Bing的限定

不知道什么时候开始,单单依靠原来的修改 GET 请求的参数 cc 来获取Bing搜索每日在不同地区展示的背景图片行不通了。 可能是聪明的Bing识破了大家抓它壁纸的套路 于是我细细地研究了一下它的新套路。

构造Header

在原来的 Header 中加入了这样一行 X-Forwarded-For:64.233.161.2 以混淆视听(不是) 之后,得到了这样一个返回结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"images": [
{
"startdate": "20191215",
"fullstartdate": "201912150800",
"enddate": "20191216",
"url": "/th?id=OHR.NutsWeekend_EN-US5701415684_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp",
"urlbase": "/th?id=OHR.NutsWeekend_EN-US5701415684",
"copyright": "Beech forest covered with frost and snow, Ardennes, Belgium (© Philippe Moes/Alamy)",
"copyrightlink": "https://www.bing.com/search?q=battle+of+the+bulge&form=hpcapt&filters=HpDate%3a%2220191215_0800%22",
"title": "The Battle of the Bulge 75 years later",
"quiz": "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20191215_NutsWeekend%22&FORM=HPQUIZ",
"wp": true,
"hsh": "a17e8b7d1284b2d4edb74483be0d8f43",
"drk": 1,
"top": 1,
"bot": 1,
"hs": [

]
}
],
......

修正请求链接

注意到返回的 UrlBase 中有这样一个标记 EN-US ,于是我在原本的请求链接后带上了原来的 cc 参数

得到了这样的返回结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"images": [
{
"startdate": "20191214",
"fullstartdate": "201912141500",
"enddate": "20191215",
"url": "/th?id=OHR.TrilliumLake_JA-JP3615984347_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp",
"urlbase": "/th?id=OHR.TrilliumLake_JA-JP3615984347",
"copyright": "「トリリアム湖とフッド山」米国オレゴン州, マウントフッド国立森林 (© Frank Krahmer/Getty Images)",
"copyrightlink": "https://www.bing.com/search?q=%E3%83%95%E3%83%83%E3%83%89%E5%B1%B1&form=hpcapt&filters=HpDate%3a%2220191214_1500%22",
"title": "オレゴン州の静かな湖",
"quiz": "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20191214_TrilliumLake%22&FORM=HPQUIZ",
"wp": true,
"hsh": "6d2a3791c51a549d64928ee8d2dc7346",
"drk": 1,
"top": 1,
"bot": 1,
"hs": [

]
}
],
......

至此,得到的结果达到了预期

Cookies的附加

其实一开始请求的时候是无法得到 title 的,后来看了看,是因为少了这样一行 Cookies: ENSEARCH=BENVER=1,把它加上之后就得到了带有 title 的结果。

接口实现

首先根据思路找出两种不一样的请求构造。

1
2
curl_setopt($objCurl,CURLOPT_URL,"http://cn.bing.com/HPImageArchive.aspx?format=js&idx=".$idx."&n=1&ensearch=0");
curl_setopt($objCurl,CURLOPT_URL,"http://cn.bing.com/HPImageArchive.aspx?format=js&idx=".$idx."&n=1&cc=".$region);

然后构造Header,设定相应的 X-Forwarded-For 值,然后设定 Cookie 为 ENSEARCH=BENVER=1

同时,为了满足各种请求需要,我给出了四个请求参数。

1
2
3
4
$idx = isset($_GET["idx"])?htmlspecialchars($_GET["idx"]):"0";
$region = isset($_GET["region"])?htmlspecialchars($_GET["region"]):"cn";
$resolution = isset($_GET["resolution"])?htmlspecialchars($_GET["resolution"]):"1920x1080";
$swiftSwap = isset($_GET["ss"])?htmlspecialchars($_GET["ss"]):"0";
参数名称必填类型说明默认值
idxint图片展示距今天数0
regionstring获取图片所展示地区cn
resolutionstring获取图片的分辨率1920x1080
ssint快速跳转 参照文章中的代码0

其中的 ss 为 0 时,接口会返回详细信息;为 1 时,接口将只返回图片的链接;为 3 时,接口将直接跳转到相应图片的页面。

接下来要做的就是发起请求并整理返回值,并且加入一点点细节。


Download Source