Looking for international version of our service? Go to 2captcha.com

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

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

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

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

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

DataDome — это защита от ботов, которая стоит перед сайтом и решает, пускать юзера дальше или нет. Часто проверка проходит в фоне, и капчи посетитель не видит вовсе.

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

Решение приходит не токеном для скрытого поля, как у большинства капч, а готовой cookie — её ставят в браузер, после чего страницу открывают заново. И проверяется не только сама капча, но и адрес, с которого вы пришли: поэтому прокси для DataDome обязателен, а User-Agent должен совпадать с тем, которым открыт браузер.

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

Если браузер вам не нужен и адрес капчи вы копируете руками, посмотрите отдельную статью про обход DataDome через API. Здесь же всё делает скрипт.

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

  • Python 3.7 или выше
  • Установленный Playwright
  • Аккаунт и API-ключ от RuCaptcha
  • URL целевой страницы
  • Резидентные прокси. Для DataDome прокси обязателен, а адреса дата-центров эта капча блокирует

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

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

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

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

Браузер запускается через тот же прокси, который вы отправляете в API. Сервис решает капчу с вашего адреса, поэтому адреса должны совпадать.

python Copy
from playwright.sync_api import sync_playwright

PROXY = {"server": "http://1.2.3.4:8080", "username": "user23", "password": "p4$w0rd"}

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False, proxy=PROXY)
    page = browser.new_page()

    page.goto("https://mysite.com/protected-page")
    page.wait_for_load_state("networkidle")

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

Для запроса нужны три компонента: адрес капчи, адрес страницы и User-Agent браузера.

Адрес капчи — это значение src у элемента iframe, в котором открылся слайдер. В примерах документации он начинается с geo.captcha-delivery.com, поэтому искать iframe удобно по этой части адреса.

python Copy
frame = page.locator('iframe[src*="captcha-delivery.com"]').first

if frame.count() == 0:
    raise RuntimeError("Капчи DataDome на странице нет")

captcha_url = frame.get_attribute("src")
page_url = page.url
user_agent = page.evaluate("navigator.userAgent")

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

Если iframe на странице не нашёлся, а страница всё равно не открывается, посмотрите ответы со статусом 403 на вкладке «Сеть». Ссылка на капчу может прийти в теле такого ответа.

Перед отправкой задачи посмотрите на параметр t в адресе капчи — он показывает, решаемая ли она с вашим IP. При t=fe капча обычная, задачу можно создавать. При t=bv ваш IP-адрес забанен самой капчей: решать нечего, нужен другой прокси.

python Copy
if "t=bv" in captcha_url:
    raise RuntimeError("IP-адрес забанен капчей, смените прокси")

if "t=fe" not in captcha_url:
    raise RuntimeError("В адресе капчи нет t=fe, проверьте, что нашли нужный iframe")

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

Шаг 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.datadome(
    captcha_url=captcha_url,
    pageurl=page_url,
    userAgent=user_agent,
    proxy={'type': 'HTTP', 'uri': 'user23:[email protected]:8080'}
)

solution = result['code']
print("Решение получено:", solution)

В ответе приходит готовый cookie:

json Copy
{
    "errorId": 0,
    "status": "ready",
    "solution": {
        "cookie": "datadome=4ZXwCBlyHx9ktZhSnycMF...; Path=/; Secure; SameSite=Lax"
    }
}

Через SDK эта строка попадает в result['code'].

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

bash Copy
curl -X POST https://api.rucaptcha.com/createTask \
  -H "Content-Type: application/json" \
  -d '{
    "clientKey": "ВАШ_API_КЛЮЧ",
    "task": {
      "type": "DataDomeSliderTask",
      "websiteURL": "https://mysite.com/protected-page",
      "captchaUrl": "https://geo.captcha-delivery.com/captcha/?initialCid=...&t=fe&referer=...",
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
      "proxyType": "http",
      "proxyAddress": "1.2.3.4",
      "proxyPort": "8080",
      "proxyLogin": "user23",
      "proxyPassword": "p4$w0rd"
    }
  }'

За качеством прокси нужно следить. Если DataDome заблокировал ваш прокси, задачи будут возвращаться с ошибкой, и прокси придётся менять. Какие именно ошибки приходят, разобрано в «Решении частых проблем».

Решение приходит в том же виде, в каком его отдал бы сервер: строка вида datadome=ЗНАЧЕНИЕ; Path=/; Secure; SameSite=Lax.

python Copy
first_part = solution.split(";")[0]
name, value = first_part.split("=", 1)

