本文 首发于 Anyeの小站
API的获取与分析
首先找到Bing一图原始的API地址:https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
返回如下:
{
"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
$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后直接输出:
header('Location: ' . $image_url);
可以通过php来传入idx的参数
$idx = 0;
if (isset($_GET['idx'])) {
$idx = $_GET['idx'];
}
那么就成了这样:
<?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。
本教程不具有任何盈利目的,仅供学习参考。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: Drone-Yolo:一种高效的无人机图像目标检测神经网络方法
摘要 https://www.mdpi.com/2504-446X/7/8/526 在各种研究领域中,对无人机的图像进行目标检测是一项有意义的任务。然而,无人机的图像带来了独特的挑战,包括图像尺寸大、检测对象尺寸小、对象密集分布、对象重叠以及光线不足影响目标检…