0%

获取Bing每日背景图片

经过访问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

/**
* 从bing上获取背景图片
*/
class model_op_bing extends components_basemodel
{
const CACHE_BING_PIC = "op.bing.%s";

/**
* @var Cache_MemCache
*/
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);