【API接口】实现Bing每日壁纸API接口 – 支持批量获取与JSON格式化输出

AI智能摘要
本文介绍了一个基于PHP 7+的Bing每日壁纸API接口实现方案,支持批量获取壁纸、JSON格式化输出及图片直显功能。通过调用Bing官方XML接口并使用正则解析,可获取包括图片URL、标题、版权、日期在内的详细信息。接口支持自定义数量与起始位置,兼容现代PHP环境,修复了e修饰符废弃问题,并建议通过缓存、CORS、CURL优化提升稳定性与性能,适用于网站背景、小程序、壁纸站等多种应用场景。
— 此摘要由AI分析文章内容生成,仅供参考。

📝 前言

Bing搜索引擎每天都会更新精美的背景壁纸,这些高质量的图片深受用户喜爱。本文将教你如何使用PHP开发一个Bing每日壁纸API接口,支持批量获取、JSON格式化输出,可直接应用于网站、小程序等项目中。

【API接口】实现Bing每日壁纸API接口 - 支持批量获取与JSON格式化输出

✨ 功能特性

  • ✅ 批量获取:支持一次性获取多张壁纸(默认10张)
  • ✅ JSON输出:格式化的JSON数据,方便前端调用
  • ✅ 图片直显:支持直接返回图片,无需二次请求
  • ✅ 完整信息:包含图片URL、标题、版权、日期等详细信息
  • ✅ 灵活参数:自定义获取数量和起始位置
  • ✅ PHP 7+兼容:修复了正则表达式过时问题

🎯 接口演示

返回JSON格式

https://your-domain.com/bing.php?format=json

直接显示图片

https://your-domain.com/bing.php

自定义数量

https://your-domain.com/bing.php?format=json&n=5

💻 完整代码

<?php
// 获取参数:n=图片数量(默认10),idx=起始索引(默认0)
$n = isset($_GET['n']) ? intval($_GET['n']) : 10;
$idx = isset($_GET['idx']) ? intval($_GET['idx']) : 0;

$str = file_get_contents("https://cn.bing.com/HPImageArchive.aspx?idx={$idx}&n={$n}");    

// 解析所有图片
preg_match_all('/<image>(.*?)<\/image>/is', $str, $imageMatches);
$images = [];

foreach($imageMatches[1] as $imageXml){
    $url = '';
    $urlBase = '';
    $title = '';
    $copyright = '';
    $copyrightlink = '';
    $startdate = '';
    $enddate = '';
    
    // 解析各个字段
    if(preg_match("/<url>(.+?)<\/url>/is", $imageXml, $matches)){
        $url = 'https://cn.bing.com' . html_entity_decode($matches[1]);
    }
    
    if(preg_match("/<urlBase>(.+?)<\/urlBase>/is", $imageXml, $matches)){
        $urlBase = 'https://cn.bing.com' . html_entity_decode($matches[1]);
    }
    
    if(preg_match("/<headline>(.+?)<\/headline>/is", $imageXml, $matches)){
        $title = html_entity_decode($matches[1]);
    }
    
    if(preg_match("/<copyright>(.+?)<\/copyright>/is", $imageXml, $matches)){
        $copyright = html_entity_decode($matches[1]);
    }
    
    if(preg_match("/<copyrightlink>(.+?)<\/copyrightlink>/is", $imageXml, $matches)){
        $copyrightlink = html_entity_decode($matches[1]);
    }
    
    if(preg_match("/<startdate>(.+?)<\/startdate>/is", $imageXml, $matches)){
        $startdate = $matches[1];
    }
    
    if(preg_match("/<enddate>(.+?)<\/enddate>/is", $imageXml, $matches)){
        $enddate = $matches[1];
    }
    
    if($url){
        $images[] = [
            'url' => $url,
            'urlBase' => $urlBase,
            'title' => $title,
            'copyright' => $copyright,
            'copyrightlink' => $copyrightlink,
            'startdate' => $startdate,
            'enddate' => $enddate
        ];
    }
}

// 检查是否返回JSON格式
$format = isset($_GET['format']) ? $_GET['format'] : '';

if($format === 'json'){
    // 返回JSON格式
    header('Content-Type: application/json; charset=utf-8');
    if(!empty($images)){
        $response = [
            'code' => 200,
            'msg' => 'success',
            'count' => count($images),
            'data' => $images
        ];
        echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
    }else{
        $response = [
            'code' => 500,
            'msg' => 'error',
            'data' => null
        ];
        echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
    }
}else{
    // 默认返回第一张图片
    if(!empty($images)){        
        header('Content-Type: image/JPEG');      
        @ob_end_clean();       
        @readfile($images[0]['url']);      
        @flush(); @ob_flush();     
        exit();   
    }else{    
        exit('error');   
    }
}
?>

🔧 技术要点解析

