使用 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



