https://cn.bing.com
已经修复!
前段时间,写了个Bing随机壁纸API,Bing随机壁纸 API 有个朋友问我壁纸怎么保存下来的,其实这东西网上一搜一大把,用PHP/JAVA/Python... 都能实现,看个人喜好了。
我服务器上的脚本是PHP写的,挂在定时任务中,每天固定时间访问该脚本,就能保存当天的壁纸。
找出Bing壁纸接口。
这里使用Fiddle 抓包工具进项抓包。
可以看到,上面有一个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
就能自动保存当天的壁纸了。
同时,为了自动化,可以创建一个定时任务,每天固定时间访问该链接即能自动保存,这里以宝塔面板为例:
打开计划任务=》添加任务 即可
运行一段时间后,还能看到运行日志呢,每天都有保存!
版权属于:编码书生
本文链接:https://codess.cc/archives/72.html
所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
除特别注明,您可以自由的转载和修改,但请务必注明文章来源且不可用于商业目的。
20 条评论
你好,复制了你的代码。建立bing文件夹,然后放了Autosave_Bing.php并且建立了imgs文件夹。内网访问Autosave_Bing.php空白一片,并且没有自动保存的图片。文件夹权限HTTP。其中代码15行已经替换为https://cn.bing.com/...不知道哪里还有问题啊。
群里已经发我了,请无视本留言~
奇怪我访问我的壁纸库地址http://www.you-Domain/bing/auto_save_bing.php后再imgs文件夹里出现一个以当天日期命名的20191022 .jpg文件,但是为什么大小为0KB呢?
确认一下被写入文件夹是否开放了权限
没保存成功
我把在web目录下边建了个bing文件夹,把壁纸库的几个文件包括imgs文件夹都放到bing文件夹下了,bing文件夹属性-常规-拥有者选的http,权限-用户或组里http完全控制
拥有者admin 权限里也是完全控制,结果还是一样啊
是webstation里新建虚拟主机吗,将你上面做的步骤移到该虚拟主机环境下,以端口访问,路由器转发端口,设定定时任务就可以保存了 ,我现在就是这样保存的
这是保存bing 图片到本地,是不会出现图片的老哥,随机显示图片请参考另一篇教程
折腾了半天,原来是壁纸连接的问题,国际版的地址不行,改成国内版的就OK啦
就是说出现空白页面是正确的。结果还是权限的问题所以没保存下来啊
我的为什么下载的是国际版的图片,能不能设置成国内版本呢
将程序第15行 https://www4.bing.com/... 换成 https://cn.bing.com/... 即可,之前2月份国内站无法访问,故换成了国际站(忘了该会来),谢谢提醒
我发现这两个网址下载的都是国际版的图片了。。。
奇怪了,之前自己就是这么修改的,没有成功,刚才试了下,没有问题了
对于没有linux的同学,也可以在群晖计划任务里面,添加任务每天自动运行
群晖计划任务执行的是shell脚本,不能运行PHP脚本,自己改写一下就行
也不用改脚本,用群晖计划任务写下自动访问那个php文件就好啦。
计划任务里直接写网址连接吗?
好办法,回头试试看OωO