M
en
Renfe Bot
Completado

Renfe Bot

Python Playwright Python-Telegram-Bot

Este proyecto nace de un problema que tuve tanto durante mi etapa universitaria como ahora, ya en el mundo laboral. El problema surge cada vez que intento reservar un viaje con Renfe en horas punta.

Estas franjas suelen ser los viernes y domingos por la tarde, cuando los estudiantes van y vuelven a sus casas. También entre semana a primera hora, cuando la gente va a trabajar.

Conseguir un billete en esos momentos es complicado: o reservas con mucha antelación, o confías en tener suerte y que justo alguien cancele su viaje en el instante en que intentas comprar.

De ahí surge la idea de este proyecto. El bot te permite seleccionar los viajes que estén completos y los monitoriza por ti. En cuanto detecta que alguien ha cancelado su billete, te envía una notificación para que puedas comprarlo al momento.

Funcionamiento

La interacción con el bot se realiza a través de Telegram.

Detalle del viaje

Desde ahí, puedes indicar las estaciones de origen y destino junto con la fecha de viaje. Se te muestran y eliges el tren que quieres monitorear. Solo puedes monitorear trenes que esten llenos.

Inicio de conversación

Puedes añadir múltiples viajes, consultar la lista de trayectos en seguimiento o eliminar viajes (si un trayecto deja de estar lleno, se elimina automaticamente de la lista de monitoreo).

Lista de comandos

En el momento que alguien cancele su viaje, el bot te envía una notificación.

Notificación de disponibilidad

Detalles Técnicos

El núcleo del proyecto es un scraper desarrollado en Python utilizando Playwright. Playwright permite interactuar con la páginas web como lo haría una persona.

El proceso de scraping sigue estos pasos:

  1. Navegación y Cookies: El bot inicia una instancia de Chromium (headless), accede a la web de Renfe y gestiona el banner de cookies.
  2. Interacción con el Formulario:
    • Autocompletado: Para introducir las estaciones de origen y destino, el script escribe el nombre, espera las sugerencias del autocompletado y utiliza difflib.SequenceMatcher para seleccionar la opción más similar.
    • Selección de Fecha: Interactúa con el componente de calendario lightpick de la web, navegando entre meses y años para hacer clic en el día exacto.
  3. Extracción de Resultados: Una vez realizada la búsqueda, el script espera a que cargue la tabla de trenes (#listaTrenesTBodyIda). Analiza cada fila para extraer horarios y determinar el estado:
    • Disponible: Si detecta un precio (.precio-final).
    • Completo: Si encuentra indicadores de plazas agotadas (iconos específicos o clases CSS).
  4. Verificación: Compara los resultados con los trenes monitorizados y, si encuentra disponibilidad en uno que estaba lleno, lanza la notificación a través de la API de Telegram.