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

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

Как обойти Cloudflare Turnstile Standalone на Chess.com

Ник Макбейн
Ник Макбейн

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

Введение

Cloudflare Turnstile — это современная альтернатива традиционным капчам, которая широко используется на таких платформах, как Chess.com, для защиты процессов входа и регистрации от ботов. Для реальных пользователей она часто работает незаметно, но скрипты автоматизации регулярно на ней застревают.

В этом руководстве я покажу, как обойти встроенный виджет Turnstile на Chess.com с помощью API rucaptcha. Мы разберем, как извлечь необходимые параметры, отправить задачу через API v2 и корректно внедрить полученный токен обратно на страницу.

Примечание: В этом руководстве рассматривается Standalone Turnstile (виджет, встроенный в страницу). Если вы имеете дело с полной страницей Cloudflare Challenge (промежуточная страница, показываемая перед основным сайтом), вам потребуются дополнительные параметры (action, data, pagedata) и другой подход к их перехвату. Подробности смотрите в руководстве Turnstile на страницах Cloudflare Challenge.

Параметры задачи

Для решения standalone-капчи Turnstile используется тип задачи TurnstileTaskProxyless. В запросе не передаются параметры прокси, так как сервис использует свой собственный внутренний пул прокси для решения задачи.

Параметр Тип Обязателен Описание
type Строка Да Должен быть установлен в TurnstileTaskProxyless
websiteURL Строка Да Полный URL страницы, где появляется капча
websiteKey Строка Да Статический ключ сайта (начинается с 0x4...)
action Строка Нет* Требуется для страниц Cloudflare Challenge. Значение параметра action вызова turnstile.render
data Строка Нет* Требуется для страниц Cloudflare Challenge. Значение параметра cData вызова turnstile.render
pagedata Строка Нет* Требуется для страниц Cloudflare Challenge. Значение параметра chlPageData вызова turnstile.render

* Требуется только для страниц Cloudflare Challenge, не для standalone-капч.

Поиск параметров

Способ 1: Вкладка Elements (рекомендуется для Standalone)

  1. Откройте страницу Chess.com, где появляется Turnstile (например, страницу входа или регистрации).
  2. Нажмите F12, чтобы открыть DevTools, и перейдите на вкладку Elements (Элементы).
  3. Нажмите Ctrl+F (или Cmd+F) и выполните поиск по cf-turnstile или data-sitekey.
  4. Вы найдете элемент div, который выглядит примерно так: <div class="cf-turnstile" data-sitekey="0x4AAAAAAAVrOwQWPlm3Bnr5" ...></div>. Значение атрибута data-sitekey — это ваш websiteKey.
  5. Скопируйте полный URL из адресной строки браузера. Это ваш websiteURL.

Способ 2: Вкладка Network (полезно для динамических страниц)

  1. Откройте DevTools и перейдите на вкладку Network (Сеть).
  2. Включите Preserve log (Сохранять журнал), чтобы фиксировать запросы при перезагрузках страницы.
  3. Вызовите капчу (например, введите email и нажмите кнопку входа).
  4. В фильтре введите turnstile или challenges.cloudflare.com.
  5. Найдите запрос к API Cloudflare и извлеките sitekey из параметров запроса.
  6. Скопируйте полный URL из адресной строки в момент, когда капча активна — он может содержать динамические параметры (например, state), которые критически важны для валидации Turnstile.

Внимание: Использование URL без динамических параметров или с устаревшими значениями приведет к ошибке решения, так как Turnstile строго проверяет соответствие URL сессии.

Примеры кода

Python + Requests (Прямой запрос к API v2)

Этот пример демонстрирует, как отправить задачу и получить результат, используя прямые HTTP-запросы. Обратите внимание, что payload не содержит полей прокси.

python Copy
import requests
import time

API_KEY = 'ВАШ_API_КЛЮЧ'
WEBSITE_URL = 'https://www.chess.com/login'
WEBSITE_KEY = '0x4AAAAAAAVrOwQWPlm3Bnr5'  # Замените на актуальный ключ

# 1. Отправка задачи (запрос без прокси)
url = 'https://api.2captcha.com/createTask'
headers = {
    'Content-Type': 'application/json'
}
payload = {
    "clientKey": API_KEY,
    "task": {
        "type": "TurnstileTaskProxyless",
        "websiteURL": WEBSITE_URL,
        "websiteKey": WEBSITE_KEY
        # Параметры прокси для TurnstileTaskProxyless не нужны
    }
}

response = requests.post(url, headers=headers, json=payload)
result = response.json()

if result.get('errorId') == 0:
    task_id = result.get('taskId')
    print(f"Задача создана, ID: {task_id}")

    # 2. Ожидание решения
    res_url = 'https://api.2captcha.com/getTaskResult'
    while True:
        time.sleep(5)  # Пауза между запросами

        res_payload = {
            "clientKey": API_KEY,
            "taskId": task_id
        }

        res_response = requests.post(res_url, headers=headers, json=res_payload).json()

        if res_response.get('errorId') == 0 and res_response.get('status') == 'ready':
            print("Капча успешно решена!")
            token = res_response['solution']['token']
            print(f"Токен: {token}")
            break
        elif res_response.get('errorId') != 0:
            print(f"Ошибка получения результата: {res_response.get('errorDescription')}")
            break
else:
    print(f"Ошибка создания задачи: {result.get('errorDescription')}")

Использование собственного прокси (TurnstileTask)

Если целевой сайт жестко привязывает сессию к конкретному IP-адресу, следует использовать тип задачи TurnstileTask и передать свои прокси-данные. Этот тип задачи расширяет TurnstileTaskProxyless, добавляя параметры, связанные с прокси.

