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

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

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

Как обойти 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 при ручной отправке, чтобы увидеть, в каком поле передается токен.

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