Sobre o projeto

ClassSniper é um projeto de automação pessoal para reservar aulas de academia no instante em que a janela de reserva abre. Ele visa uma rede específica de academias (One Playground na Austrália), cujas aulas abrem para reserva exatamente 72 horas antes do horário de início — uma janela onde vagas e instrutores populares podem ser preenchidos em instantes. O repositório é um template que você pode adaptar para sua própria conta e local. Como funciona - Um serviço de cron externo chama o endpoint workflow_dispatch do repositório a cada 60 segundos. Cada execução verifica se a janela de 72 horas de qualquer reserva na fila já abriu. - Assim que a janela abre, o bot reserva a aula: primeiro via um caminho de API direta e rápida, recorrendo à automação completa de navegador com Playwright se o caminho rápido for inconclusivo. - Um scraper complementar extrai a agenda de aulas ao vivo de todas as unidades no mesmo ritmo, para que o dashboard web mostre aulas futuras reais (nome, instrutor, vagas restantes) em vez de apenas uma entrada cega de data/hora. - Uma regra de segurança rígida bloqueia a ativação ou execução de qualquer aula que comece a menos de 30 horas de distância, já que o cancelamento em menos de 24 horas gera uma taxa. Arquitetura O repositório atua como a fonte da verdade através de três arquivos JSON commitados (pending_booking.json, status.json, class_list.json). Um dashboard no GitHub Pages lê esses arquivos diretamente — público, sem necessidade de autenticação para visualização — e grava alterações de ativação/remoção através da API de Conteúdos do GitHub com um PAT de grão fino limitado ao repositório. O GitHub Actions executa o agendador; bot/scraper.py atualiza a agenda e bot/striker.py realiza a reserva. Capturas de tela e o estado do resultado são capturados de dentro do contexto ativo do Playwright para que as falhas sejam registradas em vez de ignoradas silenciosamente. Detalhes de engenharia notáveis - Desambiguação de aulas: aulas distintas frequentemente compartilham o mesmo horário no mesmo local, portanto, a correspondência apenas por data e hora é ambígua. Cada aula possui um booking_id único originado da própria API de sessão do local e é correspondida exatamente. - Caminho rápido: a leitura do pacote JavaScript do local revelou que o fluxo da interface "clicar em Reservar → fazer login → confirmar" consiste em duas chamadas HTTP por baixo. Esses endpoints públicos são chamados diretamente, mantendo o fluxo do navegador como um fallback testado. - Timing: o momento do disparo é computado com precisão, o processo aguarda até instantes antes, aquece sua conexão HTTP cerca de cinco segundos antes e então dispara. - Escolha do agendador: os gatilhos de agendamento do GitHub Actions são de melhor esforço e foi observado que ocorriam com intervalos irregulares sob carga, portanto, utiliza-se um cron externo atingindo o workflow_dispatch a cada minuto; um grupo de concorrência e um loop de tentativa fetch-rebase lidam com execuções sobrepostas competindo no git push. - Higiene de credenciais: erros de timeout do Playwright podem incorporar valores do DOM, como o e-mail de login, portanto, o manipulador de timeout de login gera uma mensagem limpa, capturas de tela de depuração mascaram campos visíveis de e-mail/senha e uma etapa de redação remove correspondências de credenciais antes que qualquer coisa seja gravada no status.json público. - Limites de taxa: o caminho rápido faz no máximo três requisições por tentativa e não tenta novamente, deixando orçamento para um login de fallback. Stack e configuração Python, Playwright, GitHub Actions e HTML/CSS/JS sem framework no GitHub Pages. A adaptação requer o fork do repositório, a adição de segredos GYM_EMAIL e GYM_PASSWORD, a ativação de Pages e Actions, o fornecimento de um token de grão fino para o dashboard e — crucialmente — a configuração de um gatilho externo com um segundo token limitado ao Actions, já que o cron integrado é descrito como instável demais para disparos pontuais. Escopo O projeto automatiza as reservas de uma única conta pessoal em um serviço que o operador paga, utilizando as mesmas interfaces públicas que o próprio site do serviço utiliza. É declarado que ele não ignora a autenticação, não acessa dados de outros membros nem excede os limites de taxa documentados. Licenciado sob MIT.