Sobre el proyecto

ClassSniper es un proyecto de automatización personal para reservar clases de gimnasio en el instante en que se abre la ventana de reserva. Se enfoca en una cadena de gimnasios específica (One Playground en Australia), cuyas clases se abren para reserva exactamente 72 horas antes de la hora de inicio, una ventana en la que los turnos e instructores populares pueden llenarse en cuestión de momentos. El repositorio es una plantilla que se puede adaptar a su propia cuenta y centro. Cómo funciona - Un servicio de cron externo llama al endpoint workflow_dispatch del repositorio cada 60 segundos. Cada ejecución verifica si la ventana de 72 horas de alguna reserva en cola ya se ha abierto. - Una vez que se abre la ventana, el bot reserva la clase: primero a través de una ruta de API directa y rápida, recurriendo a la automatización completa del navegador con Playwright si la ruta rápida no es concluyente. - Un scraper complementario extrae el horario de clases en vivo de todas las ubicaciones del estudio con la misma cadencia, para que el tablero web muestre clases próximas reales (nombre, instructor, plazas restantes) en lugar de una entrada ciega de fecha/hora. - Una regla de seguridad estricta bloquea la activación o ejecución de cualquier clase que comience a menos de 30 horas, ya que cancelar dentro de las 24 horas conlleva una tarifa. Arquitectura El repositorio actúa como la fuente de verdad a través de tres archivos JSON confirmados (pending_booking.json, status.json, class_list.json). Un tablero de GitHub Pages lee esos archivos directamente —público, sin necesidad de autenticación para verlo— y escribe los cambios de activación/eliminación a través de la API de GitHub Contents con un PAT de grano fino limitado al repositorio. GitHub Actions ejecuta el programador; bot/scraper.py actualiza el horario y bot/striker.py realiza la reserva. Las capturas de pantalla y el estado del resultado se capturan desde el contexto en vivo de Playwright para que los fallos queden registrados en lugar de ser ignorados silenciosamente. Detalles de ingeniería notables - Desambiguación de clases: a menudo, clases distintas comparten la misma franja horaria en la misma ubicación, por lo que coincidir solo con la fecha y la hora es ambiguo. Cada clase lleva un booking_id único proveniente de la API de sesiones del centro y se coincide exactamente. - Ruta rápida: la lectura del paquete JavaScript del centro reveló que el flujo de la interfaz de usuario "clic en Reservar → iniciar sesión → confirmar" consiste en dos llamadas HTTP subyacentes. Esos endpoints públicos se llaman directamente, manteniendo el flujo del navegador como un respaldo probado. - Temporización: el momento del ataque se calcula con precisión, el proceso permanece inactivo hasta justo antes, prepara su conexión HTTP unos cinco segundos antes y luego se dispara. - Elección del programador: los disparadores de programación de GitHub Actions son de "mejor esfuerzo" y se observó que aterrizaban muy distantes bajo carga, por lo que se utiliza un cron externo que golpea workflow_dispatch cada minuto; un grupo de concurrencia y un bucle de reintento fetch-rebase gestionan las ejecuciones superpuestas que compiten en el git push. - Higiene de credenciales: los errores de tiempo de espera de Playwright pueden incrustar valores del DOM como el correo electrónico de inicio de sesión, por lo que el manejador de tiempo de espera de inicio de sesión genera un mensaje limpio, las capturas de pantalla de depuración enmascaran los campos visibles de correo electrónico/contraseña y una pasada de redacción elimina las coincidencias de credenciales antes de que se escriba cualquier cosa en el status.json público. - Límites de tasa: la ruta rápida realiza como máximo tres solicitudes por intento y no reintenta, dejando presupuesto para un inicio de sesión de respaldo. Stack y configuración Python, Playwright, GitHub Actions y HTML/CSS/JS sin framework en GitHub Pages. Adaptarlo requiere hacer un fork del repositorio, añadir los secretos GYM_EMAIL y GYM_PASSWORD, habilitar Pages y Actions, proporcionar un token de grano fino para el tablero y, fundamentalmente, configurar un disparador externo con un segundo token limitado a Actions, ya que el cron integrado se describe como demasiado poco fiable para ataques puntuales. Alcance El proyecto automatiza las reservas de una sola cuenta personal en un servicio que el operador paga, utilizando las mismas interfaces públicas que utiliza el propio sitio web del servicio. Establece que no elude la autenticación, no accede a los datos de otros miembros ni excede los límites de tasa documentados. Licenciado bajo MIT.