Serviços públicos e marcação de consultas. Fila ao vivo?

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.








All Articles