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.
Hasta el momento en este tutorial sobre como exprimir Telegram, he estado utilizando una de las dos tecnologías que soporta para estar al tanto de lo sucede. ¿A que tecnologías me refiero?. Telegram soporta dos caminos para conocer las actualizaciones de un bot, getUpdates y webhooks.
¿Porque solo he utilizado getUpdates hasta este capítulo? Esta primera tecnología tiene menos requerimientos, solo necesitas un servidor, pero este no tiene porque tener acceso desde internet. Es decir, lo puedes utilizar directamente desde tu Raspberry Pi en tu red local, sin necesidad de abrir puertos del router, ni tener un certificado SSL, ni otros requerimientos que mas adelante contaré.
Sin embargo, ahora visto con perspectiva, creo que el uso de webhooks en Telegram da mucho mas juego y resulta mas productivo. Así que ha llegado el momento de adentrarse en esta nueva parte del tutorial.
Webhooks
Pero, ¿que puñetas es un webhook? Pues un webhook no es mas que una dirección web, una url, que indicamos a un servicio, de forma que cuando se produce un evento, el servicio hace una llamada a esa dirección web. Vamos, es un teléfono de emergencias, de forma que cuando se produce cualquier emergencia, el usuario sabe a que teléfono llamar.
Esto mismo sucede con Telegram, en el caso de que se produzca un evento a un bot se hace una llamada a esa dirección web. De ahí, que necesitemos una dirección web a la que hacer la llamada.
¿Que ventajas tiene los webhooks frente a la otra tecnología?
Existen diferentes ventajas de utilizar webhooks frente a getUpdates,
- se evita la necesidad de estar preguntándole al bot sobre lo que está sucediendo.
- igualmente, evitarás la necesidad de tener que crear un sistema de llamdas en el código.
- por supuesto, ahorrarás CPU
- mejorarás el tiempo de respuesta.
Resumiendo, la ventaja del webhook, es que es mucho mas sencillo de implementar en tanto en cuanto no tienes que estar continuamente mirando al bot. Con un webhook solo actuas cuando te llega una llamada, y puedes procesar tantas llamadas como te lleguen… bueno, mas o menos.
¿Que requerimientos necesita un webhook?
Aquí es donde vienen los problemas, y la razón por la que es mas sencillo crear un bot con getUpdates.
- Necesitarás un dominio para que cada vez que se produzca una actualización, Telegram sepa donde llamar.
- Evidentemente necesitarás un puerto abierto. Esto quizá no era necesario mencionarlo, porque es de cajón, pero es que Telegram solo trabaja con cuatro puertos, el 443, 80, 88 y el 8443. Así es necesario que tu bot esté escuchando en uno de estos puertos, y por supuesto que esté accesible.
- Es necesario cifrado SSL/TLS. Con independencia del puerto que utilices, es necesario este tipo de cifrado. No es necesario que el certificado sea verificado, puede ser auto firmado.
- Probar tu bot con webhooks, puede ser algo tedioso.
Sin embargo, tengo algunas soluciones que te pueden resultar muy útiles para soslayar estos problemas, sin invertir un euro.
- Una solución para la necesidad del dominio, puede ser el uso de DuckDNS, tal y como explico en el artículo sobre como tener acceso desde el exterior con una IP dinámica.
- Tener un puerto abierto es un problema de seguridad. Sin embargo, es posible limitar el riesgo restringiendo el tráfico al rango de IP
149.154.167.197-233
en tu cortafuegos. Ten en cuenta que este rango de IP puede haber cambiado desde el momento que escribí este artículo, por lo que te recomiendo que le pegues un vistazo a la página de Telegram sobre webhooks. Igualmente, si en un momento determinado deja de funcionar tu bot para alguna razón desconocida, no te olvides de mirar el enlace anterior, no sea que hayan modificado el rango de IP. - Aunque Telegram trabaja con certificados autofirmados, mi recomendación es que utilices un certificado verificado. Esto es porque tener un certificado verificado es muy sencillo, tal y como comento en el artículo sobre como tener un certificado Let’s Encrypt en tu VPS
- Para la cuestión de probar tu bot, te recomiendo que le des un vistazo al artículo sobre Insomnia. Se trata de un cliente API Rest con muchas posibilidades, altamente configurable y muy, pero que muy productivo.
- Es necesario que te asegures que el puerto que estés utilizando esté abierto. Para esto te recomiendo que le des un vistazo al artículo sobre como proteger tu servidor. En este artículo explico con detalle el uso y configuración de UFW.
Gestionar nuestro webhook
Una vez ya tienes claro lo que son los webhooks, has cumplido con los requerimientos de Telegram para tener tu webhook ha llegado el momento de crearlo.
En este apartado de este capítulo del tutorial, te voy a mostrar, no solo como puedes crear tu propio webhook, sino también, como puedes probarlo e incluso borrarlo. Eso si, únicamente me voy a referir a webhooks en dominios con certificado verificado. Y es que aunque Telegram te da la posibilidad de utilizar otras modalidades de certificado, creo que utilizar un certificado Let’s Encrypt es muy sencillo y sobre todo fiable.
Crear tu webhook
Crear tu webhook es tan sencillo como ejecutar la seguiente orden en un terminal,
curl -F "url=https://[TU_DOMINIO]/[CAMINO_AL_WEBHOOK]" https://api.telegram.org/bot[TU_TOKEN]/setWebhook"
O mas fácil todavía directamente en Firefox o Chrome utilizas la dirección https://api.telegram.org/bot[TU_TOKEN]/setWebhook?url=https://[TU_DOMINIO]/[CAMINO_AL_WEBHOOK]
Recuerda que tienes que cambiar,
[TU_TOKEN]
, por el token asignado a tu bot.[TU_DOMINIO]
, lo tienes que reemplazar por el dominio que apunta donde tienes alojado el bot[CAMINO_AL_WEBHOOK]
, la dirección que apunta albot
.
Sencillo, ¿no te parece?
Borrar tu webhook
De la misma manera, para borrar un webhook, es tan sencillo como utilizar la siguiente dirección en tu navegador,
https://api.telegram.org/bot[TU_TOKEN]/deleteWebhook
Recuerda cambiar los parámetros para que coincidan con los de tu bot.
Obtener información de tu webhook
El otro método interesante que podemos utilizar con webhooks es precisamente getWebhookInfo
. Este método nos proporciona información sobre el estado actual de nuestro webhook. No necesita que le pasemos ningún parámetros, y si todo va bien nos devolverá la siguiente información,
url
la dirección del webhook, o una cadena vacía si no está configurado.has_custom_certificate
nos devuelve un valor booleano que nos informa si se ha proporcionado un certificado personalizado.pending_update_count
informa sobre el número de actualizaciones pendientes de ser procesadas.last_error_date
nos devuelve el último error que se ha producido.max_connections
represetnta el número máximo de conexiones simultáneas que el webook puede procesar.allowed_updates
devuelve una lista de tipos actualizaciones a las que está suscrito el bot. Por defecto está suscrito a todo tipo de actualizaciones.
Este, al igual que los otros métodos que hemos visto en este capítulo del tutorial, lo podemos ejecutar directamente desde el navegador. Para ello, tan solo tenemos que dirigirnos a la siguiente dirección,
https://api.telegram.org/bot[TU_TOKEN]/getWebhookInfo
O desde un emulador de terminal,
curl https://api.telegram.org/bot[TU_TOKEN]/getWebhookInfo
Conclusiones
En este capítulo del tutorial te he explicado lo que es un webhook, y como lo puedes utilizar para explotar, y sacar el máximo rendimiento a Telegram.
Como has podido ver son unos pocos métodos que te permiten crear, borrar y obtener información del webhook. Sencillo, pero efectivo.
En los próximos artículos veremos como integrar este bot con webhooks en diferentes plataformas y lenguajes de programación. Básicamente, utilizaré Python y PHP, aunque probablemente no en ese orden.
Mas información,