必应每日一图(cn.bing.com),指的是 cn.bing.com 网站的背景图片每天00:00就会更新一张。

很多人都喜欢把这些图片当作壁纸(包括我,当然,我并不是手动更换的,而是通过一款软件《必应自动桌面》来实现每天自动更换壁纸,当然,我们的主题是 如何用PHP抓取必应的每日背景图 )。

Bing的每日背景图片官方都有一个接口,一个是 json 方式,一个是 XML 的方式,所以就有了下面的这两个地址。

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

根据上面接口的参数,我大致得出了以下3个参数的解析:


1. format,非必要。我理解为输出格式,不存在或者不等于js,即为xml格式,等于js时,输出json格式;

2. idx,非必要。不存在或者等于0时,输出当天的图片,-1为已经预备用于明天显示的信息,1则为昨天的图片,idx最多获取到前16天的图片信息;*
3. n,必要。这是输出信息的数量,比如n=1,即为1条,以此类推,至多输出8条。


有兴趣的同学可以去研究上面的接口吧,接下来我来贴代码了,我是调用的第二个接口(返回格式是 XML):

<?php
/**
 *Description:获取Bing每日背景图
 *Version:1.0
 *Author:初文
 */
ini_set('date.timezone','Asia/Shanghai');//设置时区,亚洲、上海;老外好像更喜欢上海,所以不能改成 Asia/Beijing
/**
*我对此做了缓存,减轻服务器负载,如果不需要,你可以自己改一下
*/
$tomorrow=strtotime(date('Y-m-d 00:00:00',strtotime('+1 day')));//明天的时间戳
$cache_time=$tomorrow-time();//明天的时间戳-现在的时间戳=缓存的时间,因为必应每日一图,一天换一次...
$modified_time=@$_SERVER['HTTP_IF_MODIFIED_SINCE'];
if(strtotime($modified_time)+$cache_time>time()){//如果缓存的时间戳大于现在的时间戳
	header("HTTP/1.1 304");//发送HTTP状态码304,使浏览器返回缓存的结果
}else{//否则抓取重新抓取图片,返回给用户
	$str=curl_get('http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1');
	if(preg_match("/<url>(.+?)<\/url>/ies",$str,$matches)){
		$imgurl='http://cn.bing.com'.$matches[1];
	}
	if($imgurl){
		header('Content-Type: image/JPEG');
		header ("Last-Modified: ".gmdate("D, d M Y H:i:s", time() )." GMT");//发送Last-Modified头标,设置文档的最后的更新日期。
		header ("Expires: ".gmdate("D, d M Y H:i:s", time()+$cache_time )." GMT");//发送Expires头标,设置当前缓存的文档过期时间,GMT格式。
		header ("Cache-Control: max-age=$cache_time");//发送Cache_Control头标,设置xx秒以后文档过时,可以代替Expires,如果同时出现,max-age优先。
		@ob_end_clean();
		@readfile($imgurl);
		@flush();
		@ob_flush();
		die;
	}else{
		die('error, please try again !');//获取失败,提醒用户刷新页面重试
	}
}
function curl_get($url,$time_out=10){
	$ch=curl_init($url);
	curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch,CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; U; Android 4.4.1; zh-cn; R815T Build/JOP40D) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 Chrome/4.5 Mobile Safari/533.1');
	curl_setopt($ch,CURLOPT_TIMEOUT, $time_out);
	$content=curl_exec($ch);
	curl_close($ch);
	return($content);
}
?>


Demo: https://www.ogdn.net/assets/img/bingimg.php  //仅供演示用,不能用此链接作网站背景链接,因为有防盗链,你弄到网站当背景图也不会显示,要是真有需要,请在下方留言,我抽空做一个外链

标签: PHP, 必应

添加新评论