简介
WebHooker 是一个基于 Cloudflare Workers 构建的 GitHub/Gitea webhook 调度器。它接收来自受支持 forge(GitHub、Gitea——更多可通过 server/lib/providers/ 扩展)的 webhook 事件,应用可配置的过滤器,将事件格式化为富消息,并通过各自 REST API 投递到 Discord 频道/子区(embed)与 Telegram 群组/话题(HTML)。Discord 内的 /gh 交互通过 HTTPS Interactions Endpoint(Ed25519 验签)送达;Telegram 的 /gh 命令通过 Telegram webhook 送达。路由与分组通过内置的 Web UI 管理。
架构
text
GitHub / Gitea Webhook → Cloudflare Worker (Nuxt 4 / Nitro)
├── POST /webhook → 识别提供方 → 验证 → 去重 → 过滤 → 格式化 → Discord (REST) / Telegram (Bot API)
├── POST /discord/interactions → 验证 (Ed25519) → 处理 /gh 斜杠与右键命令
├── POST /telegram/webhook → 验证 (secret token) → 处理 /gh 命令
├── GET /auth/github → OAuth 流程
├── GET /api/richheader → Telegram 头像链接预览卡片
├── POST /api/* → 用户操作 (Bearer Token 鉴权)
├── /admin → 路由、分组与发送日志 Web UI(管理员会话)
└── GET /health → 健康检查组件
| 组件 | 职责 |
|---|---|
| Cloudflare Worker | HTTP 入口、签名验证、投递去重、事件解析、路由匹配、平台分发 |
| Interactions Endpoint | 验证 Ed25519 签名并处理 /gh 交互(斜杠命令、右键菜单、按钮、modal) |
| KV | Token 存储 (token:{userId})、OAuth 状态 (state:{hex})、路由配置 (config:routes)、分组配置 (config:groups)、管理员会话、投递去重、消息更新追踪 (msg:*) |
| D1 | 发送日志 (send_logs)、Discord↔GitHub 绑定 (discord_links)、Telegram↔GitHub 绑定 (telegram_links) |
数据流
- 某个 forge(GitHub 或 Gitea)发送 webhook 到
POST /webhook - Worker 根据请求头识别提供方(
X-GitHub-Event/X-Gitea-Event)并验证对应提供的 HMAC-SHA256 签名 - Worker 按投递 ID 去重(KV,短 TTL),丢弃重复投递
- Worker 解析事件类型并将载荷归一化为 GitHub 形状的事件
- 根据过滤器(event、repo、actor、action、branch、keyword)与分组所有者限制评估路由
- 匹配的路由触发格式化器函数生成平台中立消息
- 每条消息通过 Discord 或 Telegram REST API 发送到对应路由的目标,并处理速率限制重试;
workflow_run/check_run进度原地更新。每次尝试都记录到 D1 发送日志
技术栈
- 运行时: Cloudflare Workers
- HTTP 框架: Nuxt 4 / Nitro (H3)
- Discord 投递: Discord REST API(交互通过 Ed25519 验签的 HTTPS Interactions Endpoint)
- Telegram 投递: Telegram Bot API(webhook 带可选 secret-token 校验)
- Web UI: Nuxt 4(Vue 3 + Tailwind CSS v3)——首页/法律页面服务端渲染,
/admin控制台客户端渲染 - 存储: Cloudflare KV + D1
- 鉴权: Web Crypto API (HMAC-SHA256、Ed25519)、octokit (GitHub API)
- 语言: TypeScript
许可证
MIT