Логотип «2Captcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как обойти reCAPTCHA v2 с помощью Playwright

Грегори Фишер
Грегори Фишер

Технический специалист

reCAPTCHA v2 (знаменитая галочка Я не робот и последующая сетка с картинками) остаётся одним из главных препятствий при веб-скрапинге, автоматизированном тестировании и заполнении форм.

В этом руководстве мы разберём полный цикл обхода reCAPTCHA v2 в Playwright на Python: извлечём sitekey со страницы, получим решённый токен через API 2Captcha и корректно внедрим его в DOM, чтобы форма распознала действие как выполненное живым пользователем.

Примечание: reCAPTCHA v2 бывает двух видов: Visible (с видимой галочкой) и Invisible (работает в фоне, вызывая проверку только при подозрительном поведении). Описанный ниже метод универсален и подходит для обоих вариантов, так как механизм генерации и валидации токена у них идентичен.

Что понадобится

  • Python 3.7 или выше
  • Установленный Playwright
  • Аккаунт и API-ключ от 2Captcha
  • URL целевой страницы
  • Опционально: прокси, если целевой сайт блокирует запросы с IP-адресов дата-центров

Шаг 1. Установка зависимостей

Установите необходимые библиотеки и браузеры Playwright:

bash Copy
pip install playwright 2captcha-python
playwright install chromium

Шаг 2. Инициализация браузера и переход на страницу

Для отладки всегда начинайте с видимого режима headless=False. Это позволит визуально контролировать процесс появления виджета и внедрения токена.

python Copy
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    
    # Переход на целевую страницу
    page.goto("https://2captcha.com/demo/recaptcha-v2")
    
    # Ожидание появления контейнера reCAPTCHA
    page.wait_for_selector(".g-recaptcha")

Шаг 3. Извлечение sitekey

Уникальный ключ сайта sitekey обычно хранится в атрибуте data-sitekey контейнера виджета.

python Copy
sitekey = page.locator(".g-recaptcha").get_attribute("data-sitekey")
page_url = page.url

print(f"Найден sitekey: {sitekey}")

Важно: если виджет рендерится динамически через grecaptcha.render(), атрибута data-sitekey в DOM может не быть. В этом случае откройте DevTools, перейдите во вкладку Network и найдите запрос к google.com/recaptcha/api2/anchor. Sitekey будет передан там как query-параметр k.

Шаг 4. Отправка задачи в API и получение токена

Самый простой способ — использовать официальный Python SDK. Он автоматически создаёт задачу и опрашивает сервер до получения результата (обычно это занимает 15–30 секунд).

python Copy
from twocaptcha import TwoCaptcha

solver = TwoCaptcha('ВАШ_API_КЛЮЧ')

result = solver.recaptcha(
    sitekey=sitekey,
    url=page_url
)

token = result['code']
print(f"Токен получен: {token[:20]}...")

Альтернатива (прямой HTTP-запрос):
Если вы не используете SDK, вы можете отправить запрос напрямую через curl или библиотеку requests:

bash Copy
curl -X POST https://api.2captcha.com/createTask \
  -H "Content-Type: application/json" \
  -d '{
    "clientKey": "ВАШ_API_КЛЮЧ",
    "task": {
      "type": "RecaptchaV2TaskProxyless",
      "websiteURL": "https://2captcha.com/demo/recaptcha-v2",
      "websiteKey": "6LfD3PIbAAAAAJs_eEHvoOl75_83eXSqpPSRFJ_u"
    }
  }'

Если сайт требует привязки к конкретному IP, используйте тип задачи RecaptchaV2Task и добавьте параметры прокси: proxyType, proxyAddress, proxyPort, proxyLogin, proxyPassword.

Шаг 5. Внедрение токена в страницу (Критический этап)

Здесь многие допускают ошибки. В отличие от обычных полей ввода, reCAPTCHA v2 ожидает токен в скрытом элементе textarea с id g-recaptcha-response.

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

