Öffentliche Dienste und Terminvereinbarung. Live-Warteschlange?

Sie sind wahrscheinlich auf eine Situation gestoßen, in der Sie einen Termin vereinbaren müssen, aber es gibt keine Freikarten. Ein Artikel darüber, wie wir es geschafft haben, den Wartevorgang am Beispiel eines ausländischen Passes zu automatisieren.





Nach der Genehmigung des elektronischen Passantrags müssen Sie einen Termin für einen persönlichen Besuch vereinbaren, um die Originale der Dokumente mitzubringen und ein Foto zu machen. Als ich mehrere Tage zu unterschiedlichen Zeiten zum öffentlichen Dienst ging, fand ich keine kostenlosen Gutscheine. Ich wollte so eine Lotterie nicht fortsetzen.





Die Lösung ist ziemlich einfach. Wenn der Benutzer eine Adresse auf der Karte auswählt, wird eine Anfrage gesendet, die die verfügbare Besuchszeit zurückgibt. Es ist in der Entwicklerkonsole sichtbar. Von dort erfahren wir mehr über die URL und die Parameter.





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)
      
      



Ein Problem entsteht. Um eine erfolgreiche Antwort zu erhalten, müssen der Anfrage Cookies hinzugefügt werden. Sie können von derselben Anfrage kopiert werden. Aber sie werden nur ein paar Stunden arbeiten. Wenn wir einen Fehler erhalten (401), übergeben wir die Autorisierung, kopieren neue Cookies und speichern sie in einer Datei. Wenn wir freien Speicherplatz finden, öffnen Sie den Browser für diese Seite.





Implementierung erforderlich Python, Selenium und Windows Task Scheduler. Somit erhalten wir den folgenden Hauptcode:





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



Um mit Selenium Cookies zu erhalten, gehen Sie zur Anmeldeseite, suchen Sie die Eingabefelder und fügen Sie ein Login mit einem Passwort ein. In der Praxis war es nicht möglich, sich ohne Fenstermodus anzumelden. Daher wird alle paar Stunden ein Browserfenster für einige Sekunden angezeigt. Um die erforderlichen Cookies zu erhalten, rufen Sie die Seite auf, auf der die Adresse der Abteilung ausgewählt ist 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
      
      



Für eine Anfrage werden Cookies mit formatiert =;







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



Der Windows Task Scheduler muss noch konfiguriert werden. .py



Es ist mir nicht gelungen, das Skript direkt auszuführen . Daher durch .bat



einen Befehl python "script.py"



. Ja, dies öffnet ein Konsolenfenster. Es gibt externe Programme, mit denen Sie die Konsole heimlich starten können.





Infolgedessen gab es am dritten Tag und 240 Starts gegen 17 Uhr freien Speicherplatz für die Aufnahme. Ich denke, wir können noch weiter gehen und durch nachfolgende Anfragen eine automatische Aufnahme machen.








All Articles