Bing搜索的首页每天都会推送一张很俊秀的图片,如何利用PHP获取Bing搜索逐日图片?
我们用到的接口是https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
把稳,这里有几个GET参数,它们的浸染分别是:

这里将n设定为1、format设定为js、idx设定为0,去发出GET要求【推举一个Getman在线版:https://getman.cn/】,返回的数据是这样的:
{ "images": [ { "startdate": "20200404", "fullstartdate": "202004041600", "enddate": "20200405", "url": "/th?id=OHR.KissimmeeFrog_ZH-CN8379824947_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp", "urlbase": "/th?id=OHR.KissimmeeFrog_ZH-CN8379824947", "copyright": "基西米湖中的绿色树蛙和紫色睡莲,佛罗里达州 (© Joanne Williams/Danita Delimont)", "copyrightlink": "https://www.bing.com/search?q=%E5%9F%BA%E8%A5%BF%E7%B1%B3%E6%B9%96&form=hpcapt&mkt=zh-cn", "title": "", "quiz": "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20200404_KissimmeeFrog%22&FORM=HPQUIZ", "wp": true, "hsh": "759031457bf9d3d144d511a09e80d227", "drk": 1, "top": 1, "bot": 1, "hs": [] } ], "tooltips": { "loading": "正在加载...", "previous": "上一个图像", "next": "下一个图像", "walle": "此图片不能下载用作壁纸。", "walls": "下载今日美图。仅限用作桌面壁纸。" }}
个中的“images”节点下的“url”值便是我们要获取的图像地址。我们把它取出来,再加上Bing的网址前缀(https://cn.bing.com)即组合成了完全的图像地址。比如说上面返回数据的完全图像地址是这样的:
https://cn.bing.com/th?id=OHR.KissimmeeFrog_ZH-CN8379824947_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp
知道了背景图的获取办法,接下来便是用PHP去动态抓取了。
如果你只是纯挚的想用作网页背景的话,你只需新建一个php文件,里面贴入如下代码:
<?php$str = file_get_contents('https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1'); // 从bing获取数据 if(preg_match('/<url>([^<]+)<\/url>/isU', $str, $matches)) { // 正则匹配抓取图片url $imgurl = 'https://cn.bing.com'.$matches[1];} else { // 如果由于某些缘故原由,没抓取到图片地址 $imgurl = 'https://img.infinitynewtab.com/InfinityWallpaper/2_14.jpg'; // 利用默认的图像(默认图像链接可修正为自己的)} header("Location: {$imgurl}"); // 跳转至目标图像
然后把这个php文件上传到你的做事器,访问这个php文件该当就能看到被跳转到了Bing的图片。
利用方法:直接将那个php文件的绝对地址当做图片放进网页中即可。
比如说,如果你的这个php的地址为“https://hao.defcon.cn/bing.php”,那么你在你自己的网页的css中这么写就能当背景利用了:
body{ width:100%; height:100%; background: url(https://hao.defcon.cn/bing.php) no-repeat; -moz-background-size: cover; /背景图片拉伸以铺满全屏/ -ms-background-size: cover; -webkit-background-size: cover; background-size: cover;}
以上方法只是大略地跳转,如果想要抓取这张图片并保存到做事器呢?这里直接贴代码:
<?php$path = 'temp'; //设置图片缓存文件夹$filename = date("Ymd") . '.jpg'; //用年月日来命名新的文件名if (!file_exists($path.'/'. $filename)) //如果文件不存在,则解释本日还没有进行缓存{ if(!file_exists($path)) //如果目录不存在 { mkdir($path, 0777); //创建缓存目录 } $str = file_get_contents('https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'); //读取必应api,得到相应数据 $str = json_decode($str,true); $imgurl = 'https://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); }}/ 远程抓取图片并保存 @param $url 图片url @param $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; //返回新的文件名}
如果这个php被访问,它就会自动启动抓取并保存。你可以用阿里云监控或其他类型的网站监控做事来实现每天自动运行这个php。