Pelayanan publik dan membuat janji. Antrian langsung?

Anda mungkin pernah menemui situasi ketika Anda perlu membuat janji, tetapi tidak ada tiket gratis. Artikel tentang bagaimana kami berhasil mengotomatiskan proses menunggu menggunakan contoh mendapatkan paspor asing.





Setelah permohonan paspor elektronik disetujui, Anda harus membuat janji untuk kunjungan pribadi untuk membawa dokumen asli dan mengambil foto. Pergi ke layanan publik selama beberapa hari pada waktu yang berbeda, saya tidak menemukan kupon gratis. Saya tidak ingin melanjutkan lotre seperti itu.





Solusinya cukup sederhana. Saat pengguna memilih alamat di peta, permintaan dikirim yang mengembalikan waktu kunjungan yang tersedia. Itu terlihat di konsol pengembang. Dari sana, kita akan belajar tentang URL dan parameternya.





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)
      
      



Muncul masalah. Untuk menerima respons yang berhasil, cookie perlu ditambahkan ke permintaan. Mereka dapat disalin dari permintaan yang sama. Tapi mereka hanya akan bekerja selama beberapa jam. Oleh karena itu, ketika kami menerima kesalahan (401), kami memberikan otorisasi dan menyalin cookie baru, menyimpannya ke sebuah file. Saat kami menemukan ruang kosong, buka browser ke halaman ini.





Implementasi diperlukan Python, Selenium dan Windows Task Scheduler. Jadi, kami mendapatkan kode utama berikut:





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



Untuk mendapatkan cookie, menggunakan Selenium, buka halaman login, cari kolom input dan masukkan login dengan kata sandi. Dalam praktiknya, tidak mungkin untuk masuk tanpa mode berjendela. Oleh karena itu, setiap beberapa jam jendela browser akan muncul selama beberapa detik. Untuk mendapatkan set cookie yang diperlukan, buka halaman di mana alamat departemen dipilih 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
      
      



Untuk permintaan, cookie diformat menjadi =;







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



Tetap mengkonfigurasi Penjadwal Tugas Windows. .py



Saya tidak berhasil menjalankan skrip secara langsung. Oleh karena itu, melalui .bat



satu perintah python "script.py"



. Ya, ini membuka jendela konsol. Ada program eksternal yang memungkinkan Anda meluncurkan konsol secara diam-diam.





Akibatnya, pada hari ketiga dan 240 peluncuran sekitar pukul 17, ada ruang kosong untuk merekam. Saya rasa kita bisa melangkah lebih jauh dan membuat perekaman otomatis melalui permintaan berikutnya.








All Articles