58 - Que tu Raspberry te avise con webhooks
Saca mas provecho a tu Raspberry o a tu servidor o VPS con los webhooks, convirtiendo tu servidor en un centro de notificaciones personal
El episodio del podcast de hoy seguro que te rompe la cabeza. Y es que en los últimos episodios del podcast, te he hablado de cosas bastante mundanas. Y con mundanas me refiero a nuestro equipo de escritorio. Es cierto, que puntualmente alguno ha ido del lado de la Raspberry o de la creación de bots, pero la mayoría son de estos mundanos. Pues con el de hoy, rompo la racha, porque este es uno que reúne, un poco de programación, un poco de Raspberry o servidor y todo un mundo de posibilidades. Hoy te voy a hablar de notificaciones en la Raspberry o en cualquier servidor. Hoy te voy a hablar de Webhooks.
Si no sabes lo que es un webhook, te invito a que escuches este episodio del podcast, que seguro que le vas a sacar provecho.
Que tu Raspberry te avise con webhooks
Antes de meternos en faena
Aplicaciones
- Telegram. Como ya comenté en el episodio del lunes del podcast, la versión de Telegram que hay en los repositorios oficiales de Ubuntu, está desactualizada. No lo entiendo. La cuestión es que hasta el momento no me había dado cuenta. Resulta que estaba usando la versión 1.4, y actualmente estamos en la 1.6.3. Por que no se que están haciendo estos chicos de Telegram, que en los últimos dos o tres días ya han realizado como 3 actualizaciones. Con lo que me cuesta a mi subir una actualización al repositorio…
- De nuevo recordarte que los chicos de GNOME se han puesto las pilas, y han actualizado las dos extensiones que estaban pendientes. Una extensión que te muestra la ocupación de tus particiones, y una segunda que es un menú de extensiones de Chromium/Chrome.
Artículos
Esta semana he escrito dos artículos.
- El primero corresponde al tutorial sobre el terminal. Continuo explicando algunos filtros para trabajar con archivos de texto. Si la semana pasada te comenté sobre awk, sed, grep, etc; esta semana te hablo de otros tan interesantes como head, tail, cat, split.
- En particular, a mi me tiene robado el corazón tail, porque me permite ver monitorizar el log de las aplicaciones, y de esta manera ver que está sucediendo.
- En el segundo de los artículos, te comentaré una aplicación que, en el caso de que utilices WhatsApp, seguro que te interesa. Y es que esta aplicación te permite trabajar con varias cuentas de WhatsApp en el escritorio en Linux, y en otras plataformas. Si lo has adivinado, se trata de una aplicación que utiliza el framework Electron.
A por los webhooks
Seguro que te estás preguntando… a ver Lorenzo que se le ha ocurrido ahora con eso de los Webhooks…
Si no conoces lo que son los webhooks, indicarte que son una interesante herramienta. De lo simple y sencilla que es resulta tonta. En ocasiones me pregunto, como puede ser que una idea así no se me haya ocurrido.
Si has seguido el tutorial sobre bots en Telegram, ya tienes una idea de lo que hablo. Pero si no, te puedo asegurar que es algo realmente interesante. Además, para tener tus propio webhook, no necesitas de una gran infraestructura. De hecho, tener tu webhook en una Raspberry.
¿Como estar informado?
Vamos con un ejemplo sencillo. Pongamos que ayer te estás esperando recibir una mercancía importante en el almacén de tu empresa. De esa mercancía importante dependen otros pedidos que tienes que realizar. Estás muy preocupado respecto a la mercancia, sabiendo todo lo que depende de ella.
Aquí tienes dos opciones. La primera es llamar cada 15 minutos al responsable de almacén y preguntarle por la mercancía. La segunda opción es simple, decirle al encargado del almacén que te llame a un número de teléfono, en cuanto llegue la mercancía.
Básicamente a nivel de programación podemos hacer lo mismo. O bien, mediante polling, que es la opción de estar preguntando continuamente al responsable del almacén. O bien, mediante webhooks que es decirle que te llame a un número de teléfono, siendo ese número de teléfono el webhook.
Por ejemplo, Telegram, tiene los dos procedimientos, el de polling, con el procedimiento getUpdates, o el de webhooks.
Y esto de los webhooks ¿quien lo utiliza?
Ahora que ya has visto la conveniencia de los webhooks, y te has convencido que es un medio mas que interesante, es probable que te estés preguntando quien utiliza esto de los webhooks. O traducido al román paladino… Seguro que esto no lo utiliza ni el tato. Error.
Como no podía ser de otra forma, en GitHub, puedes encontrar un listado de servicios que llamarían a tu webhook. Vamos, lo que Daniel Primo, el conductor de Web reactiva llamaría una lista awesómica… lo he acentuado y todo.
¿Que vas a encontrar en este listado awesómico? Pues en ese listado vas a encontar un centenar de servicios que pueden llamar a tu webhook. Por citar algunos,
- Asana
- Box… pero con b, no confundir con los del partido político. Esos no se si permiten webhooks.
- Dropbox
- Evernote
- GitHub
- GitLab
- Hipchat
- IFTTT
- Mailchimp
- PagerDuty
- PayPal
- Strava
- Stripe
- Telegram
- Trello
- Uber
- Wunderlist
- Zapier
También te indica algunos servicios que aceptan también llamadas a sus propios webhooks. Es decir, que en lugar de que ellos te llamen a ti, tu llamarlos a ellos.
¿Cual es el procedimiento de configuración de un WebHook en un servicio?
Te cuento por ejemplo el de GitLab, que es uno que he configurado recientemente y que te puede servir a ti también. En el caso que te cuento, indicarte que somos seis personas que estamos utilizando GitLab a modo de tablero Kanban.
Si no sabes lo que es un tablero Kanban, y por simplificar, imagínate un tablero de esos que se colocan en pared con post-it. El tablero lo divides en columnas. De nuevo por simplificar, una columna sería Para hacer, otra sería Haciéndose y la última Hecho. De esta forma cada una de tus tareas sería un post-it. Y iría pasando de una columna a otra del tablero, conforme la tarea va avanzando en su realización.
Tengo preparado un nuevo podcast en el que trataré en profundidad esto de los tableros Kanban, pero se trataba de que tuvieras una idea.
¿Como se integra esto de los webhooks con el tablero Kanban y GitLab? La configuración de un WebHook es sencilla. Se trata de asociar el webhook con un trigger, es decir, un desencadenante, un evento. Al producirse ese evento, se hace una llamada al webhook con una serie de parámetros correspondientes al evento que los ha producido.
En el ejemplo que te estoy indicando, un trigger o desencadenante, puede ser cambiar un post-it de columna. De esta manera, este evento llamaría a tu webhook. Y te informaría de lo que ha sucedido. La otra opción, sería que tu estuvieras mirando continuamente el tablero, para saber el estado de tus post-it.
Por resumir, se trata de asociar un evento desencadenante o trigger a tu webhook. Con esto ya lo tendrías configurado.
¿Que datos te llegan en cada llamada a tu webhook?
Esto es tan sencillo como definir un log en el código asociado a tu webhook e ir realizando llamadas. Así podrás estudiarlo con detenimiento. La otra opción, mas aburrida pero, probablemente, mucho mas eficaz, es la de estudiar la documentación del proveedor. Aunque, también tengo que decir, que en ocasiones, esta documentación justo brilla por su ausencia o obsolescencia…, cualquiera de las dos encias.
Para ver la evolución en tiempo real de las llamadas al webhoolk, puedes hacer uso de uno de los filtros que he comentado en el capítulo del tutorial sobre el terminal en el que hablo de tail.
Infraestructura
A pesar de lo que diga Samuel, del podcast Yo Virtualizador, un podcast asociado también a la red de https://feedpress.me/sospechosos habituales, y que te recomiendo encarecidamente,con poco y menos puedes tener un webhook.
Con una Raspberry, es posible tener una especie de centro de notificaciones. Un punto donde lleguen todas las notificaciones de todos los servicios y tu las redirijas a un único punto, o las registres o hagas lo que consideres. Partiendo de que todo esto lo tienes en una Raspberry, los pasos serían los siguientes,
- Montar un servidor Apache o Nginx. Yo actualmente me decanto por el segundo. En atareao.es, encontrarás como montar cualquiera de los dos. O incluso, mejor toda la infraestructura Lemp. De esta forma tendrás, no solo el servidor, si no también la base de datos. Así sería como pedía Samuel.
- Lo siguiente sería conseguir que tu Raspberry fuera visible desde el exterior. Esto no es gran problema. En el caso de que tengas una IP dinámica, que es lo que tenemos la mayoría de nosotros, tan solo tienes que seguir las indicaciones del tutorial sobre la tu propia nube, en el que trato del tema de la IP dinámica.
- El siguiente paso, que podemos en algunos casos evitar, pero que es muy recomendable, es el cifrado de las comunicaciones, tal y como explico en otro capítulo del tutorial sobre los primeros pasos con la Raspberry.
Con esto ya tenemos toda la infraestructura necesaria.
El código
Si no te manejas con el código, esta es la parte que a lo mejor te da un poco de repelús. Sin embargo, como verás a continuación, nada mas lejos de la realidad.
Esto parte la hago con PHP, por que pienso que es mas sencillo ponerla en marcha. Sin embargo, que quede constancia, que prefiero hacerla con Python, aunque es algo mas complejo, por lo menos lo que se refiere a la puesta en marcha.
De cualquier forma, siguiendo los siguientes capítulos del tutorial sobre telegram puedes implantarlo tanto para PHP como para Python,
- Flask y Nginx. Webhooks y Telegram. Para el caso de que lo quieras hacer con Python.
- Un bot de Telegram con PHP. Para el caso que prefieras utilizar PHP como lenguaje vehicular.
A continuación te pongo el sencillo código que puedes utilizar para el caso de PHP. En este código he añadido log, para que se monitoricen todas nuestras acciones.
Como digo en el caso de PHP, es tan sencillo como,
<?php
$request = file_get_contents("php://input");
$fecha = date('Y-m-d H:i:s');
file_put_contents("registro_de_actualizaciones.log", $fecha.' - '.$request, FILE_APPEND);
$request = json_decode($request)
La primera línea recibe el contenido de la llamada entrante. La segunda línea y tercera es para escribir en el log el contenido, y con la última línea, empezamos a trabajar.