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

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

Как обойти Amazon WAF Captcha с помощью Playwright

Джерри Слиман
Джерри Слиман

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

Amazon WAF Captcha показывает задание, которое может пройти только человек: в коде страницы ответа нет. Поэтому при скрапинге и автоматическом тестировании капчу отдают на решение сервису, а он возвращает готовые значения.

В этом руководстве мы пройдём весь путь в Playwright на Python: найдём параметры капчи на странице, отправим задачу в API RuCaptcha и получим решение. Как подставить решение обратно в страницу, разберём отдельно — это зависит от того, как капча встроена на конкретном сайте.

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

  • Python 3.7 или выше
  • Установленный Playwright
  • Аккаунт и API-ключ от RuCaptcha
  • 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://mysite.com/page/with/amazon-captcha")
 
    # Ожидание загрузки скриптов капчи
    page.wait_for_load_state("networkidle")

Шаг 3. Извлечение параметров капчи

Для запроса нужны три значения со страницы: websiteKey, iv и context. Разметка у каждого сайта своя, поэтому сначала найдите их, а потом закрепите в коде.

Откройте страницу с капчей и инструменты разработчика. На вкладке «Сеть» отфильтруйте запросы по слову awswaf — там будут адреса скриптов challenge.js и captcha.js. Сохраните оба, они пригодятся на Шаге 4.

На вкладке «Элементы» найдите по странице слово context. Рядом с ним лежат iv и публичный ключ. Запомните элемент и то, в каком виде записаны значения.

Затем подставьте свой селектор вместо SELECTOR и имя своего атрибута вместо FIELD.

python Copy
element = page.locator("SELECTOR").first
 
if element.count() == 0:
    raise RuntimeError("Элемент с параметрами капчи не найден, проверьте селектор")
 
raw = element.get_attribute("FIELD")
if raw is None:
    raise RuntimeError("В элементе нет значения с параметрами капчи")
 
page_url = page.url

Проверка count() нужна: если элемента нет, get_attribute не вернёт пустое значение, а будет ждать до таймаута. А .first нужен потому, что локатор с двумя совпадениями выдаёт ошибку вместо первого элемента.

Дальше разберите значение так, как оно записано у вас. Если это JSON, подойдёт пример ниже; имена ключей подставьте свои.

python Copy
import json
 
params = json.loads(raw)
website_key = params["key"]
iv = params["iv"]
context = params["context"]

Значения временные: перед каждым запросом снимайте их заново, на той же загрузке страницы.

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

Задачу создаёт официальный Python SDK. Он сам опрашивает сервер, пока не придёт результат.

python Copy
import os
 
from twocaptcha import TwoCaptcha
 
api_key = os.getenv('APIKEY_RUCAPTCHA', 'ВАШ_API_КЛЮЧ')
 
solver = TwoCaptcha(api_key, server='rucaptcha.com')
 
result = solver.amazon_waf(
    sitekey=website_key,
    iv=iv,
    context=context,
    url=page_url
)
 
solution = result['code']
print("Решение получено:", solution)

В ответе два значения:

json Copy
{
  "status": 1,
  "request": {
    "captcha_voucher": "xxxxx",
    "existing_token": "xxxxx"
  }
}

Содержимое request SDK кладёт в result['code'].

Альтернатива (прямой HTTP-запрос):
Если вы не используете SDK, отправьте запрос через curl или библиотеку requests. Имена полей там другие, поэтому просто скопировать параметры из примера выше не получится. Ответ придёт в объекте solution метода getTaskResult, имена значений те же.

bash Copy
curl -X POST https://api.rucaptcha.com/createTask \
  -H "Content-Type: application/json" \
  -d '{
    "clientKey": "ВАШ_API_КЛЮЧ",
    "task": {
      "type": "AmazonTaskProxyless",
      "websiteURL": "https://mysite.com/page/with/amazon-captcha",
      "websiteKey": "AQIDA...wZwdADFLWk7XOA==",
      "context": "qoJYgnKsc...aormh/dYYK+Y=",
      "iv": "CgAAXFFFFSAAABVk"
    }
  }'

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

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

Шаг 5. Внедрение решения в страницу

У большинства капч ответ кладут в одно известное поле. Здесь значений два, и куда именно их подставлять, зависит от сайта. Это можно выяснить за один проход вручную.

  1. Откройте страницу с капчей и инструменты разработчика.
  2. На вкладке «Сеть» включите сохранение записей, чтобы они не пропали при переходе.
  3. Пройдите капчу вручную до конца.
  4. Найдите запрос, который страница отправила сразу после этого. Оба значения будут в его теле, заголовках или файлах cookie.
    Дальше повторите это в скрипте. Переменная solution ниже — то, что вернул API на Шаге 4.

Если значения уходят полями формы, запишите их так. Решение передаётся аргументом функции, а не склейкой строк: так оно попадёт на страницу как есть, с любыми символами.

