经过访问BING的网址最终发现,bing中文网一直在提供每日更新背景图片壁纸的json数据.
访问网址:http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
参数说明
根据上面地址的结构,我暂时研究到就三项属性有效,他们分别是:
- format,非必要。我理解为输出格式,不存在或者不等于js,即为xml格式,等于js时,输出json格式;
- idx,非必要。不存在或者等于0时,输出当天的图片,-1为已经预备用于明天显示的信息,1则为昨天的图片,idx最多获取到前16天的图片信息;*
- n,必要。这是输出信息的数量,比如n=1,即为1条,以此类推,至多输出8条;*
*号注释:此处我们要注意的时,是否正常的输出信息,与n和idx有关,通过idx的值,我们就可以获得之前bing所使用的背景图片的信息了。
提供一个我正在用json转php,调用图片地址的方法:
1 2 3
| $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"};
|
实现
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
| <?php
class model_op_bing extends components_basemodel { const CACHE_BING_PIC = "op.bing.%s";
protected $cache = null;
public function __construct($pkid = false) { parent::__construct($pkid); $this->cache = SCache::getCacheEngine("Memcache"); $this->cache->init(array('servers' => lib_Constant::$MEMCACHE_SERVERS)); }
public function getBackground($isForce=false) { $cacheKey = sprintf(self::CACHE_BING_PIC, date("Y_m_d",time()));
if ( $this->cache->get($cacheKey) && false == $isForce ) { return $this->cache->get($cacheKey); }
$picSuffix = 'http://cn.bing.com'; $result = file_get_contents( sprintf('%s%s', $picSuffix, '/HPImageArchive.aspx?format=js&idx=0&n=1') ); $bing = json_decode($result); $imgurl = $bing->{"images"}[0]->{"url"}; $imgurl = false === strpos($picSuffix, $imgurl) ? sprintf('%s%s', $picSuffix, $imgurl) : $imgurl;
$type = pathinfo($imgurl, PATHINFO_EXTENSION); $data = file_get_contents($imgurl); $base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
$this->cache->set($cacheKey, $base64, 43200); return $base64; } }
|
调用方:
1 2 3
| $params['backgroundImg'] = (date('Ymd') == '20161208' || date('Ymd') == '20161209') ? "/assets/op/img/1208_index.jpg" : $bingModel->getBackground((!empty($_GET['update'])) ? true : false);
|