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 のチャット(通常のグループ、またはトピックが有効なスーパーグループ内の特定のトピック)にマッピングされます。片方のプラットフォームに投稿されたメッセージは、1〜2 秒以内に他方のプラットフォームに表示されます。

Discourse → Telegram Telegram → Discourse
テキスト(フォーマット付き) :white_check_mark: 実 HTML フォーマット :white_check_mark: エンティティ → Markdown
エmoji :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: 静止画は画像として;アニメーションは対応 emoji に変換
  • 著者属性: ボットはどちらのプラットフォームでもユーザーになりすませないため、メッセージには著者を太字のプレフィックスとして付加します — Discourse では **Maria:** hello、Telegram では maria: |
  • ループ安全: ブリッジ自体が投稿したメッセージは、再びリレーされることはありません。
  • 冪等ジョブ: リトライや webhook の再配信により、重複メッセージが生成されることはありません。
  • レート制限対応: HTTP 429 の場合、Telegram が要求した正確な待機時間後にジョブを再キューします。
  • 優雅なフォールバック: Bot API の制限を超えるファイル(ダウンロード 20 MB / アップロード 50 MB)は [file omitted: name (size)] という注釈になります;サポート外のフォーマットはプレーンテキストにフォールバックします。
  • /id セットアップコマンド: ボットが見える任意のグループやトピックに /id と入力すると、ID とそのまま貼り付けられるマッピング行を返信します。

既知の制限

  • Telegram での削除は Discourse に同期されません — Telegram Bot API には削除イベントがありません。これはプラットフォームの制限であり、設定の問題ではありません。
  • Telegram ではボットは 48 時間以内の自分のメッセージのみ編集可能であり、Discourse での古いメッセージの編集は Telegram 側に反映されません。
  • リアクションはブリッジされません。
  • Discourse チャットのスレッドは Telegram トピックにマッピングされません;スレッドへの返信はフラットにブリッジされます。

設定

1. Telegram ボットの作成

  1. @BotFather を介してボットを作成し、トークンをコピーします。
  2. プライバシーモードを無効化/setprivacy → Disable)します。これをしないと、ボットは /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 にブリッジするチャネルごとに 1 行追加します:

chat_channel_id:telegram_chat_id:telegram_thread_id

Discourse チャンネル ID はチャンネル URL の末尾の番号です(/chat/c/<slug>/<id>);General トピックや通常のグループにはスレッド ID を空にします。起動時およびマッピング変更時に、プラグインは active mappings のサマリー行をログに記録し、grep でブリッジ対象を確認できます。

5. 検証 — 両方向にメッセージを送信します。何もない場合は、順に active mappings のログ行、webhook 情報(get_webhook_info)、プライバシーモードを確認します。

設定項目

名前 説明
telegram_bridge_enabled ブリッジのマスターオン/オフスイッチ。
telegram_bridge_bot_token @BotFather が発行する Telegram Bot API トークン(秘密)。
telegram_bridge_webhook_secret 受信 webhook リクエストの Telegram の X-Telegram-Bot-Api-Secret-Token ヘッダーに対して検証されるシークレット(秘密)。
telegram_bridge_mappings チャネルマッピング、1 行ずつ:chat_channel_id:telegram_chat_id:telegram_thread_id(スレッド ID はオプション)。

:lock: プライバシーに関する注意: ブリッジされたチャネルのコンテンツは、Discourse インスタンスを離れ、Telegram に保存されます(その逆も同様)。明示的にマッピングリストに記載されたチャネルのみがブリッジされます — ただし、そのチャネルのメンバーには告知してください。

「いいね!」 1