Cloudflare WeChat Notifier

May 14, 2026 · View on GitHub

基于 Cloudflare Workers + Hono + D1 + Queues 的 iLink / WeClawBot Webhook 服务。

它把外部系统的文本通知桥接到微信 ClawBot,并补齐了 iLink 协议在云端部署时常见的几个缺口:扫码登录、context_token 激活、投递日志、异步重试,以及一个可直接在浏览器里操作的轻量管理页面。

Deploy to Cloudflare Workers

flowchart LR
  A["GitHub / CI / 监控系统 / 任意业务服务"] --> B["/webhook/:source"]
  B --> C["Cloudflare Worker (Hono)"]
  C --> D[("D1: bot_state / login_session / delivery_log")]
  C --> E["Cloudflare Queue"]
  E --> F["iLink API / WeClawBot-API"]
  F --> G["微信 ClawBot"]
  C --> H["Dashboard / 二维码页 / 日志中心"]

目录


功能特性

能力说明
Webhook 入站通过 POST /webhook/:source 接收业务系统通知,校验后快速入队,立即返回 202
iLink 协议封装内置 get_bot_qrcodeget_qrcode_statusgetupdatessendmessagesendtyping
Bot 扫码登录提供二维码会话创建、扫码状态轮询、登录结果持久化
Bot 激活首次登录后可主动执行激活,拿到 context_tokenget_updates_buf
异步投递通过 Cloudflare Queues 解耦入站和发信,支持失败重试
敏感信息加密bot_tokenilink_user_idcontext_token 等敏感字段入库前使用 AES-GCM 加密
投递日志记录 trace_iddedupe_key、状态、响应码、错误信息和尝试次数
幂等支持传入 dedupeKey 时,按 source + dedupeKey 防止重复投递
自动保活提醒通过 Worker 定时任务每 24 小时自动入队一条交互保活提醒
管理页面提供总览页、二维码页、日志中心,适合部署后直接使用

技术栈

模块选型说明
运行时Cloudflare Workers承载 HTTP 服务和队列消费者
路由层Hono适合 Worker 的轻量路由与中间件
数据库Cloudflare D1保存 bot 状态、登录会话、投递日志
队列Cloudflare Queues实现入站异步化和失败重试
语言TypeScript统一接口契约和类型约束
测试Vitest覆盖路由、加密逻辑、队列消费和协议适配
二维码qrcode服务端渲染 SVG 登录二维码

适用场景

场景是否适合
GitHub Actions / CI 完成后推送微信通知适合
监控告警、值班消息、部署回调推送到微信适合
只想要一个单 bot、单租户的轻量通知桥接适合
多 bot、多租户、复杂权限系统暂不适合
图片、文件、富媒体消息转发暂不支持

快速开始

1. 克隆并安装依赖

git clone <your-repo-url>
cd ilink-cloudflare
npm install

2. 创建 Cloudflare 资源

npx wrangler d1 create ilink-cloudflare
npx wrangler queues create ilink-notification-queue

3. 复制并填写 wrangler.toml

Copy-Item wrangler.toml.example wrangler.toml

把上一步输出中的 D1 database_id 填回 wrangler.toml,并确认 queue 名与配置一致。

4. 配置本地环境

Copy-Item .dev.vars.example .dev.vars

.dev.vars 示例:

ADMIN_TOKEN=replace-with-admin-token
WEBHOOK_SHARED_TOKEN=replace-with-webhook-token
BOT_STATE_ENC_KEY=replace-with-long-random-secret
ILINK_BASE_URL=https://ilinkai.weixin.qq.com
KEEPALIVE_ENABLED=true
KEEPALIVE_INTERVAL_HOURS=24
KEEPALIVE_TEXT=【保活提醒】请和微信 ClawBot 进行一次交互,保持 iLink 上下文可用。

5. 配置 Cloudflare Secrets

npx wrangler secret put ADMIN_TOKEN
npx wrangler secret put WEBHOOK_SHARED_TOKEN
npx wrangler secret put BOT_STATE_ENC_KEY

6. 初始化数据库

npm run cf:migrate:local
npm run cf:migrate:remote

7. 本地调试或部署

npm run dev
npm run deploy

部署成功后,你会得到一个 https://<your-worker>.workers.dev 地址。


配置项说明

