感谢Cloudflare提供的免费服务,让本项目得以实现。

在此向Cloudflare致以最高的敬意。

前言

看了BlueSkyXN的博客后,准备自己搭一个二刺螈随机图片API(毕竟网上找到的都良莠不齐)。他的博客提到了这个库:BlueSkyXN/RandomIMGAPI: 业内最简的原创随机图API源码。自己在西雅图的服务器上部署了一下,效果不错,就是每次请求会很慢,毕竟线路很差。目光自然又转向了Cloudflare。能不能用Cloudflare Workers实现呢?

准备

步骤

创建Cloudflare Workers

  1. 左侧栏找到“Workers与Pages”,点进去新建。模板直接选JS的Hello World就行 (注意不要选成Python的了)

  2. 部署完毕后编辑代码,将下面的代码粘贴进去:

    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));
    });
  3. 重新部署!

绑定自定义域

workers.devpages.dev均被封锁,无法直连,只能使用自定义域的方式。

进入Workers配置页面,选择“域和路由”,并添加自己想要的域名/URL路由即可。

完成!