Sakwe

PHP 自动保存Bing 每日壁纸 [2019.1.23更]
https://cn.bing.com 已经修复!  前段时间,写了个Bing随机壁纸API,...
扫描右侧二维码阅读全文
23
2019/01

PHP 自动保存Bing 每日壁纸 [2019.1.23更]

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://www4.bing.com'.$str['images'][0]['url'];    //获取图片url
    $img = grabImage($imgurl, $path.'/'.$filename); //读取并保存图片
 /*
    $handle = fopen("dat.txt", "a");    //用于存放图片信息,如果不需要保存图片的相关信息,可以把下面这些去掉。
    if ($handle)
    {
        $copyright = $str['images'][0]['copyright'];    //说明
        $startdate = $str['images'][0]['startdate'];
        $fullstartdate = $str['images'][0]['fullstartdate'];
        $enddate = $str['images'][0]['enddate'];
        $urlbase = $str['images'][0]['urlbase'];
        $copyrightlink = $str['images'][0]['copyrightlink'];
        $quiz = $str['images'][0]['quiz'];
        $wp = $str['images'][0]['wp'];
        $hsh = $str['images'][0]['hsh'];
        $drk = $str['images'][0]['drk'];
        $top = $str['images'][0]['top'];
        $bot = $str['images'][0]['bot'];
        $tempArr = array("imgurl"=>$imgurl,"copyright"=>$copyright, "startdate"=>$startdate,
        "fullstartdate"=>$fullstartdate, "enddate"=> $enddate, "urlbase"=>$urlbase,
        "copyrightlink"=> $copyrightlink, "quiz"=>$quiz, "wp"=> $wp,
        "hsh"=>$hsh,"drk"=>$drk, "top"=> $top, "bot"=> $bot);   //将相关信息放进数组中
        fwrite($handle, json_encode($tempArr) ."\r\n"); //最终以json格式保存在文本文档中
        fclose($handle);
    }
    */
}
/**
 * 远程抓取图片并保存
 * @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 年 02 月 27 日 06 : 38 PM
您的支持就是我持续更新的动力!

发表评论