[BING] 获取BING每日美图、构建API、每日抓取下载、部署私人服务器并存储

BING-获取BING每日美图

Posted by cl9000 on April 13, 2017

BING每日美图

解析API

bing 搜索

F12 查看源码,定位背景地址、解析可以获得首页图的获取API。格式:

1
http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1

注意,这里有几个GET参数,它们的作用分别是:

  • n,必要参数。这是输出信息的数量。比如n=1,即为1条,以此类推,至多输出8条。
  • format,非必要。返回结果的格式,不存在或者等于xml时,输出为xml格式,等于js时,输出json格式
  • idx,非必要。不存在或者等于0时,输出当天的图片,-1为已经预备用于明天显示的信息,1则为昨天的图片,以此类推,idx最多获取到前16天的图片信息
    这里将n设定为1、format设定为js、idx设定为1,去发出GET请求,返回的数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"images": [
{
"startdate": "",
"fullstartdate": "",
"enddate": "",
"url": "",
"urlbase": "",
"copyright": "",
"copyrightlink": "",
"title": "",
"quiz": "",
"wp": true,
"hsh": "",
"drk": 1,
"top": 1,
"bot": 1,
"hs": []
}
],
"tooltips": {
"loading": "正在加载...",
"previous": "上一个图像",
"next": "下一个图像",
"walle": "此图片不能下载用作壁纸。",
"walls": "下载今日美图。仅限用作桌面壁纸。"
}
}

其中的 “images” 节点下的 “url” 值便是我们要获取的图像地址。
把它取出来,再加上Bing的网址前缀(http://cn.bing.com)即组合成了完整的图像地址。可直接浏览器查看。

用PHP去动态抓取

获取BING每日背景图,构建API、每日抓取下载、部署私人服务器并存储,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
// ini_set('date.timezone','Asia/Shanghai'); //设置时区,确定为中国上海时区

// 方案一
$path0 = 'BingWallpaper'; // 定义存放图片的一级目录,这个目录是固定的,需要手动创建并设置写入权
$path = $path0 .'/'. date("Ym"); // 图片缓存文件夹,以当前年月命名并自动新建文件夹
$filename = date("Ymd") .'.jpg'; // 用年月日来命名新的文件名
if (!file_exists($path .'/'. $filename)) { // 如果文件不存在,则说明今天还没有进行缓存
if(!file_exists($path)) { // 如果目录不存在
mkdir($path, 0777); // 创建缓存目录
}
$str = file_get_contents('http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'); // 读取必应api,获得相应数据
$str = json_decode($str, true);
$imgurl = 'http://cn.bing.com'. $str['images'][0]['url']; // 获取图片url
$img = grabImage($imgurl, $path .'/'. $filename); // 读取并保存图片
}
function grabImage($url, $filename = "") {
if($url == "") return false; // 如果$url地址为空,直接退出
if ($filename == "") { // 如果没有指定新的文件名
$ext = strrchr($url, "."); // 得到$url的图片格式
$filename = date("Ymd") . $ext; // 用天月面时分秒来命名新的文件名
}
ob_start(); // 打开输出
readfile($url); // 输出图片文件
$img = ob_get_contents(); // 得到浏览器输出
ob_end_clean(); // 清除输出并关闭
$size = strlen($img); // 得到图片大小
$fp2 = @fopen($filename, "a");
fwrite($fp2, $img); // 向当前目录写入图片文件,并重新命名
fclose($fp2);
return $filename; // 返回新的文件名
}

// // 方案二
// $path='BingWallpaper'; // 定义存放图片的一级目录,这个目录是固定的,需要手动创建并设置写入权
// $path1=$path.'/'.date('Ym'); // 定义存放图片的二级目录,以当前所处年份来命名
// if(!file_exists($path1)) {
// mkdir($path1, 0777);
// } // 判断二级目录是否存在,若不存在,则自动创建并设置写入权
// // $path2=$path1.'/'.date('m'); // 定义存放图片的三级目录,以当前所处月份来命名
// // if(!file_exists($path2)){
// // mkdir($path2, 0777);
// // } // 判断三级目录是否存在,若不存在,则自动创建并设置写入权
// // $pathurl=$path2.'/'.date('Ymd').'.jpg'; // 定义图片名,以当前所处日份来命名
// $pathurl=$path1.'/'.date('Ymd').'.jpg'; // 定义图片名,以当前所处日份来命名
// if(!is_file($pathurl)) {
// $str=file_get_contents('http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1'); // 获取图片地址,并判断图片是否已经存在
// if(preg_match("/<urlBase>(.+?)<\/urlBase>/isu", $str, $matches)) { // ies
// $imgurl='http://cn.bing.com'.$matches[1].'_1920x1080.jpg';
// copy($imgurl, $pathurl);
// } //读取对应的图片并写入指定目录
// }
// // 显示图片
// // header('Content-Type:image/jpeg'); //定义输出类型
// // @ob_end_clean(); //擦除缓存
// // @readfile($pathurl); //输出本地图片
// // @flush(); //缓存
// // @ob_flush(); //输出缓存
// // exit(); //退出


// 方案三: + 写入图片信息 参考 https://mkblog.cn/492/
// $path = 'temp'; //设置图片缓存文件夹
// $filename = date("Ymd") . '.jpg'; //用年月日来命名新的文件名
// if (!file_exists($path.'/'. $filename)) { //如果文件不存在,则说明今天还没有进行缓存
// if(!file_exists($path)) //如果目录不存在
// {
// mkdir($path, 0777); //创建缓存目录
// }
// $str = file_get_contents('http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'); //读取必应api,获得相应数据
// $str = json_decode($str,true);
// $imgurl = 'http://cn.bing.com'.$str['images'][0]['url']; //获取图片url
// $img = grabImage($imgurl, $path.'/'.$filename); //读取并保存图片
// $handle = fopen("dat.txt", "a"); //用于存放图片信息,如果不需要保存图片的相关信息,可以把下面这些去掉。
// if ($handle) {
// $copyright = $str['images'][0]['copyright']; //说明
// $startdate = $str['images'][0]['startdate'];
// $fullstartdate = $str['images'][0]['fullstartdate'];
// $enddate = $str['images'][0]['enddate'];
// $urlbase = $str['images'][0]['urlbase'];
// $copyrightlink = $str['images'][0]['copyrightlink'];
// $quiz = $str['images'][0]['quiz'];
// $wp = $str['images'][0]['wp'];
// $hsh = $str['images'][0]['hsh'];
// $drk = $str['images'][0]['drk'];
// $top = $str['images'][0]['top'];
// $bot = $str['images'][0]['bot'];
// $tempArr = array("imgurl"=>$imgurl,"copyright"=>$copyright, "startdate"=>$startdate,
// "fullstartdate"=>$fullstartdate, "enddate"=> $enddate, "urlbase"=>$urlbase,
// "copyrightlink"=> $copyrightlink, "quiz"=>$quiz, "wp"=> $wp,
// "hsh"=>$hsh,"drk"=>$drk, "top"=> $top, "bot"=> $bot); //将相关信息放进数组中
// fwrite($handle, json_encode($tempArr) ."\r\n"); //最终以json格式保存在文本文档中
// fclose($handle);
// }
// }
// function grabImage($url, $filename = "") {
// if($url == "") return false; //如果$url地址为空,直接退出
// if ($filename == "") { //如果没有指定新的文件名
// $ext = strrchr($url, "."); //得到$url的图片格式
// $filename = date("Ymd") . $ext; //用天月面时分秒来命名新的文件名
// }
// ob_start(); //打开输出
// readfile($url); //输出图片文件
// $img = ob_get_contents(); //得到浏览器输出
// ob_end_clean(); //清除输出并关闭
// $size = strlen($img); //得到图片大小
// $fp2 = @fopen($filename, "a");
// fwrite($fp2, $img); //向当前目录写入图片文件,并重新命名
// fclose($fp2);
// return $filename; //返回新的文件名
// }


// ******************************************************************************************
// // 仅使用其作为背景图API,新建PHP文件
// // Bing壁纸API - 1
// $str=file_get_contents('http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1');
// if(preg_match("/(.+?)<\/url>/ies",$str,$matches)){
// $imgurl='http://cn.bing.com'.$matches[1];
// }
// if($imgurl){
// header('Content-Type: image/JPEG');
// @ob_end_clean();
// @readfile($imgurl);
// @flush(); @ob_flush();
// exit();
// }else{
// exit('error');
// }
// // Warning: preg_match(): The /e modifier is no longer supported, use preg_replace_callback instead in /Library/WebServer/Documents/phpMyProjects/php-test/index4.php on line 4
// // error

// // Bing壁纸API - 2
// $str = file_get_contents('http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1'); // 从bing获取数据
// if(preg_match('/<url>([^<]+)<\/url>/isU', $str, $matches)) { // 正则匹配抓取图片url
// $imgurl = 'http://cn.bing.com'.$matches[1];
// } else { // 如果由于某些原因,没抓取到图片地址
// $imgurl = 'http://img.infinitynewtab.com/InfinityWallpaper/2_14.jpg'; // 使用默认的图像(默认图像链接可修改为自己的)
// }
// echo "$imgurl";
// echo "<img src='$imgurl' />";
// header("Location:{$imgurl}"); // 跳转至目标图像

文件管理

DirectoryLister

参考链接

参考链接



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!