Мост между 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, мария: в Telegram.
  • Безопасность от циклов: сообщения, отправленные самим мостом, никогда не пересылаются обратно.
  • Идемпотентные задачи: повторные попытки и повторные доставки вебхуков никогда не приводят к дублированию сообщений.
  • Учёт ограничений скорости: при HTTP 429 задача ставится в очередь заново ровно через время, указанное Telegram.
  • Корректное снижение функциональности: файлы, превышающие лимиты Bot API (20 МБ на скачивание / 50 МБ на загрузку), заменяются на заметку [файл пропущен: имя (размер)]; неподдерживаемое форматирование превращается в обычный текст.
  • Команда /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): включите плагин, вставьте токен бота и задайте случайный секрет вебхука (например, openssl rand -hex 24).

3. Зарегистрируйте вебхук — проще всего через собственный клиент плагина, который сам задаст правильные allowed_updates:

cd /var/discourse
./launcher enter app
rails runner "puts DiscourseTelegramChatBridge::TelegramClient.new.set_webhook(
  url: 'https://ВАШ-САЙТ/telegram-bridge/webhook',
  secret_token: SiteSetting.telegram_bridge_webhook_secret)"

:warning: allowed_updates хранится в регистрации вебхука на стороне Telegram, а не в коде плагина. Если вы зарегистрируете его вручную и забудете указать edited_message, Telegram молча перестанет доставлять правки.

4. Привяжите каналы — введите /id в каждой группе/теме, затем добавьте по одной строке для каждого привязанного канала в telegram_bridge_mappings:

chat_channel_id:telegram_chat_id:telegram_thread_id

Идентификатор канала Discourse — это число в конце URL канала (/chat/c/<slug>/<id>); оставьте идентификатор потока пустым для общей темы или обычной группы. При каждом запуске и изменении привязок плагин выводит в лог строку active mappings, которую можно отфильтровать через grep, чтобы проверить, что именно привязано.

5. Проверьте — отправьте сообщение в обоих направлениях. Если ничего не происходит, проверьте по порядку: строку лога active mappings, информацию о вебхуке (get_webhook_info) и режим конфиденциальности.

Настройки

Название Описание
telegram_bridge_enabled Главный переключатель моста вкл/выкл.
telegram_bridge_bot_token Токен Telegram Bot API, выданный @BotFather (секретный).
telegram_bridge_webhook_secret Секрет, проверяемый по заголовку X-Telegram-Bot-Api-Secret-Token в входящих запросах вебхука (секретный).
telegram_bridge_mappings Привязки каналов, по одной на строку: chat_channel_id:telegram_chat_id:telegram_thread_id (идентификатор потока необязателен).

:lock: Примечание по конфиденциальности: контент из привязанных каналов покидает ваш экземпляр Discourse и хранится в Telegram (и наоборот). Привязываются только каналы, явно указанные в настройках — но сообщите об этом участникам этих каналов.

1 лайк