Французские водительские права: Борьба за слоты для записи на экзамен
Table Of Content
- Введение:
- Предварительная настройка:
- Часть 1: Импорт необходимых модулей
- Часть 2: Интеграция с Slack для уведомлений
- Отправка сообщения в Slack
- Часть 3: Обход Captcha с помощью сервиса Anti-Captcha
- Часть 4: Понимание основного скрипта
- 4.1 Настройка WebDriver и переход на веб-сайт
- Инициализация WebDriver и переход на страницу
- 4.2 Ожидание загрузки основных элементов
- Ожидание загрузки элементов
- 4.3 Ввод данных для входа
- Заполнение имени пользователя и пароля
- 4.4 Подготовка к обходу CAPTCHA
- Ожидание загрузки CAPTCHA
- 4.5 Обход CAPTCHA с использованием сервиса Anti-Captcha
- Решение CAPTCHA с использованием Anti-Captcha
- 4.6 Обработка ответа CAPTCHA
- 4.7 Навигация по процессу бронирования записи на прием
- Переход к процессу бронирования
- Выбор отдела из выпадающего списка
- Нажатие кнопки поиска для проверки
- 4.8 Проверка доступности и отправка уведомлений
- Проверка доступности
- 4.9 Закрытие драйвера
- Подождать и закрыть соединение с драйвером
- Автоматизация скрипта:
- Настройка cron-задания (выполняется каждые 10 минут с 8:00 до 18:00)
- Заключение:
Введение:
В эпоху цифровой трансформации автоматизация превратилась из роскоши в необходимость. Представьте себе ситуацию: вы находитесь во Франции и стремитесь получить водительские права, но путь к записи на желаемый экзамен напоминает навигацию по лабиринту. Тысячи надеющихся борются за ограниченное количество слотов, что делает процесс почти невозможным. Многие обращаются за помощью в автошколы, что часто сопряжено с большими затратами.
Но что, если бы был способ уравнять шансы? В этом блоге мы представляем вам скрипт на Python, который готов изменить способ записи на вождение во Франции. Попрощайтесь с утомительным обновлением веб-страниц. Этот скрипт не только автоматизирует процесс записи на сайте permisdeconduire.gouv.fr, но также интегрируется без проблем с Slack, предоставляя уведомления в режиме реального времени для вашего удобства.
Давайте глубже погрузимся в этот скрипт, разобрав его компоненты и поняв настройку с нуля.
Отказ от ответственности:_ Эта статья служит исключительно в качестве учебного ресурса, проливая свет на механизмы автоматизации и написания скриптов на Python. Она не предназначена для предоставления советов или поощрения использования ботов или скриптов с целью обхода политики веб-сайта или нарушения условий использования. Использование таких инструментов может повлечь юридические последствия, и настоятельно рекомендуется читателям быть осторожными и действовать в соответствии с условиями использования любого веб-сайта, с которым они взаимодействуют. Действуйте на свой страх и риск, и всегда придерживайтесь этичного и ответственного использования технологий._
Предварительная настройка:
Прежде чем мы погрузимся в скрипт, необходимо настроить наше окружение. Вот Python-пакеты, которые вам нужно установить:
pip install selenium
pip install anticaptchaofficial
pip install requests
pip install logging
Часть 1: Импорт необходимых модулей
import time
import logging
from anticaptchaofficial.recaptchav2proxyless import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
В этом разделе скрипта импортируются все необходимые модули, которые облегчают парсинг веб-страниц, решение капчи и ведение журнала.
Часть 2: Интеграция с Slack для уведомлений
# Отправка сообщения в Slack
def send_to_slack(message):
webhook_url = "ваш URL для Slack"
slack_data = {'text': message}
response = requests.post(webhook_url, json=slack_data, headers={'Content-Type': 'application/json'})
if response.status_code != 200:
raise ValueError(f"Запрос в Slack вернул ошибку {response.status_code}, ответ:\n{response.text}")
Эта функция предназначена для отправки уведомлений в указанный канал Slack. Интеграция с Slack позволяет получать уведомления о статусе бронирования в режиме реального времени прямо в вашем приложении Slack.
Часть 3: Обход Captcha с помощью сервиса Anti-Captcha
Одной из ключевых проблем при автоматизации процесса записи на вождение является преодоление постоянно бдительного механизма CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart). Веб-сайты используют CAPTCHA, чтобы предотвратить перегрузку своих систем автоматическими ботами. Однако наш сценарий на Python изобретательно решает эту проблему с помощью интеграции сервиса Anti-Captcha.
Реализация функции solve_captcha
не предоставляется в этой статье, но мы предлагаем вам найти ресурсы онлайн для решения капчи.
Часть 4: Понимание основного скрипта
В этом разделе мы разберем основной скрипт по секциям, предлагая подробное объяснение каждого шага, включенного в автоматизированный процесс бронирования.
4.1 Настройка WebDriver и переход на веб-сайт
# Инициализация WebDriver и переход на страницу
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('http://candidat.permisdeconduire.gouv.fr/')
Мы инициализируем объект chrome_options
, чтобы хранить любые настраиваемые параметры для Chrome WebDriver, затем инициализируем Chrome WebDriver с указанными параметрами. Затем скрипт переходит на официальный веб-сайт для бронирования водительских удостоверений.
4.2 Ожидание загрузки основных элементов
# Ожидание загрузки элементов
wait = WebDriverWait(driver, 10)
username = wait.until(EC.presence_of_element_located((By.ID, 'username')))
password = wait.until(EC.presence_of_element_located((By.ID, 'password')))
remember_me_checkbox = wait.until(EC.presence_of_element_located((By.ID, 'rememberMe')))
Мы создаем экземпляр WebDriverWait
, который позволит нам приостановить выполнение скрипта до тех пор, пока не будут выполнены определенные условия. Скрипт ожидает загрузки элементов для ввода имени пользователя, пароля и флажка "Запомнить меня", находя их по соответствующим идентификаторам.
4.3 Ввод данных для входа
# Заполнение имени пользователя и пароля
username.send_keys('Ваше имя пользователя')
password.send_keys('Ваш пароль')
remember_me_checkbox.click()
Эти строки отвечают за автоматический ввод имени пользователя и пароля в соответствующие поля на веб-странице. Скрипт также автоматически устанавливает флажок "Запомнить меня".
4.4 Подготовка к обходу CAPTCHA
# Ожидание загрузки CAPTCHA
sitekey_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="kc-captcha"]')))
sitekey_clean = sitekey_element.get_attribute('data-sitekey')
Скрипт ожидает появления элемента CAPTCHA на странице, идентифицируя его по XPath. Затем он извлекает значение атрибута data-sitekey из элемента CAPTCHA, что является важным шагом для обхода CAPTCHA на следующем этапе.
4.5 Обход CAPTCHA с использованием сервиса Anti-Captcha
# Решение CAPTCHA с использованием Anti-Captcha
g_response = solve_recaptcha(sitekey_clean)
Функция solve_recaptcha
вызывается с параметром sitekey. Эта функция взаимодействует с сервисом Anti-Captcha, чтобы получить решение для CAPTCHA.
4.6 Обработка ответа CAPTCHA
После того, как наш скрипт на Python успешно получает действительный g_response
от сервиса Anti-Captcha, он выполняет ряд важных операций, которые обеспечивают беспрепятственное продвижение через защищенный CAPTCHA этап процесса бронирования.
Первый шаг заключается в заполнении поля ответа CAPTCHA значением g_response
, полученным от сервиса Anti-Captcha. Чтобы имитировать пользовательский опыт, скрипт симулирует появление галочки в поле CAPTCHA. Это важно, потому что некоторые веб-сайты используют JavaScript для отображения визуальной обратной связи пользователям при успешном прохождении CAPTCHA. С заполненным полем ответа CAPTCHA и симулированной галочкой скрипт теперь может включить и нажать кнопку входа или любую другую соответствующую кнопку действия на странице. Это делается с использованием возможностей WebDriver.
4.7 Навигация по процессу бронирования записи на прием
# Переход к процессу бронирования
reserve_exam_link = wait.until(EC.presence_of_element_located((By.XPATH, "//a[contains(text(), 'Réserver un examen')]")))
reserve_exam_link.click()
time.sleep(2)
autocomplete_input = wait.until(EC.presence_of_element_located((By.ID, 'id-departement-autocomplete')))
autocomplete_input.send_keys('Номер вашего отдела')
input_field = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".auto-complete__input")))
input_field.click()
# Выбор отдела из выпадающего списка
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.auto-complete__menu-list')))
dropdown_options = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.auto-complete__menu-list div')))
for option in dropdown_options:
if " Ваш отдел с текстом " in option.text:
option.click()
break
# Нажатие кнопки поиска для проверки
rechercher_button = WebDriverWait(driver, 5).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "button.sc-jGKxIK.jtNPTZ")))
rechercher_button.click()
Эти строки автоматизируют процесс навигации по процессу бронирования записи на прием, включая нажатие на ссылку «Réserver un examen», выбор соответствующего отдела и нажатие кнопки поиска.
4.8 Проверка доступности и отправка уведомлений
# Проверка доступности
page_source = driver.page_source
if "Aucune place d’examen disponible" in page_source:
message= "Нет доступных мест для экзамена."
logging.info("response: " + message)
else:
send_to_slack("Место для экзамена может быть доступно, проверьте веб-сайт: http://candidat.permisdeconduire.gouv.fr/")
Эти строки отвечают за проверку доступности слотов для экзамена на основе исходного кода страницы и регистрируют ответ или отправляют уведомления через Slack в зависимости от результата.
4.9 Закрытие драйвера
# Подождать и закрыть соединение с драйвером
time.sleep(2)
driver.quit()
Скрипт приостанавливается на 2 секунды перед переходом к следующему шагу. Наконец, скрипт закрывает WebDriver, завершая сеанс. Полный скрипт можно сохранить в файле main.py.
Понимая каждый раздел этого скрипта, вы можете изменить его по своему усмотрению или даже расширить его, добавив больше функциональности. Этот скрипт служит мощным инструментом для упрощения и автоматизации утомительного процесса бронирования водительских лицензий.
Автоматизация скрипта:
Чтобы этот скрипт выполнялся ежедневно с 8:00 до 18:00 с интервалом между каждым выполнением от 5 до 10 минут, можно использовать инструменты планирования, такие как cron (для систем на основе Unix) или Планировщик задач (для Windows).
Вот пример настройки cron-задания, которое выполняет скрипт каждые 10 минут в указанный промежуток времени:
# Настройка cron-задания (выполняется каждые 10 минут с 8:00 до 18:00)
*/10 8-18 * * * /usr/bin/python3 /путь/к/вашему/main.py
Заключение:
В этой статье представлена пошаговая инструкция по настройке автоматизированной системы записи на водительское удостоверение. Используя мощь Python и интеграцию с сервисами Slack и Anti-Captcha, этот скрипт устраняет неудобства и трудоемкость ручной записи, предоставляя безупречное и эффективное решение. Перед запуском этого скрипта убедитесь, что заменили конфиденциальные данные на заполнители и тщательно протестировали настройку, чтобы подтвердить ее функциональность.
Мы надеемся, что эта исчерпывающая инструкция станет ценным инструментом, помогающим многим людям без проблем записываться на получение водительских удостоверений. Счастливого кодирования!
_Примечание: _Перед запуском скрипта убедитесь, что вы зарегистрировались и настроили необходимые аккаунты в сервисе Anti-Captcha и Slack, а также получили необходимые ключи API и URL-адреса вебхуков.
Спасибо, что вы являетесь частью нашего сообщества! Перед тем, как уйти: