用JSON或PHP获取BING每日背景图片


在弄我的小博客,用了一个很简洁的主题,但是发现这个主题的登录背景图不好看,而且一成不变,就想着能不能做些修改,让系统自动修改登录页面。正好bing中文网每日都会更新漂亮的背景图片,就想着把它抓取过来用在自己的博客中。
于是就上网搜索一通,发现已经有网友这么做了,而且还给出了具体的代码,以下是本人收集的两种较好的方法,就在此MARK下。

之前一直以为通过在线抓取bing得网页以后,再做正则的匹配,不过,今天在网上才注意到,原来在CSDN论坛已有有人发了一个更为简便的方式。当然,还是通过php的方式获取,但是匹配的xml页面,相对更加快捷的获取背景图片。

BING官网原理:
BING中文网一直在提供每日更新背景图片壁纸的json数据。
访问网址:http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
上面地址中三项属性含义:
1、format,非必要。我理解为输出格式,不存在或者不等于js,即为xml格式,等于js时,输出json格式;
2、idx,非必要。不存在或者等于0时,输出当天的图片,-1为已经预备用于明天显示的信息,1则为昨天的图片,idx最多获取到前16天的图片信息;*
3、n,必要。这是输出信息的数量,比如n=1,即为1条,以此类推,至多输出8条;
注意:是否正常的输出信息,与n和idx有关,通过idx的值,我们就可以获得之前BING所使用的背景图片的信息了。

JSON方法:
调用图片地址的方法:
$str = file_get_contents('http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1');
$array = json_decode($str);
$imgurl = $array->{"images"}[0]->{"url"};
如果是JS的ajax抓取,请注意,需要用jsonp的方法
JSON方法简单高效,而且获取到的图片都是高分辨率的,值得推荐使用。

PHP方法:
<?php
$str=file_get_contents('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');
@ob_end_clean();
@readfile($imgurl);
@flush(); @ob_flush();
exit();
}else{
exit('error');
}
?>
可以直接调用上面的变量$imgurl,也可以将这个封成函数,方便调用。
想要用BING美图作为WordPress登录页面的背景图代码,那就在主题functions.php中加入一下代码即可:
<?php
/*
必应壁纸为登录页面背景
*/
function custom_login_head(){
$str=file_get_contents('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];
echo'<style type="text/css">body{background: url('.$imgurl.');width:100%;height:100%;background-image:url('.$imgurl.');-moz-background-size: 100% 100%;-o-background-size: 100% 100%;-webkit-background-size: 100% 100%;background-size: 100% 100%;-moz-border-image: url('.$imgurl.') 0;background-repeat:no-repeat\9;background-image:none\9;}</style>';
}
}
add_action('login_head', 'custom_login_head');
?>
补充CSS部分,如何让背景图固定不随滚动条滚动。
background:fixed;
为你背景图所在的选择器内,添加上面这句声明即可。
很可惜,PHP调用的方法,获取到的图片并不完美,可能永远只有1366x768大小的图片,对于现在很多分辨率在1600x900或者1980x1080的时候,上面获取到的大小,明显不合适了。

BING美图