Обход капчи на Python: ключевые моменты и подводные камни

Когда речь заходит об обходе капчи на Python, кажется, что сложного в этом? Однако на практике возникает множество нюансов.

Хотя сам я не являюсь разработчиком, но окружён этими людьми и часто участвую в дискуссиях, касающихся программирования.

Обход капчи на Python: ключевые моменты и подводные камни

Недавно передо мной встал вопрос: как реализовать решение капчи на Python для крупного проекта, связанного с парсингом данных с Amazon. Я испробовал множество вариантов, потратил часы на настройки, обратился даже к искусственному интеллекту в лице ChatGPT, но не смог добиться стабильного обхода капчи Amazon.

Обход капчи на Python: ключевые моменты и подводные камни

После коллективных мозговых штурмов (большая часть усилий была с моей стороны, а решение предложил коллега) был написан скрипт, который теперь может обойти капчу на Python. Мы решили сделать его доступным сообществу в надежде на обратную связь и советы по оптимизации, так как проблемные моменты всё ещё возникают. Мы уже перепробовали несколько подходов, но скрипт не демонстрирует стабильную работу. Если у вас есть идеи, как улучшить этот процесс, буду благодарен за помощь.

Принцип работы скрипта для обхода капчи на Python

Скрипт для решения капчи на Python выполняет несколько последовательных шагов, каждый из которых имеет важное значение для конечного результата. Вот как он работает:

  • Импортирует необходимые библиотеки для работы.

  • Настраивает подключение через прокси.

  • Открывает страницу регистрации на Amazon.

  • Решает первую капчу (если она присутствует, иначе этот шаг пропускается).

  • Заполняет регистрационную форму.

  • Решает вторую капчу, используя координатный метод.

  • Проверяет корректность решения капчи.

  • Закрывает браузер.

Теперь давайте разберёмся с каждым пунктом подробнее, чтобы лучше понять, как работает данный скрипт.

Библиотеки, необходимые для обхода капчи на Python

Этот скрипт требует установки и использования нескольких ключевых библиотек:

  • os, base64, BytesIO — стандартные библиотеки Python, которые используются для работы с файловой системой, кодирования изображений в формат base64 и работы с потоками байтов. Этот набор библиотек используется для обхода капчи, представленной в виде изображения.

  • seleniumbase.Driver, selenium.webdriver.common.by.By, selenium.webdriver.common.action_chains.ActionChains — эти библиотеки отвечают за управление браузером через Selenium, поиск элементов на веб-странице и выполнение сложных действий, таких как клик по координатам. Selenium здесь является центральной библиотекой, которая управляет всеми взаимодействиями с капчей, поэтому она особенно важна.

  • TwoCaptcha — это библиотека, которая интегрируется с сервисом 2Captcha, предназначенным для автоматического распознавания капчи. Таким образом, для решения капчи на Python мы используем сторонний сервис, который возвращает готовый результат.

Настройка прокси для скрипта

Изначально скрипт был настроен на загрузку прокси из файла, но для упрощения была добавлена возможность указания прокси непосредственно в коде. Если файл с прокси отсутствует, скрипт автоматически подгружает прокси из кода. А если не удаётся найти прокси ни в файле, ни в коде, то скрипт завершает работу, что, в общем-то, логично — обход капчи без использования прокси в современных реалиях малоэффективен, особенно при больших объёмах запросов.

Обход капчи на Python: ключевые моменты и подводные камни

После подключения прокси скрипт открывает страницу регистрации на Amazon при помощи функции driver.uc_open_with_reconnect. Основная цель скрипта — это регистрация на сайте, но перед этим нужно пройти капчу.

Обход капчи на Python: ключевые моменты и подводные камни

Решение первой капчи на Python

Здесь начинается самое интересное. Если на странице появляется простая текстовая капча, скрипт находит её с помощью Selenium, делает скриншот изображения, преобразует его в формат base64 и отправляет на сервис 2Captcha для решения. После получения ответа скрипт подставляет результат в нужное поле и нажимает кнопку "Продолжить". Если капча отсутствует, этот шаг просто пропускается, и скрипт переходит к следующему этапу.

Заполнение формы регистрации

Как только капча пройдена или пропущена, скрипт возвращается к заполнению регистрационной формы. Данные для формы берутся из кода, что делает процесс полностью автоматизированным. Однако на данном этапе есть простор для доработки — можно интегрировать функцию загрузки данных для формы из внешнего файла, что позволит многократно автоматизировать процесс регистрации.

Решение второй капчи с использованием координатного метода

Теперь рассмотрим второй этап решения капчи. Вторая капча, как правило, сложнее — она требует точного указания координат для клика. Принцип работы скрипта следующий: делается скриншот капчи, который отправляется на сервис для определения координат. После получения координат скрипт перемещает курсор в нужную точку с помощью ActionChains, переключается во фрейм и нажимает кнопку подтверждения.

Здесь и возникает проблема: иногда процесс «зависает» на этапе распознавания или проверки капчи, либо капча не решается вовремя, и она обновляется. Это становится главной причиной нестабильности работы скрипта. В большинстве случаев скрипт работает корректно, но такие «зависания» не дают покоя, и я надеюсь на ваши советы по улучшению этого процесса.

