| Мост в реальном времени между чатом 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, мария: в Telegram. - Безопасность от циклов: сообщения, отправленные самим мостом, никогда не пересылаются обратно.
- Идемпотентные задачи: повторные попытки и повторные доставки вебхуков никогда не приводят к дублированию сообщений.
- Учёт ограничений скорости: при HTTP 429 задача ставится в очередь заново ровно через время, указанное Telegram.
- Корректное снижение функциональности: файлы, превышающие лимиты Bot API (20 МБ на скачивание / 50 МБ на загрузку), заменяются на заметку
[файл пропущен: имя (размер)]; неподдерживаемое форматирование превращается в обычный текст. - Команда
/idдля настройки: введите/idв любой группе или теме, где есть бот, и он ответит идентификаторами и готовой строкой для привязки.
Известные ограничения
- Удаления в Telegram не синхронизируются с Discourse — в Telegram Bot API нет события удаления. Это ограничение платформы, а не проблема конфигурации.
- Telegram позволяет ботам редактировать только свои сообщения в течение 48 часов; правки старых сообщений в Discourse не отражаются в Telegram.
- Реакции не передаются.
- Чат-потоки Discourse не привязываются к темам Telegram; ответы в потоках передаются плоским образом.
Конфигурация
1. Создайте бота в Telegram
- Создайте бота через @BotFather и скопируйте токен.
- Отключите режим конфиденциальности (
/setprivacy→ Disable), иначе бот будет видеть только/commands.
Если бот уже находится в группе, удалите и добавьте его заново — иначе изменения не применятся к существующим членствам. - Добавьте бота в группу как администратора (ему нужно право Удалять сообщения для синхронизации удалений).
- Чтобы привязать конкретные темы, включите Темы в настройках группы.
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)"
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 (идентификатор потока необязателен). |
Примечание по конфиденциальности: контент из привязанных каналов покидает ваш экземпляр Discourse и хранится в Telegram (и наоборот). Привязываются только каналы, явно указанные в настройках — но сообщите об этом участникам этих каналов.
