Son las 9 de la mañana, estás trabajando en tu super red neuronal que permitirá entender a los usuarios de una vez por todas, ¿podrás tomarte un café mientras entrena?, ¿hacer un viaje express a la playa? ¡Se acabó la incertidumbre! Vete a por tu café y recibe una notificación en tu móvil cuando termine.

Algunos procesos de nuestro día a día requieren largos tiempos de compilación/entrenamiento y mucha potencia de procesado, a veces incluso el Spotify deja de funcionar.

En estos casos, estar sentado delante de la pantalla, de brazos cruzados, pendiente de que el proceso termine o refrescando una página para ver los resultados, puede ser bastante tedioso.

¿Cómo podemos evitar esta espera innecesaria? Con unas pocas líneas de código, recibiendo una notificación en nuestro bot de Telegram y dedicar el tiempo a cosas más entretenidas que pulsar F5.

Primero, aclaremos conceptos. Un bot no es otra cosa que un programa que es capaz de “engancharse” a una conversación de un sistema de mensajería y atender a los mensajes de los usuarios e interactuar con estos de distintos modos. Aunque, para el caso concreto que nos ocupa, no vamos a reaccionar a los mensajes, solo enviaremos.

Telegram

Telegram expone su propia API de la que vamos a hacer uso de dos endpoint; uno, para mandar mensajes sencillos solo con texto, y otro, para mandar el mensaje con una imagen adjunta.

Creando nuestro bot

Los desarrolladores de Telegram han elegido un método muy llamativo para solicitar las credenciales necesarias para comenzar a trabajar con su API de bots. Básicamente tienes que abrir una conversación con “@BotFather” desde el propio Telegram. “@BotFather” es un bot y reconoce una serie de comandos.

El que nos ocupa es “/newbot”, que nos pedirá que introduzcamos un nombre para nuestro nuevo minion digital así como un nombre de usuario.

Ese chorizo de números y letras es el identificador de tu bot; todo el mundo se refiere a él como token y deberías cuidarlo. Cualquiera que utilice ese token será, a efectos de la API de Telegram, tu bot.

Identificando nuestra conversación

Pero con tener el token no es suficiente, también debemos saber a quién queremos enviar nuestras notificaciones. Para ello vamos a abrir un chat con nuestro bot, una manera de hacerlo es, simplemente, dirigirte a la url http://t.me/, en nuestro caso será http://t.me/CustomNotificationParadigmaBot o pulsando en el enlace que nos sugiere “Padre”.

Ya en la conversación con nuestro bot necesitaríamos iniciarlo con /start y escribirle algo bonito (yo le mando un romántico punto). Ahora vamos a ver cuál es el identificador único para la conversación que acabamos de abrir con él.

Esto es muy sencillo desde Linux, podemos hacerlo en una sola línea.

curl https://api.telegram.org/bot$TOKEN_TELEGRAM/getUpdates | jq -c '.result[0].message.chat | {id,username}'

Et voilà! ya sabemos el id de nuestro chat y el bot podrá mandarnos notitas.

Talk is cheap. Show me the code

Basta de hablar del bot. Vamos a ver cómo podemos integrar esto para hacernos la vida más sencilla y despreocupada. Puede que simplemente necesitemos que nos informe de que se ha terminado un pipeline en Gitlab, con un mensaje muy simple, dependiendo de su resultado o, tal vez, tengamos un script demasiado largo para gastar la vida mirando cómo se ejecuta.

Para nuestro script de linux usamos el comando curl y para nuestro modelo de Python, la librería requests.

curl -H 'Content-Type: application/json' \
   -d '{"chat_id": ${TELEGRAM_CHAT_ID}, "text": "Build FAILED", "disable_notification": false}' \
   https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage

import requests

url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
data = {"chat_id": TELEGRAM_CHAT_ID, "text": "Build OK", "disable_notification": False}
requests.post(url, json=data)

Como en Gitlab no hay integrado un sistema de notificaciones para Telegram, vamos a hacerlo nosotros. Cuando hablamos de la integración continua de nuestro repositorio, hablamos del fichero “.gitlab-ci.yml”.

Lo primero será añadir un nuevo Stage al que llamaremos “notify”, este stage estará al final de nuestro pipeline que se encargará de ejecutar un CURL para comunicarse con Telegram.

Añadimos dos jobs que se lanzarán si algún job falla o si termina correctamente para discriminar el mensaje que enviaremos. Podemos tunear el mensaje como más nos guste,
en el ejemplo se envía el estado del pipeline y el texto del commit que lo ha lanzado.

.notify:
 allow_failure: true
 script:
   - curl -H 'Content-Type:application/json' -d "{\"chat_id\":\"$TELEGRAM_CHAT_ID\", \"text\":\"$MESSAGE\", \"disable_notification\":false}" https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage

notify_success:
 stage: notify
 extends: .notify
 when: on_success
 variables:
   MESSAGE: Build OK on $CI_COMMIT_TITLE

notify_fail:
 stage: notify
 extends: .notify
 when: on_failure
 variables:
   MESSAGE: Build FAILED on $CI_COMMIT_TITLE

¡Nuestro pipeline quedaría así de bonito!

¿Qué pasa si nos gusta ver una imagen con nuestro “Success” o si un texto no es suficiente? Pues podemos hacerlo con el otro endpoint que hemos mencionado.

Por ejemplo, estamos trabajando en un Colab creando la red neuronal que nos permitirá de una vez por todas entender al usuario. No nos vale solo con saber la precisión, también queremos ver una preciosa gráfica que nos muestre la precisión de nuestro modelo.

¡Vamos a ello! Igual que antes, os dejo aquí los códigos necesarios para hacer uso del endpoint mencionado, tanto en Bash como en Python.

curl -X POST \
  -H 'Content-Type: multipart/form-data' \
  -F "chat_id=${TELEGRAM_CHAT_ID}" \
  -F "caption=Build OK" \
  -F  "disable_notification=false" \
  -F "photo=@imagen.png" \   https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendPhoto
import requests

url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendPhoto"
data = {"chat_id": TELEGRAM_CHAT_ID, "caption": "Build OK", "disable_notification": False}
files={'photo': open('imagen.png','rb')}
requests.post(url, data=data, files=files)

Y añadiendo un par de líneas al final de nuestro código, podemos ver el resultado final desde la terraza de nuestro bar favorito, en vez de estar sentado mirando Twitter frente a un equipo que arde mientras entrena.

Y, al terminar, nos llega esta preciosidad a nuestro móvil, pudiendo regresar a nuestra tarea sin haber tenido que estar continuamente pendiente de cuando sale el resultado.

Conclusiones

Gracias a este tutorial no tendrás que pasar más tiempo pendiente de revisar tareas y podrás mejorar tu productividad (o tomarte algo tranquilamente mientras tu modelo entrena).

¿Por qué usar este sistema y no uno específico como pushover? Muy simple, porque no nos requiere instalar una aplicación extra en el móvil para una única utilidad ¡y además es gratis! ¿Quién no usa Telegram para seguir sus chollos favoritos?

Además, ya habrás dado un pequeño paso para iniciarte en el mundo de los bots xD.

Cuéntanos qué te parece.

Enviar.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete