Blog
Как решить DataDome с помощью Python

Как решить DataDome с помощью Python

Logo of Capsolver

CapSolver Blogger

How to use capsolver

16-Nov-2023

обход datadome, решение datadome, решатель капчи datadome, решатель datadome

⚙️ Предпосылки

  • Рабочий прокси
  • Питон установлен
  • API-ключ Capsolver

🤖 Шаг 1: Установите необходимые пакеты

Выполните следующие команды для установки необходимых пакетов:

pip install capsolver

👨‍💻 Код Python для обхода Datadome с помощью прокси

Вот пример сценария Python для выполнения этой задачи:

import time
import json
import requests

API_KEY = "your api key"
# TODO: YOUR_PROXY
PROXY = "your proxy"
# TODO: user agent from https://docs.capsolver.com/guide/antibots/datadome.html
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
SITE_URL_WITH_DATADOME = "your datadome url"

HEADERS_TEMPLATE = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en,en-US;q=0.9',
    'cache-control': 'max-age=0',
    'dnt': '1',
    'sec-ch-device-memory': '8',
    'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-full-version-list': '"Google Chrome";v="119.0.6045.200", "Chromium";v="119.0.6045.200", "Not?A_Brand";v="24.0.0.0"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'sec-gpc': '1',
    'upgrade-insecure-requests': '1',
    'user-agent': USER_AGENT,
    'referer': SITE_URL_WITH_DATADOME  
}

def format_proxy(px: str):
    if '@' not in px:
        sp = px.split(':')
        if len(sp) == 4:
            px = f'{sp[2]}:{sp[3]}@{sp[0]}:{sp[1]}'
    return {"http": f"http://{px}", "https": f"http://{px}"}

def get_page_with_cookie(url, cookie=None):
    headers = HEADERS_TEMPLATE.copy()
    if cookie:
        headers['cookie'] = f"datadome={cookie}"
    try:
        response = requests.get(url, headers=headers, proxies=format_proxy(PROXY), timeout=(20, 20), verify=False)
        print(response.text)
        print(response.status_code)
        return response
    except requests.RequestException as e:
        print(f"Request failed: {e}")
        return None

def extract_captcha_url(response):
    if response.status_code == 403 or "geo.captcha-delivery.com" in response.text:
        if 'dd=' in response.text:
            dd = response.text.split('dd=')[1]
            dd = dd.split('</script')[0]
            dd = json.loads(dd.replace("'", '"'))
            cid = response.headers.get('Set-Cookie').split('datadome=')[1]
            cid = cid.split(';')[0]
            return f"https://geo.captcha-delivery.com/captcha/?initialCid={dd['cid']}&hash={dd['hsh']}&cid={cid}&t={dd['t']}&referer={SITE_URL_WITH_DATADOME}&s={dd['s']}&e={dd['e']}"
        else:
            possible_paths = ["/captcha/", "/interstitial/"]
            for path in possible_paths:
                start_index = response.text.find(f"https://geo.captcha-delivery.com{path}")
                if start_index != -1:
                    end_index = response.text.find('"', start_index)
                    return response.text[start_index:end_index]
    return "Not DataDome Captcha / Challenge found"

def call_capsolver(web_url, captcha_url):
    data = {
        "clientKey": API_KEY,
        "task": {
            "type": 'DatadomeSliderTask',
            "websiteURL": web_url,
            "captchaUrl": captcha_url,
            "userAgent": USER_AGENT,
            "proxy": PROXY
        }
    }
    headers = {
        "Content-Type": "application/json",
        "Accept": "application/json",
    }
    res = requests.post('https://api.capsolver.com/createTask', headers=headers, json=data, verify=False)
    resp = res.json()
    task_id = resp.get('taskId')
    if not task_id:
        print("create task failed:", res.text)
        return
    while True:
        time.sleep(1)
        data = {
            "clientKey": API_KEY,
            "taskId": task_id
        }
        res = requests.post('https://api.capsolver.com/getTaskResult', headers=headers, json=data, verify=False)
        resp = res.json()
        status = resp.get('status', '')
        if status == "ready":
            cookie = resp['solution']['cookie']
            cookie = cookie.split(';')[0].split('=')[1]
            print("successfully got cookie:", cookie)
            return cookie
        if status == "failed" or resp.get("errorId"):
            print("failed to solve datadome:", res.text)
            return
        print('solve datadome status:', status)

def test_register_page():
    response = get_page_with_cookie(SITE_URL_WITH_DATADOME)
    print("Getting captcha url")
    captcha_url = extract_captcha_url(response)
    print(captcha_url)
    if captcha_url and 't=bv' not in captcha_url:
        cookie = call_capsolver(SITE_URL_WITH_DATADOME, captcha_url)
        if cookie:
            get_page_with_cookie(SITE_URL_WITH_DATADOME, cookie)

if __name__ == '__main__':
    test_register_page()

⚠️ Измените эти переменные

  • PROXY: обновите данные своего прокси. Формат должен быть http://имя пользователя:пароль@ip:порт.
  • API_KEY: получите ключ API на панели управления Capsolver.
  • SITE_URL_WITH_DATADOME: замените URL-адресом веб-сайта, для которого вы хотите обойти капчу datadome.
  • USER_AGENT: получите последнюю версию пользовательского агента из документации.

👀 Дополнительная информация

Máse