Danielside

informática softwarelibre divagaciones música

Recepción de mensajes Telegram en XMPP/Jabber

De entre las plataformas de mensajería instantáneas existentes, poniendo en la balanza la libertad y también la masa de usuarios, he decidido que usaría Telegram, por muchos motivos.

Aunque en apariencia sea igual a whatsucks, tiene innumerables ventajas desde el punto de vista de tu libertad. Las desventajas son las de siempre 1) que no controlas los servidores por donde pasan tus comunicaciones, 2) que no te puedes fiar al 100% de la corrección del cifrado de mensajes. Pero más allá de eso, nos ofrece:

  1. Las aplicaciones cliente son libres y su código está disponible, cualquier lo puede inspeccionar y si no le gusta instalarse la del market, compilarlo.
  2. Está en f-droid.
  3. Y más importante que eso, siempre han facilitado enormemente la creación de clientes no oficiales que usen su red, realizando esl esfuerzo de crear APIs (https://core.telegram.org/api) que permiten construir clientes con la totalidad de las funciones de la plataforma. De esta manera, podrías implementar el cifrado extremo a extremo que te diera la gana, como el omnipresente OTR el nuevo OMEMO de Conversations (https://conversations.im/omemo/)

En definitiva, siendo también un servicio opaco, creo que es una plataforma que da un amplio grado de libertad y eso la hace mucho más divertida.

Como no soy de tener grandes cuotas de datos en el móvil (¡voy por la vida con 100Mb al mes!) y no llevo los datos permanentemente activados, unido al hecho de que Telegram se come bien la batería, decidí que quería construir un puente para recibir lo que me decían por Telegram en Conversations (Android) o Gajim/Pidgin/, es decir, desde cualquier cliente de XMPP. En una entrada anterior había explicado como montarlo para grupos [1], pero me faltaba la capacidad de recibir los mensajes que me escribían a mi directamente. Una vez visto, ya puedo decidir si abrir Telegram o llamar (o ignorar ;)).

Se parece al “busca” (pager) que tenían en las pelis americanas de los 80s y 90s. Decides no tener Telegram en el móvil y si te hablan puedes verlo en tu Conversations. Unido con mi otro plugin para recibir SMS cuando estás desconectado de XMPP [2] siempre te enterarás de cuando te contactan por Telegram y ya verás tú lo que haces ;). Además, vamos a recibir, gracias a HTTP Upload de XMPP, los vídeos, GIFs y fotos que nos envíen como enlaces.

Requisitos

  • Tener un servidor disponible y con conexión a internet permanente. Yo lo tengo en mi VPS pero puede ser perfectamente un ordenador en tu casa siempre encendido.
  • Telegram-cli [4], el gran cliente en modo consola de Telegram

De Telegram a XMPP

El grueso de esta parte se la debemos al estupendo trabajo realizado con Telegram-cli, un cliente Telegram completo que se usa desde la línea de comandos. Dos grandes ideas del creador me permiten reutilizarlo: 1) que se puede ejecutar en modo demonio escuchando en un puerto y 2) que es extensible (en LUA, casualmente el mismo lenguaje para extender el servidor Prosody de XMPP).

Es curioso que los dos servicios más importantes que necesitemos, Prosody y Telegram-cli, permitan su extensión mediante el lenguaje LUA. Es un lenguaje interpretado muy orientado a extender programas realizados en C y no es difícil de aprender. Así que vamos a ello.

Preparando Telegram

Es importante que Telegram lo ejecute el mismo usuario que es responsable del servicio Prosody, porque para poder recibir y descargar multimedia desde XMPP, Telegram debe ser capaz de escribir en el directorio donde Prosody los almacena para servirlos con httpupload [5]. Supongamos que Prosody se está ejecutando en tu sistema con el usuario prosody y el grupo prosody.

Instalamos y configuramos Telegram-cli siguiendo su README. Comprobamos que funciona bien realizando algunos envíos de mensajes. Lo dejamos reposar.

Para gestionar telegram-cli como demonio vamos a hacer uso de supervisor, un sistema para gestionar procesos. En debian el paquete se llama tal cual, supervisor. En /etc/supervisor/conf.d creamos el archivo telegram.conf y le ponemos lo siguiente:

[program:telegram]
directory=/usr/lib/prosody/telegram
command=/home/prosody/bin/supervisor_telegram.sh
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/home/prosody/log/supervisor/stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/home/prosody/log/supervisor/stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
user = prosody
environment = HOME="/home/prosody", USER="prosody"

Ojocuidao con las líneas en negrita. Vemos como el comando para levantar telegram en modo demoníaco no se pone aquí, es mejor poner un script. Y la última le dice el HOME que tendrá ese script y el usuario que lo va a ejecutar. En realidad, puede ser cualquiera, pero si lo ejecuta prosody vamos a poder descargarnos los archivos que nos envían por Telegram, colocarlos en el directorio donde el módulo HTTP Upload -de Prosody- guarda los archivos, y enviar un enlace al contacto XMPP. El contenido del script es algo así:

#!/bin/bash
/usr/lib/prosody/telegram/bin/telegram-cli -d -vvvv -E -R -D -C -P 2392 -s /home/prosody/telegram2xmpp/tg2xmpp.lua

Y arrancamos con:

supervisorctl start telegram

Ahora veremos qué lleva ese script en LUA. Es lo que nos permite extender telegram-cli para enviar mensajes a xmpp cuando se reciban mensajes en Telegram. Primero tenemos que comprobar si funciona el demonio. El creador de este cliente ha sido hábil y permite enviar comandos al servicio mediante netcat, una estupenda herramienta, como un telnet muy evolucionado, que permite enviar mensajes arbitrarios a cualquier servidor. Probamos con una línea como la que sigue (“Test” es el nombre del contacto, sustitúyelo por cualquier contacto que tengas en Telegram):

echo "msg Test desde netcat" | nc localhost 2392 -q 1

Ahora vamos con la extensión de Telegram-cli. Clona el repo del proyecto [6] en el mismo directorio que tengas configurado en la línea que levanta telegram, copia tg2xmpp_conf.lua.dist a tg2xmpp_conf.lua y escribe tus valores de configuración. El significado de cada uno es el siguiente:

  1. own_telegram_user: Tu nombre de usuario de telegram.
  2. own_xmpp_user: Tu nombre de usuario de XMPP, incluido servidor (ej. perico@delospalotes.com)
  3. xmpp_http_upload_url: la URL que el módulo http upload ofrece para descargar archivos, si tienes habilitado el módulo sabrás cual es.
  4. excluded_tg_destinations: es un array para listar contactos de los cuales NO quieres recibir mensajes XMPP. Útil para grupos de mucho tráfico.

Todo va estando ya en su sitio. La manera que tengo de enviar mensajes XMPP cuando recibo un mensaje Telegram es el programa sendxmpp presente en cualquier distribución. El mensaje lo va a enviar, en mi caso, el usuario prosody, por lo que tenemos que ir a /home/prosody y crear el archivo .sendxmpprc y poner una sencilla línea:

telegramxmpp@servidor.xmpp contraseña

Tenemos que crear en Prosody un nuevo usuario y configurarlo aquí (prosodyctl adduser telegramxmpp@servidor.xmpp). Ese usuario va a ser el que envíe los mensajes, por lo tanto nuestro usuario XMPP principal lo debe tener añadido al roster

Os dejo con unas capturas de la misma conversación en Telegram, Conversations y Gajim. Como solo tenemos un usuario XMPP que actua como concentrador de los mensajes, lo que hago es preceder cada mensaje de un fragmento que indica quien lo ha enviado y, si aplica, a qué grupo.

Telegram

Telegram


Conversations

Conversations


gajim

gajim

Referencias

  1. Telegram, XMPP y Matterbridge
  2. Envio de SMS para contactos XMPP offline
  3. Prosody
  4. Telegram-cli
  5. Prosody HTTP Upload
  6. Telegram2XMPP en Github


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *