博客最近换了主题,然后在主题作者的博客里发现了关于 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
调用示例:
默认调用:
不带任何参数调用
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
如何搭建
原作者已经给出具体的 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 代码,拒绝访问。这里也可以改成其它动作。
转载结束,为自己的勤劳撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。