Este es uno de los capítulos del tutorial Exprimiendo Telegram. Crea tu propio bot para Telegram.. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
Actualmente, y me refiero al momento de escribir este artículo, tengo varias páginas web alojadas en un VPS, que me encargo de gestionar. Además de estas páginas, suelo realizar pequeños proyectos para probar diferentes servicios. Sin embargo, solo tengo en funcionamiento los servicios durante las pruebas, salvo algún caso puntual, en el que uno de los proyectos pase a producción. Recientemente surgió la necesidad de poner en marcha una sala Mumble para hacer grabaciones de podcast de forma puntual. Al igual que con el resto de servicios, no quería que esto impactara en lo que tengo en producción. No tiene ningún sentido, tener un servicio levantado permanentemente para utilizarlo una vez a la semana. De esta forma, implementé un sencillo bot. Un bot para gestionar servicios desde Telegram.
En un episodio del podcast, te comenté como controlar tu raspberry con un botón desde Android. Sin embargo, esto te obliga a instalarte una aplicación mas en el móvil. ¿Como si ya tuvieras pocas?. La solución que te propongo es bastante mas sencilla, si ya tienes un servidor Nginx o Apache. No vas a necesitar instalar ninguna aplicación adicional. Directamente, desde tu cliente de mensajería favorito, desde Telegram, puedes controlar ese servicio.
Y te digo un servidor de páginas web, porque estarías en el mismo caso que yo. Es decir, estás utilizando tu VPS o Raspberry para servir páginas, pero además quieres poder controlar algún servicio adicional.
Sin lugar a dudas, si este es tu caso, si ya tienes tu servidor, y quieres controlar tu equipo con Telegram, la solución que te propongo es ideal.
Gestionar servicios desde Telegram
Como te indico en la introducción, esta solución, es ideal para el caso, concreto de que tengas en marcha un servidor como Apache, Nginx o el que consideres, para otros menesteres. Sin embargo, a lo mejor te interesa directamente montar el servidor únicamente para tu bot de Telegram. Mas que nada por la cantidad de acciones que puedes realizar sin necesidad de instalar una nueva aplicación en tu móvil.
Lo necesario
En el capítulo anterior Flask y Nginx. WebHooks y Telegram de este tutorial sobre como exprimir Telegram, ya montamos todo lo necesario para nuestro bot.
Como te expliqué en ese capítulo, lo que parecía algo farragoso, terminaría por resultar realmente sencillo. Y es que ahora realizar llamadas desde Telegram a tu bot, simplemente consiste en añadir una línea al archivo /var/www/misitio.com/mibot/app.py
.
Repositorio en GitHub
Todo lo que voy a comentar aquí está en un repositorio en el repositorio mumblebot de GitHub. Así que, para seguir con facilidad todo la explicación, clona el repositorio localmente y vamos paso a paso a ver con detalle cada uno de los elementos.
Empezando por el final
Voy a ir del final al principio. Es decir, voy a empezar por las llamadas que se encuentran en mumblebot/dobot/__init__.py
.
A parte de algunas llamadas de prueba como son /mumblebot/
y /mumblebot/test/
, tenemos la fundamental que es /mumblebot/998d4bcc-2798-4ca5-9be7-48588f0573c4
. La cosa de ponerle un código extraño es para dificultar el trabajo a los amigos de lo ajeno. Sin embargo, no tengo muy claro su efectividad.
Las llamadas de Telegram son de tipo POST
. El resultado es un json
, cuya parte importante es if update['message']['text'] == '/start':
donde aseguramos comparar el mensaje con la palabra clave. De esta forma, al escribir /start
se realizará la tarea que hallamos designado.
En nuestro caso, algo tan sencillo como,
os.system('/usr/bin/sudo /home/user/mumble_scripts/start.sh')
Este es el encargado de levantar nuestro servicio. De la misma forma, también tienes mensajes para,
- detener el servicio
- conocer el estado del servicio
- mostrar una ayuda con todas las opciones posibles.
Los scripts del servicio
Por otro lado, es necesario crear unos scrips que sean los encargados de realizar las operaciones. En este caso concreto son realmente sencillos. Así por ejemplo, para start.sh
, tendremos algo como esto,
#!/bin/bash
ufw allow 56473
systemctl start mumble-server
En una línea abrimos el puerto que usaremos con el servicio, y en la segunda línea iniciamos el servicio. Sencillo ¿no te parece?. El script de parar es exactamente igual, pero al revés.
El que es un poco diferente es el de conocer el estado de nuestro servicio. En este caso, averiguamos la situación del puerto, y posteriormente la situación del servicio, tal y como puedes ver a continuación,
#!/bin/bash
ufw status | grep 54325
if systemctl status mumble-server | grep running > /dev/null; then echo "Mumble Server **started**";else echo "Mumble server **stopped**";fi
Arrancando el servicio
Así, dentro del bot, tenemos que para iniciar nuestro servicio, tan solo necesitamos lo siguiente,
os.system('/usr/bin/sudo /home/user/mumble_scripts/start.sh')
telegram.send_simple_message(update['message']['chat']['id'], 'Please **wait** three seconds', parse_mode='Markdown')
time.sleep(3)
msg = subprocess.Popen(['/usr/bin/sudo', '/home/user/mumble_scripts/info.sh'], stdout=subprocess.PIPE).stdout.read()
telegram.send_simple_message(update['message']['chat']['id'], msg, parse_mode='Markdown')
El proceso completo de gestionar servicios desde Telegram, es como te describo a continuación,
- Iniciamos el servicio
- Mandamos un mensaje a Telegram para informar al usuario que se espere tres segundos.
- Esperamos tres segundo para dar tiempo a que se inicie el servicio.
- Miramos el estado del servicio
- Mandamos un último mensaje a Telegram con la situación
De una forma similar lo haríamos en el caso de detener el servicio.
Derechos de root
Como te puedes imaginar, para ejecutar algunas de estas ordenes es necesario tener derechos de administrador. Para ello tenemos que modificar el archivo /etc/sudoers
y añadir, por un lado,
Defaults:www-data !requiretty
Y por otro lado,
www-data ALL=NOPASSWD: /home/lorenzo/mumble_scripts/start.sh, /home/lorenzo/mumble_scripts/stop.sh, /home/lorenzo/mumble_scripts/info.sh
De esta manera www-data
podrá ejecutar estos y solo estos scripts sin necesidad de contraseña, para así gestionar los servicios desde Telegram.
Conclusión
Como ves esto de gestionar servicios desde Telegram es algo sencillo de hacer. Lo cierto es que necesitas tocar todos los palos para poder poner esto en marcha. Pero como te puedes imaginar, hecho uno, hechos todos. Es una manera muy potente de poder controlar tu equipo, Raspberry, VPS, de una forma muy sencilla.
Ten en cuenta, que a partir de aquí, añadir, órdenes, tan solo consiste en crear las órdenes que necesites y sus correspondientes scripts.
Por último, recuerda que necesitas reinicar el servicio de mibot
cuando realices todos estos cambios. Esto lo puedes leer en el artículo anterior de Flask y Nginx. WebHooks y Telegram.
Espero que te guste este nuevo capítulo. Si tienes cualquier duda o comentario, o alguna idea para otro bot, no dudes en decírmela.