使用 Cloudflare Workers 搭建随机图片API
感谢Cloudflare提供的免费服务,让本项目得以实现。
在此向Cloudflare致以最高的敬意。
前言
看了BlueSkyXN的博客后,准备自己搭一个二刺螈随机图片API(毕竟网上找到的都良莠不齐)。他的博客提到了这个库:BlueSkyXN/RandomIMGAPI: 业内最简的原创随机图API源码。自己在西雅图的服务器上部署了一下,效果不错,就是每次请求会很慢,毕竟线路很差。目光自然又转向了Cloudflare。能不能用Cloudflare Workers实现呢?
准备
- 功能正常的Cloudflare账号
- 一个托管在Cloudflare的域名
- 包含目标图片的GitHub库(比如我的:Zxis233/img2020S7: Pixiv 2020精选集 删除大量NSFW图片)
步骤
创建Cloudflare Workers
-
左侧栏找到“Workers与Pages”,点进去新建。模板直接选JS的Hello World就行 (注意不要选成Python的了)
-
部署完毕后编辑代码,将下面的代码粘贴进去:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47// 使用Cloudflare Workers 实现的随机图床API
// 获取指定txt文件中的图片链接,返回随机图片链接
// TXT文件链接为https://raw.githubusercontent.com/Zxis233/img2020S7/refs/heads/master/img.txt
// 将获取到的随机链接中的'https://jsd.proxy.aks.moe/gh/Zxis233/img2020S7@master'替换为'https://raw.githubusercontent.com/Zxis233/img2020S7/refs/heads/master'
// 返回形式为图片
async function handleRequest(request) {
// 自定义允许的主机名, 包含这些的允许返回图片
const allowedReferers = ['esing.dev', 'github.io', '192.168.31.222'];
const referer = request.headers.get('Referer');
if (!referer || !allowedReferers.some(host => referer.includes(host))) {
return new Response('Forbidden', { status: 403 });
}
// 路径分流, 便于选择不同的GitHub图片库
const urlPath = new URL(request.url).pathname;
if (urlPath.startsWith('/2021')) {
return new Response('Not Found', { status: 404 });
}
if (urlPath.startsWith('/2020')) {
// 获取包含图片文件的txt文件
const url = 'https://raw.githubusercontent.com/Zxis233/img2020S7/refs/heads/master/img.txt';
const response = await fetch(url);
const text = await response.text();
const imgList = text.split('\n').filter(Boolean);
let randomImg = imgList[Math.floor(Math.random() * imgList.length)];
// 可选, 替换原本文件中的路径前缀
randomImg = randomImg.replace('https://jsd.proxy.aks.moe/gh/Zxis233/img2020S7@master', 'https://raw.githubusercontent.com/Zxis233/img2020S7/refs/heads/master');
// 可选, 若txt文件内只含文件的相对路径使用这个
// randomImg = 'https://raw.githubusercontent.com/Zxis233/img2020S7/refs/heads/master/' + randomImg
// 以图片形式返回, 顺便让CF反代了, 加快速度
return fetch(randomImg);
// 可选, 以链接形式返回启用
return new Response(randomImg, {
headers: { 'Content-Type': 'text/plain' },
});
}
return new Response('Not Found', { status: 404 });
}
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
}); -
重新部署!
绑定自定义域
因workers.dev与pages.dev均被封锁,无法直连,只能使用自定义域的方式。
进入Workers配置页面,选择“域和路由”,并添加自己想要的域名/URL路由即可。
完成!
[{"url":"https://imgrandom.esing.dev/2020/1","alt":"1"},{"url":"https://imgrandom.esing.dev/2020/2","alt":"2"},{"url":"https://imgrandom.esing.dev/2020/3","alt":"3"},{"url":"https://imgrandom.esing.dev/2020/4","alt":"4"},{"url":"https://imgrandom.esing.dev/2020/5","alt":"5"},{"url":"https://imgrandom.esing.dev/2020/6","alt":"6"}]
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Esing的小站!
评论
WalineGitalk