Creando mi propio sistema de notificaciones con Telegram

5 min
Creando mi propio sistema de notificaciones con Telegram

Vacunas COVID Twitter bot

Bot de Twitter que informa diariamente del estado de vacunación en España contra la COVID-19.

PythonTwitter API

Cada vez que desarrollaba una nueva aplicación, cada vez que ponía en marcha un nuevo bot, cada vez que desplegaba un sistema, siempre se me venía a la mente lo mismo. ¿Cómo puedo obtener feedback de lo que está pasando? Ya no solo qué piensa la gente, sino cómo está funcionando o si hay algún problema con la aplicación que requiera intervención manual.

Dándole vueltas a todo esto, descubrí varias plataformas que venían a solucionar esto de forma parcial, aunque no era tan flexible como yo quería. Además, muchos de estos servicios exigen cuotas mensuales pensadas para grandes empresas, lo cual significa un impedimento más.

Como en muchas otras ocasiones en la vida, la solución a las respuestas está mucho más lejos del foco original de lo que esperamos. Problemas complejos a veces requieren de soluciones sencillas, y en otras tantas ocasiones al contrario.

Este es uno de esos casos en los que contar con amplitud o range, como lo denomina David Epstein en su libro, te permite aplicar conocimientos de otras áreas para solucionar problemas que tenías en mente. En este caso, he utilizado la funcionalidad de bots de Telegram para desarrollar un sistema que permite actualizar en tiempo real el estado de muchas de mis aplicaciones con notificaciones que me llegan directamente al móvil. Totalmente gratuito, fácil de implantar y todo lo flexible que lo quieras llegar a tener.

Manos a la obra

La idea principal es la siguiente:

  • Crear un nuevo bot usando @botfather
  • Obtener el token para poder manejar el bot
  • Abrir una conversación para que pueda mandarnos notificaciones (por defecto, si no has iniciado la conversación con un bot, este no puede escribirte. Así se evita el spam)
  • Obtener el ID de nuestra conversación
  • Realizar peticiones desde nuestro sistema, aplicación o script

La idea es bastante sencilla y aunque todo este proceso no llevará más de 10 minutos, es importante seguir todos estos pasos para que la cosa funciones como debería. Un paso en falso y te pasarás horas buscando qué narices ha ido mal.

Crear el bot y obtener el token

Para comenzar a crearlo deberemos acudir al padre de todos ellos, nunca mejor dicho. Hay un bot en Telegram que es el encargado de manejar todos todos nuestros bots. Lo podéis encontrar como @botfather. Una vez comencemos la comunicación, deberemos mandar el comando /newbot y añadir el nombre y username que nos permitirá diferenciarlo del resto (este nombre de usuario deberá acabar en bot).

crear-bot-token.png

Una vez hecho esto, el bot ya estará creado y nos aparecerá un mensaje con toda la información que necesitamos al respecto. Entre esta información tenemos el token, el cual es fundamental almacenar con cautela y no compartirlo con nadie.

Iniciar una conversación y obtener el ID del chat

Para poder mandar una notificación desde un bot necesitamos dos cosas: el token y el ID del chat al que queremos mandar la notificación. El primero ya lo tenemos, por lo que vamos a ver cual es el identificador de nuestra conversación.

Iniciamos una conversación con nuestro bot. Esto lo podemos hacer utilizando el enlace que nos aparece en el mensaje e confirmación de creación o buscándolo en Telegram por el nombre de usuario que le hemos asignado.

Una vez hecho esto pasaremos a acceder a la página con todas las actualizaciones que ha recibido. Abrimos cualquier navegador y accedemos a la siguiente página:

https://api.telegram.org/bot[token]/getUpdates

Deberás cambiar [token] por el de tu propio bot. En mi caso, la URL quedará de la siguiente forma: https://api.telegram.org/bot1725563685:AAGQNBsLvzA-ssf0QsqNQ9K3BUIB1NVnbJ8/getUpdates

obteniendo-chat-id-min.png

Una vez accedáis a esta dirección, os aparecerá un fichero JSON con un array de un solo objeto (si solo habéis mandado un mensaje, claro). Dentro de este objeto se encuentra otro objeto llamado chat. Si accedéis a él veréis que cuenta con la propiedad id. Ese es el dato que nos interesa y que deberemos guardar.

¡Orden en la sala!

La flexibilidad es un arma de doble filo. Tener un gran abanico de posibilidades como el que nos ofrece los bots de Telegram tiene que ir acompañado de unas directrices o pautas, lo que los ingleses denominan guidelines.

En este caso, no vamos a necesitar un estándar ISO para marcas las reglas de este sistema de notificaciones. Seamos sinceros, es solo un sistema de notificaciones. Pero llevar un orden a la hora de hacer las cosas evitará complicaciones futuras (además de lograr orden y evitar el caos).

En este caso, he decidido que las notificaciones estén compuestas por tres elementos:

  • Emoticono para indicar el tipo de notificación
  • Título en negrita que indica el sistema o aplicación desde el que se ha mandado
  • Descripción con todos los detalles al completo

No todas las notificaciones son iguales, pensemos por un momento lo que pasa cuando cogemos el móvil por la mañana. Nuestro cerebro categoriza de forma las notificaciones que nos han ido llegando a lo largo de la noche. Algunas son críticas y requieren de actuación inmediata, otras advierten de un posible problema mientras que otras son solo informativas (un mensaje de tu pareja diciéndote que ha reservado para cenar esta noche, por ejemplo).

Por esa misma razón, he dividido las notificaciones en 4 categorías, que con el formato correcto, sus mensajes quedarían de la siguiente forma:

Notificación informativa

ℹ️ **App 1**

Hace 3 días que no actualizas los datos de la BD.

Notificación de exito

✅ **App 2**

El tweet programado se ha publicado correctamente

Notificación de advertencia

⚠️ **App 3**

No hay nuevos datos del ministerio que se puedan obtener

Notificación de error

❌ **App 4**

No se ha podido obtener el fichero CSV del servidor. Formato de la URL inválido.

Una vez tenido esto en cuenta, ya se puedo empezar a implantar en aplicaciones y en sistemas. Si sois curiosos y ya os habéis puesto manos a la obra buscando cómo hacer funcionar el bot, os haréis dado cuenta de que es bastante sencillo. Vamos a ver algunos ejemplos prácticos en el siguiente apartado.

Implementar en nuestros sistemas

Con el token y el id del chat en la mano, ya podemos ponernos manos a la obra para implantar el sistema de notificaciones. Básicamente, tenemos se debe hacer una petición GET a la siguiente dirección:

https://api.telegram.org/bot[token]/sendMessage?chat_id[chatId]&parse_mode=Markdown&text=[msg]

Donde [token] es el token del bot, [chatId] es el identificador del chat y [msg] es el mensaje que queremos mandar.

Para comprobar que todo funciona, podemos ejecutar un curl desde nuestra terminal:

curl 'https://api.telegram.org/bot1725563685:AAGQNBsLvzA-ssf0QsqNQ9K3BUIB1NVnbJ8/sendMessage?chat_id=123456789&parse_mode=Markdown&text=hola'

Si todo ha ido bien, nos habrá llegado ua notificación de nuestro bot a Telegram. Pero no nos interesa ejecutar este tipo de comandos desde la terminal. A no ser que estés programando un script de bash, lo más normal es que quieras ejecutar esa petición utilizando algún lenguaje de programación. Para Python, por ejemplo, puedes usar la siguiente función:

def sendNotification(notification, emoji):
    bot_token = '1725563685:AAGQNBsLvzA-ssf0QsqNQ9K3BUIB1NVnbJ8'
    bot_chatID = '123456789'
    msg = emoji + ' *Vacunas COVID Twitter bot*\n\n'+notification
    send_text = 'https://api.telegram.org/bot' + bot_token + '/sendMessage?chat_id=' + bot_chatID + '&parse_mode=Markdown&text=' + msg
    response = requests.get(send_text)
    return response.json()

sendNotification('Mensaje mandado correctamente', '✅')

Casi todos los lenguajes de programación cuentan con librerías capaces de realizar peticiones HTTP. JavaScript, por ejemplo, trae la API fetch de forma nativa, sin tener que instalar ningún módulo ni nada parecido. No obstante, si quieres hacerlo mucho más fácil, existen módulos desarrollados por la comunidad para manda mensajes, aunque debido a la simplicidad de la API que nos ofrece Telegram, no le veo mucho sentido.

Otro tema a tener en cuenta es que los mensajes se pueden mandar tanto en formato Markdown como en HTML. Yo pienso que Markdown es mucho más rápido y sencillo, aunque recomiendo echarle un ojo a la documentación de este formato. Si optáis por HTML, tendréis que cambiar el atributo parse_mode de la petición.