TYPECHO WIKI

PHP获取Bing图片作为Typecho博客网站首页背景图

发布者:Typecho维基君/更新日期:2019-04-03/人气指数:130

写这个教程是因为很多人都非常喜欢Bing的背景图片,TypechoWiki君之前也用过Bing的图片作为背景图,今天就来给大家分享一下如何操作Bing的背景图。

Bing接口

我们用到的接口是https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1
这里的idx=0表示是显示当天的时间,如果要显示昨天的就将idx=0改为idx=1,以此类推。
注意:bing支持查看历史图片15天以内的,数字就有范围限制了(0-15)。

你可能感兴趣:Typecho Bing大图背景自适应主题 bing

获取当日图片

我们有了接口就可以直接利用正则表达式去匹配相关字符串了。
下面给出一个获取并输出当日美图的php代码,新建一个PHP文件将一下代码丢进去,然后在需要图片的地方直接调用即可。

<?php
    $str=file_get_contents('https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1');
if (preg_match("/<url>(.+?)<\/url>/ies", $str, $matches)) {
    $imgurl='https://cn.bing.com'.$matches[1];
}
if ($imgurl) {
    header('Content-Type: image/JPEG');
    @ob_end_clean();
    @readfile($imgurl);
    @flush();
    @ob_flush();
    exit();
} else {
    exit('error');
}
?>

保存为bingpic.php,上传到服务器直接访问即可。

获取图片版权介绍

有了图片,没有文字怎么能满足饥渴的我,还是利用正则提取出图片版权信息

<?php
$url=file_get_contents('https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1');
 
if (preg_match("/<copyright>(.+?)<\/copyright>/ies", $url, $matches)) {
    $imgcopyright=$matches[1];
}
if ($imgcopyright) {
    header("Content-type: text/html; charset=utf-8");
    echo $imgcopyright;
} else {
    exit('error');
}
?>

tip:修改相关参数即可实现对应的文字说明

自动保存bing图片

自动在php文件同级目录下创建一个当前年月的文件夹,保存每天的bing美图并输出

<?php
error_reporting(0);
$path=date('Ym');
if (!file_exists($path)) {
    mkdir($path, 0777);
}
$pathurl = $path.'/'.date('d').'.jpg';
if (!is_file($pathurl)) {
    $str=file_get_contents('https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1');
    if (preg_match("/<urlBase>(.+?)<\/urlBase>/ies", $str, $matches)) {
        $imgurl='https://s.cn.bing.com'.$matches[1].'_1920x1080.jpg';
        copy($imgurl, $pathurl);
    }
}
 header('Content-Type: image/JPEG');
  @ob_end_clean();
  @readfile($pathurl);
  @flush();
@ob_flush();
exit();
?>

还有一种直接写进Typecho的function主题的方法:

function get_bing_img()
{
    // 从bing获取数据
    $res = file_get_contents('https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1');
    // 转成数组
    $bingArr = json_decode($res, true);
    $src = "https://cn.bing.com{$bingArr['images'][0]['urlbase']}_1920x1080.jpg";
    return $src;
}

上面的代码可以直接丢到你的Typecho主题的functions.php文件里,不过这样虽然可以调用,但是一旦频率过高可能被封,那么有没有其他办法呢,答案是有的,将Bing图片直接按照日期缓存到本地,然后从缓存里调用:

注意:该方法需要在你的主题下新建bingCache目录,并将该目录权限设置为777
function get_bing_img_cache()
{
    // 获取路径
    $imgDir = 'usr/themes/xxxx/bingCache/';
    $bingDir = $imgDir['basedir'].'/bing';
    if (!file_exists($bingDir)) {
        mkdir($bingDir, 0755);
    }
    $today = mktime(0,0,0,date('m'),date('d'),date('Y'));
    $yesterday = mktime(0,0,0,date('m'),date('d')-1,date('Y'));
    // 是否存在今日图片
    if (!file_exists($bingDir.'/'.$today.'.jpg')) {
        // 从bing获取数据
        $res = file_get_contents('https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1');
        // 转成数组
        $bingArr = json_decode($res, true);
        $bing_url = "https://cn.bing.com{$bingArr['images'][0]['urlbase']}_1920x1080.jpg";
        $content = file_get_contents($bing_url);
        file_put_contents($bingDir.'/'.$today.'.jpg', $content); // 写入今天的
        unlink($bingDir.'/'.$yesterday.'jpg'); //删除昨天的
        $src = $imgDir['baseurl'].'/bing/'.$yesterday.'.jpg';
    } else {
        // 存在
        $src = $imgDir['baseurl'].'/bing/'.$today.'.jpg';
    }
    return $src;
}

主题中需要图片的地方调用方法:<?php if(!empty(get_bing_img())){echo "style='background-image: url(".get_bing_img().")'";} ?>

本文检索关键词:typecho
赞助支持

添加新评论 »