1. API参数设计

$n = isset($_GET['n']) ? intval($_GET['n']) : 10;
$idx = isset($_GET['idx']) ? intval($_GET['idx']) : 0;
  • n:控制获取图片数量,默认10张
  • idx:起始索引,0表示今天,1表示昨天,以此类推
  • 使用 intval() 确保参数安全

2. 正则表达式批量解析

preg_match_all('/<image>(.*?)<\/image>/is', $str, $imageMatches);

使用 preg_match_all 批量匹配所有 <image> 标签,比逐个请求效率更高。

3. HTML实体解码

$url = 'https://cn.bing.com' . html_entity_decode($matches[1]);

Bing返回的XML中包含 &amp; 等HTML实体,需要解码为 & 才能正确访问。

4. JSON格式化输出

echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
  • JSON_UNESCAPED_UNICODE:正确显示中文,不转义为 \uxxxx
  • JSON_UNESCAPED_SLASHES:不转义斜杠,https:// 而非 https:\/\/
  • JSON_PRETTY_PRINT:格式化输出,提高可读性

5. PHP 7+ 兼容性修复

// ❌ 旧版本(PHP 5)
preg_match("/<url>(.+?)<\/url>/ies", $str, $matches)

// ✅ 新版本(PHP 7+)
preg_match("/<url>(.+?)<\/url>/is", $str, $matches)

PHP 7.0+ 移除了正则表达式的 e 修饰符,必须去除才能正常运行。

📊 返回数据格式

JSON响应示例

{
    "code": 200,
    "msg": "success",
    "count": 10,
    "data": [
        {
            "url": "https://cn.bing.com/th?id=OHR.MadgascarAmmonite_ZH-CN6497276091_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp",
            "urlBase": "https://cn.bing.com/th?id=OHR.MadgascarAmmonite_ZH-CN6497276091",
            "title": "大自然的秘密代码",
            "copyright": "马达加斯加菊石化石 (© ThomasLENNE/Shutterstock)",
            "copyrightlink": "https://www.bing.com/search?q=xxx",
            "startdate": "20251122",
            "enddate": "20251123"
        }
        // ... 更多图片
    ]
}

字段说明

字段说明示例
url完整图片地址1920×1080分辨率
urlBase图片基础URL可拼接不同尺寸
title图片标题中文描述
copyright版权信息作者和来源
copyrightlink版权链接Bing搜索链接
startdate开始日期YYYYMMDD格式
enddate结束日期YYYYMMDD格式

🚀 使用场景

1. 前端网站背景

fetch('https://your-domain.com/bing.php?format=json')
  .then(response => response.json())
  .then(data => {
    document.body.style.backgroundImage = `url(${data.data[0].url})`;
  });

2. 微信小程序轮播

wx.request({
  url: 'https://your-domain.com/bing.php?format=json&n=5',
  success(res) {
    this.setData({
      swiperList: res.data.data.map(item => item.url)
    });
  }
});

3. 直接显示图片

<img src="https://your-domain.com/bing.php" alt="Bing每日壁纸">

4. 壁纸下载站

获取历史壁纸:

// 获取最近30天的壁纸
bing.php?format=json&idx=0&n=30

⚠️ 注意事项

  1. 服务器配置
    • 确保PHP已开启 allow_url_fopen
    • 或使用 curl 替代 file_get_contents
  2. 错误处理
    • 建议添加超时控制
    • 处理网络异常情况
  3. 缓存优化
    • Bing每天更新一次,建议添加缓存
    • 减少对Bing服务器的请求压力
  4. 跨域问题
    • 如需跨域访问,添加CORS头:
    header('Access-Control-Allow-Origin: *');

🔥 进阶优化

添加缓存机制

$cacheFile = 'cache/bing_' . date('Ymd') . '.json';
if(file_exists($cacheFile)){
    echo file_get_contents($cacheFile);
    exit;
}
// ... 原有代码
file_put_contents($cacheFile, json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));

使用CURL(更稳定)

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://cn.bing.com/HPImageArchive.aspx?idx={$idx}&n={$n}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$str = curl_exec($ch);
curl_close($ch);

支持不同分辨率

// 添加分辨率参数
$resolution = isset($_GET['resolution']) ? $_GET['resolution'] : '1920x1080';
$url = str_replace('1920x1080', $resolution, $url);

📈 总结

本文实现了一个功能完善的Bing每日壁纸API接口,具有以下优势:

  • 🎨 代码简洁,易于理解和维护
  • 🚀 性能优良,支持批量获取
  • 🔧 灵活扩展,可根据需求定制
  • 📱 应用广泛,适用多种场景

希望这个接口能帮助你快速集成Bing每日壁纸功能到你的项目中!

🔗 相关资源


如果觉得本文对你有帮助,欢迎点赞👍、收藏⭐、评论💬!

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容