分享一个自用的Bing壁纸API

发布于 2020-08-26  999 次阅读


细心的朋友可能发现,我的博客首页图片其实就是Bing壁纸,为了这个壁纸我琢磨了好久,阅遍全网的Bing壁纸API,结果不是不能用就是不符合我的需求(不过说实话我的需求挺怪的),我实在忍不了,干脆自己写(改)了一个,顺便在这里分享给大家。

效果:

主要特性

  • 最好的语言PHP编写
  • 保存当天壁纸到本地
  • 随机返回近10天的壁纸
  • 若壁纸不存在则返回当天壁纸

一些说明

  • 此项目部分代码参考了网上的一些实现方式,但是由于年代久远且相互抄袭严重,找不到真正的作者,因此此部分代码不注明出处(主要是我也不知道),当然如果作者能联系我的话,我也很乐意注明出处的
  • 每天的壁纸都会以日期.jpg 保存
  • 壁纸保存在/bing/ 目录下

代码

<?php
$path = 'bing';                         //设置图片缓存文件夹
$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);             //读取并保存图片
}
$cutday='-'.rand(0, 9).' '.'day';   //随机往前推的天数
$imgurl = './bing/'.date("Ymd",strtotime($cutday)) . '.jpg';    //生成随机的图片地址
if(file_exists($imgurl))
{
    header("Location: $imgurl");                                //如果图片存在则跳转随机图片
}
else{
    $imgurl = './bing/'.date("Ymd") . '.jpg';
    header("Location: $imgurl");                                //否则跳转当天图片
}


/**
 * 远程抓取图片并保存
 * @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;           //返回新的文件名
}

 

GitHub地址(可以的话赏个Star呗):https://github.com/kakkk/PHP-BingWallpaper

Demo

https://bing.kakkk.cc/bing.php

End.


车到山前必有路,船到桥头自然直。