Эта статья была полезной?
Как обойти 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
pip install playwright 2captcha-python
playwright install chromium
Шаг 2. Инициализация браузера и переход на страницу
Для отладки всегда начинайте с видимого режима headless=False. Это позволит визуально контролировать процесс появления виджета и внедрения токена.
python
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
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
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
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
# 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
page.click("button[type='submit']")
page.wait_for_load_state("networkidle")
browser.close()
Полный рабочий пример (Python)
python
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 вы столкнулись.
Полезные ссылки
- Документация API 2Captcha по reCAPTCHA v2: https://2captcha.com/api-docs/recaptcha-v2
- Демо-страница reCAPTCHA v2: https://2captcha.com/demo/recaptcha-v2
- Python SDK 2Captcha на GitHub: https://github.com/2captcha/2captcha-python