FlareGram 是一个基于 Cloudflare Workers + grammY + D1 的 Telegram 双向私信中转机器人。
当前版本支持:
- 用户私聊机器人
- 机器人将消息转发给单个管理员
- 管理员在 Telegram 中直接回复该转发消息
- 机器人将管理员回复回传给原用户
- Cloudflare Workers
- Cloudflare D1
- Wrangler
- grammY
- TypeScript
- Vitest
- Node.js
20+ pnpm- Cloudflare 账号
- 一个已通过
@BotFather创建的 Telegram Bot
pnpm installpnpm wrangler loginpnpm wrangler d1 create flaregram执行后会返回一段类似下面的信息:
[[d1_databases]]
binding = "DB"
database_name = "flaregram"
database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
把返回的 database_id 填到项目根目录的 wrangler.jsonc:
你需要知道“接收所有私信转发的管理员账号”的 chat_id。
最简单的方式:
- 先在 Telegram 里给机器人发一条消息
- 临时调用 Telegram API 查看 update
curl "https://api.telegram.org/bot<你的BOT_TOKEN>/getUpdates"在返回 JSON 里找到管理员账号对应的:
message.from.id- 或
message.chat.id
然后把它填到 wrangler.jsonc:
{
"vars": {
"ADMIN_CHAT_ID": "你的管理员 chat id"
}
}pnpm wrangler secret put BOT_TOKEN
pnpm wrangler secret put WEBHOOK_SECRET建议:
BOT_TOKEN:直接填 BotFather 给你的 tokenWEBHOOK_SECRET:填一个高强度随机字符串,例如flaregram-prod-2026-xxxxxx
说明:
BOT_INFO不再需要手工配置- Worker 会在首次请求时基于
BOT_TOKEN自动调用 TelegramgetMe获取 bot 信息 - 如果你之前已经配置过
BOT_INFO,当前版本仍会兼容读取,但新部署可以不再设置
先把表结构应用到远端 D1:
pnpm run db:migrate:remote如果你只想先本地验证 D1 SQL,也可以用:
pnpm run db:migrate:localpnpm run deploy默认情况下,部署完成后你会拿到 Worker 地址,通常类似:
https://flaregram.<your-subdomain>.workers.dev
如果你要直接绑定 Cloudflare 托管的自定义域名,推荐把它写进 wrangler.jsonc,并把本地配置作为唯一真源。例如:
{
"routes": [
{
"pattern": "flaregram.knowsky404.com",
"custom_domain": true
}
]
}说明:
custom_domain: true适用于“这个子域名的所有流量都直接交给 Worker 处理”- 当域名所在 Zone 已托管在 Cloudflare 时,Cloudflare 会自动为 Custom Domain 管理 DNS 记录和证书
- 如果你之后仍使用
wrangler deploy,不要只在 Cloudflare Dashboard 里修改路由;下次部署时本地wrangler.jsonc会覆盖 Dashboard 中的路由配置
本项目 webhook 路径固定为:
/telegram/webhook/<WEBHOOK_SECRET>
例如你的 Worker 域名是:
https://flaregram.<your-subdomain>.workers.dev
如果你使用自定义域名,例如:
https://flaregram.knowsky404.com
并且 WEBHOOK_SECRET 是:
my-secret-path
那么完整 webhook 地址就是:
https://flaregram.<your-subdomain>.workers.dev/telegram/webhook/my-secret-path
使用自定义域名时,则是:
https://flaregram.knowsky404.com/telegram/webhook/my-secret-path
注册命令:
curl "https://api.telegram.org/bot<你的BOT_TOKEN>/setWebhook?url=https://flaregram.<your-subdomain>.workers.dev/telegram/webhook/<你的WEBHOOK_SECRET>"如果你已经切到自定义域名,请改成:
curl "https://api.telegram.org/bot<你的BOT_TOKEN>/setWebhook?url=https://flaregram.knowsky404.com/telegram/webhook/<你的WEBHOOK_SECRET>"检查 webhook 状态:
curl "https://api.telegram.org/bot<你的BOT_TOKEN>/getWebhookInfo"按下面顺序测试:
- 普通用户私聊机器人,发送一条文本消息
- 管理员账号应收到机器人转发的该消息
- 管理员直接“回复这条转发消息”
- 原用户应收到管理员回复
再补测一次非文本消息,例如图片、文件、表情包或动图,确认 copyMessage 路径正常。
运行单元测试:
pnpm test运行类型检查:
pnpm exec tsc --noEmit优先检查:
- Worker 是否已成功部署
WEBHOOK_SECRET是否和注册 URL 完全一致getWebhookInfo是否返回最近错误
先检查你是不是“回复了那条机器人转发消息本身”。
这个项目当前靠 reply_to_message.message_id 去 D1 查映射,如果你不是直接回复那条消息,而是新发一条独立消息,机器人不会知道应该回给谁。
通常原因:
- 不是回复那条转发消息
- D1 还没初始化成功
- 部署的是旧版本代码
常见原因:
- 用户屏蔽了机器人
- 用户从未真正和机器人建立私聊
- Telegram 侧临时错误
这类问题一般出现在受限沙箱或 CI 环境里。真实本地机器上执行通常不会有问题。优先在你自己的终端环境里运行:
pnpm wrangler d1 create flaregram
pnpm run db:migrate:remote
pnpm run deploy当前版本故意保持最简,只支持:
- 单管理员
- 通过“回复转发消息”回私信
- 无 Web 管理后台
- 无多客服分配
- 无自动回复规则
如果你准备在验证部署后继续迭代,下一步最值得加的是:
- 管理员身份校验与更清晰的错误提示
- webhook 注册/检查脚本
- 多管理员支持
{ "d1_databases": [ { "binding": "DB", "database_name": "flaregram", "database_id": "你的真实 database_id" } ] }