Automatização de compra de bilhetes de trem via Python com análise de código e download
Resumo: Com a proximidade do período de viagens da Festa da Primavera, implementamos um fluxo automatizado para monitorar e comprar bilhetes no site 12306. Utilizamos o módulo tkinter para criar uma janela de notificação após a compra bem-sucedida, informando ao usuário sobre o sucesso da operação. A versão sem interface gráfica permite que o script execute em segundo plano, exibindo alertas apenas quando necessário. Testado com sucesso e efetuada compra de bilhete
Aviso: Este artigo tem fins exclusivamente técnicos e não pode ser utilizado para fins comerciais. Todos os conteúdos são originais. Para reprodução, inclua o link deste artigo
Pré-requisitos
Versão:
Python: 3.9
Chromedriver: procure no site oficial a versão compatível com seu navegador
Endereço do site oficial do Chromedriver: http://chromedriver.storage.googleapis.com/index.html (ou pesquise no Google)
Módulos utilizados:
1. selenium: utilizado para automatizar operações no navegador, simulando login, consulta de bilhetes e processo de reserva.
2. configparser: usado para ler e gravar arquivos de configuração, armazenando informações como origem, destino e data da viagem.
3. schedule: responsável por executar tarefas programadas, realizando consultas e reservas em intervalos definidos.
4. time: fornece funcionalidades relacionadas ao tempo, como pausas entre operações.
5. tkinter: utilizado para criar uma interface gráfica simples, exibindo uma janela de notificação após a compra bem-sucedida.
Parte 1 - Fluxo principal
1. Simulação de login: Utilizamos o Selenium para automatizar o processo de login no site 12306, incluindo a digitação de nome de usuário, senha, dígitos finais do RG e código de verificação do celular.
2. Leitura de configurações: Obtemos informações de viagem (origem, destino e data) através de um arquivo de configuração ou entrada manual.
3. Consulta de bilhetes: Simulamos a consulta de bilhetes no site 12306, preenchendo os campos de origem, destino e data, e executando a busca.
4. Simulação de reserva: Se encontrarmos bilhetes disponíveis, o script simula o clique no botão de reserva, acessando a página de finalização da compra.
5. Seleção de passageiros: Na página de finalização, o script marca automaticamente os dados dos passageiros para envio do pedido.
6. Confirmação do pedido: Simulamos o clique no botão de confirmação, finalizando o processo de compra.
7. Notificação de sucesso: Após a confirmação bem-sucedida, usamos o módulo tkinter para exibir uma janela de notificação com informações sobre a compra.
8. Informações de pagamento: A janela exibe dados relevantes para o pagamento, orientando o usuário a concluir a transação.
Parte 2 - Análise do código de login
- Abertura da página de login: driver.get("https://kyfw.12306.cn/otn/resources/login.html") abre a página de login do 12306.
- Localização dos campos de usuário e senha: Utilizamos driver.find_element para localizar os campos de login pelo ID.
- Digitação de usuário e senha: Enviamos os dados digitados pelo usuário via send_keys.
- Clique no botão de login: driver.find_element(By.ID, "J-login").click() simula o clique no botão de login.
- Autenticação: Digitação dos dígitos finais do RG e código de verificação via SMS.
- Aguardar conclusão do login: Usamos time.sleep(10) para garantir que a página carregue completamente após o login.
- Navegação para página de consulta: Localizamos a opção de bilhetes de ida via XPath e acessamos a página de consulta.
Parte 2 - Análise do código de consulta
Inserção das informações: Obtemos dados de origem, destino e data do arquivo de configuração, inserindo-os nos campos correspondentes via send_keys. Seleção de critérios: Utilizamos a classe Select para lidar com menus suspensos, escolhendo o horário de saída. Marcação de bilhetes disponíveis: Verificamos se a caixa de seleção já está marcada, e se não estiver, clicamos para marcar. Clique no botão de consulta: Simulamos o clique no botão de busca.
Aguardar resultados da consulta: Utilizamos WebDriverWait para aguardar a aparição dos elementos de resultados, com tempo máximo de 10 segundos.
Processamento dos resultados: Se houver resultados, simulamos o clique no elemento de resultado e chamamos a função place_order para finalizar a compra. Verificação do status de login: Verificamos se o campo J-userName existe, indicando que o login expirou, encerrando o programa. Tratamento de exceções: Capturamos exceções para lidar com casos temporários de indisponibilidade de bilhetes.
Parte 3 - Aálise do código de finalização da compra
1. Marcação dos passageiros
Localizamos o elemento da caixa de seleção via XPath. Verificamos se a caixa já está marcada, e se não estiver, clicamos para selecionar os passageiros.
2. Verificação de navegação bem-sucedida
Obtemos a URL atual após clicar no botão de finalização do pedido. Verificamos se a URL mudou, indicando que a navegação foi bem-sucedida. Se a compra for concluída, realizamos ações cnoforme o conteúdo da página, como exibir a notificação de suceso.
Parte 4 - Tarefas programadas
As tarefas programadas atuam como um assistente automático que verifica regularmente as informações de bilhetes, facilitando a compra e a finalização. Isso evita a necessidade de intervenção manual, garantindo respostas rápidas durante os períodos de pico. A inclusão de tarefas programadas no código permite maior eficiência no processo.
Sumário do processo de aprendizado
- Testes mostraram que o login no 12306 expira após aproximadamente 1 hora, exigindo reautenticação.
- O programa foi desenvolvido com foco em cenários individuais, não abordando threads ou programação de rede.
- A funcionalidade de notificação via serviço de SMS da Alibaba Cloud não foi implementada devido à rigorosa verificação de APIs.
- Alguns elementos podem ter caminhos XPath diferentes, recomenda-se usar as ferramentas de desenvolvedor do navegador (F12) para obter os caminhos corretos.
- A estrutura do projeto inclui os arquivos main_auto.py e main_test.py, permitindo testes em um arquivo antes de implementar no principal.
Link do código-fonte
Comunidade com código-fonte (inclui códigos de todas as edições): https://t.zsxq.com/1645BOuxjCódigos com descontos: https://t.zsxq.com/16ksfdpbw