Puente de chat entre Discourse y Telegram

:information_source: Resumen Puente bidireccional en tiempo real entre Discourse Chat y Telegram, con soporte de primera clase para temas de foros de Telegram
:hammer_and_wrench: Enlace al repositorio GitHub - babylai/discourse-telegram-chat-bridge: Real-time two-way bridge between Discourse Chat and Telegram (design phase / POC) · GitHub
:open_book: Guía de instalación Cómo instalar plugins en Discourse

Características

Cada canal de chat de Discourse se asigna a un chat de Telegram: ya sea un grupo simple o un tema específico en un supergrupo con temas habilitados. Un mensaje publicado en un lado aparece en el otro en uno o dos segundos.

Discourse → Telegram Telegram → Discourse
Texto (con formato) :white_check_mark: formato HTML real :white_check_mark: entidades → Markdown
Emojis :white_check_mark: :white_check_mark:
Respuestas :white_check_mark: :white_check_mark:
Ediciones :white_check_mark: :white_check_mark:
Eliminaciones :white_check_mark: :cross_mark: (limitación de la API de bots, ver más abajo)
Fotos :white_check_mark: fotos y álbumes :white_check_mark: descargadas y re-subidas
Otros archivos :white_check_mark: :white_check_mark: documentos, video, audio, voz
Stickers :white_check_mark: estáticos como imagen; animados degradados a su emoji
  • Atribución del autor: los bots no pueden suplantar a los usuarios en ninguna plataforma, por lo que los mensajes llevan el autor como prefijo en negrita: **María:** hola en Discourse, maría: en Telegram.
  • Seguro contra bucles: los mensajes publicados por el puente mismo nunca se retransmiten.
  • Trabajos idempotentes: los reintentos y reentregas de webhooks nunca producen mensajes duplicados.
  • Consciente de límites de tasa: ante HTTP 429, el trabajo se vuelve a encolar después de exactamente el tiempo de espera que Telegram solicita.
  • Degradación elegante: los archivos que superan los límites de la API de bots (20 MB de descarga / 50 MB de subida) se convierten en una nota [archivo omitido: nombre (tamaño)]; el formato no compatible se degrada a texto plano.
  • Comando de configuración /id: escribe /id en cualquier grupo o tema que el bot pueda ver y responderá con los IDs más una línea de mapeo lista para pegar.

Limitaciones conocidas

  • Las eliminaciones en Telegram no se sincronizan con Discourse — la API de bots de Telegram no tiene evento de eliminación. Esta es una limitación de la plataforma, no un problema de configuración.
  • Telegram solo permite a los bots editar sus propios mensajes durante 48 horas; las ediciones de Discourse de mensajes más antiguos no se reflejan en el lado de Telegram.
  • Las reacciones no se puentean.
  • Los hilos de chat de Discourse no se asignan a temas de Telegram; las respuestas de hilos se puentean de forma plana.

Configuración

1. Crear el bot de Telegram

  1. Crea un bot a través de @BotFather y copia el token.
  2. Desactiva el modo de privacidad (/setprivacy → Desactivar), o el bot solo verá /comandos. :warning: Si el bot ya está en un grupo, elimínalo y vuelvelo a agregar — el cambio no se aplica a las membresías existentes de otra manera.
  3. Agrega el bot a tu grupo como administrador (necesita Eliminar mensajes para la sincronización de eliminaciones).
  4. Para puenteo a temas específicos, habilita Temas en la configuración del grupo.

2. Configurar los ajustes del sitio (Admin → Plugins → Puente Telegram): habilita el plugin, pega el token del bot y establece un secreto de webhook aleatorio (por ejemplo, openssl rand -hex 24).

3. Registrar el webhook — lo más fácil a través del propio cliente del plugin, que establece los allowed_updates correctos por ti:

cd /var/discourse
./launcher enter app
rails runner "puts DiscourseTelegramChatBridge::TelegramClient.new.set_webhook(
  url: 'https://TU-SITIO/telegram-bridge/webhook',
  secret_token: SiteSetting.telegram_bridge_webhook_secret)"

:warning: allowed_updates vive en el registro de webhook almacenado en Telegram, no en el código del plugin. Si registras manualmente y omites edited_message, Telegram silenciosamente nunca entregará ediciones.

4. Mapear canales — escribe /id en cada grupo/tema, luego agrega una línea por canal puenteado a telegram_bridge_mappings:

id_canal_chat:id_chat_telegram:id_hilo_telegram

El ID del canal de Discourse es el número al final de la URL del canal (/chat/c/<slug>/<id>); deja el ID de hilo en blanco para el tema General o un grupo simple. En cada arranque y cambio de mapeo, el plugin registra una línea resumen de mapeos activos que puedes buscar con grep para confirmar qué está puenteado.

5. Verificar — envía un mensaje en cada dirección. Si no ocurre nada, verifica en orden: la línea de registro de mapeos activos, la información del webhook (get_webhook_info) y el modo de privacidad.

Ajustes

Nombre Descripción
telegram_bridge_enabled Interruptor principal de encendido/apagado del puente.
telegram_bridge_bot_token Token de la API de bots de Telegram, emitido por @BotFather (secreto).
telegram_bridge_webhook_secret Secreto validado contra el encabezado X-Telegram-Bot-Api-Secret-Token de Telegram en solicitudes entrantes de webhook (secreto).
telegram_bridge_mappings Mapeos de canales, uno por línea: id_canal_chat:id_chat_telegram:id_hilo_telegram (ID de hilo opcional).

:lock: Nota de privacidad: el contenido de los canales puenteados sale de tu instancia de Discourse y se almacena con Telegram (y viceversa). Solo los canales explícitamente listados en los mapeos se puentean — pero informa a los miembros de esos canales.

1 me gusta