| Discourse 聊天与 Telegram 之间的实时双向桥接,对 Telegram 论坛主题提供一等支持 | |
| GitHub - babylai/discourse-telegram-chat-bridge: Real-time two-way bridge between Discourse Chat and Telegram (design phase / POC) · GitHub | |
| 如何在 Discourse 中安装插件 |
功能特性
每个 Discourse 聊天频道都映射到一个 Telegram 聊天——可以是普通群组,也可以是启用了主题的超级群组中的特定主题。在一侧发布的消息会在几秒钟内出现在另一侧。
| Discourse → Telegram | Telegram → Discourse | |
|---|---|---|
| 文本(带格式) | ||
| 表情符号 | ||
| 回复 | ||
| 编辑 | ||
| 删除 | ||
| 照片 | ||
| 其他文件 | ||
| 贴纸 | — |
- 作者归属: 机器人无法在任一平台上冒充用户,因此消息会带有粗体前缀的作者信息——Discourse 中为
**Maria:** hello,Telegram 中为 maria:。 - 防循环: 由桥接本身发布的消息永远不会被回传。
- 幂等任务: 重试和 webhook 重新交付永远不会产生重复消息。
- 速率限制感知: 在 HTTP 429 时,任务会在 Telegram 要求的确切等待时间后重新入队。
- 优雅降级: 超过 Bot API 限制的文件(20 MB 下载 / 50 MB 上传)会变成
[文件省略:名称 (大小)]注释;不支持的格式会退化为纯文本。 /id设置命令: 在机器人可见的任何群组或主题中输入/id,它会回复 ID 以及一个可直接粘贴的映射行。
已知限制
- Telegram 中的删除不会同步到 Discourse——Telegram Bot API 没有删除事件。这是一个平台限制,而非配置问题。
- Telegram 只允许机器人在 48 小时内编辑自己的消息;Discourse 中较旧消息的编辑不会反映在 Telegram 端。
- 反应不会被桥接。
- Discourse 聊天线程不会映射到 Telegram 主题;线程回复会被扁平化桥接。
配置
1. 创建 Telegram 机器人
- 通过 @BotFather 创建机器人并复制令牌。
- 禁用隐私模式(
/setprivacy→ 禁用),否则机器人只能看到/commands。
如果机器人已经在群组中,请移除并重新添加它——否则更改不会应用于现有成员资格。 - 将机器人作为管理员添加到群组(需要删除消息权限以实现删除同步)。
- 若要桥接到特定主题,请在群组设置中启用主题。
2. 配置站点设置(管理员 → 插件 → Telegram Bridge):启用插件,粘贴机器人令牌,并设置一个随机的 webhook 密钥(例如 openssl rand -hex 24)。
3. 注册 webhook——最简便的方法是通过插件自身的客户端,它会自动为你设置正确的 allowed_updates:
cd /var/discourse
./launcher enter app
rails runner "puts DiscourseTelegramChatBridge::TelegramClient.new.set_webhook(
url: 'https://YOUR-SITE/telegram-bridge/webhook',
secret_token: SiteSetting.telegram_bridge_webhook_secret)"
allowed_updates 存储在 Telegram 的 webhook 注册中,而不是插件代码中。如果你手动注册并省略 edited_message,Telegram 将静默不传递编辑。
4. 映射频道——在每个群组/主题中输入 /id,然后为每个桥接频道在 telegram_bridge_mappings 中添加一行:
chat_channel_id:telegram_chat_id:telegram_thread_id
Discourse 频道 ID 是频道 URL 末尾的数字(/chat/c/<slug>/<id>);对于普通群组或“常规”主题,留空线程 ID。每次启动和映射更改时,插件都会记录一条 active mappings 摘要行,你可以使用 grep 来确认哪些内容被桥接。
5. 验证——在两个方向发送消息。如果没有任何反应,请按顺序检查:active mappings 日志行、webhook 信息(get_webhook_info)和隐私模式。
设置
| 名称 | 描述 |
|---|---|
telegram_bridge_enabled |
桥接的主开关。 |
telegram_bridge_bot_token |
Telegram Bot API 令牌,由 @BotFather 颁发(保密)。 |
telegram_bridge_webhook_secret |
用于验证传入 webhook 请求中 Telegram 的 X-Telegram-Bot-Api-Secret-Token 标头的密钥(保密)。 |
telegram_bridge_mappings |
频道映射,每行一个:chat_channel_id:telegram_chat_id:telegram_thread_id(线程 ID 可选)。 |
隐私说明: 来自桥接频道的内容会离开你的 Discourse 实例并存储在 Telegram 中(反之亦然)。只有映射中明确列出的频道才会被桥接——但请告知这些频道的成员。
