实现bing背景获取(php)

2021-07-01
2分钟阅读时长

php获取bing背景图

测试链接: https://api.kquark.com/bing

https://api.kquark.com/bing/?idx=1&n=1&size=UHD

idx 取值0-8,代表前几天图片,n代表一次获取多少张图片url(暂无用),size代表图片质量部分可取参数如下 size参数:

resolutions: [
    'UHD',
    '1920x1200',
    '1920x1080',
    '1366x768',
    '1280x768',
    '1024x768',
    '800x600',
    '800x480',
    '768x1280',
    '720x1280',
    '640x480',
    '480x800',
    '400x240',
    '320x240',
    '240x320'
]

设计原理依据bing api 获取

https://bing.com/HPImageArchive.aspx?idx=0&n=1

php代码:

<?php
$predate = $_GET['idx'];
$num = $_GET['n'];
$size = $_GET['size'];

if(strlen($predate)==0){
    $predate=rand(0,8);
}
if(strlen($num)==0){
    $num = 1;
}
if(strlen($size)==0){
    $size = 'UHD';
}
echo 'predate:'.$predate.'<br>';
echo 'num:'.$num.'<br>';
echo 'size:'.$size.'<br>';

$bingurl='https://bing.com/HPImageArchive.aspx?idx='.$predate.'&n='.$num;
//'https://bing.com/HPImageArchive.aspx?idx=0&n=1'

echo $bingurl.'<br>';
$str = file_get_contents($bingurl);   // 从bing获取数据
 
if(preg_match('/<url>([^<]+)<\/url>/isU', $str, $matches)) { // 正则匹配抓取图片url
    $imgurl = 'http://bing.com'.$matches[1];
} else {  // 如果由于某些原因,没抓取到图片地址
    $imgurl = 'https://bing.com/th?id=OHR.GreaterFlamingosIndia_ZH-CN5655181892_UHD.jpg'; // 使用默认的图像(默认图像链接可修改为自己的)
}
$imgurl=str_replace("1920x1080",$size,$imgurl);
echo $imgurl.'<br>';

header("Location: {$imgurl}");    // 跳转至目标图像

nginx伪静态:

location /bing/ {
if (-f $request_filename) {
break;
        }
rewrite ^/bing/(.*)$ /bing/bing.php?idx=$1&n=$2&size=$3 last;
}

php 保存图片:

<?php
//error_reporting(0);
//$predate = $_GET['idx'];
//$num= $_GET['n'];
$predate = $_GET['idx'];
$num = $_GET['n'];
$size = $_GET['size'];

$path = 'img';   //设置图片缓存文件夹
$filename = date("Ymd") . '.jpg';  //用年月日来命名新的文件名

if(strlen($predate)==0){
    $predate=rand(0,8);
}
if(strlen($num)==0){
    $num = 1;
}
if(strlen($size)==0){
    $size = 'UHD';
}
echo 'predate:'.$predate.'<br>';
echo 'num:'.$num.'<br>';
echo 'size:'.$size.'<br>';


//https://api.kquark.com/bing
$bingurl='https://bing.com/HPImageArchive.aspx?idx='.$predate.'&n='.$num;
//'https://bing.com/HPImageArchive.aspx?idx=0&n=1'

echo $bingurl.'<br>';
$str = file_get_contents($bingurl);   // 从bing获取数据
 
if(preg_match('/<url>([^<]+)<\/url>/isU', $str, $matches)) { // 正则匹配抓取图片url
    $imgurl = 'http://bing.com'.$matches[1];
} else {  // 如果由于某些原因,没抓取到图片地址
    $imgurl = 'https://bing.com/th?id=OHR.BlossomsBC_ROW7514274008_UHD.jpg&amp;rf=LaDigue_UHD.jpg&amp;pid=hp'; // 使用默认的图像(默认图像链接可修改为自己的)
}
$imgurl=str_replace("1920x1080",$size,$imgurl);
echo $imgurl.'<br>';
saveImage($path,$filename);

header("Location: {$imgurl}");    // 跳转至目标图像


function saveImage($path= "",$filename = "")
{
    if (!file_exists($path.'/'. $filename))    //如果文件不存在,则说明今天还没有进行缓存
    {
        if(!file_exists($path)) //如果目录不存在
        {
            echo 'create path'.'<br>';
            mkdir($path, 0777); //创建缓存目录
        }
        echo 'try save'.$filename.'<br>';
        $str = file_get_contents('http://bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'); 
        $str = json_decode($str,true);
        $imgurl = 'http://bing.com'.$str['images'][0]['url'];    //获取图片url
        
        $imgurl=str_replace("1920x1080",'UHD',$imgurl);
        
        $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);
        }
        $handle = fopen("url_dat.txt", "a");    //用于存放图片信息,如果不需要保存图片的相关信息,可以把下面这些去掉。
        if ($handle)
        {
            fwrite($handle,date("Ymd").':'.$imgurl ."\r\n");
            fclose($handle);
        }
    }
    else
    {
        echo 'today saved:'.$path.'/'. $filename.'<br>';
    }
}
/**
 * 远程抓取图片并保存
 * @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;           //返回新的文件名
}