PHP 自动保存Bing 每日壁纸
https://cn.bing.com
已经修复!
- *
前段时间,写了个Bing随机壁纸API,Bing随机壁纸 API 有个朋友问我壁纸怎么保存下来的,其实这东西网上一搜一大把,用PHP/JAVA/Python... 都能实现,看个人喜好了。
我服务器上的脚本是PHP写的,挂在定时任务中,每天固定时间访问该脚本,就能保存当天的壁纸。
找出Bing壁纸接口。
可以看到,上面有一个cn.bing.com:443
的直链,选中它,再打开TextWizard,就能看到Bing 壁纸服务器返回的 JSON 数据。
- *
分析返回的JSON数据。
这里使用JSON格式化工具对他进行格式化(可以使用Sublime text中的Pretty JSON
插件)
如图所示,红线圈住的即为返回的当天壁纸的链接,别忘了在其前面加https://cn.bing.com
据说被墙 2019.1.24更(已修复),可是,这只是当天的壁纸,并不是通链,所以还是没有抓到真正的 API !!呵呵...这就是巨硬鸡贼的地方,为了不公开他的壁纸API ,目前巨硬已经隐藏了API 的直链!但是这是难不倒程序猿的!祭出谷歌大法,找出来了https://www4.bing.com
- *
分析接口
壁纸接口:http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
2019.1.24更:https://www4.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
参数:
formart
:输出格式(非必要参数),formart=js时,输出JSON格式;formart不存在或者不等于js 时,输出XML格式;idx
:输出图片日期(非必要参数)。以当前(今天为基准),idx=0或者不存在,默认输出今天的图片,idx=-1是预备用于明天显示的图片,idx=1则是昨天的图片,最大支持到16,最小为-1。n
:输出信息的数量(必要参数)。即随该图片一起的信息数量(bing每一张图片都有相关信息),n=1为一条,最大支持8条。
在JSON数据中 URL 后有 1920x1080,这是指定输出图片大小,接口支持1920x1080、1366x768、1024x768、480x800四种尺寸的图片输出。
- *
封装函数
上面分析完,就要开始写代码了
代码思路:
- 创建缓存文件夹;
- 赋予缓存文件夹777权限;
- 设定图片命名方式(Ymd-年月日:20180925);
- 访问API 获取数据;
- 获取图片URL、并访问保存;
- 保存图片、保存其他信息;
<?php
/**
* php抓取bing每日图片并保存到服务器
*/
$path = 'imgs'; //设置图片缓存文件夹
$filename = date("Ymd") . '.jpg'; //用年月日来命名新的文件名
if (!file_exists($path.'/'. $filename)) //如果文件不存在,则说明今天还没有进行缓存
{
if(!file_exists($path)) //如果目录不存在
{
mkdir($path, 0777); //创建缓存目录
}
$str = file_get_contents('http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'); //读取必应api,获得相应数据
/* $str = file_get_contents('https://www4.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); //读取并保存图片
/*Bing壁纸先已全面取消壁纸故事接口,并不再维护,故本例中未对每日故事进行采集,望知悉!*/
}
/**
* 远程抓取图片并保存
* @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; //返回新的文件名
}
将以上代码保存为Autosave_Bing.php
放至网站任意目录,假设为Bing
目录,然后将该目录权限设为777
,所有者设为www
。然后访问网址https://www.you-Domain/Bing/Autosave_Bing.php
就能自动保存当天的壁纸了。
同时,为了自动化,可以创建一个定时任务,每天固定时间访问该链接即能自动保存,这里以宝塔面板为例:
- *
> 此篇文章【PHP 自动保存Bing 每日壁纸】,均来自于网络,贫小子仅作分享