page.context.add_cookies([{
    "name": name,
    "value": value,
    "domain": "mysite.com",
    "path": "/",
    "secure": True,
    "sameSite": "Lax",
}])

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

Cookie живёт 15–30 минут. Для долгой работы предусмотрите обновление: когда капча появится снова, скрипт пройдёт тот же круг и получит новую cookie.

Шаг 6. Проверка, что капча пройдена

Cookie влияет на то, что сервер отдаёт в ответ на запрос, поэтому страницу нужно открыть заново.

python Copy
page.goto("https://mysite.com/protected-page")
page.wait_for_load_state("networkidle")

if page.locator('iframe[src*="captcha-delivery.com"]').first.count() > 0:
    raise RuntimeError("Капча осталась, cookie не подошла")

print("Капча пройдена")

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

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

python Copy
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/protected-page"
DOMAIN = "mysite.com"

PROXY_BROWSER = {"server": "http://1.2.3.4:8080", "username": "user23", "password": "p4$w0rd"}
PROXY_API = {'type': 'HTTP', 'uri': 'user23:[email protected]:8080'}


def solve_datadome():
    solver = TwoCaptcha(API_KEY, server='rucaptcha.com')

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False, proxy=PROXY_BROWSER)
        page = browser.new_page()

        try:
            page.goto(TARGET_URL)
            page.wait_for_load_state("networkidle")

            # 1. Ищем iframe с капчей
            frame = page.locator('iframe[src*="captcha-delivery.com"]').first

            if frame.count() == 0:
                print("Капчи нет, страница открылась сразу")
                return

            captcha_url = frame.get_attribute("src")
            user_agent = page.evaluate("navigator.userAgent")

            # 2. Проверяем, решаема ли капча
            if "t=bv" in captcha_url:
                raise RuntimeError("IP-адрес забанен капчей, смените прокси")

            if "t=fe" not in captcha_url:
                raise RuntimeError("В адресе капчи нет t=fe, проверьте iframe")

            # 3. Отправляем задачу в API
            print("Отправка задачи в API...")
            result = solver.datadome(
                captcha_url=captcha_url,
                pageurl=page.url,
                userAgent=user_agent,
                proxy=PROXY_API
            )
            solution = result['code']
            print("Решение получено:", solution)

            # 4. Ставим cookie
            first_part = solution.split(";")[0]
            name, value = first_part.split("=", 1)

            page.context.add_cookies([{
                "name": name,
                "value": value,
                "domain": DOMAIN,
                "path": "/",
                "secure": True,
                "sameSite": "Lax",
            }])

            # 5. Открываем страницу заново
            page.goto(TARGET_URL)
            page.wait_for_load_state("networkidle")

            if page.locator('iframe[src*="captcha-delivery.com"]').first.count() > 0:
                raise RuntimeError("Капча осталась, cookie не подошла")

            print("Капча пройдена")
            page.wait_for_timeout(3000)  # Пауза для визуальной проверки

            # 6. Отчёт о результате. True, если капча пройдена, иначе False
            solver.report(result['captchaId'], True)

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


if __name__ == "__main__":
    solve_datadome()

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

  • В ответ приходит ERROR_BAD_PROXY или ERROR_CAPTCHA_UNSOLVABLE. Первая означает, что через прокси не удалось подключиться: проверьте адрес, порт и доступы. Вторая обычно значит, что прокси заблокирован DataDome, — его нужно менять.
  • В ответ приходит ERROR_PAGEURL. Адрес капчи передан не полностью или в нём нет t=fe.
  • В адресе капчи t=bv. Это не ошибка запроса: IP-адрес забанен самой капчей. Задачу отправлять бесполезно, нужен другой прокси.
  • Капча остаётся после установки cookie. Проверьте домен в add_cookies и то, что браузер и API работают через один и тот же прокси.
  • Скрипт не находит iframe. Капча появляется не сразу. Дождитесь загрузки, как показано в Шаге 2, и проверьте, что страница вообще отдала заглушку.

Если API вернул код ошибки, его описание есть на странице «Коды ошибок», ссылка в конце.

Заключение

Главная сложность DataDome в том, что решение зависит не только от капчи, но и от адреса, с которого вы работаете. Прокси здесь обязателен, а User-Agent в запросе должен совпадать с тем, которым вы открываете сайт.

Поэтому перед отправкой задачи стоит проверять параметр t в адресе капчи. При t=fe капчу можно решать, при t=bv адрес забанен.

В ответ приходит готовый cookie. Ваш код разбирает строку, ставит cookie в браузер и открывает страницу заново.

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

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

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