Você provavelmente já se deparou com uma situação em que precisa marcar uma consulta, mas não há ingressos grátis. Um artigo sobre como conseguimos automatizar o processo de espera usando o exemplo da obtenção de um passaporte estrangeiro.
Após a aprovação do pedido eletrônico de passaporte, é necessário agendar uma visita pessoal para trazer os originais dos documentos e tirar uma foto. Indo ao serviço público por vários dias em horários diferentes, não encontrei nenhum cupom grátis. Eu não queria continuar com essa loteria.
A solução é bem simples. Quando o usuário seleciona um endereço no mapa, é enviada uma solicitação que retorna o horário de visita disponível. É visível no console do desenvolvedor. A partir daí, aprenderemos sobre o URL e os parâmetros.
def send_post(cookies):
url = 'https://www.gosuslugi.ru/api/lk/v1/equeue/agg/slots'
headers = {'Content-type': 'application/json;charset=UTF-8', 'Accept':'application/json', 'Cookie':cookies}
payload = {'eserviceId':'','serviceId':[''],'organizationId':[''],'parentOrderId':'','serviceCode':'','attributes':[]}
return post(url, data=dumps(payload), headers=headers)
Surge um problema. Para receber uma resposta bem-sucedida, os cookies precisam ser adicionados à solicitação. Eles podem ser copiados da mesma solicitação. Mas eles funcionarão apenas por algumas horas. Portanto, quando recebemos um erro (401), passamos a autorização e copiamos os novos cookies, salvando-os em um arquivo. Quando encontrarmos espaço livre, abra o navegador para esta página.
Implementação necessária Python, Selenium e Windows Task Scheduler. Assim, obtemos o seguinte código principal:
from webbrowser import open as open_tab
from selenium import webdriver
from datetime import datetime
from requests import post
from json import dumps
from os import path
def main():
response = send_post(read_cookies())
if response.status_code == 401:
write_cookies(get_cookies())
write_log(' 401. .')
main()
return
elif response.status_code == 200:
length = len(response.json()['slots'])
if length > 0:
write_log(' : ' + length)
open_tab(TARGET_LINK, new=1)
else:
write_log(' ')
else:
write_log(' {0}'.format(response.status_code))
Para obter cookies, usando o Selenium, acesse a página de login, encontre os campos de entrada e insira um login com uma senha. Na prática, não era possível fazer login sem o modo de janela. Portanto, a cada poucas horas, uma janela do navegador aparecerá por alguns segundos. Para obter o conjunto de cookies necessário, vá para a página onde o endereço do departamento está selecionado TARGET_LINK
.
def get_cookies():
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('--minimal')
driver = webdriver.Chrome(executable_path=DRIVER_FILE, options=options)
driver.get('https://esia.gosuslugi.ru/')
driver.implicitly_wait(7)
input_login = driver.find_element_by_id('login')
input_password = driver.find_element_by_id('password')
btn_enter = driver.find_element_by_id('loginByPwdButton')
input_login.send_keys(LOGIN)
input_password.send_keys(PASSWORD)
btn_enter.click()
driver.get(TARGET_LINK)
cookies = driver.get_cookies()
driver.close()
return cookies
Para uma solicitação, os cookies são formatados para =;
raw_cookies = ''.join(['{}={}; '.format(i['name'], i['value']) for i in cookies])
Resta configurar o Windows Task Scheduler. .py
Não consegui executar o script diretamente. Portanto, por meio de .bat
um comando python "script.py"
. Sim, isso abre uma janela de console. Existem programas externos que permitem que você inicie o console secretamente.
Com isso, no terceiro dia e 240 lançamentos por volta das 17 horas, havia um espaço livre para gravação. Acho que podemos ir mais longe e fazer a gravação automática nas solicitações subsequentes.