Эта статья была полезной?
Как обойти Amazon WAF Captcha с помощью Playwright
Технический специалист
Amazon WAF Captcha показывает задание, которое может пройти только человек: в коде страницы ответа нет. Поэтому при скрапинге и автоматическом тестировании капчу отдают на решение сервису, а он возвращает готовые значения.
В этом руководстве мы пройдём весь путь в Playwright на Python: найдём параметры капчи на странице, отправим задачу в API RuCaptcha и получим решение. Как подставить решение обратно в страницу, разберём отдельно — это зависит от того, как капча встроена на конкретном сайте.
Что понадобится
- Python 3.7 или выше
- Установленный Playwright
- Аккаунт и API-ключ от RuCaptcha
- 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://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
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
import json
params = json.loads(raw)
website_key = params["key"]
iv = params["iv"]
context = params["context"]
Значения временные: перед каждым запросом снимайте их заново, на той же загрузке страницы.
Шаг 4. Отправка задачи в API и получение решения
Задачу создаёт официальный Python SDK. Он сам опрашивает сервер, пока не придёт результат.
python
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
{
"status": 1,
"request": {
"captcha_voucher": "xxxxx",
"existing_token": "xxxxx"
}
}
Содержимое request SDK кладёт в result['code'].
Альтернатива (прямой HTTP-запрос):
Если вы не используете SDK, отправьте запрос через curl или библиотеку requests. Имена полей там другие, поэтому просто скопировать параметры из примера выше не получится. Ответ придёт в объекте solution метода getTaskResult, имена значений те же.
bash
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. Внедрение решения в страницу
У большинства капч ответ кладут в одно известное поле. Здесь значений два, и куда именно их подставлять, зависит от сайта. Это можно выяснить за один проход вручную.
- Откройте страницу с капчей и инструменты разработчика.
- На вкладке «Сеть» включите сохранение записей, чтобы они не пропали при переходе.
- Пройдите капчу вручную до конца.
- Найдите запрос, который страница отправила сразу после этого. Оба значения будут в его теле, заголовках или файлах cookie.
Дальше повторите это в скрипте. Переменнаяsolutionниже — то, что вернул API на Шаге 4.
Если значения уходят полями формы, запишите их так. Решение передаётся аргументом функции, а не склейкой строк: так оно попадёт на страницу как есть, с любыми символами.
python
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
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
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
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
Полезные ссылки
- Документация API RuCaptcha по Amazon captcha: https://rucaptcha.com/api-docs/amazon-aws-waf-captcha
- Как обойти Amazon AWS captcha: https://rucaptcha.com/p/amazon-captcha-bypass
- Автоматическое решение Amazon AWS капчи: примеры кода: https://rucaptcha.com/blog/amazon-captcha-solving
- Коды ошибок: https://rucaptcha.com/api-docs/error-codes
- Отладка: https://rucaptcha.com/api-docs/debugging
- Python SDK RuCaptcha на GitHub: https://github.com/2captcha/2captcha-python