配置项类型必填用途
ADMIN_TOKENSecret保护 /admin/*/api/* 接口
WEBHOOK_SHARED_TOKENSecret校验 /webhook/:source 请求头中的 X-Webhook-Token
BOT_STATE_ENC_KEYSecret加密 D1 中保存的敏感 bot 信息
ILINK_BASE_URLVariableiLink API 地址,默认 https://ilinkai.weixin.qq.com
KEEPALIVE_ENABLEDVariable是否启用自动保活提醒,默认 true
KEEPALIVE_INTERVAL_HOURSVariable自动保活提醒间隔小时数,默认 24
KEEPALIVE_TEXTVariable自动保活提醒文本
DBD1 BindingD1 数据库绑定
NOTIFICATION_QUEUEQueue Binding消息投递队列绑定

使用流程

步骤操作
1打开 /admin/dashboard?token=ADMIN_TOKEN 进入总览页
2点击“打开二维码页”,或直接访问 /admin/bot/login/qrcode/page?token=ADMIN_TOKEN
3使用微信扫码,轮询到 confirmed 为止
4给“微信ClawBot”发一条消息,生成可用上下文
5回到总览页点击“尝试激活”,拿到 context_token
6/api/send 发送测试消息,或让外部系统调用 /webhook/:source
7/admin/deliveries/page?token=ADMIN_TOKEN 查看投递结果和失败原因

管理页面

页面地址说明
总览页/admin/dashboard?token=ADMIN_TOKEN查看 bot 状态、手动激活、测试发信、最近日志
二维码页/admin/bot/login/qrcode/page?token=ADMIN_TOKEN浏览器直接展示登录二维码并自动轮询扫码状态
日志中心/admin/deliveries/page?token=ADMIN_TOKEN筛选日志、查看详情、自动刷新

示例:

http://127.0.0.1:8787/admin/dashboard?token=ADMIN_TOKEN&refresh=10&logsLimit=12
http://127.0.0.1:8787/admin/bot/login/qrcode/page?token=ADMIN_TOKEN
http://127.0.0.1:8787/admin/deliveries/page?token=ADMIN_TOKEN&status=failed&limit=50&refresh=10

截图

Dashboard 总览

二维码登录页


API 快览

方法路径鉴权方式说明
GET/healthz健康检查,返回数据库和队列状态
POST/admin/bot/login/qrcodeAuthorization: Bearer ADMIN_TOKEN创建登录二维码会话
GET/admin/bot/login/status/:sessionIdAuthorization: Bearer ADMIN_TOKEN?token=查询扫码状态
POST/admin/bot/activateAuthorization: Bearer ADMIN_TOKEN?token=激活 bot,尝试获取 context_token
GET/admin/bot/statusAuthorization: Bearer ADMIN_TOKEN?token=查询当前 bot 状态
GET/admin/deliveriesAuthorization: Bearer ADMIN_TOKEN?token=查询投递日志列表
GET/admin/deliveries/:deliveryIdAuthorization: Bearer ADMIN_TOKEN?token=查询单条投递详情
POST/api/sendAuthorization: Bearer ADMIN_TOKEN管理员手动发送测试消息
POST/webhook/:sourceX-Webhook-Token外部系统推送通知入口

请求示例

1. 发送测试消息

curl -X POST "http://127.0.0.1:8787/api/send" -H "Content-Type: application/json" -H "Authorization: Bearer ADMIN_TOKEN" -d "{\"text\":\"Cloudflare deploy succeeded\",\"dedupeKey\":\"deploy-20260326-1\"}"

2. 调用业务 Webhook

curl -X POST "http://127.0.0.1:8787/webhook/github" -H "Content-Type: application/json" -H "X-Webhook-Token: WEBHOOK_SHARED_TOKEN" -d "{\"text\":\"Release v1.0.0 published\",\"traceId\":\"github-release-001\",\"meta\":{\"repo\":\"demo/app\"}}"

3. 查询最近日志

curl "http://127.0.0.1:8787/admin/deliveries?token=ADMIN_TOKEN&limit=20&status=delivered"

4. 标准消息体

{
  "text": "build completed",
  "traceId": "optional-trace-id",
  "dedupeKey": "optional-dedupe-key",
  "meta": {
    "env": "prod"
  }
}

项目结构

路径说明
src/index.tsWorker 入口,同时处理 HTTP 和 Queue Consumer
src/app.tsHono 路由定义和鉴权
src/ilink/client.tsiLink 协议客户端
src/services/管理、投递、健康检查等业务服务
src/storage/D1 仓储层
src/lib/加密、校验、页面模板、错误处理等基础能力
src/queue/consumer.tsQueue 消费与重试流程
migrations/0001_init.sqlD1 初始化表结构
test/Vitest 测试用例

开发命令

命令说明
npm run dev本地启动 Worker
npm run deploy部署到 Cloudflare Workers
npm run typecheck执行 TypeScript 类型检查
npm test执行测试
npm run test:watch监听模式运行测试
npm run cf:migrate:local对本地 D1 应用迁移
npm run cf:migrate:remote对远程 D1 应用迁移
npm run cf:types生成 Cloudflare 绑定类型

当前限制

项目说明
单 bot当前只维护一个活跃 bot 状态
单租户没有多用户和权限体系
仅文本消息暂不支持图片、文件、卡片等复杂消息类型
无 iLink 入站转发当前只处理“外部系统 -> 微信”这条链路
管理端较轻量目前是 HTML 管理页,不是完整 SPA 控制台

协议参考


许可证

MIT