Automatizando Tareas Aburridas con Python (Ejercítate en Casa) ft. WGER

Mauricio Matias C.
4 min readSep 13, 2020

A día de hoy han pasado como 6 meses de cuarentena intermitente en Bolivia mi país de origen, 6 meses son mucho tiempo y muy bien saben que cuando una parte de nuestro cuerpo no es empleada se atrofia, es decir, probablemente tengas un cuerpo con una atrofia de 6 meses o más 😆 , pero no te asustes, en este post resolveremos este problema de la forma más divertida e intrusiva posible.

Hace unas semanas me propuse automatizar mis rutinas de ejercicio, no soy un experto en este tema ya que las veces que fui a un gimnasio son casi nulas, por otro lado, en internet tenemos a disposición horas y horas de entrenamientos y explicaciones para ir empezando, mi meta, simplemente mantenerme activo físicamente y porque no fortalecer mis limitaciones físicas.

En ese sentido, busque como obtener ejercicios aleatorios con un script, acá se presentan las siguientes opciones:

  • Buscar manualmente una serie de ejercicios, parametrizarlos y almacenarlos en un registro o archivo (.xml .csv o .json) para posteriormente extraerlos uno a uno aleatoriamente según convenga.
  • Web Scraping de una pagina con ejercicios y rutinas interesantes.
  • Buscar en la web un servicio API REST de ejercicios listo para consumir.

Siempre me decanto por la solución mas sencilla, a simple vista buscar manualmente una serie de ejercicios en la web y crear una base de datos o registro no me parece nada automático, web scraping es algo tedioso pero no imposible, es así que la solución que involucra una API REST se convierte en la mas atractiva y accesible. Estableciéndose como un punto de partida. Tras una vuelta por internet me tope con esta API:

WGER es un administrador de entrenamientos con una API lo suficientemente abierta para aprovechar los ejercicios que alberga, por otro lado y como toda API abierta, tiene ciertos problemas en el contenido que ofrece, ya que hay registros con contenido incoherente, pero realmente no es algo preocupante ya que eso no ocurre ni el 5% de las veces que se hace peticiones.

Lo primero al ver una API abierta es leer su documentación o al menos darle un corto vistazo, en este caso no puedo quejarme de la documentación que WGER ofrece ya que pude encontrar todo lo que necesitaba sin mucho esfuerzo. A continuación les enseño el modelo relacional de su base de datos, lo que me llamo la atención es que note cierta familiaridad con la forma en la que maneja su API REST y tras una vista en los repositorios de github llegue a confirmar que usan Django como core para su backend.

Modelo ER de la base de datos de WGER

Una vez comprendida la relación que existe de entidad en entidad solo toca buscar como extraer ejercicios de forma aleatoria, al ser un API REST usaremos un cliente HTTP, siendo más concreto la popular biblioteca requests de Python.

Decidí que todas las consultas se hagan en función del equipo de entrenamiento que se tenga en casa, no todos disponen de mancuerdas, pesas, bancas especiales, etc. Es así que en el script que dejaré al final del post encontraran un arreglo llamado EQUIPEMENT en el que pueden comentar o descomentar los equipos de entrenamiento que posean o no.

Para hacer mas extensible el script hice un pequeño mapeo en clases u objetos de las entidades que considere mas importantes para el proyecto. Ahora entiendo como le hacen para mapear APIs, no del todo, pero al menos este ejemplo basta para entender de que van las libs que mapean una API.

Finalmente queda la etapa de spameo de ejercicios, la más delicada y opte por exponer una página estática en el servidor HTTP que Python trae por defecto.

Dicha página estática contiene la información de un ejercicio aleatorio en particular (que el script extrae de la API de WGER). No siempre la descripción que la API nos da acerca de un ejercicio, es suficiente. Por lo que incremente vídeos embebidos de YouTube con relación a dicho ejercicio.

¿Por qué una página estática? Tiene la ventaja de ser vista fácilmente desde un navegador y no necesita mucho para mostar contenido multimedia ya que es solo HTML y JavaScript (le puse Vue.js en el HTML en vez de JQuery, mucho más sencillo aún), conveniente ya que Python tiene la biblioteca webbroser que permite abrir una URL en el navegador por defecto del sistema. Desarrollarlo con bibliotecas GUI de Python haría mas complejo el problema. Y bueno a problemas sencillos soluciones sencillas.

Hasta este punto tenemos cubierto los problemas de recolección y visualización ¿Qué hay del spam?, apilamos todos los procedimientos en una función, iteramos infinitamente y hacemos una llamada a dicha función pasado cierto retardo, es decir, cada cuanto queremos que se nos muestre un ejercicio en el navegador. Resultado:

Ejercicio aleatorio

He aquí el repo, no olviden detenerse a leer un momento las instrucciones:

Les dejo la tarea de ejecutar este script cada que arranca su sistema, al menos si usas MacOS o Windows, con respecto a Linux no tendrás problemas, pero fíjate las instrucciones para agregarlo al cron.

Espero les entretenga y mantenga activos físicamente como a mí 😃. Se despide su amigo cr0wg4n, cambio y fuera 👋.

--

--