python Copy
# 1. Внедряем токен в скрытое поле
page.evaluate(f"""
    const responseField = document.getElementById('g-recaptcha-response');
    if (responseField) {{
        responseField.value = "{token}";
        responseField.style.display = 'block'; // Делаем видимым для надёжности
    }}
""")

# 2. Имитируем вызов callback-функции (если она существует)
# Замените recaptchaCallback на реальное имя функции из атрибута data-callback, если оно отличается
page.evaluate(f"""
    if (typeof recaptchaCallback === 'function') {{
        recaptchaCallback("{token}");
    }}
""")

Шаг 6. Отправка формы

После успешного внедрения токена форма должна считать себя валидной.

python Copy
page.click("button[type='submit']")
page.wait_for_load_state("networkidle")

browser.close()

Полный рабочий пример (Python)

python Copy
from playwright.sync_api import sync_playwright
from twocaptcha import TwoCaptcha

API_KEY = "ВАШ_API_КЛЮЧ"
TARGET_URL = "https://2captcha.com/demo/recaptcha-v2"

def solve_recaptcha():
    solver = TwoCaptcha(API_KEY)

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        
        try:
            page.goto(TARGET_URL)
            page.wait_for_selector(".g-recaptcha")

            # 1. Извлекаем sitekey
            sitekey = page.locator(".g-recaptcha").get_attribute("data-sitekey")
            print(f"Sitekey: {sitekey}")

            # 2. Решаем капчу через API
            print("Отправка задачи в API...")
            result = solver.recaptcha(sitekey=sitekey, url=TARGET_URL)
            token = result['code']
            print("Токен получен!")

            # 3. Внедряем токен и вызываем callback
            page.evaluate(f"""
                const responseField = document.getElementById('g-recaptcha-response');
                if (responseField) {{
                    responseField.value = "{token}";
                }}
                if (typeof recaptchaCallback === 'function') {{
                    recaptchaCallback("{token}");
                }}
            """)

            # 4. Отправляем форму
            page.click("button[type='submit']")
            page.wait_for_load_state("networkidle")
            
            print("Форма успешно отправлена!")
            page.wait_for_timeout(3000) # Пауза для визуальной проверки

        except Exception as e:
            print(f"Ошибка: {e}")
        finally:
            browser.close()

if __name__ == "__main__":
    solve_recaptcha()

Решение частых проблем

  • Форма не отправляется после вставки токена: сайт ожидает срабатывания callback-функции. Проверьте атрибут data-callback у контейнера .g-recaptcha и вызовите эту функцию через page.evaluate, как показано в Шаге 5.
  • Sitekey не находится (возвращает пустое значение): виджет загружается внутри динамического iframe. Дождитесь появления iframe или перехватите сетевой запрос к google.com/recaptcha/api2/anchor и извлеките параметр k из URL.
  • Появляется дополнительная проверка (картинки): вы столкнулись с триггером низкого уровня доверия. Решение: используйте качественные резидентские или мобильные прокси при создании задачи в API и добавьте реалистичный User-Agent.
  • Скрипт работает в видимом режиме, но падает в headless: это детекция headless-режима антибот-системой, а не ошибка капчи. Решение: используйте библиотеки для маскировки (например, playwright-stealth) или передавайте в API прокси того же типа, что и у вашего сервера.

Заключение

Автоматизация прохождения reCAPTCHA v2 больше не должна быть узким местом в ваших рабочих процессах. Используя связку Playwright и API 2Captcha, вы получаете надежный и масштабируемый инструмент, который берет на себя всю сложность взаимодействия с защитой Google.

Ключ к стабильному успеху кроется не только в получении валидного токена, но и в его правильной интеграции. Внедрение значения в скрытое поле g-recaptcha-response и корректный программный вызов callback-функции полностью имитируют поведение реального пользователя на уровне браузера. Следуя этому руководству, вы сможете обходить проверки предсказуемо и эффективно, сохраняя высокую скорость работы ваших скриптов для скрапинга, тестирования или парсинга данных, независимо от того, с каким вариантом reCAPTCHA v2 вы столкнулись.

Полезные ссылки