| Puente bidireccional en tiempo real entre Discourse Chat y Telegram, con soporte de primera clase para temas de foros de Telegram | |
| GitHub - babylai/discourse-telegram-chat-bridge: Real-time two-way bridge between Discourse Chat and Telegram (design phase / POC) · GitHub | |
| 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) | ||
| Emojis | ||
| Respuestas | ||
| Ediciones | ||
| Eliminaciones | ||
| Fotos | ||
| Otros archivos | ||
| Stickers | — |
- 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:** holaen 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/iden 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
- Crea un bot a través de @BotFather y copia el token.
- Desactiva el modo de privacidad (
/setprivacy→ Desactivar), o el bot solo verá/comandos.
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. - Agrega el bot a tu grupo como administrador (necesita Eliminar mensajes para la sincronización de eliminaciones).
- 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)"
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). |
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.
