Facundo Cornejo.
Volver a proyectos

Case study

Bot de Vuelos — Alertas de precio

Un bot que vigila precios de vuelos y avisa por Telegram, corriendo entero en GitHub Actions a costo cero. Estuvo 28 días sin mandar una sola alerta y todas las corridas figuraban en verde.

PythonhttpxGitHub ActionsTelegram Bot API

Contexto

Estaba organizando un viaje y buscar vuelos baratos se había vuelto un trabajo: mil pestañas abiertas, buscadores lentos, y horas por día sin garantía de encontrar el mejor precio. Vi la idea de un bot de alertas y pensé que lo podía hacer. Es un proyecto personal, sin cliente y sin plazo, que resultó ser el que más me enseñó sobre sistemas que corren solos.

Problema: casi ninguna aerolínea quiere que le consultes precios

Arranqué con las herramientas de desarrollador del navegador, interceptando las peticiones que hacen las webs de las aerolíneas al buscar un vuelo. Lo que encontré, y anoté como tabla de veredictos: una aerolínea con la API abierta y sin autenticación; otra con una clave pública que su propio frontend deja a la vista; y una tercera protegida con tokens y un sistema antibot serio, que directamente marqué como no viable en vez de perder días peleándola. Para cubrir el resto usé una librería que raspa Google Flights simulando un navegador. La arquitectura salió de ahí: APIs directas donde se puede, un raspador universal como red de seguridad.

Los 28 días de silencio

Un día el bot dejó de avisar. No falló: dejó de avisar. Las corridas programadas seguían apareciendo en verde, terminando sin error, y yo asumía que simplemente no había bajado ningún precio. Pasó un mes hasta que revisé de verdad. La librería que uso como fuente universal había sacado una versión nueva con la interfaz cambiada; el bot obtenía cero precios, no encontraba nada por debajo del umbral —porque no había nada— y terminaba con código de salida cero. Todo el sistema estaba diseñado para avisar cuando pasa algo, y no tenía forma de avisar cuando no pasaba nada. El arreglo tuvo dos partes. Una, fijar la versión exacta de la dependencia en vez de aceptar la última. La otra, y la que importa: una corrida con cero precios ahora manda alerta a Telegram y termina en error, así que la corrida aparece en rojo. Después del fix, la primera corrida trajo 534 precios y 8 alertas. La regla que me llevé: un sistema automático necesita saber gritar cuando no encuentra nada. El silencio no es una señal de éxito.

Solución y decisiones técnicas

  • Arquitectura de adaptadores: cada fuente traduce su formato propio a un resultado estándar. Sumar una aerolínea nueva es crear un archivo, sin tocar el motor.
  • Umbrales configurables por ruta en dólares y en pesos, con comparación entre monedas.
  • Deduplicación con estado persistido entre corridas: no repite la misma alerta, pero si el precio baja todavía más, vuelve a avisar. Sin eso el bot se vuelve ruido y lo terminás silenciando.
  • Peticiones en paralelo con Python asíncrono, para que las tres fuentes no se esperen entre sí.
  • Todo corre en la capa gratuita de GitHub Actions con una tarea programada cada 6 horas, y el panel se publica en GitHub Pages. Costo total de infraestructura: cero.
  • Cuando actualizo la librería de raspado, lo hago a mano y con una prueba local antes. Es la dependencia más frágil del sistema y ya me mordió una vez.

Resultado

Corriendo desde hace meses, con ocho rutas monitoreadas y más de 2.700 alertas emitidas en los últimos 90 días. El panel público muestra el mejor precio y el promedio por ruta, y la tabla de alertas con aerolínea, escalas y fecha de detección.

Aprendizajes

  • Un proceso automático tiene que reportar la ausencia de resultados como un problema, no como una corrida normal.
  • Fijar la versión exacta de la dependencia que sostiene el sistema. "La última" es una decisión que tomás una vez y te cobran después.
  • Antes de escribir un scraper, mirar si hay una API. Y antes de pelear una API protegida, evaluar si vale la pena: descartar una fuente a tiempo también es una decisión técnica.
  • Un panel público que muestra lo que el sistema está haciendo vale más que cualquier log: en un vistazo sé si está vivo.

En pantalla

Dashboard del bot con ocho rutas y sus mejores precios