通过Cloudflare规则实现纯静态随机图API

通过Cloudflare规则实现纯静态随机图API#

参考项目 D-RandomPIC

基于 Cloudflare Pages 404 规则与 GitHub Actions 自动构建的随机图 API。

访问 https://randompic.pldduck.com/ecy-v 之类的地址即可获得一张随机图片。

演示#

随机图演示

介绍#

工作原理#

不依赖任何后端服务,完全由静态文件与 Cloudflare 规则实现随机取图:

  1. gen_pic.py 扫描 pic/ 下的分类子文件夹,将每个分类的图片复制到 dist/<分类>/ 目录下,并按十六进制编号重命名,生成 000.jpgfff.jpg 共 4096 个文件(对应规则中 3 位十六进制 hash 的全部取值,覆盖所有可能路径,保证不会 404)。
  2. 构建产物 dist/ 部署到 Cloudflare Pages。
  3. 在 Cloudflare 为该 Pages 项目配置 404 规则(见 rule.txt):
纯文本
 concat(http.request.uri.path, "/", substring(uuidv4(cf.random_seed), 0, 3), ".jpg")

当用户访问 /ecy-v 时,如果该路径不存在(返回 404),规则会使用随机种子生成 3 位十六进制字符串并重写到 /ecy-v/xxx.jpg,从而随机返回该分类下的一张图片。

D-RandomPIC 目录结构#

纯文本
D-RandomPIC/
├── gen_pic.py            # 构建脚本:生成 dist/ 下的随机图片文件
├── index.html            # 演示页面(列出各分类 API 地址)
├── 404.html              # 404 响应体
├── rule.txt              # Cloudflare 404 规则表达式
├── pic/                  # 源图片目录(按分类存放)
│   ├── ecy-h/            # 随机二次元图(横屏/电脑)
│   ├── ecy-v/            # 随机二次元图(竖屏/手机)
│   ├── fj/               # 其他分类示例
│   └── ys/               # 其他分类示例
└── dist/                 # 构建产物(由 gen_pic.py 生成,不提交到仓库)

新增图片分类时,只需在 pic/ 下新建一个子文件夹并放入图片,推送到仓库即可,构建脚本与 Cloudflare 规则无需改动。

本地构建测试#

需要 Python 3(仅使用标准库,无需安装任何依赖)。

Bash
python gen_pic.py

构建完成后检查 dist/ 目录,每个分类下应生成 4096 个文件(000.jpgfff.jpg)。

搭建部署#

部署方法#

1.Fork D-RandomPIC#

D-RandomPIC Fork一份到你的Github

2.创建 Pages 项目#

在 Cloudflare Dashboard 中创建 Pages 项目
选择直传项目 Direct Upload

3.配置 GitHub Actions Secrets#

名称说明
CLOUDFLARE_API_TOKENCloudflare API Token,需具备 Pages 编辑权限
CLOUDFLARE_ACCOUNT_IDCloudflare 账号 ID(Dashboard 首页右下角可查看)
CLOUDFLARE_PROJECT_NAME创建Pages时填写的项目名称(如果填写 d-randompic 可忽略此变量)

CLOUDFLARE_API_TOKEN 获取方法

获取API-1

点击右上角 支持 右边的 账户图标
获取API-2

点击配置文件
获取API-3

选择API令牌 点击右上角创建令牌
获取API-4
选择创建自定令牌
获取API-5

按照上图配置权限
最后点击获取令牌就可以得到令牌了

CLOUDFLARE_ACCOUNT_ID 获取方法

获取账户ID

红色码住的这一段就是 也可以随便找个域名的页面进去的右侧下滑就有

4.配置 404 规则#

配置Rules 为 404 状态码配置重写规则 表达式见 rule.txt

找到随机图要使用的域名 点击进入

配置Rules-1
在左侧菜单栏里找到 规则>概述
配置Rules-2

点击创建规则
配置Rules-3

选择URL重写规则
配置Rules-4

选择自定义表达式
配置Rules-5

按照上图配置 重写到 后面的内容如下

纯文本
concat(http.request.uri.path, "/", substring(uuidv4(cf.random_seed), 0, 3), ".jpg")

最后保存即可

5.触发Action#

触发Action

进入action页面后 找到左侧的Build and Deploy to Cloudflare Pages 点击右侧的Run workflow
再次点击绿色的Run workflow
最后等待部署成功即可

API 使用#

  • GET /ecy-v:随机二次元图(竖屏/手机)
  • GET /ecy-h:随机二次元图(横屏/电脑)
  • 新增分类 xxx 后,GET /xxx 即生效

示例:

Bash
curl -L https://randompic.pldduck.com/ecy-v

在 HTML 中直接使用:

HTML
<img src="https://randompic.pldduck.com/ecy-v" alt="随机图片">

作者 跑路的duck

帮助改进本文

评论

评论将在滚动到此处时自动加载。