Обход капчи Turnstile Challenge на Python и Selenium

Обход проблемы Cloudflare с помощью pyhton
Сервис 2Captcha помогает автоматически решать капчи Turnstile Challenge. Статья описывает процесс взаимодействия с API.

Материал полезен для python разработчиков, которые работают над проектами, требующими автоматизации задач, связанных с сайтами, защищенными Turnstile Challenge капчей.

Что такое Turnstile Challenge капча?

Turnstile — это Cloudflare капча, которая призвана блокировать ботов и автоматизированные системы. Она является простой в решении для обычных пользователей, но сложной для распознавания ботами и автоматическими системами.

Пример того как выгглядит Turnstile Challenge:

Cloudflare Challenge Page Screenshot

Подготовка к обходу капчи Turnstile

Прежде чем начать обход капчи Turnstile, необходимо подготовить рабочее окружение и инструменты. Для этого нам понадобятся:

  • Python и библиотека SeleniumBase для автоматизации веб-браузера.
  • 2captcha API ключ для решения капчи.
  • Прокси (опционально), если требуется обходить капчу с различных IP-адресов.

Шаги обхода капчи Turnstile

1. Подключение необходимых библиотек и зависимостей:

Перед выполнением обхода капчи Turnstile требуется подключить необходимые библиотеки, такие как json, re, requests, seleniumbase, и time. Эти библиотеки используются для работы с данными в формате JSON, выполнения регулярных выражений, отправки HTTP-запросов, автоматизации браузера и добавления задержек в коде.

import json
import re
import requests
from seleniumbase import Driver
from selenium.webdriver.common.by import By
import time

2 Начало работы скрипта:

Этот шаг включает определение URL сайта, защищенного капчей Turnstile, установку прокси (при необходимости), API ключа 2captcha, установку актуального UserAgent, и настройку веб-драйвера для работы в режиме headless.

proxy = "xxxxxx:xxxxxx@xx.xxx.xxx.xx:xxxx"  # YOUR_2CAPTCHA_PROXY
my_key = "your_2captcha_api_key"

# Установка актуального UserAgent
agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"

# Настройка веб-драйвера для работы в безголовом режиме
driver = Driver(uc=True, log_cdp=True, headless=True, no_sandbox=True, agent=agent, proxy=False)

# URL сайта, защищенного капчей Turnstile
url = "URL сайта, защищенного капчей Turnstile"
driver.get(url)
time.sleep(5)

3. Перехват параметров капчи Turnstile:

Далее переопределяем метод turnstile.render и console.clear, чтобы выводить необходимые параметры капчи в консоль браузера. Также определяем callback функцию,
которая понадобится для отправки токена.

# Функция для перехвата параметров капчи с помощью JavaScript
def intercept(driver):
    driver.execute_script("""
    console.clear = () => console.log('Console was cleared')
    const i = setInterval(()=>{
    if (window.turnstile)
     console.log('success!!')
     {clearInterval(i)
         window.turnstile.render = (a,b) => {
          let params = {
                sitekey: b.sitekey,
                pageurl: window.location.href,
                data: b.cData,
                pagedata: b.chlPageData,
                action: b.action,
                userAgent: navigator.userAgent,
                json: 1
            }
            console.log('intercepted-params:' + JSON.stringify(params))
            window.cfCallback = b.callback
            return        } 
    }
},50)    
""")
    time.sleep(1)
    # Получение логов браузера, где будут содержаться перехваченные параметры
    logs = driver.get_log("browser")
    for log in logs:
        if log['level'] == 'INFO':
            if "intercepted-params:" in log["message"]:
                log_entry = log["message"].encode('utf-8').decode('unicode_escape')
                match = re.search(r'"intercepted-params:({.*?})"', log_entry)
                json_string = match.group(1)
                params = json.loads(json_string)
                return params

4. Отправка параметров на сервер 2captcha API:

Получив необходимые параметры капчи, отправляем их на сервер 2captcha с помощью API запроса.

data0 = {"key": my_key,
         "method": "turnstile ",
         "sitekey": params["sitekey"],
         "action": params["action"],
         "data": params["data"],
         "pagedata": params["pagedata"],
         "useragent": params["userAgent"],
         "json": 1,
         "pageurl": params["pageurl"],
         }
response = requests.post(f"https://2captcha.com/in.php?", data=data0)
print("Запрос отправлен", response.text)
s = response.json()["request"]

5. Использование результата решения капчи

После отправки запроса на сервер 2captcha, необходимо дождаться результата решения капчи. Делая запросы к серверу раз в 5-10 секунд , чтобы узнать, решена ли капча. Когда капча успешно решена, API вернёт токен, который нужно передать в callback-функцию скрипта для продолжения выполнения

while True:
    solu = requests.get(f"https://2captcha.com/res.php?key={my_key}&action=get&json=1&id={s}").json()
    if solu["request"] == "CAPCHA_NOT_READY":
        print(solu["request"])
        time.sleep(8)
    elif "ERROR" in solu["request"]:
        print(solu["request"])
        driver.close()
        driver.quit()
        exit(0)
    else:
        break

for key, value in solu.items():
    print(key, ": ", value)

solu = solu['request']
driver.execute_script(f" cfCallback('{solu}');")
time.sleep(5)

6. Готово! Turnstile пройден и вы можете работать с сайтом дальше.

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

Если нужно обойти Cloudflare Turnstile (не Cloudflare Challenge) на любом сайте:

Остались вопросы?

Если после прочтения документации у вас остались вопросы по новому API, будем рады ответить и помочь:

Можно задать вопрос любым способом:

Мы ценим отзывы и хотим убедиться, что сервис идеально подходит для ваших задач.