Discourse-Telegram 聊天桥接

:information_source: 摘要 Discourse 聊天与 Telegram 之间的实时双向桥接,对 Telegram 论坛主题提供一等支持
:hammer_and_wrench: 仓库链接 GitHub - babylai/discourse-telegram-chat-bridge: Real-time two-way bridge between Discourse Chat and Telegram (design phase / POC) · GitHub
:open_book: 安装指南 如何在 Discourse 中安装插件

功能特性

每个 Discourse 聊天频道都映射到一个 Telegram 聊天——可以是普通群组,也可以是启用了主题的超级群组中的特定主题。在一侧发布的消息会在几秒钟内出现在另一侧。

Discourse → Telegram Telegram → Discourse
文本(带格式) :white_check_mark: 真实的 HTML 格式 :white_check_mark: 实体 → Markdown
表情符号 :white_check_mark: :white_check_mark:
回复 :white_check_mark: :white_check_mark:
编辑 :white_check_mark: :white_check_mark:
删除 :white_check_mark: :cross_mark:(Bot API 限制,见下文)
照片 :white_check_mark: 照片和相册 :white_check_mark: 下载并重新上传
其他文件 :white_check_mark: :white_check_mark: 文档、视频、音频、语音
贴纸 :white_check_mark: 静态作为图片;动态退化为表情符号
  • 作者归属: 机器人无法在任一平台上冒充用户,因此消息会带有粗体前缀的作者信息——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 机器人

  1. 通过 @BotFather 创建机器人并复制令牌。
  2. 禁用隐私模式/setprivacy → 禁用),否则机器人只能看到 /commands:warning: 如果机器人已经在群组中,请移除并重新添加它——否则更改不会应用于现有成员资格。
  3. 将机器人作为管理员添加到群组(需要删除消息权限以实现删除同步)。
  4. 若要桥接到特定主题,请在群组设置中启用主题

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)"

:warning: 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 可选)。

:lock: 隐私说明: 来自桥接频道的内容会离开你的 Discourse 实例并存储在 Telegram 中(反之亦然)。只有映射中明确列出的频道才会被桥接——但请告知这些频道的成员。

1 个赞