Обход капчи Python – раздел которого в коде нет

У Амазон еще есть третий вид капчи, Фанкапча, и я не смог победить ее в данном контексте, поэтому просто выпилил из этого кода на всякий случай. Да и Фанкапча за все время тестирования мне так ни разу не встретилась (но из разговоров мудрейших я знаю что она там есть, где то в чертогах Амазона). Ходят легенды, что есть специально обученный мужик, назовем его просто СОМ, который руками меняет условия для обхода капчи, либо дизайн страницы.

Никто этого СОМа никогда не видел, но у вечерами, когда ITшники собираются у костра этой байкой пугают джунов.

Обход капчи на Python: ключевые моменты и подводные камни

Заключение и итоги

В итоге можно сказать, что скрипт для обхода капчи на Python работает, но не без проблем. Основная трудность заключается в нестабильной работе при решении второй капчи. Fan-капча также не решается этим скриптом — я пока не смог побороть её и решил выпилить этот функционал. Тем не менее, скрипт решает основные задачи, и если есть идеи по улучшению кода — буду рад увидеть ваши рекомендации в комментариях.

Пока же остаётся открытым вопрос: как добиться полной стабильности при работе с капчами на Amazon и справиться с Fan-капчей, если она вдруг появится?

Заключительный код скрипта для решения капчи на Python:

import os import base64 from io import BytesIO from seleniumbase import Driver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from twocaptcha import TwoCaptcha # pip3 install 2captcha-python # Прокси для ручного ввода manual_proxy = "http://login:password@ip:port" # Замените на ваш прокси # Функция для чтения прокси из файла def get_proxy_from_file(file_path): if os.path.exists(file_path): with open(file_path, 'r') as file: proxy = file.read().strip() return proxy return None # Попробуем сначала подключить прокси из внешнего файла, если файл отсутствует, используем ручное значение proxy_file_path = "proxy.txt" # Имя файла с прокси proxy = get_proxy_from_file(proxy_file_path) or manual_proxy my_key = "API Key 2captcha" solver = TwoCaptcha(my_key, defaultTimeout=70) agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" # Инициализация драйвера с прокси driver = Driver(uc=True, headless=False, proxy=proxy, agent=agent) # headless=True for invisible mode try: url = "https://www.amazon.com/ap/register?openid.pape.max_auth_age=0&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&pageId=usflex&ignoreAuthState=1&openid.assoc_handle=usflex&openid.mode=checkid_setup&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&prepopulatedLoginId=&failedSignInCount=0&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&disableLoginPrepopulate=1&switch_account=signin&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0" driver.uc_open_with_reconnect(url, 5) # Решение первой капчи try: my_img = driver.find_element("body > div > div.a-row.a-spacing-double-large > div.a-section > div > div > form > div.a-row.a-spacing-large > div > div > div.a-row.a-text-center > img") print("SOLVE FIRST CAPTCHA...") screenshot = my_img.screenshot_as_png screenshot_bytes = BytesIO(screenshot) base64_screenshot = base64.b64encode(screenshot_bytes.getvalue()).decode('utf-8') result = solver.normal(base64_screenshot) print('result: ' + str(result)) # Отправка запроса на сервис 2Captcha res = result['code'] driver.find_element(By.ID, "captchacharacters").send_keys(f"{res}") driver.find_element(By.CLASS_NAME, "a-button-inner").click() except: pass # Ожидание и заполнение формы driver.sleep(1) print("Fill out the form") driver.find_element(By.ID, "ap_customer_name").send_keys("Alex0053") # Заполнение формы driver.find_element(By.ID, "ap_email").send_keys("some_post43120@gmail.com") driver.find_element(By.ID, "ap_password").send_keys("password40000A#") driver.find_element(By.ID, "ap_password_check").send_keys("password40000A#") driver.find_element(By.ID, "continue").click() driver.sleep(10) # Вторая капча - координатная while True: try: cap_img = driver.find_element(By.ID, "cvf-aamation-challenge-iframe") # Доработка элемента фрейма print("SOLVE SECOND-COORD CAPTCHA...") screenshot = cap_img.screenshot_as_png screenshot_bytes = BytesIO(screenshot) base64_screenshot = base64.b64encode(screenshot_bytes.getvalue()).decode('utf-8') element_position = cap_img.location result = solver.coordinates(base64_screenshot, lang='en', min_clicks=1, max_clicks=1) x = str(result['code']).split(":")[1].split(",")[0].replace("x=", "") y = str(result['code']).split(":")[1].split(",")[1].replace("y=", "") print('result: ' + str(result)) x_coord = element_position["x"] + int(x) y_coord = element_position["y"] + int(y) actions = ActionChains(driver) actions.move_by_offset(x_coord, y_coord).click().perform() driver.sleep(2) actions.reset_actions() driver.switch_to_frame(cap_img) driver.find_element(By.ID, "amzn-btn-verify-internal").click() driver.switch_to.default_content() driver.sleep(7) except Exception as e: print(e) try: driver.find_element('form[id="verification-code-form"]') print("CAPTCHA PASSED!!!") break except: pass driver.sleep(3) # Последний блок кода, если нужно except Exception as e: print(e) finally: driver.close() driver.quit()
Начать дискуссию