python Copy
page.evaluate("""(solution) => {
    const voucher = document.querySelector('SELECTOR_VOUCHER');
    const token = document.querySelector('SELECTOR_TOKEN');
    if (!voucher || !token) {
        throw new Error('Поля для решения капчи на странице не найдены');
    }
    voucher.value = solution.captcha_voucher;
    token.value = solution.existing_token;
}""", solution)

Если значения уходят в cookie, укажите домен и путь явно. Если передать вместо них адрес страницы, cookie привяжется к этому адресу и на других страницах сайта работать не будет.

python Copy
page.context.add_cookies([
    {"name": "COOKIE_VOUCHER", "value": solution["captcha_voucher"],
     "domain": "mysite.com", "path": "/"},
    {"name": "COOKIE_TOKEN", "value": solution["existing_token"],
     "domain": "mysite.com", "path": "/"},
])

Проверка в первом примере нужна: без неё скрипт отправит форму без решения и напишет, что всё прошло успешно.

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

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

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

Селектор кнопки подставьте свой: button[type='submit'] подходит не всякой форме.

О результате стоит сообщить сервису. В SDK для этого есть метод report, в API — методы reportCorrect и reportIncorrect. Идентификатор задачи лежит в том же ответе, что и решение: solver.report(result['captchaId'], True).

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

Скрипт доходит до получения решения. Подстановку добавьте из Шага 5, когда найдёте поля своей страницы.

python Copy
import json
import os
 
from playwright.sync_api import sync_playwright
from twocaptcha import TwoCaptcha
 
API_KEY = os.getenv('APIKEY_RUCAPTCHA', 'ВАШ_API_КЛЮЧ')
TARGET_URL = "https://mysite.com/page/with/amazon-captcha"
 
 
def solve_amazon_waf():
    solver = TwoCaptcha(API_KEY, server='rucaptcha.com')
 
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
 
        try:
            page.goto(TARGET_URL)
            page.wait_for_load_state("networkidle")
 
            # 1. Получаем параметры капчи со страницы
            element = page.locator("SELECTOR").first
 
            if element.count() == 0:
                raise RuntimeError("Элемент с параметрами капчи не найден, проверьте селектор")
 
            raw = element.get_attribute("FIELD")
            if raw is None:
                raise RuntimeError("В элементе нет значения с параметрами капчи")
 
            params = json.loads(raw)
            website_key = params["key"]
            iv = params["iv"]
            context = params["context"]
 
            page_url = page.url
            print("Параметры получены")
 
            # 2. Отправляем задачу в API
            print("Отправка задачи в API...")
            result = solver.amazon_waf(
                sitekey=website_key,
                iv=iv,
                context=context,
                url=page_url
            )
            solution = result['code']
            print("Решение получено:", solution)
 
            # 3. Здесь подставьте код из Шага 5 под поля вашей страницы
 
            # 4. Отправляем форму
            page.click("button[type='submit']")
            page.wait_for_load_state("networkidle")
 
            print("Форма отправлена.")
            page.wait_for_timeout(3000)  # Пауза для визуальной проверки
 
            # 5. Отчёт о результате. True, если сайт принял решение, иначе False
            solver.report(result['captchaId'], True)
 
        except Exception as e:
            print(f"Ошибка: {e}")
        finally:
            browser.close()
 
 
if __name__ == "__main__":
    solve_amazon_waf()

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

  • Параметры не находятся или приходят пустыми. Скрипты капчи ещё не отработали. Дождитесь их загрузки, как показано в Шаге 2, и проверьте селектор.
  • Задача создана, но решение не приходит. Значения устарели: снимайте их заново перед каждым запросом. Перезагрузите страницу и отправьте задачу снова.
  • Форма не принимает решение. Проверьте, что подставлены оба значения и туда, куда их отправляет ваша страница. Найти нужное место поможет способ из Шага 5.
  • Скрипт не находит элемент капчи. Капча может грузиться внутри iframe. Тогда и параметры из Шага 3 лежат внутри него: обращайтесь через page.frame_locator.
    Если API вернул код ошибки, его описание есть на странице «Коды ошибок», ссылка в конце.

Заключение

Главная сложность Amazon WAF Captcha в том, что параметры websiteKey, iv и context одноразовые. Снимайте их прямо перед созданием задачи, а не храните между запусками.

Само задание решает работник сервиса, а ваш код получает два готовых значения — captcha_voucher и existing_token. Вашему коду остаётся два действия: найти параметры на странице и подставить решение обратно. Как именно их выполнять, зависит от того, как капча встроена на сайте.

Отправляйте отчёты методами reportCorrect и reportIncorrect: по ним сервис определяет, какие решения не подошли.

Полное описание параметров метода — на странице документации: https://rucaptcha.com/api-docs/amazon-aws-waf-captcha

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