博客最近换了主题,然后在主题作者的博客里发现了关于 Bing 这个 API 的文章,我自己也试着弄了一个,发现还挺简单的,就转出来给大家也看看吧!

转载说明

本文转载自青空之蓝博客博主 Otstar Lin 的文章,我自己也简单修改了点内容(主要是为了把自己遇到的一点小坑和解决办法也分享下),但我仍然定义为转载文章,毕竟代码什么的都不是我原创的。_(:з)∠)_

原文标题: Bing每日一图API

作者:Otstar Lin

链接:https://blog.ixk.me/bing-daily-picture-api.html

作者的转载协议:本文采用 CC BY-NC-SA 3.0 许可协议,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

综上,本文也会以 CC BY-NC-SA 3.0 许可协议进行转载分享。

原文及博主的小改动

什么是Bing每日一图

相信大家在访问Bing搜索的时候都会看到非常漂亮的背景图,由于Bing的背景图每天都会变,于是称为Bing每日一图。

调用方法

此API只支持https调用,国外地区访问使用CF节点。

所有参数均仅适用于以 GET 方式进行请求

可直接插入img标签中

PS:下面的地址是原作者给出的公开 API 调用地址,大家可以按照调用格式拿来用哦。

请求地址:

https://lab.ixk.me/api/bing/

调用参数:

参数代码参数含义可用参数
rand是否随机显示最近8天内的图片true or Do not fill in
day显示指定的最近图片-1,0,1,2,3,4,5,6,7(0为今天,-1为昨天)
size指定获取图片大小详见下方可用分辨率
info获取图片基础信息(json格式)true or Do not fill in

以上所有参数均非必要,默认参数为 rand=false,day=0,size=1920×1080,info=false

可用分辨率:

  • 1920×1080
  • 1366×768
  • 1280×768
  • 1024×768
  • 800×600
  • 800×480
  • 768×1280
  • 720×1280
  • 640×480
  • 480×800
  • 400×240
  • 320×240
  • 240×320
  • 注:中间的x为英文字母x

调用示例:

默认调用:

不带任何参数调用

PS:为了减轻原博主服务器的压力和本博客文章的完整性,我换成自己的 API 啦

Info调用:(例)

调用链接:https://lab.ixk.me/api/bing?info=true

{
title:"Concrete dinosaurs along Old Route 66 in Holbrook, Arizona (© Gary Warnimont/Alamy)",
url:"https://www.bing.com/az/hprichbg/rb/ConcreteDinosaurs_EN-US9038296644_1920x1080.jpg",
link:"http://www.bing.com/search?q=route+66&form=hpcapt&filters=HpDate:%2220180627_0700%22",
time:"20180627",
api author:"Otstar",
api author link:"https://www.ixk.me"
}

随机调用:

调用链接:https://lab.ixk.me/api/bing?rand=true

同上,这里换成自己的 API 链接了

如何搭建

原作者已经给出具体的 PHP 代码了,我们只需要写好上传到服务器里就可以直接开用了。

下面我就以上传到服务器根目录为例,先新键一个bing.php 文件,复制并粘贴下面的代码并放到服务器的根目录下:

<?php
//判断是否随机调用
if ($_GET['rand']==='true') {
$gettime = rand(-1,7);
}
else {
//若不为随机调用则判断是否指定日期
$gettimebase = $_GET['day'];
if (empty($gettimebase)) {
$gettime = 0;
}
else {
$gettime = $gettimebase;
}
}
//获取Bing Json信息
$json_string = file_get_contents('https://www.bing.com/HPImageArchive.aspx?format=js&idx='.$gettime.'&n=1');
//转换为PHP数组
$data = json_decode($json_string);
//提取基础url
$imgurlbase = "https://www.bing.com".$data->{"images"}[0]->{"urlbase"};
//判断是否指定图片大小
$imgsizebase = $_GET['size'];
if (empty($imgsizebase)){
    $imgsize = "1920x1080";
}
else {
    $imgsize = $imgsizebase;
}
//建立完整url
$imgurl = $imgurlbase."_".$imgsize.".jpg";
//获取其他信息
$imgtime = $data->{"images"}[0]->{"startdate"};
$imgtitle = $data->{"images"}[0]->{"copyright"};
$imglink = $data->{"images"}[0]->{"copyrightlink"};
//判断是否只获取图片信息
if ($_GET['info']==='true') {
    echo "{title:".$imgtitle.",url:".$imgurl.",link:".$imglink.",time:".$imgtime."api author:Otstar,api author link:https://www.ixk.me"."}";
}
else {
//若不是则跳转url
    header("Location: $imgurl");
}

上传好之后,链接访问比如 example.com/bing.php 应该就能看到效果了。

自己的一点小经验

上面的做完之后,按照原作者写的 API 调用教程来正常调用就可以返回图片了,如果遇到了问题,下面是博主自己的一点经验分享。

出现错误(404 之类的):

检查下服务器的配置文件,看是否是针对特殊路径做了限制,另外注意看是不是自己的调用地址写错了。

怎么限制 API 的访问:

搭建好的 API 是不论任何人都可以拿来调用的,只要他知道你的调用地址。如果你不想自己的 API 被人滥用的话,可以做一些配置来限制允许调用 API 的人,比如 IP 限制,User-Agent 限制,Referer 限制等。

由于这个不是什么特别重要的 API,也消耗不了什么资源,因此这里就只简单分享下 Referer 头限制的方法吧,以 Nginx 为例,在自己网站的配置文件中加入如下代码:

location /bing.php
		{
			valid_referers none blocked server_names *.example.com;
		    if ($invalid_referer) {
				return 403;
			}
		}

关于 Referer 的解释和代码的解读:

  • /bing.php:规则匹配的地址,按照自己的 API 路径来写,注意 location 规则的匹配先后顺序问题,保险起见请放在 fastcgi 等类似 php 规则的下面。
  • Referer:简单的说,浏览器在你输入某个网址时,会对非该网址的其它资源请求头中添加 referer 信息,告诉请求资源的服务器自己是从哪里来的
  • valid_referers:指定允许的 referer 头的范围,none 就是直接请求的资源(比如你直接输入 API 地址打开时),sever_names 对应的你自己网站设定的 sever name,后面还可以自己加,具体格式看 Nginx 官方文档
  • return 403:返回 403 代码,拒绝访问。这里也可以改成其它动作。

转载结束,为自己的勤劳撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。

说点什么
欢迎评论!不想写邮箱的请填写 [email protected] 哦!
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...