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

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

Как обойти Cloudflare Turnstile Standalone на Postman

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

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

Введение

Современные порталы аутентификации всё чаще используют Cloudflare Turnstile для защиты от бот-трафика и перебора учетных данных. Эта технология обеспечивает беспрепятственный доступ для реальных пользователей, но создает серьезное препятствие для скриптов автоматизации.

В этом руководстве представлен технический разбор метода обхода встроенного виджета Turnstile (типичного для таких платформ, как Postman) с использованием API 2captcha v2. Мы подробно рассмотрим перехват необходимых параметров, отправку задачи и корректные механизмы внедрения полученного токена для завершения процесса аутентификации.

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

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

Для встроенных виджетов оптимальным выбором является тип задачи TurnstileTaskProxyless. Передавать параметры прокси в payload не требуется, так как сервис решает задачу, используя собственную управляемую инфраструктуру.

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

* Для стандартных встроенных реализаций эти параметры следует опустить.

Перехват параметров

Способ 1: Инспекция DOM (Рекомендуется)

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

Способ 2: Сетевой перехват (Для динамических сессий)

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

Критически важно: Turnstile криптографически привязывает токен к URL сессии. Пропуск динамических параметров запроса (таких как ?state=... или ?returnTo=...) приведет к ошибке ERROR_INVALID_SITE_KEY или скрытому сбою валидации на целевом сервере.

Примеры реализации

Прямая интеграция с API v2 (Python + Requests)

Этот подход демонстрирует прямое HTTP-взаимодействие с API 2captcha. Обратите внимание на отсутствие полей прокси в payload для TurnstileTaskProxyless.

python Copy
import requests
import time

API_KEY = 'ВАШ_API_КЛЮЧ'
WEBSITE_URL = 'https://identity.getpostman.com/' # Включите динамические параметры, если они есть
WEBSITE_KEY = '0x4AAAAAAA...' # Замените на извлеченный ключ

# 1. Отправка задачи на решение
create_url = 'https://api.2captcha.com/createTask'
headers = {'Content-Type': 'application/json'}
payload = {
    "clientKey": API_KEY,
    "task": {
        "type": "TurnstileTaskProxyless",
        "websiteURL": WEBSITE_URL,
        "websiteKey": WEBSITE_KEY
    }
}

response = requests.post(create_url, headers=headers, json=payload).json()

if response.get('errorId') == 0:
    task_id = response.get('taskId')
    print(f"Задача инициирована. ID: {task_id}")

    # 2. Опрос результата
    result_url = 'https://api.2captcha.com/getTaskResult'
    while True:
        time.sleep(5)
        res_payload = {"clientKey": API_KEY, "taskId": task_id}
        res_response = requests.post(result_url, headers=headers, json=res_payload).json()

        if res_response.get('status') == 'ready' and res_response.get('errorId') == 0:
            token = res_response['solution']['token']
            print(f"Успех! Токен: {token}")
            break
        elif res_response.get('errorId') != 0:
            print(f"Ошибка API: {res_response.get('errorDescription')}")
            break
else:
    print(f"Ошибка отправки: {response.get('errorDescription')}")

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

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

Параметр Тип Обязателен Описание
proxyType Строка Да http, socks4 или socks5
proxyAddress Строка Да IP-адрес или имя хоста прокси-сервера
proxyPort Целое число Да Порт прокси-сервера
proxyLogin Строка Нет Имя пользователя для аутентификации на прокси
proxyPassword Строка Нет Пароль для аутентификации на прокси
python Copy
# Модифицированный payload для TurnstileTask
payload = {
    "clientKey": API_KEY,
    "task": {
        "type": "TurnstileTask",
        "websiteURL": WEBSITE_URL,
        "websiteKey": WEBSITE_KEY,
        "proxyType": "http",
        "proxyAddress": "198.51.100.10",
        "proxyPort": 8080,
        "proxyLogin": "username",
        "proxyPassword": "password"
    }
}

Совет по инфраструктуре: Для провайдеров с высоким уровнем безопасности стандартные датацентровые прокси часто вызывают мгновенную блокировку. Использование резидентских прокси значительно повышает процент успешных решений, так как эти IP-адреса принадлежат легитимным потребительским устройствам, подключенным через интернет-провайдеров. 2captcha предоставляет надежную сеть резидентских прокси (90+ млн IP, 220+ стран) с поддержкой протоколов HTTP и SOCKS5.

Альтернатива: Если вы уже управляете браузером через Selenium или Playwright, как правило, эффективнее использовать TurnstileTaskProxyless и направлять нативный трафик браузера через ваш прокси, вместо передачи учетных данных прокси в API.

Официальный Python SDK (Синхронный)

Для написания более чистого кода официальная библиотека 2captcha-python абстрагирует логику опроса. SDK удобно возвращает токен в поле result['code'].

python Copy
import os
import sys
from twocaptcha import TwoCaptcha

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

try:
    result = solver.turnstile(
        sitekey='0x4AAAAAAA...',
        url='https://identity.getpostman.com/',
    )
    print(f"Полученный токен: {result['code']}")
except Exception as e:
    sys.exit(f"Не удалось решить: {e}")

Официальный Python SDK (Асинхронный)

Идеально подходит для конвейеров автоматизации с высокой пропускной способностью и конкурентными запросами.

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

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

async def main():
    try:
        result = await solver.turnstile(
            sitekey='0x4AAAAAAA...',
            url='https://identity.getpostman.com/',
        )
        print(f"Полученный токен: {result['code']}")
    except Exception as e:
        sys.exit(f"Не удалось решить: {e}")

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

Механика внедрения токена

После получения токена его необходимо передать обратно в клиентское приложение. Провайдеры идентификации обычно обрабатывают это одним из двух способов:

1. Скрытое поле формы (Стандартный)

Бэкенд ожидает получения токена в определенном скрытом поле перед отправкой формы.

javascript Copy
const tokenInput = document.querySelector('input[name="cf-turnstile-response"]') || document.createElement('input');
tokenInput.type = 'hidden';
tokenInput.name = 'cf-turnstile-response';
tokenInput.value = "ВАШ_ПОЛУЧЕННЫЙ_ТОКЕН";
document.querySelector('form').appendChild(tokenInput);
// Далее выполните отправку формы

2. Явный JavaScript Callback

Если виджет был инициализирован с атрибутом data-callback, фронтенд ожидает вызова функции.

javascript Copy
// Замените 'onTurnstileSuccess' на реальное имя функции обратного вызова, найденное в DOM
if (typeof onTurnstileSuccess === 'function') {
    onTurnstileSuccess("ВАШ_ПОЛУЧЕННЫЙ_ТОКЕН");
}

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

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

Валидация и отладка

Перед развертыванием в продакшене проверьте ваши параметры в Песочнице 2captcha.

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

Типичные сбои

Симптом Корневая причина Решение
ERROR_INVALID_SITE_KEY Некорректный sitekey или несоответствие домена. Убедитесь, что ключ начинается с 0x4 и не содержит лишних пробелов.
Бесконечный CAPCHA_NOT_READY websiteURL устарел или в нем отсутствуют динамические параметры сессии. Захватывайте URL после полной загрузки страницы и активации капчи.
Скрытый сбой при отправке формы Токен внедрен в неправильный элемент DOM. Изучите вкладку Network во время ручного успешного входа, чтобы определить точное поле payload, несущее токен.

Справочные ссылки