Conectando Telegram con XMPP mediante matterbridge

Lo mejor de los protocolos abiertos es precisamente eso, que son abiertos. Y como tales pueden hablar entre ellos. Y eso es divertido. Cerrado, aburrido. Abierto, divertido.

Uso Telegram de forma ocasional. No quiero tenerlo en el móvil. Primero para no estar pendiente a cada momento y segundo porque hacía que la batería se descargara a ritmo alarmante. Lo que sí tengo en el móvil es un par de grandes clientes XMPP: Conversations [1] y Xabber [2]. Y me pregunté ¿y no podría recibir los mensajes de Telegram y a su vez enviarlos desde aquí? Ni Conversations ni Xabber me destruyen la batería y así puedo estar en contacto con la gente que tengo en Telegram sin tenerlo instalado.

La plataforma cerrada de moda en todas las empresas es Slack, que sirve para chatear, enviar archivos y todas esas cosas. ¿A qué viene esto? Viene a que hay una plataforma alternativa -que no he tenido ocasión de probar- libre y autogestionada llamada Mattermost [3]. El usuario 42wim [4] de Github tiene varios proyectos interesantes relacionados con Mattermost, el que nos interesa es Matterbridge [5], un “puente entre mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocket.chat y hipchat (via xmpp)”. Así que ¡esto es precisamente lo que queremos!

La idea

Para tener una idea de lo que se quiere hacer, lo que vamos a montar está dirigido a recibir en una sala creada en tu servidor XMPP todo lo que se diga en otra “sala” (grupo) de Telegram, y viceversa. Se dirige a grupos porque la conexión se realiza mediante bots de Telegram. Se creará un bot que se añadirá al grupo Telegram que te interese, pudiendo crear tantos bots como grupos necesites, éste verá todos los mensajes que se envíen al grupo y mediante matterbridge los enviará al otro lado del puente que se defina, en este caso la sala XMPP que esté al otro lado. Y viceversa, lo que escribas en la sala XMPP será copiado por el usuario creado por el puente en tu sala y enviado al grupo de Telegram.

Preparando el bot

Para crear el bot no tienes más que abrir Telegram y pedírselo a @botfather . Añade a ese bot y comienza a hablar con él. Esta es la secuencia de comandos:

/start

/newbot

/setprivacy (poner en "disable")

Puedes adecentar un poco el bot poniéndole el nombre, una imagen, etc. Todo como si fuera un usuario normal. Debe estar presentable antes de añadirlo al grupo de Telegram del cual quieres recibir los mensajes al otro lado del puente. Lo añades al grupo y seguimos con otras cosas. Guárdate el token cuando te lo dé porque lo usaremos más adelante.

Instalando y configurando matterbridge

Lo mejor para configurar el tinglado es tener tu propio servidor siempre online, bien una raspberry o similar en tu casa detrás de tu conexión casera, bien un VPS o cualquier otro tipo de servidor. En mi caso gestiono mi servidor virtual, en él tengo corriendo Prosody (XMPP) entre otras aplicaciones. Si no has instalado ya Prosody, es muy fácil dejarlo fino hasta para usarlo con el movil [6].Es en este servidor donde tenemos que realizar los siguientes pasos, ya que el puente debe ser un proceso que esté siempre en ejecución escuchando a ambos lados para poder retransmitir los mensajes.

No hace falta tener Matterbridge y el servidor XMPP en el mismo servidor, solo es necesario que haya conectividad. Si gestionas ambos servicios, acuérdate de abrir puertos de firewall si es necesario.

Para compilar matterbridge es preciso tener instalado el runtime del lenguaje Go [7]. Pero también puedes simplemente bajarte los binarios [8]

wget https://github.com/42wim/matterbridge/releases/download/v0.9.2/matterbridge-linux64

chmod +x matterbridge-linux64

