Al igual que puedes automatizar tareas uniendo servicios y aplicaciones de Internet entre sí, también puedes incorporar a ellas tu propio código escrito en Python.
Además de darte más control sobre la tarea, poder alterar el flujo y los datos de esta, modificarlos o añadir nuevos, te permite extender las posibilidades con nuevas funcionalidades creadas por ti, conectar otros servicios, APIs, librerías y aplicaciones para terminar automatizando prácticamente cualquier tipo de tarea que necesites.
A lo largo de los últimos años automatizando tareas para empresas, cada vez es más frecuente, además de interactuar con servicios y aplicaciones habituales, necesitar conectar con bases de datos y APIs corporativas, infraestructuras, redes privadas (VPN, VPS, VPC…), tecnologías propietarias o hacer un tratamiento particular de los datos.
Cuando te enfrentas a un proyecto de automatización con necesidades similares, poder cubrirlas incorporando nuevas piezas de código que puedan además interactuar con el resto del sistema resulta fundamental para poderlo llevar a cabo.
Webhooks
Por suerte muchas de estas necesidades pueden resolverse utilizando Webhooks, lo que permite incorporar nuevos servicios y comunicarnos por medio de eventos.
En cualquier momento durante la ejecución de una tarea automática se puede incluir mediante Webhooks llamadas externas a un entorno Python donde se ejecute un determinado código.
Opcionalmente podemos proporcionarle parámetros con datos que procedan de la tarea o actuar de acuerdo a la respuesta que devuelva el código Python.
Servidor Web para programación en Python
Para poder llamar a tu código escrito en Python es necesario que este sea accesible a través de una URL, por lo deberás contar con un servidor Web y recomendablemente un framework como Django, Flask o similar con el que construir la aplicación web donde residirá tu código.
Utilizaré el popular servicio Python Anywhere porque además de ofrecer todo esto sin la necesidad de instalar o configurar nada, podemos ejecutar código Python en cuestión de minutos de manera gratuita.
Una vez en la página de Python Anywhere haz clic en el botón «Start running Python online in less than a minute«.
Deberás crear una cuenta haciendo clic en el botón «Create a Beginner account«. Con la modalidad gratuita tienes más que suficiente para la mayoría de casos.
Una vez creada tu cuenta te llevará al Dashboard, donde puedes ver una relación de las distintas web apps que tengas creadas, los ficheros de tu servidor, etc.
Lo primero que haremos será crear una aplicación web. Para ello haz clic en el botón «Open Web tab«.
Como puedes ver aun no existe ninguna aplicación web. Crea la primera de ellas haciendo clic en el botón «Add a new web app«.
A continuación se muestra el nombre de dominio que te ha asignado Python Anywhere y donde residirá tu aplicación Web en adelante.
Haz clic en Next para continuar.
Es el momento de elegir el framework que utilizarás para la aplicación web de Python. Para este ejemplo haré uso del framework Flash y la versión de Python 3.8.
A continuación puedes personalizar la ruta de tu aplicación.
A menos que quieras especificar uno en concreto puedes clic directamente en Next para continuar.
Finalmente tu entorno ya está configurado y listo para empezar a trabajar, pero antes tienes que hacer clic en el botón «Run until 3 months from today«, lo que permitirá que el entorno esté disponible durante los 3 próximos meses de manera gratuita.
Cada tres meses deberás pulsar este botón para renovar el periodo de vida de tu aplicación web, a menos que decidas en algún momento dar el salto a un plan premium de Python Anywhere.
Haz clic en la opción Files del menú superior y accederás al directorio de archivos de tu aplicación.
Todo el código de la aplicación estará alojado en el directorio «mysite» que aparece en la columna izquierda. Haz clic en este directorio para ver su contenido.
El archivo flask_app.py es donde escribirás tu código. Haz un clic en él para abrirlo dentro del editor de código de Python Anywhere.
Como puedes observar la aplicación ya contiene el código necesario para arrancar el framework de Flask y devolver el mensaje «Hello from Flask!» cuando se invoca la ruta «/».
Abre un navegador y comprueba que efectivamente recibes este mismo mensaje al introducir el dominio de tu aplicación web.
Enhorabuena, ya tienes tu propio entorno en la nube donde ejecutar código Python.
Conversor de horas a minutos
Imaginemos una tarea automática capaz de recibir un email donde venga indicado un número de horas, convertirlas a minutos y responder el email con el número de minutos.
Programaremos la tarea delegando todas las piezas de recepción y envío de emails a Botize mientras que la conversión de horas a minutos la implementaremos en Python.
Mediante un Webhook llamaremos a nuestro código Python enviándole el número de horas que se recibió en email. Python resolverá la conversión y entregará el número de horas equivalente a la tarea, que procederá entonces a enviar el mail con la respuesta.
Utilizo el email con la finalidad de simplificar el proceso, pero puedes reemplazarlo por cualquier otra pieza de Botize, desde una base de datos hasta publicarlo en Twitter o convertirlo en un Bot de Telegram.
Conversor en Python
Comencemos por incorporar al código fuente de nuestra web app el correspondiente al conversor de horas a minutos.
En primer lugar habilita una nueva ruta a la que puedes llamar «/botize» para diferenciarla de la ruta «/» que viene por defecto. Esta será la que utilizaremos y por donde enviaremos mediante parámetro GET el número de horas.
Finalmente añadimos el código necesario para leer los parámetros recibidos y generar la respuesta con el número de minutos correspondiente.
En la línea 5 se ha incluido la librería request, necesaria para obtener los parámetros GET indicados en el Webhook.
El número de horas vendrá especificado en el parámetro hours y el número de minutos lo entregaremos en el parámetro minutes.
Como puedes observar en el código Botize precisa que la respuesta contenga el objeto meta con un código de respuesta 200, lo que indica que no ha habido errores y que los datos que entregamos estén dentro del objeto data.
Para terminar haz clic en el botón «Save» del menú superior y a continuación en el botón de refrescar situado a la derecha. Este reiniciará el servicio para que nuestros cambios queden reflejados.
Probemos el resultado manualmente introduciendo la dirección de tu dominio seguido de la ruta «/botize» y un número de horas.
Como puedes observar el resultado es una cadena JSON con la estructura necesaria y el número de horas convertido a minutos.
Creando la tarea automática
Es hora de crear la tarea automática y unir todas las piezas.
Accede a Botize y crea una nueva tarea o directamente haz clic aquí.
Estás en el editor de tareas de Botize. El primer paso es seleccionar el servicio que dará comienzo a la tarea, en nuestro caso el email. Haz clic en el icono de Botize Mail como se muestra en la imagen.
Selecciona la opción «Si envío un email a bot@botize.com«, para que la tarea se accione cada vez que le enviamos un email al bot de Botize.
En otros escenarios podríamos haber elegido que la tarea se ejecute cuando un usuario escriba en un grupo de Telegram, sistemáticamente todos los días a una hora determinada, cuando subimos un archivo a Dropbox, etc.
En el campo «Cuenta de correo del remitente» indica el mail que utilizarás para comunicarte con la tarea.
Haz clic en el botón de Siguiente y aparecerá el siguiente mensaje indicando que para verificar que la cuenta es correcta debes enviar un email a bot@botize.com con el asuno BOTIZE.
Envíalo y pulsa el botón Verificar.
Has completado el primer paso y la tarea ya está lista para recibir emails desde la cuenta indicada. A continuación Botize vuelve a mostrarte los distintos servicios con los que puedes seguir automatizando acciones.
Haz un clic en el icono de Webhooks como se muestra en la imagen.
De entre las distintas operaciones que puedes automatizar selecciona «Ejecutar una petición GET«.
En el campo URL indica la dirección de tu aplicación Python.
En el campo Parámetros GET hay que indicar los parámetros que queremos enviar a Python.
En el código esperábamos recibir el número de horas en el parámetro hours, por lo que lo indicaremos aquí, mientras que el valor vendrá especificado en el cuerpo del email, por lo que en lugar de escribir un valor concreto, colocaremos la etiqueta Cuerpo, que hace referencia al valor que llegue cada email.
El resultado quedará como en la siguiente imagen. En tu caso la URL se corresponderá con la que Python Anywhere asignó para tu aplicación web.
Pulsa Siguiente para continuar.
Haz clic en el botón «+» que queda situado a la derecha del icono de Webhooks para habilitar un nuevo espacio, que usaremos para automatizar el email de respuesta.
Una vez seleccionado el icono de Botize Email, se nos muestran las distintas operaciones que podemos automatizar. En este caso selecciona la opción «Enviar un email desde bot@botize.com«, dado que en este último paso queremos que el bot nos responda con un email indicando el resultado en minutos.
Finalmente indica en el campo Para tu email y en el campo Mensaje el texto que quieras que se envíe.
En este caso el número de horas venía especificado como ya hemos visto en el cuerpo del email anterior, mientras que el número de minutos viene especificado en el parámetro minutes, de modo que el cuerpo del mensaje final quedará como se muestra en la imagen.
Ya has completado todos los pasos, es hora de pulsar el botón de Guardar cambios y probar tu tarea automática.
La tarea está marcada para ejecutarse cada hora, lo cual quiere decir que el bot revisará la bandeja de entrada y procederá con la conversión una vez cada hora.
Ahora que sabes incorporar Python en tus tareas, no solo tienes más control sobre los datos que se generan sino que en combinación con todos los demás servicios que integra Botize vas a descubrir nuevas posibilidades y llevar tus automatizaciones aún más lejos.
Si estás pensando en utilizar PHP en su lugar, también es posible. En esta entrada tienes todos los pasos para programar un Bot de Telegram añadiendo funcionalidad en PHP.
Si necesitas ayuda con la implementación o quieres compartir alguna de estas ideas puedes hacerlo en los comentarios de esta entrada.