Servicios públicos y concertar cita. ¿Cola en vivo?

Probablemente te hayas encontrado con una situación en la que necesites concertar una cita, pero no hay entradas gratuitas. Un artículo sobre cómo logramos automatizar el proceso de espera usando el ejemplo de la obtención de un pasaporte extranjero.





Después de la aprobación de la solicitud electrónica de pasaporte, debe programar una cita para una visita personal con el fin de traer los originales de los documentos y tomar una foto. Al ir a los servicios públicos durante varios días en diferentes horarios, no encontré ningún cupón gratis. No quería continuar con esa lotería.





La solución es bastante sencilla. Cuando el usuario selecciona una dirección en el mapa, se envía una solicitud que devuelve el tiempo de visita disponible. Es visible en la consola del desarrollador. A partir de ahí, aprenderemos sobre la URL y los 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 un problema. Para recibir una respuesta exitosa, es necesario agregar cookies a la solicitud. Se pueden copiar de la misma solicitud. Pero solo funcionarán durante unas horas. Por lo tanto, cuando recibimos un error (401), pasamos la autorización y copiamos nuevas cookies, guardándolas en un archivo. Cuando encontremos espacio libre, abrimos el navegador de esta página.





La implementación requería Python, Selenium y el Programador de tareas de Windows. Así, obtenemos el siguiente 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 obtener cookies, usando Selenium, vaya a la página de inicio de sesión, busque los campos de entrada e inserte un inicio de sesión con una contraseña. En la práctica, no era posible iniciar sesión sin el modo de ventana. Por lo tanto, cada pocas horas aparecerá una ventana del navegador durante un par de segundos. Para obtener el conjunto de cookies requerido, vaya a la página donde se selecciona la dirección del departamento 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 una solicitud, las cookies tienen el formato =;







raw_cookies = ''.join(['{}={}; '.format(i['name'], i['value']) for i in cookies])
      
      



Queda por configurar el Programador de tareas de Windows. .py



No logré ejecutar el script directamente. Por lo tanto, a través de .bat



un comando python "script.py"



. Sí, esto abre una ventana de consola. Existen programas externos que le permiten iniciar la consola en secreto.





Como resultado, el tercer día y 240 lanzamientos alrededor de las 17 en punto, había un espacio libre para grabar. Creo que podemos ir más allá y realizar grabaciones automáticas a través de solicitudes posteriores.








All Articles