Ahora es cuando creamos la configuración en un archivo que estará en el mismo directorio que el binario, llamado matterbridge.toml . La documentación de este archivo se encuentra en el mismo matterbridge.sample que viene en el repositorio Git, pero aquí pongo mi configuración con algunos detalles que creo que merece la pena saber porque no quedan muy claros algunos detalles. Iré comentando cada sección según vayamos viéndolas:

[xmpp]

[xmpp.mixmpp]

Server="servidorxmpp.tld:5222"

Jid="usuario@servidorxmpp.tld"

Password="PasswordMuySecreta"

Muc="muc.servidorxmpp.tld"

Nick="matterbridge"

SkipTLSVerify=true

RemoteNickFormat="[{NICK}] "

Esta es la sección de XMPP. El puente se conectará a tu servidor y creará una sala de conversación, por lo cual le debes indicar en Muc cual es el servidor para las salas. El Nick será el nombre con el que el puente aparecerá en la sala XMPP, de manera que todos los mensajes que la gente envíe en el grupo Telegram parecerá que vienen de la misma persona. Pero eso lo soluciona RemoteNickFormat, que hace que cada mensaje venga precedido del nombre real del usuario.

A las malas he aprendido que no debemos configurar nuestra cuenta principal en este servidor como la cuenta que usará Matterbridge para conectarse. Si no, apareceremos siempre como conectados con nuestra XMPP de cara a los demás y los mensajes que nos envíen “se los traga” Matterbridge. Hay que crear una cuenta nueva en el servidor XMPP que solo sirva para esto.

Continuemos con el archivo. Supongamos que tenemos el clásico grupo Familia en Telegram, pues configuramos su bot en Matterbridge:

[telegram]

[telegram.bot_grupo_familia]

Token="Token del bot"

Aquí empieza lo divertido. La validación contra Telegram no va con usuario y contraseña, si no con un Token. Este es el token que te ha proporcionado @botfather al crear bot_grupo_familia .

Si tenemos otro bot que se encargue del clásico grupo Amigos, no tenemos más que añadirlo a continuación:

[telegram.bot_grupo_amigos]

Token="Token del bot"

Hasta ahora lo que hemos hecho ha sido definir los puntos extremos del puente ¡falta construir el puente! Esto se hace en la sección de gateways :

[[gateway]]

name="gateway_xmpp_familia"

enable=true [[gateway.inout]]

account="xmpp.mixmpp"

channel="familia" [[gateway.inout]]

account="telegram.bot_grupo_familia"

channel="123456" #Id del grupo Familia en Telegram

Esta es la parte más “complicada”. Parece que no hay ninguna manera inmediata y sencilla de averiguar el identificador de un grupo de Telegram, por lo tanto tenemos que hacerlo con un script. El script se conectará a Telegram mediante el token y se quedará a la escucha, en ese momento hay que enviar algún mensaje al grupo y el script imprimirá su identificador. Primero instalamos las dependencias:

su -c "apt-get install python3 python3-pip"

su -c "pip3 install python-telegram-bot"

Ahora nos descargamos [9], le damos permisos de ejecución y lo ejecutamos pasándole el id del token del bot de Telegram:

./see_telegram_groups.py "TOKEN"

Cuando salga nuestro preciado identificador ya podemos copiarlo, pulsar Ctrl+C para detener el script y pegarlo en el fichero de configuración.

¡Y eso es todo! Si queremos hacer lo mismo para otro gateway solo tenemos que crear otra configuración similar (copiando a partir de [[gateway]] incluido) con los datos de la cuenta XMPP y de la cuenta Telegram.

Para poner el puente en funcionamiento es tan simple como:

./matterbridge-linux64

Con eso vemos toda la salida para depuración. Si quisiéramos dejarlo corriendo en un servidor al que nos hemos conectado por SSH podríamos hacer muchas cosas, pero una muy sencilla es:

nohup ./matterbridge-linux64 2> /dev/null &

Referencias: