必应(bing.com)

想必大家都有了解,它的照片品质很高,想下载做壁纸啥的,怎么弄呢?

前言

这次是偏向网页端,那就用php手搓一个出来吧!

这次所需的官方API接口:

常用

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

带有水印

https://bingwallpaper.microsoft.com/api/BWC/getHPImages

大家可以自己选择哪个哈~

接下来演示的是常用接口

怎么做?

图片跳转bing-url

参考腾讯云开发者社区的帖子:

https://cloud.tencent.com/developer/article/1835238

<?php
//判断是否随机调用
if ($_GET['rand']==='true') {
  $gettime = rand(-1,7);
}else{
//若不为随机调用则判断是否指定日期
  $gettimebase = $_GET['day'];
  if (empty($gettimebase)) {
    $gettime = 0;
  }else{
    $gettime = $gettimebase;
  }
}
//获取Bing Json信息
$json_string = file_get_contents('https://cn.bing.com/HPImageArchive.aspx?format=js&idx='.$gettime.'&n=1');
//转换为PHP数组
$data = json_decode($json_string);
//提取基础url
$imgurlbase = "https://cn.bing.com".$data->{"images"}[0]->{"urlbase"};
//判断是否指定图片大小
$imgsizebase = $_GET['size'];
if (empty($imgsizebase)){
  $imgsize = "1920x1080";
}else{
  $imgsize = $imgsizebase;
}
//建立完整url
$imgurl = $imgurlbase."_".$imgsize.".jpg";
//获取其他信息
$imgtime = $data->{"images"}[0]->{"startdate"};
$imgtitle = $data->{"images"}[0]->{"copyright"};
$imglink = $data->{"images"}[0]->{"copyrightlink"};
//判断是否只获取图片信息
if ($_GET['info']==='true') {
  echo "{title:".$imgtitle.",url:".$imgurl.",link:".$imglink.",time:".$imgtime."}";
}else{
  //若不是则跳转url
  header("Location: $imgurl");
}

调用参数:

参数代码参数含义可用参数
rand是否随机显示最近8天内的图片true or false
day显示指定的最近图片-1,0,1,2,3,4,5,6,7(0为今天,-1为昨天)
size指定获取图片大小详见下方可用分辨率
info获取图片基础信息(json格式)true or false

这个api挺好的,参数挺全,够用了。

如果想要保存到本地呢?

图片保存到本地

这个 参考的是

https://mkblog.cn/492/

源代码

<?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;           //返回新的文件名
}

我参考大佬的思路,对图片和json数据进行了分类

改进

<?php
/**
 * php抓取bing每日图片并保存到服务器与分类
 * 作者:mengkun (mkblog.cn)&moluo (mlvlog.com)
 * 日期:2016/12/23
 * 更新日期:2022/08/10
 */
$KEY=$_GET["key"];
if ($KEY=='moluobing') {
$path = 'th';   //设置图片缓存文件夹
$data=date("Ymd") ;
$txt=".json";
$handleb=$data.$txt;
$filename =date("Ymd").'.jpg';  //用年月日来命名新的文件名
if (!file_exists($path.'/'. $filename))    //如果文件不存在,则说明今天还没有进行缓存
{
    if(!file_exists($path)) //如果目录不存在
    {
        mkdir($path, 0777); //创建缓存目录
    }
    $str = file_get_contents('https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN'); //读取必应api,获得相应数据
    $str = json_decode($str,true);
    $imgurl = 'https://cn.bing.com'.$str['images'][0]['url'];    //获取图片url
/**
 * 远程抓取图片并保存
 * @param $url 图片url
 * @param $filename 保存名称和路径
 */
     function grabImage($url, $filename = "")
{
    global $grabImage;
    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;           //返回新的文件名
}
    $img = grabImage($imgurl, $path.'/'.$filename); //读取并保存图片
    if(!file_exists('json')) //如果目录不存在
    {
        mkdir('json', 0777); //创建json目录
    }
    $handle = fopen('json/'.$handleb, "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);
    }
}


    $key_error = [
        'code' => '200',
        'message' => '运行成功',];
        exit(json_encode($key_error,JSON_UNESCAPED_UNICODE))
;}
else {
    $key_error = [
        'code' => '500',
        'message' => '不允许直接访问',];
        exit(json_encode($key_error,JSON_UNESCAPED_UNICODE))
       ;}

执行上面的文件一次,就能得到以下文件了,保存json为了方便以后调用。

注意带上key进行get请求噢~(key=moluobing)

可以设置定时任务,一天请求一次,就可以了~

有人就要问了?咦?~那我如果想让api返回我今天保存的图片,怎么弄啊?

好办!

运用本地API保存的图片

<?php
$data=date("Ymd") ;
$filename = date("Ymd") . '.jpg'; 
header("Location: ./th/$filename");    // 跳转至目标图像

这不就行了嘛~

必应图片

写在后面

必应每日一图的另一个官方接口,也欢迎大家调用,虽然它有水印(节点是美国的,速度不行,还是用常用接口快一点),但分辨率会略微高一点。

好了,这篇文章就到这,欢迎在评论区讨论~


陌罗