Параметр Тип Обязателен Описание
proxyType Строка Да Тип прокси: http, socks4 или socks5
proxyAddress Строка Да IP-адрес или имя хоста прокси-сервера
proxyPort Целое число Да Порт прокси-сервера
proxyLogin Строка Нет Логин для базовой аутентификации на прокси
proxyPassword Строка Нет Пароль для базовой аутентификации на прокси

Пример на Python + Requests (с прокси):

python Copy
payload = {
    "clientKey": API_KEY,
    "task": {
        "type": "TurnstileTask",
        "websiteURL": WEBSITE_URL,
        "websiteKey": WEBSITE_KEY,
        "proxyType": "http",
        "proxyAddress": "1.2.3.4",
        "proxyPort": 8080,
        "proxyLogin": "user23",
        "proxyPassword": "p4$w0rd"
    }
}
# Дальнейшая логика опроса результата остается точно такой же

💡 Полезный совет: Для максимальной эффективности на строгих сайтах вроде Chess.com рекомендуется использовать резидентские прокси вместо датацентровых. Резидентские IP-адреса принадлежат реальным устройствам, что делает их значительно сложнее для обнаружения и блокировки. 2captcha предлагает надежный сервис резидентских прокси с пулом из 90+ млн IP в 220+ странах, поддерживающий протоколы HTTP, HTTPS и SOCKS5.

Примечание: Если вы автоматизируете браузер самостоятельно (например, через Playwright или Selenium), часто лучше использовать TurnstileTaskProxyless и направлять трафик браузера через ваш прокси на уровне самого браузера, а не передавать прокси в API.

Python SDK (Синхронный)

Если вы предпочитаете не работать с HTTP-запросами вручную, используйте официальную библиотеку 2captcha-python. SDK возвращает токен в поле result['code'], что эквивалентно solution['token'] в сыром ответе API.

python Copy
import sys
import os
from twocaptcha import TwoCaptcha

# Установите ключ API через переменную окружения или напрямую
api_key = os.getenv('APIKEY_2CAPTCHA', 'ВАШ_API_КЛЮЧ')
solver = TwoCaptcha(api_key)

try:
    result = solver.turnstile(
        sitekey='0x4AAAAAAAVrOwQWPlm3Bnr5',
        url='https://www.chess.com/login',
    )
except Exception as e:
    sys.exit(str(e))
else:
    # SDK возвращает токен в result['code']
    print(f"Токен: {result['code']}")

Python SDK (Асинхронный)

Для высоконагруженных приложений рекомендуется использовать асинхронную версию SDK.

python Copy
import asyncio
import os
import sys
from twocaptcha import AsyncTwoCaptcha

api_key = os.getenv('APIKEY_2CAPTCHA', 'ВАШ_API_КЛЮЧ')
solver = AsyncTwoCaptcha(api_key)

async def solve_captcha():
    try:
        result = await solver.turnstile(
            sitekey='0x4AAAAAAAVrOwQWPlm3Bnr5',
            url='https://www.chess.com/login',
        )
        # SDK возвращает токен в result['code']
        print(f"Токен: {result['code']}")
        return result
    except Exception as e:
        sys.exit(e)

if __name__ == '__main__':
    asyncio.run(solve_captcha())

Как использовать полученный токен

После получения токена его необходимо передать на целевую страницу. Существует два основных способа, которые использует Chess.com (и аналогичные сайты):

Вариант 1: Скрытое поле формы (наиболее частый)
Сайт ожидает токен в скрытом поле ввода с именем cf-turnstile-response.

javascript Copy
document.querySelector('input[name="cf-turnstile-response"]').value = "ВАШ_ТОКЕН";
// Затем отправьте форму

Вариант 2: JavaScript Callback
Если виджет был инициализирован с атрибутом data-callback, вам нужно вызвать эту функцию вручную.

javascript Copy
// Замените 'turnstileCallback' на реальное имя функции из атрибута data-callback
if (typeof turnstileCallback === 'function') {
    turnstileCallback("ВАШ_ТОКЕН");
}

Альтернатива: Браузерное расширение

Если вы не хотите писать код, вы можете использовать официальное браузерное расширение Captcha Solver. Оно автоматически обнаруживает виджеты Turnstile на страницах вроде Chess.com и решает их в один клик, используя ваш аккаунт 2captcha.

Тестирование в режиме песочницы

Прежде чем интегрировать решение в основной скрипт, проверьте корректность извлеченных параметров с помощью песочницы 2captcha.

  1. Отправьте задачу через API, используя ваши websiteURL и websiteKey.
  2. Перейдите в Песочницу 2captcha и переключитесь в режим Worker (Работник).
  3. Если вы возьмете эту задачу и увидите, что виджет Turnstile загружается корректно, параметры собраны верно. Если виджет выдает ошибку "Invalid domain", убедитесь, что websiteURL в точности совпадает с адресом страницы.

Частые ошибки и их решение

Ошибка / Проблема Причина Решение
ERROR_INVALID_SITE_KEY Неверный websiteKey или несовпадение домена Убедитесь, что ключ начинается с 0x4 и скопирован без лишних пробелов.
Бесконечный CAPCHA_NOT_READY Устаревший или неверный websiteURL Убедитесь, что вы отправляете точный URL, на котором была вызвана капча, включая все динамические параметры.
Форма не отправляется после внедрения токена Токен помещен не в то поле Проверьте вкладку Network при ручной отправке, чтобы увидеть, в каком поле передается токен.

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