原代码出处:孟坤博客 - 使用PHP抓取Bing每日图像并为己所用

原代码如下

<?php
/**
 * php抓取bing每日图片并保存到服务器
 * 作者:mengkun (mkblog.cn)
 * 日期:2016/12/23
 */
$path = 'temp';   //设置图片缓存文件夹
$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 = json_decode($str,true);
    $imgurl = 'http://cn.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;           //返回新的文件名
}

老头稍稍改了一下

<?php
$path = '/root/bing/';//设置图片缓存文件夹
$filename = date("Ymd").'.jpg';//用年月日来命名新的文件名
//文件不存在,表示今天还没有进行缓存
if ( !file_exists( $path.$filename ) ) {
    if( !file_exists( $path ) ) {//目录不存在,创建缓存目录
        mkdir( $path, 0644 );
    }
    $str = file_get_contents( 'http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=ZH-CN' ); //读取必应api,获得相应数据
    $handle = fopen( $path.'data_origin_'.date("Y").'.txt', "a" );//保存图片信息,原始json数据
    if ( $handle ){
        fwrite( $handle, $str."\r\n" );
        fclose( $handle );
    }
    $str = json_decode( $str, true );
    $imgurl     = "http://cn.bing.com".$str['images'][0]['url'];//拼接图片url 默认1920x1080
    $imgurl_UHD = "http://cn.bing.com".$str['images'][0]['urlbase']."_UHD.jpg";//拼接UHD高清图片url
    $img = grabImage( $imgurl_UHD, $imgurl, $path.$filename ); //读取并保存图片
    $handle = fopen( $path.'data_'.date("Y").'.txt', "a" );//保存图片信息,如果不需要可以把下面这些去掉。
    if ( $handle ) {
        $tempArr = array(//将相关信息放进数组中
            "imgurl"        => $imgurl,
            "imgurl_UHD"    => $imgurl_UHD,
            "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']
        );
        //最终以json格式保存,json_encode不转义斜杠和中文 JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES = 320 
        fwrite( $handle, json_encode( $tempArr, 320 ) ."\r\n" );//PHP 5.4+
        fclose( $handle );
    }
}
function grabImage ( $url_UHD, $url, $filename = "" ){
    if ( ( $url_UHD == "" ) || ( $url == "" ) ){ return false; }//如果$url地址为空,直接退出
    if ( $filename == "" ){//如果没有指定新的文件名
        $ext = strrchr( $url, "." );//得到$url的图片格式
        $filename = date( "Ymd" ).$ext;//年月日命名新的文件名
    }
    ob_start();//打开输出
    readfile( $url_UHD );//输出UHD图片文件
    $img = ob_get_contents();//浏览器输出
    ob_end_clean();//清除输出并关闭
    $size = strlen( $img );//UHD图片大小
    if( $size < 250 ){ //异常情况处理,即当天图片不符合要求,一般出现在当天背景为MP4的情况下 
        ob_start(); //打开输出
        readfile( $url ); //输出1920*1080图片文件
        $img = ob_get_contents();//浏览器输出
        ob_end_clean();//清除输出并关闭
        $size = strlen( $img );//1920*1080图片大小
    }
    $fp2 = @fopen( $filename, "a" );
    fwrite( $fp2, $img );//向当前目录写入图片文件,并重新命名
    fclose( $fp2 );
    return $filename;//返回新的文件名
}

简单使用参考:上面代码保存为 bing-get.php,上传至 VPS /root 目录下,建立壁纸图片和信息存放文件夹,如 bing,权限一般 644 就可以,根据实际修改吧。然后 ssh 执行 bing-get.php 即可下载当天壁纸和保存 json 信息(上面代码会保存原始 json 和修改过的 json 信息,根据需要修改)。

php /root/bing-get.php

调试好使用 crontab 定时执行 bing-get.php 脚本即可自动下载壁纸:

15 17 * * * /usr/local/php/bin/php  /root/bing-get.php > /dev/null 2>&1 &

来源:cyhour.com

相关Bing Wallpaper 必应壁纸