如何搭建Bing一图API

本文 首发于 Anyeの小站

API的获取与分析

首先找到Bing一图原始的API地址:https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1

返回如下:

json 复制代码
{
  "images": [
    {
      "startdate": "20230820",
      "fullstartdate": "202308201600",
      "enddate": "20230821",
      "url": "/th?id=OHR.EmeraldLakeYukon_ZH-CN4281156537_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp",
      "urlbase": "/th?id=OHR.EmeraldLakeYukon_ZH-CN4281156537",
      "copyright": "翡翠湖,加拿大育空地区 (© artherng/Getty Images)",
      "copyrightlink": "https://www.bing.com/search?q=%E5%8A%A0%E6%8B%BF%E5%A4%A7%E8%82%B2%E7%A9%BA%E5%9C%B0%E5%8C%BA&form=hpcapt&mkt=zh-cn",
      "title": "自内而外的光彩",
      "quiz": "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20230820_EmeraldLakeYukon%22&FORM=HPQUIZ",
      "wp": true,
      "hsh": "4dcae2d3d6d89fc9f0f3da4a6eb49b92",
      "drk": 1,
      "top": 1,
      "bot": 1,
      "hs": []
    }
  ],
  "tooltips": {
    "loading": "正在加载...",
    "previous": "上一个图像",
    "next": "下一个图像",
    "walle": "此图片不能下载用作壁纸。",
    "walls": "下载今日美图。仅限用作桌面壁纸。"
  }
}

其中的可选参数经分析:

format(可选):返回结果的格式,可以是js、xml(默认)

idx(可选):图片的索引,从0开始。每天会有新图片,所以这个索引会变化。

n(必选):请求获取的图片数量,可以请求多张。

可以发现我们想请求的Url即为https://cn.bing.com/+images[n]['url']

构造请求

那么我们就可以使用php来简单构造这个请求

php 复制代码
<?php

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

$json = file_get_contents($api_url);

$data = json_decode($json, true);

$image_url = 'https://cn.bing.com' . $data['images'][0]['url'];


// 打开图片文件指针
$image_fp = fopen($image_url, 'r');

// 输出图片内容的 header
header('Content-type: image/jpg'); 

// 输出图片内容
fpassthru($image_fp);

exit;

?>

这样就实现了使用 fopen 打开图片 URL 对应的文件指针,输出 header 告诉浏览器这是 jpeg 图片,使用 fpassthru 输出图片内容。

优化代码

这个代码已经基本实现了调用 API 获取并返回图片,但是我们会发现一个问题就是这样每次请求都会调用一次 API ,进而消耗服务器的流量,如果我仅仅是为了返回图片而已,那么我们可以在PHP代码中,通过 API 获得图片URL后直接输出:

php 复制代码
header('Location: ' . $image_url);

可以通过php来传入idx的参数

php 复制代码
$idx = 0; 
if (isset($_GET['idx'])) {
  $idx = $_GET['idx'];
}

那么就成了这样:

php 复制代码
<?php

// 获取idx参数
$idx = 0;
if (isset($_GET['idx'])) {
  $idx = $_GET['idx'];
}

// 构建API地址
$api_url = "https://cn.bing.com/HPImageArchive.aspx?format=js&idx=$idx&n=1";

// 获取JSON
$json = file_get_contents($api_url);

// 解析JSON
$data = json_decode($json, true); 

// 拼接完整图片URL
$image_url = 'https://cn.bing.com' . $data['images'][0]['url'];

// 直接输出图片URL
header('Location: ' . $image_url);

exit;

?>

为了保证服务器安全,防止PHP注入性破坏,我们还可以增加传入参数的限制等等,这样就构成了一个简单的每日一图 API。

本教程不具有任何盈利目的,仅供学习参考。

相关推荐
╰⋛⋋⊱⋋翅膀⋌⊰⋌⋚╯3 小时前
cJSON使用
json
4311媒体网7 小时前
帝国cms调用文章内容 二开基本操作
java·开发语言·php
Evan芙9 小时前
nginx+php部署walle,发布php站点
运维·nginx·php
catchadmin10 小时前
PHP 8.6 即将支持部分函数应用
php
未来之窗软件服务14 小时前
幽冥大陆(四十九)PHP打造Java的Jar实践——东方仙盟筑基期
java·php·jar·仙盟创梦ide·东方仙盟·东方仙盟sdk·东方仙盟一体化
BingoGo15 小时前
Laravel + Vue3 前后端分离开源后台管理框架 CatchAdmin v5.0 Beta 发布
后端·php
行思理16 小时前
Linux多PHP如何切换系统默认PHP版本
linux·运维·php
正在走向自律17 小时前
从Oracle到金仓KES:PL/SQL兼容性与高级JSON处理实战解析
数据库·sql·oracle·json·金仓数据库·电科金仓·兼容性挑战
Web极客码18 小时前
如何通过GUI或命令行更改Ubuntu 20.04的DNS设置
linux·ubuntu·php
毕设源码-朱学姐18 小时前
【开题答辩全过程】以 基于PHP的高校心理测评系统的设计与实现为例,包含答辩的问题和答案
开发语言·php