Posted on

Botlpf es un bot de twitter que he creado para La piñata Frikie, un blog con más de una década de existencia pero abandonado. Que tocaba temática friki y creado por cuatro amigos.

Desde hace ya mucho me plantee crear un bot nostálgico que se encargara de tuitear de forma automática un recordatorio de las entradas que se publicaron ese mismo día pero en años anteriores. El texto del tweet sigue el siguiente esquema:

«Tal día como hoy, hace [año actual – año post] años, [twitter del autor] posteó: [Título del post] [Etiquetas de la entrada en forma de tags de twitter] [URL]«

Data mining

Para empezar, hace falta extraer los datos de las entradas del blog. En este caso al ser un blog en abandono se pueden extraer de un solo golpe y olvidarse, ya que nunca va a haber actualizaciones o nuevas entradas. Pero en caso de ser un blog en funcionamiento lo único que habría que hacer es programar una tarea que ejecutara el programa una vez al día para actualizar los datos.

Los datos se extraen mediante la API de blogger, que pertenece al ecosistema de Google. Para usarla necesitaremos:

Y ya podemos obtener los datos. Teniendo la clave de la API y la ID del blog no necesitamos nada más siempre que este sea público. Si el blog es privado habrá que añadir la autenticación que complica un poco más pero tampoco debería ser mayor problema. Pero, como he dicho, en este caso no es necesario.

Una vez extraídos los datos deberemos plantearnos dónde los almacenaremos, ya que esta elección afectará a la arquitectura del bot. En este caso yo me he decidido por guardar los datos en CSV como copia de seguridad y en un servidor MySql (MariaDB) que tengo levantado para el acceso a los datos.

Teniendo definidas estas partes solo queda crear el script de python que generará las tablas de datos:

GitHub: Botlpf/Data Mining

En ese repositorio de GitHub se encuentran los archivos necesarios para generar la extracción de datos. Tan solo es necesario rellenar los huecos del archivo config.py. Y ejecutar el archivo Blogger_to_MySql.py.

Este script realizará las siguientes tareas:

  1. Extrae los datos que nos interesan (y alguno más ya que estamos) sobre las entradas del blog en una tabla con un registro por entrada.
  2. Crea nuevas columnas que necesitaremos más tarde: Extracciones del timestamp (mes:día, año y hora:minuto), transformación de las etiquetas de blogger en tags de twitter y asignación de la cuenta de twitter a cada autor.
  3. Crea una nueva base de datos en el servidor MySql con las tablas vacías ya preparadas para recibir los datos.
  4. Se generan dos tablas de datos distintas: Todos los datos completos (posts_full.csv) y otra con los datos mínimos necesarios para que el bot funcione (posts_min.csv).
  5. Por último se guardan los datos en formato csv y en el servidor de MySql.

El resultado es algo tal y como esto:

Nota: La función to_sql de la librería pandas es muy suya y suele fallar con temas de la codificación. Pero no tendremos ningún problema en ese caso si usamos cualquier cliente para importar los csv a sus correspondientes tablas. En este caso yo utilizo HeidiSQL.

El bot

GitHub: Botlpf/Source

Para poder publicar los tweets, nos valdremos de la librería Tweepy, para usar la API de Twitter a través de ella. Así que necesitaremos obtener las claves y secretos para usar la API y autenticarnos. Para ello deberemos darnos de alta como desarrolladores y registrar la aplicación.

Una vez con las claves y secretos en nuestro poder, las usamos para rellenar los huecos del archivo config.py. Además de añadir los datos de acceso al servidor de MySql. En este caso no añado el host porque está instalado en la misma máquina que lo ejecuta, por lo que es localhost.

Crontab

El bot está pensado (aunque planeo retocarlo para hacerlo más óptimo en un futuro) para ejecutarse cada minuto, comprobando si algún post coincide en hora y minuto con el momento actual.

Para que el script se ejecute cada minuto he recurrido al clásico y confiable CRON que viene por defecto en la mayoría de las distribuciones basadas en Linux, como es el caso de mi servidor doméstico (el mismo que hostea esta esta página web). Así que una vez cargado en el servidor, asegurándonos de que están todas las dependencias y la última versión de python añadida, editamos crontab:

$ crontab -e

Y añadimos el script, cambiando [path] por la ruta en la que lo hayamos metido:

*/1 * * * * python /[path]/botlpf.py

Llegado a este punto, esto es lo que debería ocurrir con nuestro bot de botlpf.py:

  1. Crontab ejecutará el script cada minuto.
  2. Cada vez que se ejecute busca en la tabla posts_min aquellos registros que coinciden en hora y minuto con el tiempo real y los saca como DataFrame de Pandas.
  3. Se aplica una función por cada registro de esa tabla. En caso de no haber registros no hará nada.
  4. La función publica un tweet en la cuenta @lapinatafrikie con el texto que he puesto arriba.
  5. Se añade un registro a la tabla log que se ha creado inicialmente en el servidor MySql. Este registro consta de 2 campos: Un timestamp y el tweet generado y publicado o el valor por defecto False si no ha habido coincidencia.

Y ya lo tenemos, si todo va bien el bot debe estar ejecutándose minuto a minuto y publicando tweets como los de este ejemplo:

Repositorio: GitHub: botlpf

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.