PHP 自动保存Bing 每日壁纸

https://cn.bing.com 已经修复!


  前段时间,写了个Bing随机壁纸API,Bing随机壁纸 API 有个朋友问我壁纸怎么保存下来的,其实这东西网上一搜一大把,用PHP/JAVA/Python... 都能实现,看个人喜好了。

我服务器上的脚本是PHP写的,挂在定时任务中,每天固定时间访问该脚本,就能保存当天的壁纸。

找出Bing壁纸接口。

这里使用Fiddle 抓包工具进项抓包。
5744.jpg

可以看到,上面有一个cn.bing.com:443的直链,选中它,再打开TextWizard,就能看到Bing 壁纸服务器返回的 JSON 数据。


分析返回的JSON数据。

这里使用JSON格式化工具对他进行格式化(可以使用Sublime text中的Pretty JSON插件)
2540.png

如图所示,红线圈住的即为返回的当天壁纸的链接,别忘了在其前面加https://cn.bing.com 据说被墙 2019.1.24更https://www4.bing.com(已修复),可是,这只是当天的壁纸,并不是通链,所以还是没有抓到真正的 API !!呵呵...这就是巨硬鸡贼的地方,为了不公开他的壁纸API ,目前巨硬已经隐藏了API 的直链!但是这是难不倒程序猿的!祭出谷歌大法,找出来了


分析接口

壁纸接口: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就能自动保存当天的壁纸了。

同时,为了自动化,可以创建一个定时任务,每天固定时间访问该链接即能自动保存,这里以宝塔面板为例:

打开计划任务=》添加任务 即可

运行一段时间后,还能看到运行日志呢,每天都有保存!

最后修改:2019 年 08 月 08 日 02 : 57 PM
您的支持就是我持续更新的动力!

8 条评论

  1. 45share

    我的为什么下载的是国际版的图片,能不能设置成国内版本呢

    1. Sakwe
      @45share

      将程序第15行 https://www4.bing.com/... 换成 https://cn.bing.com/... 即可,之前2月份国内站无法访问,故换成了国际站(忘了该会来),谢谢提醒

      1. 45share
        @Sakwe

        我发现这两个网址下载的都是国际版的图片了。。。

      2. 45share
        @Sakwe

        奇怪了,之前自己就是这么修改的,没有成功,刚才试了下,没有问题了

  2. simonmz

    对于没有linux的同学,也可以在群晖计划任务里面,添加任务每天自动运行

    1. Sakwe
      @simonmz

      群晖计划任务执行的是shell脚本,不能运行PHP脚本,自己改写一下就行

      1. simonmz
        @Sakwe

        也不用改脚本,用群晖计划任务写下自动访问那个php文件就好啦。

        1. Sakwe
          @simonmz

          好办法,回头试试看OωO

发表评论

为了博客更好地生产内容,请将本站加入广告屏蔽插件的白名单,感谢您的支持。 具体方法
X