后端与接口
在 wrangler/MCP 不适合的…
当需要 Cloudflare 批量 DNS、custom hostnames、email routing、cache purge、WAF/redirect rules、跨 zone 设置、D1/R2/KV/Vectorize/Queues 批量或 fleet 审计时,用 API token 直接执行 REST API 脚本。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 wrangler/MCP 不适合的 特定
解决思路
- 单次操作用 MCP 或 wrangler;批量、fleet 或脚本化操作直接调用 Cloudflare REST API。
- 在 Cloudflare Dashboard → My Profile → API Tokens → Create Token 创建 scoped token,并设置环境变量 `export CLOUDFLARE_API_TOKEN=your-token-here`。
- 验证 token:`curl -s https://api.cloudflare.com/client/v4/user/tokens/verify -H 'Authorization: Bearer $CLOUDFLARE_API_TOKEN' | jq '.success'`。
- 使用最小权限 token:按操作选择预设,例如 `Edit zone DNS`、`Edit zone settings`、`Edit Cloudflare Workers`、`Read analytics`。
- 列出 zones 查找 zone ID:`curl -s 'https://api.cloudflare.com/client/v4/zones?per_page=50' -H 'Authorization: Bearer $CLOUDFLARE_API_TOKEN' | jq '.result[] | {name, id}'`。
- 按域名获取 zone ID:`ZONE_ID=$(curl -s 'https://api.cloudflare.com/client/v4/zones?name=example.com' -H 'Authorization: Bearer $CLOUDFLARE_API_TOKEN' | jq -r '.result[0].id')`。
- 将 Account/Zone ID 存到环境变量或配置文件,不要在脚本中硬编码。
- 批量新增/更新 DNS 记录:读取 CSV,循环对每个记录 POST `/zones/$ZONE_ID/dns_records`,JSON body 包含 `type`、`name`、`content`、`proxied`、`ttl=1`,每次后 `sleep 0.25`,并用 `jq` 输出 `name/id/success`。
- 导出 zone 全部 DNS 记录:`curl -s 'https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?per_page=100' -H 'Authorization: Bearer $CLOUDFLARE_API_TOKEN' | jq -r '.result[] | [.type, .name, .content, .proxied] | @csv' > dns-export.csv`。
- DNS 查找替换:先按 `content=$OLD_IP` GET `/zones/$ZONE_ID/dns_records?content=$OLD_IP` 并取 `jq -r '.result[].id'`,再对每个 `RECORD_ID` PATCH `/zones/$ZONE_ID/dns_records/$RECORD_ID`,body 设置新的 `content`。
- 创建 Custom Hostname:POST `/zones/$ZONE_ID/custom_hostnames`,body 包含 `hostname`,以及 `ssl.method=http`、`ssl.type=dv`、`ssl.settings.min_tls_version=1.2`,用 `jq` 输出 `id/status/ssl_status`。
- 列出 Custom Hostname:GET `/zones/$ZONE_ID/custom_hostnames?per_page=50`,用 `jq` 输出 `hostname/status/ssl_status`。
- 检查 Custom Hostname 状态:GET `/zones/$ZONE_ID/custom_hostnames/$HOSTNAME_ID`,读取 `.result.status`;客户端需添加 CNAME:`app.clientdomain.com → your-worker.your-domain.com`。
- 启用 Email Routing:PUT `/zones/$ZONE_ID/email/routing/enable`。
- 创建 Email Routing 转发规则:POST `/zones/$ZONE_ID/email/routing/rules`,matchers 使用 `type=literal, field=to, value=info@example.com`,actions 使用 `type=forward, value=[real-inbox@gmail.com]`。
- 创建 Email Routing catch-all 规则:POST `/zones/$ZONE_ID/email/routing/rules`,matchers 使用 `type=all`,actions 转发到 `catchall@company.com`。
- 列出 Email Routing 规则:GET `/zones/$ZONE_ID/email/routing/rules`,用 `jq` 输出 `name/enabled/matchers/actions`。
- 清除全部缓存:POST `/zones/$ZONE_ID/purge_cache`,body 设置 `purge_everything=true`。
- 清除指定 URL 缓存:POST `/zones/$ZONE_ID/purge_cache`,body 的 `files` 数组列出目标 URL。
- 按 cache tag 清除缓存:POST `/zones/$ZONE_ID/purge_cache`,body 的 `tags` 数组列出 tag(需要 Enterprise 或 cache tag headers)。
- 按前缀清除缓存:POST `/zones/$ZONE_ID/purge_cache`,body 的 `prefixes` 数组列出前缀 URL。
- 创建单条 Redirect Rule:POST `/zones/$ZONE_ID/rulesets/phases/http_request_dynamic_redirect/entrypoint`,rules 中 expression 使用 `http.request.uri.path eq /old-page`,action=`redirect`,`action_parameters.from_value.target_url.value` 设为目标 URL,`status_code=301`。
- 批量创建 Redirect Rules:用 Python 读取 CSV,为每行 `old_path,new_url` 生成 rules 数组(包含 expression、description、action、action_parameters),最后输出 `{rules: rules}` 的 JSON。
- 跨多个 zone 应用同一设置:定义 `SETTINGS` 的 JSON body,获取 active zones:`curl -s 'https://api.cloudflare.com/client/v4/zones?status=active&per_page=50' -H 'Authorization: Bearer $CLOUDFLARE_API_TOKEN' | jq -r '.result[].id'`,循环对每个 zone PATCH `/zones/$ZONE/settings/ssl` 并使用该 body,每次后 `sleep 0.25`,用 `jq` 输出 zone/success。
- 常见 fleet 设置项:`ssl` 设为 `full` 或 `strict`;`min_tls_version` 设为 `1.2`;`always_use_https` 设为 `on`;`security_level` 设为 `medium`;`browser_cache_ttl` 设为 `14400`。
- 创建 WAF custom rule 按国家封禁:POST `/zones/$ZONE_ID/rulesets/phases/http_request_firewall_custom/entrypoint`,rules 中 expression 如 `ip.geoip.country in {RU CN}`,action=`block`,description 说明用途。
- 创建速率限制规则:POST `/zones/$ZONE_ID/rulesets/phases/http_ratelimit/entrypoint`,rules 中 expression 如 `http.request.uri.path contains /api/`,action=`block`,ratelimit 设置 `characteristics=[ip.src]`、`period=60`、`requests_per_period=100`,description 说明用途。
- 列出 Worker routes:GET `/zones/$ZONE_ID/workers/routes`,用 `jq` 输出 `pattern/id`。
- 创建 Worker route:POST `/zones/$ZONE_ID/workers/routes`,body 设置 `pattern=api.example.com/*`、`script=my-worker`。
- 删除 Worker route:DELETE `/zones/$ZONE_ID/workers/routes/$ROUTE_ID`。
- 查询 Analytics:POST `https://api.cloudflare.com/client/v4/graphql`,GraphQL query 使用 viewer/zones/httpRequests1dGroups 等字段,例如按 `zoneTag` 和 `date_gt` 查询 `requests`、`pageViews`,再 `jq` 读取结果。
- 速率限制:大多数 API 调用 1200 requests / 5 minutes;DNS 记录操作共享该限制;Cache purge 1000 purge calls / day;Zone creation 5 per minute。
- 脚本中持续操作时每次调用之间加 `sleep 0.25`;需要并行时用 `p-limit` 或 `xargs -P 4` 控制并发。
- 根据用户描述生成脚本到 `.jez/scripts/`;脚本应从环境读取 API token,绝不硬编码。
- 脚本需为 list 操作处理分页。
- 脚本需在每次调用后用 `jq '.success'` 做错误检查。
- 脚本需在调用之间加入速率限制 sleep。
- 脚本需记录它做了什么。
- 脚本尽可能支持 `--dry-run`。
- 简单操作优先用 `curl` + `jq`;复杂逻辑(分页循环、错误处理、CSV 处理)用 Python;较大脚本用 TypeScript + `cloudflare` npm 包获得类型安全。
- API 基址:`https://api.cloudflare.com/client/v4/`;完整文档:`https://developers.cloudflare.com/api/`。
- API 模式:GET `/zones` 列表,POST `/zones` 创建,GET `/zones/:id` 读取,PATCH `/zones/:id` 更新,DELETE `/zones/:id` 删除,PUT `/zones/:id/settings/:name` 更新设置。
- 每个响应结构为 `{ success: bool, errors: [], messages: [], result: {} }`。
- 需要 D1、R2、KV、Workers、Vectorize、Queues API 模式时,读取 `references/developer-platform-api.md`。
适用边界 · 注意事项
- 单次部署 Worker、创建 D1 数据库等 wrangler 或 MCP 已能很好完成的单点操作,不用此技能。
- 没有 Cloudflare 账号、API Token,或缺少目标 Zone/Account 权限时不可用。
- 未做权限最小化、速率限制和 dry-run 评估时,不要直接运行批量/fleet 变更。