Эта статья была полезной?
Как обойти 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
pip install playwright 2captcha-python
playwright install chromium
Шаг 2. Инициализация браузера и переход на страницу
Браузер запускается через тот же прокси, который вы отправляете в API. Сервис решает капчу с вашего адреса, поэтому адреса должны совпадать.
python
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
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
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
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
{
"errorId": 0,
"status": "ready",
"solution": {
"cookie": "datadome=4ZXwCBlyHx9ktZhSnycMF...; Path=/; Secure; SameSite=Lax"
}
}
Через SDK эта строка попадает в result['code'].
Альтернатива (прямой HTTP-запрос):
Если вы не используете SDK, отправьте запрос через curl или библиотеку requests. Тип задачи один — DataDomeSliderTask, и прокси в нём тоже обязателен.
bash
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 заблокировал ваш прокси, задачи будут возвращаться с ошибкой, и прокси придётся менять. Какие именно ошибки приходят, разобрано в «Решении частых проблем».
Шаг 5. Установка cookie
Решение приходит в том же виде, в каком его отдал бы сервер: строка вида datadome=ЗНАЧЕНИЕ; Path=/; Secure; SameSite=Lax.
python
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
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
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
Полезные ссылки
- Документация API RuCaptcha по DataDome captcha: https://rucaptcha.com/api-docs/datadome-slider-captcha
- Как обойти DataDome: https://rucaptcha.com/p/datadome-captcha-solver
- Резидентные прокси: https://rucaptcha.com/proxy/residential-proxies
- Работа с прокси: https://rucaptcha.com/api-docs/proxy
- Коды ошибок: https://rucaptcha.com/api-docs/error-codes
- Python SDK RuCaptcha на GitHub: https://github.com/2captcha/2captcha-python