[Python] Госуслуги и запись на прием. Живая очередь?
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Вероятно вы сталкивались с ситуацией, когда необходимо записаться на прием, а свободных талонов нет. Статья о том, как удалось автоматизировать процесс ожидания на примере оформления загранпаспорта.После одобрения электронного заявления на загранпаспорт, необходимо записаться на личное посещение, чтобы принести оригиналы документов и сделать фото. Заходя на госуслуги несколько дней в разное время, свободных талонов так и не обнаружилось. Не хотелось продолжать такую лотерею.Решение довольно простое. Когда пользователь выбирает адрес на карте, отправляется запрос, который возвращает доступное время посещения. Он виден в консоле разработчика. Оттуда узнаем о 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)
Возникает проблема. Чтобы получить успешный ответ, к запросу требуется добавить куки. Их можно скопировать из этого же запроса. Но они будут действовать лишь несколько часов. Поэтому при получении ошибки (401) проходим авторизацию и копируем новые куки, сохраняя их в файл. Когда обнаружим свободные места, откроем браузер на этой странице.
Для реализации понадобился 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 переходим на страницу входа, находим поля для ввода и вставляем логин с паролем. На практике не удалось авторизоваться без оконного режима. Поэтому раз в несколько часов станет появляться окно браузера на пару секунд. Чтобы получить нужный набор кук, переходим на страницу, где выбирается адрес ведомства 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
Для запроса, куки форматируются в имя=значение;
raw_cookies = ''.join(['{}={}; '.format(i['name'], i['value']) for i in cookies])
Осталось настроить планировщик заданий Windows. Прямой запуск скрипта .py у меня не получился. Поэтому через .bat одна команда python "script.py". Да, при этом открывается окно консоли. Есть внешние программы, позволяющие запустить консоль скрытно.В результате, на третий день и 240 запусков в районе 17 часов появилось свободное место для записи. Думаю, что можно пойти дальше и через последующие запросы сделать автозапись.
===========
Источник:
habr.com
===========
Похожие новости:
- [Тестирование IT-систем, Тестирование веб-сервисов, Тестирование мобильных приложений] Нестабильные(Flaky) тесты — одна из основных проблем автоматизированного тестирования (перевод)
- [Python, Delphi, *nix, DevOps] Ansible-vault decrypt: обходимся без Ansible
- [Python, Обработка изображений, Машинное обучение] Распознавание дорожных знаков
- [Мессенджеры, Python, API] Хардкорная разработка под Телеграм. Бот-модератор своими руками. Часть 1
- [Информационная безопасность, Python] Поиск Dependency Confusion в корпоративном GitLab
- [Разработка мобильных приложений, Разработка под e-commerce, Карьера в IT-индустрии, IT-компании] «Кадровый голод» или почему IT-компании находятся в постоянном поиске сотрудников
- [Python, PostgreSQL, Django, SQL] SQL в DjangoORM
- [Python, Программирование, Машинное обучение] Продвинутое использование библиотеки PYTORCH: от подготовки данных до визуализации
- [Python, Математика, Машинное обучение, Учебный процесс в IT, Искусственный интеллект] Временные ряды. Простые решения
- [Системное администрирование, PowerShell, Лайфхаки для гиков] Автоматизируем ведение большого количества пользователей в AD
Теги для поиска: #_python, #_python, #_gosuslugi (госуслуги), #_avtomatizatsija (автоматизация), #_lichnyj_opyt (личный опыт), #_selenium, #_python
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 01:10
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Вероятно вы сталкивались с ситуацией, когда необходимо записаться на прием, а свободных талонов нет. Статья о том, как удалось автоматизировать процесс ожидания на примере оформления загранпаспорта.После одобрения электронного заявления на загранпаспорт, необходимо записаться на личное посещение, чтобы принести оригиналы документов и сделать фото. Заходя на госуслуги несколько дней в разное время, свободных талонов так и не обнаружилось. Не хотелось продолжать такую лотерею.Решение довольно простое. Когда пользователь выбирает адрес на карте, отправляется запрос, который возвращает доступное время посещения. Он виден в консоле разработчика. Оттуда узнаем о 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) Для реализации понадобился 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)) 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 raw_cookies = ''.join(['{}={}; '.format(i['name'], i['value']) for i in cookies])
=========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 01:10
Часовой пояс: UTC + 5