Эта статья была полезной?
Как обойти 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)
- Откройте страницу Chess.com, где появляется Turnstile (например, страницу входа или регистрации).
- Нажмите
F12, чтобы открыть DevTools, и перейдите на вкладку Elements (Элементы). - Нажмите
Ctrl+F(илиCmd+F) и выполните поиск поcf-turnstileилиdata-sitekey. - Вы найдете элемент
div, который выглядит примерно так:<div class="cf-turnstile" data-sitekey="0x4AAAAAAAVrOwQWPlm3Bnr5" ...></div>. Значение атрибутаdata-sitekey— это вашwebsiteKey. - Скопируйте полный URL из адресной строки браузера. Это ваш
websiteURL.
Способ 2: Вкладка Network (полезно для динамических страниц)
- Откройте DevTools и перейдите на вкладку Network (Сеть).
- Включите Preserve log (Сохранять журнал), чтобы фиксировать запросы при перезагрузках страницы.
- Вызовите капчу (например, введите email и нажмите кнопку входа).
- В фильтре введите
turnstileилиchallenges.cloudflare.com. - Найдите запрос к API Cloudflare и извлеките
sitekeyиз параметров запроса. - Скопируйте полный URL из адресной строки в момент, когда капча активна — он может содержать динамические параметры (например,
state), которые критически важны для валидации Turnstile.
Внимание: Использование URL без динамических параметров или с устаревшими значениями приведет к ошибке решения, так как Turnstile строго проверяет соответствие URL сессии.
Примеры кода
Python + Requests (Прямой запрос к API v2)
Этот пример демонстрирует, как отправить задачу и получить результат, используя прямые HTTP-запросы. Обратите внимание, что payload не содержит полей прокси.
python
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
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
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
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
document.querySelector('input[name="cf-turnstile-response"]').value = "ВАШ_ТОКЕН";
// Затем отправьте форму
Вариант 2: JavaScript Callback
Если виджет был инициализирован с атрибутом data-callback, вам нужно вызвать эту функцию вручную.
javascript
// Замените 'turnstileCallback' на реальное имя функции из атрибута data-callback
if (typeof turnstileCallback === 'function') {
turnstileCallback("ВАШ_ТОКЕН");
}
Альтернатива: Браузерное расширение
Если вы не хотите писать код, вы можете использовать официальное браузерное расширение Captcha Solver. Оно автоматически обнаруживает виджеты Turnstile на страницах вроде Chess.com и решает их в один клик, используя ваш аккаунт 2captcha.
Тестирование в режиме песочницы
Прежде чем интегрировать решение в основной скрипт, проверьте корректность извлеченных параметров с помощью песочницы 2captcha.
- Отправьте задачу через API, используя ваши
websiteURLиwebsiteKey. - Перейдите в Песочницу 2captcha и переключитесь в режим Worker (Работник).
- Если вы возьмете эту задачу и увидите, что виджет Turnstile загружается корректно, параметры собраны верно. Если виджет выдает ошибку "Invalid domain", убедитесь, что
websiteURLв точности совпадает с адресом страницы.
Частые ошибки и их решение
| Ошибка / Проблема | Причина | Решение |
|---|---|---|
ERROR_INVALID_SITE_KEY |
Неверный websiteKey или несовпадение домена |
Убедитесь, что ключ начинается с 0x4 и скопирован без лишних пробелов. |
Бесконечный CAPCHA_NOT_READY |
Устаревший или неверный websiteURL |
Убедитесь, что вы отправляете точный URL, на котором была вызвана капча, включая все динамические параметры. |
| Форма не отправляется после внедрения токена | Токен помещен не в то поле | Проверьте вкладку Network при ручной отправке, чтобы увидеть, в каком поле передается токен. |