我最喜欢干的事情之一,就是把锅全都丢给用户端。只要能不在服务端解决就不在服务端,就算要在服务端也不要在我的服务端,jié桀桀桀桀~

就算本站还没有什么流量,但归根到底首页封面的图片应该是加载次数最多的了。正好我自己的壁纸也比较喜欢用必应的每日一图(这个是直接在微软商店里找的必应壁纸这个应用实现的),干脆就也拿来当封面好了。

要获取必应每日一图很简单,必应直接就给出了接口:

1
https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN

可以看到后面有几个参数:

  • format:可以返回json(js)或xml
  • idx:0代表今天,1代表昨天,最多能到7,也就是一周前
  • n:一次返回的壁纸数量,最多是8
  • mkt:市场/区域

但是如果在前端用JavaScript调用API的话,会触发浏览器的跨域资源共享(Cross-origin resource sharing, CORS)错误。这个是为了防止恶意网站在用户不知情的情况下,直接调用其他网站的接口并窃取敏感数据而设置的,用户端除非用了魔改的浏览器也无法轻易跳过。似乎是有提供可以跳过防御的服务存在,但最好的解决方案还是在后端调用并存储。

还好返回的结果只是包含着图片url的json而不是图片本身,不然到头来还是要我的服务端来发图片给用户。先来看看json的内容吧,下面是我设置的每天同步的当日图片对应的json:

为了动态显示这块代码块的格式我还得再引入highlight.js,真是头疼。而且github的高光风格还不匹配夜间模式,只能祈祷看到这篇文章的你正在用日间模式了。

可以看到只要在里面的url前面加上https://www.bing.com就是我们要的图片url了。里面还有其他的一些无聊内容,甚至可以拿来搓一个卡片或者小组件。

每日一图

每天同步这个json也很简单,我是用的python的requests包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
import json

url = "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN"

try:
response = requests.get(url, timeout=10)
response.raise_for_status()
data = response.json()

# 保存到本地文件
with open("你的json位置", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
except Exception as e:
# 失败了干点什么吧
print("更新失败:", e)