公共サービスと予約。ライブキュー?

予約が必要な状況に遭遇したかもしれませんが、無料のチケットはありません。外国のパスポートを取得する例を使用して、待機プロセスを自動化する方法に関する記事。





パスポートの電子申請が承認された後、書類の原本を持参して写真を撮るために、個人訪問の予約をする必要があります。異なる時間に数日間公共サービスに行ったところ、無料のクーポンは見つかりませんでした。そんな宝くじを続けたくなかった。





解決策は非常に簡単です。ユーザーが地図上の住所を選択すると、利用可能な訪問時間を返すリクエストが送信されます。開発者コンソールに表示されます。そこから、URLとパラメーターについて学習します。





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)
      
      



問題が発生します。正常な応答を受信するには、Cookieをリクエストに追加する必要があります。それらは同じリクエストからコピーできます。しかし、それらは数時間しか機能しません。したがって、エラー(401)を受け取った場合、承認を渡し、新しいCookieをコピーして、ファイルに保存します。空き容量が見つかったら、ブラウザを開いてこのページに移動します。





実装には、Python、Selenium、およびWindowsタスクスケジューラが必要です。したがって、次のメインコードを取得します。





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



Seleniumを使用してCookieを取得するには、ログインページに移動し、入力フィールドを見つけて、パスワードを使用してログインを挿入します。実際には、ウィンドウモードなしでログインすることはできませんでした。したがって、数時間ごとにブラウザウィンドウが数秒間表示されます。必要なCookieのセットを取得するには、部門のアドレスが選択されているページに移動します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
      
      



リクエストの場合、Cookieは次のようにフォーマットされます =;







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



Windowsタスクスケジューラを構成する必要があります。スクリプトを.py



直接実行することに成功しませんでししたがって、.bat



1つのコマンドを介してpython "script.py"



はい、これによりコンソールウィンドウが開きます。コンソールを密かに起動できる外部プログラムがあります。





その結果、3日目と17時頃に240回の打ち上げがあり、録音用の空きスペースがありました。さらに進んで、その後のリクエストで自動録音できると思います。








All Articles