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