cf-cron-hub

🤖 AI / 脚本使用说明 · 怎么增删改任务(点此折叠/展开)

AI / 脚本使用说明 · 怎么增删改任务

本服务是 Cloudflare cron 调度中枢:只占用 1 个 cron 名额(免费账户全账户上限 5 个), 转而按配置驱动任意多个定时任务。全部操作走 REST API,认证只需一个请求头 x-admin-key,不需要登录、不需要 Cookie。

⚠️ 下面示例里的 <ADMIN_PASS> 是占位符,必须先替换成真实后台密码

本页公开可访问,出于安全不写明文密码。把示例中每一处 <ADMIN_PASS> 原样替换为后台密码(连尖括号一起换掉,最终形如 -H "x-admin-key: 你的密码")再执行。 密码值 = 部署时 wrangler.toml 里 [vars] ADMIN_PASS 的值; 本机可直接 grep ADMIN_PASS E:/cf-wrangler/cf-cron-hub/wrangler.toml 取到。 密码忘了或想换:改 ADMIN_PASS 后重新 wrangler deploy 即可(旧密码立即失效)。

操作方法 · 路径说明
列出全部任务GET /api/tasks含推算出的上次 / 下次执行时间
增 · 新增任务POST /api/tasksbody = 一个任务对象;id 已存在则为整体覆盖更新
改 · 局部更新PATCH /api/tasks/<id>例如 {"enabled":false} 临时暂停
删 · 删除任务DELETE /api/tasks/<id>
立即试跑一次POST /api/run/<id>同步返回结果;加完任务务必跑一次
失败记录 / 清空GET /api/errors · POST /api/errors/clear
全量配置读写GET | PUT /api/configPUT 的 body 为 {"tasks":[...]}
字段自描述GET /api/schema机器可读:全部字段含义 + 端点清单

任务对象长什么样

{
  "id": "my-job",                    // 唯一标识,建议 kebab-case
  "name": "我的任务",                 // 显示名
  "note": "这条干嘛的",               // 备注,可空
  "enabled": true,                   // false = 暂停(保留配置)
  "schedule": {
    "type": "interval",              // interval 按秒数 | cron 按表达式
    "seconds": 900                   // 60 每分钟 / 300 每5分 / 900 每15分 / 3600 每小时 / 86400 每天
  },                                 // cron 模式改写成: "schedule":{"type":"cron","expr":"0 * * * *"}(UTC 时间)
  "action": {
    "type": "http",                  // http 发请求 | binding 走内部 Service Binding
    "method": "POST",
    "url": "https://目标域名/路径",
    "headers": { "Authorization": "Bearer 目标需要的密钥" },
    "body": null,
    "timeout_ms": 60000              // 上限 120000
  }
}

复制即用:增 / 删 / 改 (记得先把 <ADMIN_PASS> 换成真实密码)

# 增(幂等:同一个 id 再 POST 一次就是更新)
curl -X POST https://cron.panglina.cc.cd/api/tasks \
  -H "x-admin-key: <ADMIN_PASS>" -H "content-type: application/json" \
  -d '{"id":"my-job","name":"我的任务","enabled":true,"schedule":{"type":"interval","seconds":900},"action":{"type":"http","method":"GET","url":"https://example.panglina.ccwu.cc/health","timeout_ms":30000}}'

# 改(局部,例如暂停)
curl -X PATCH https://cron.panglina.cc.cd/api/tasks/my-job \
  -H "x-admin-key: <ADMIN_PASS>" -H "content-type: application/json" -d '{"enabled":false}'

# 删
curl -X DELETE https://cron.panglina.cc.cd/api/tasks/my-job -H "x-admin-key: <ADMIN_PASS>"

# 试跑验证(必做)
curl -X POST https://cron.panglina.cc.cd/api/run/my-job -H "x-admin-key: <ADMIN_PASS>"
★ 三条硬规则(都是踩过的坑)
  1. 目标 URL 必须跨 zone。本调度器服务在 cron.panglina.cc.cd,其 zone 是 panglina.cc.cd。 两种形态,背后是同一条规则(Cloudflare 不支持取同 zone 的另一个 Worker):
    ① 目标同在 panglina.cc.cd 这个 zone(如 xxx.panglina.cc.cd)→ HTTP 403 + error code 1014;
    ② 目标是 *.workers.dev(与本服务自己的 cf-cron-hub.<账户>.workers.dev 属于同一个 zone)→ HTTP 404 + error code 1042,并且它只在定时触发时失败、手动试跑却是 200,极具迷惑性。
    两者的特征都极隐蔽:本机 curl 同一个地址完全正常,只有 Worker 里调失败,很容易误判成密钥错。 解法:一律改用跨 zone 的同构域名 *.panglina.ccwu.cc 或 *.panglina.ggff.net; 目标没有自定义域名就先给它绑一个,或用 Service Binding 走内网。
  2. 目标别指向本服务自己的域名(cron.panglina.cc.cd)→ Worker 公网自请求必 522。
  3. 加完任务必须 POST /api/run/<id> 试跑,别只看创建成功。 ⚠️ 但要知道 试跑通过 ≠ 定时能跑:试跑带入站 Host,zone 判定宽松;定时 tick 没有入站请求, 会退回本服务自己的 zone(见上面规则 1 的 1042 形态)。想真验证定时链路, 把周期临时改成 60 秒、等两分钟、再改回原值。
  4. ⚠️ 长间隔任务(seconds >= 3600)不能用纯跨槽算法判定 —— 2026-09-15 实测:CF 在整点整分那一分钟会漏触发 tick,而长任务每天只有 1~4 次窗口 (且 86400 与 21600 的槽边界都落在 00:00 UTC), 一次漏触发 = 全部长任务集体停摆,且成功不落盘 ⇒ 零痕迹、零告警(曾静默停摆 20 小时)。 现已修复:长任务 / cron 任务改用持久化 lastRun 判定,漏 tick 下一分钟自动补跑,天然自愈。
    判断任务是否真跑,只认 GET /api/tasks 里的 lastRunReal (真实执行时间)或目标侧副作用;绝不要看 lastRunAt / nextRunAt —— 那是配置反推值,永远看着正常,会骗人。

成本:短任务(< 3600 秒)刻意做到日常 0 次 KV 写入(执行成功不落盘,执行时间由跨槽算法反推); 长任务 / cron 任务每次执行写 1 次 lastruns(当前配置约 10 次/天,是修复静默停摆的必要代价)。 仅改配置、手动试跑、任务失败时额外写。免费层 KV 写入仅 1000 次/天且全账户共享,所以这条是硬约束。 完整改造文档见工程目录 E:\cf-wrangler\cf-cron-hub\AI-GUIDE.md。