Services publics et prise de rendez-vous. File d'attente en direct?

Vous avez probablement rencontré une situation où vous devez prendre rendez-vous, mais il n'y a pas de billets gratuits. Un article sur la façon dont nous avons réussi à automatiser le processus d'attente en utilisant l'exemple de l'obtention d'un passeport étranger.





Après l'approbation de la demande électronique de passeport, vous devez prendre rendez-vous pour une visite personnelle afin d'apporter les originaux des documents et de prendre une photo. En allant aux services publics pendant plusieurs jours à des moments différents, je n'ai pas trouvé de coupons gratuits. Je ne voulais pas continuer une telle loterie.





La solution est assez simple. Lorsque l'utilisateur sélectionne une adresse sur la carte, une demande est envoyée qui renvoie le temps de visite disponible. Il est visible dans la console développeur. De là, nous en apprendrons davantage sur l'URL et les paramètres.





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)
      
      



Un problème se pose. Pour recevoir une réponse réussie, des cookies doivent être ajoutés à la demande. Ils peuvent être copiés à partir de la même demande. Mais ils ne travailleront que quelques heures. Par conséquent, lorsque nous recevons une erreur (401), nous transmettons l'autorisation et copions les nouveaux cookies, en les enregistrant dans un fichier. Lorsque nous trouvons de l'espace libre, ouvrez le navigateur vers cette page.





Implémentation requise Python, Selenium et Windows Task Scheduler. Ainsi, nous obtenons le code principal suivant:





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))
      
      



Pour obtenir des cookies, en utilisant Selenium, accédez à la page de connexion, recherchez les champs de saisie et insérez un identifiant avec un mot de passe. En pratique, il n'était pas possible de se connecter sans mode fenêtré. Par conséquent, toutes les quelques heures, une fenêtre de navigateur apparaîtra pendant quelques secondes. Pour obtenir l'ensemble de cookies requis, rendez-vous sur la page où l'adresse du département est sélectionnée 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
      
      



Pour une demande, les cookies sont formatés pour =;







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



Il reste à configurer le planificateur de tâches Windows. .py



Je n'ai pas réussi à exécuter le script directement. Par conséquent, par .bat



une seule commande python "script.py"



. Oui, cela ouvre une fenêtre de console. Il existe des programmes externes qui vous permettent de lancer la console en secret.





En conséquence, le troisième jour et 240 lancements vers 17 heures, il y avait un espace libre pour l'enregistrement. Je pense que nous pouvons aller plus loin et faire de l'auto-enregistrement grâce aux demandes ultérieures.








All Articles