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

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

Как обойти Cloudflare Challenge на сайте US Visa

Грегори Фишер
Грегори Фишер

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

Сайт планирования собеседований для визы в США (usvisascheduling.com) использует продвинутую защиту Cloudflare Turnstile. Особенность этой капчи заключается в том, что параметры pagedata, data, action и userAgent являются строго динамическими и меняются при каждой загрузке страницы или попытке взаимодействия.

Использование устаревших или вручную скопированных параметров приведет к ошибке. Единственный надежный способ получить актуальные данные — внедрить специальный скрипт перехвата в консоль браузера строго до того, как капча загрузится. Если вы сделаете это после появления виджета, скрипт уже не сможет перехватить нужные параметры.

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

Для решения используется тип задачи TurnstileTaskProxyless.

Параметр Тип Обязательный Описание
type String Да Должен быть установлен в TurnstileTaskProxyless
websiteURL String Да Полный URL страницы, где находится капча
websiteKey String Да Статический ключ сайта (sitekey, начинается с 0x4...)
pagedata String Да Динамический параметр (chlPageData), извлекаемый скриптом
data String Да Динамический параметр (cData), извлекаемый скриптом
action String Да Действие капчи (обычно interactive)
userAgent String Да User-Agent браузера. Должен байт-в-байт совпадать с реальным

Как перехватить динамические параметры

ВАЖНО: Скрипт перехвата необходимо внедрять в консоль браузера ДО загрузки капчи. Если вы выполните его после того, как виджет уже появился на экране, он не сработает, так как метод render уже будет вызван и параметры будут упущены.

Эти параметры меняются при каждой загрузке страницы. Чтобы их получить, нужно внедрить специальный скрипт перехвата в консоль браузера (DevTools) сразу после открытия страницы, до любых действий, которые могут вызвать появление капчи.

Инструкция:

  1. Откройте страницу входа в режиме инкогнито и нажмите F12 (Инструменты разработчика).
  2. Перейдите на вкладку Консоль (Console).
  3. Сразу же вставьте следующий скрипт и нажмите Enter. Не обновляйте страницу после этого!
javascript Copy
const i = setInterval(()=>{
    if (window.turnstile) {
        clearInterval(i)
        window.turnstile.render = (a, b) => {
            let p = {
                type: "TurnstileTaskProxyless",
                websiteKey: b.sitekey,
                websiteURL: window.location.href,
                data: b.cData,
                pagedata: b.chlPageData,
                action: b.action,
                userAgent: navigator.userAgent
            }
            console.log(JSON.stringify(p))
            window.tsCallback = b.callback
            return 'foo'
        }
    }
}, 10)
  1. Теперь выполните действие, которое вызывает появление капчи (например, введите email и пароль и нажмите кнопку входа).
  2. В консоли мгновенно появится JSON-объект с актуальными параметрами. Скопируйте его.
  3. Немедленно отправьте эти параметры в запросе на решение через API. Не обновляйте страницу, иначе параметры станут недействительными.

Обратите внимание: скрипт не только извлекает параметры, но и сохраняет оригинальный callback виджета в глобальную переменную window.tsCallback. Именно через эту функцию необходимо передать полученный токен, чтобы сайт принял решение.

Примеры кода

Python + requests

Пример отправки задачи с параметрами, скопированными из консоли.

python Copy
import requests
import time
import json

API_KEY = 'ВАШ_API_КЛЮЧ'

# Вставьте сюда JSON, скопированный из консоли браузера
captured_json = {
    "type": "TurnstileTaskProxyless",
    "websiteKey": "0x4AAAAAAAAjq6WYeRDKmebM",
    "websiteURL": "https://www.usvisascheduling.com/",
    "data": "a31b07896e8aa62f",
    "pagedata": "iZy6cBQbM42IgQSPXJNMblTW4QaqlmCKkBgbiPp1X54-1787833218-1.3.1.1-...",
    "action": "interactive",
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36"
}

url = 'https://api.2captcha.com/createTask'
headers = {
    'Content-Type': 'application/json'
}

# Формируем payload, добавляя clientKey к данным из консоли
payload = {
    "clientKey": API_KEY,
    "task": captured_json
}

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}")
    
    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')}")

Python + Playwright (Автоматический перехват)

Этот скрипт автоматически внедряет код перехвата сразу после загрузки страницы, ДО появления капчи, перехватывает вывод из консоли и отправляет задачу в API без ручного копирования.

python Copy
from playwright.sync_api import sync_playwright
import requests
import time
import json

API_KEY = 'ВАШ_API_КЛЮЧ'
TARGET_URL = 'https://www.usvisascheduling.com/'

def solve_usvisa_turnstile():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        context = browser.new_context()
        page = context.new_page()
        
        captured_payload = {}

        # Слушаем сообщения консоли для перехвата данных от нашего скрипта
        page.on("console", lambda msg: captured_payload.update(json.loads(msg.text)) if msg.text.startswith('{"type":') else None)

        try:
            page.goto(TARGET_URL)
            
            # 1. ВАЖНО: Внедряем скрипт перехвата СРАЗУ после загрузки страницы, ДО появления капчи
            page.evaluate("""
                const i = setInterval(()=>{
                    if (window.turnstile) {
                        clearInterval(i)
                        window.turnstile.render = (a, b) => {
                            let p = {
                                type: "TurnstileTaskProxyless",
                                websiteKey: b.sitekey,
                                websiteURL: window.location.href,
                                data: b.cData,
                                pagedata: b.chlPageData,
                                action: b.action,
                                userAgent: navigator.userAgent
                            }
                            console.log(JSON.stringify(p))
                            window.tsCallback = b.callback
                            return 'foo'
                        }
                    }
                }, 10)
            """)
            
            # 2. Только после внедрения скрипта выполняем действие, вызывающее капчу
            # page.fill('input[name="email"]', 'test@example.com')
            # page.click('button[type="submit"]')
            
            # Ждем появления данных в консоли
            for _ in range(20):
                if captured_payload:
                    break
                time.sleep(1)
                
            if not captured_payload:
                raise Exception("Не удалось перехватить параметры капчи. Проверьте селекторы действий.")
            
            print("Параметры перехвачены. Отправка в API...")
            
            # 3. Отправка в API
            api_url = 'https://api.2captcha.com/createTask'
            headers = {'Content-Type': 'application/json'}
            payload = {
                "clientKey": API_KEY,
                "task": captured_payload
            }
            
            task_response = requests.post(api_url, headers=headers, json=payload).json()
            task_id = task_response.get('taskId')
            
            # 4. Ожидание решения
            res_url = 'https://api.2captcha.com/getTaskResult'
            token = None
            for _ in range(20):
                time.sleep(5)
                res = requests.post(res_url, headers=headers, json={"clientKey": API_KEY, "taskId": task_id}).json()
                if res.get('status') == 'ready':
                    token = res['solution']['token']
                    break
                if res.get('errorId') != 0:
                    print(f"Ошибка API: {res.get('errorDescription')}")
                    break
                    
            if token:
                print(f"Токен получен: {token}")
                
                # 5. ВАЖНО: Передаем токен ТОЛЬКО через callback
                # Скрипт перехвата сохранил оригинальный callback виджета в window.tsCallback
                page.evaluate(f"""
                    if (typeof window.tsCallback === 'function') {{
                        window.tsCallback("{token}");
                        console.log("Token passed via tsCallback successfully");
                    }} else {{
                        console.error("tsCallback function not found. Interception script may not have worked correctly.");
                    }}
                """)
                print("Токен передан через callback.")
            else:
                print("Не удалось получить токен.")
                
        except Exception as e:
            print(f"Ошибка: {e}")
        finally:
            # browser.close()

if __name__ == '__main__':
    solve_usvisa_turnstile()

Как использовать полученный токен (Только через callback)

Сайт US Visa Scheduling принимает токен Cloudflare Turnstile исключительно через callback-функцию. Внедрение токена в скрытые поля формы не сработает, так как сайт не читает их напрямую.

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

javascript Copy
window.tsCallback("ПОЛУЧЕННЫЙ_ТОКЕН");

Именно этот вызов сообщает сайту, что капча успешно решена, и разблокирует форму для отправки. Если вы не вызовете callback или передадите токен иным способом, сайт отклонит решение.

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

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

  1. Скопируйте JSON из консоли и отправьте задачу через API.
  2. Перейдите в Песочницу: https://2captcha.com/setting#sandbox и переключитесь в режим Работник (Worker).
  3. Если вы увидите корректно загружающийся виджет Turnstile, значит, параметры собраны верно. Если виджет выдает ошибку, убедитесь, что вы отправили запрос мгновенно после появления JSON в консоли, не обновляя страницу.

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

Ошибка / Проблема Причина Решение
Ошибка валидации или истечения срока Параметры pagedata или data устарели. Эти параметры одноразовые. Перехватывайте их заново через консольный скрипт и отправляйте в API мгновенно, без обновления страницы.
Скрипт перехвата не сработал Скрипт был внедрен после того, как капча уже загрузилась. Внедряйте скрипт сразу после открытия страницы, до любых действий, которые могут вызвать появление виджета.
Ошибка несоответствия User-Agent userAgent в задаче API отличается от реального. Убедитесь, что скрипт перехвата корректно считал navigator.userAgent, и вы не меняете его вручную в API.
Сайт не принимает токен Токен не был передан через callback. Обязательно вызывайте window.tsCallback(token) после получения токена. Внедрение в скрытые поля не работает на этом сайте.
window.tsCallback is not a function Скрипт перехвата не сохранил callback. Проверьте, что вы внедряли скрипт ДО появления капчи. Если виджет уже загрузился, перезагрузите страницу и внедрите скрипт заново.
Капча не появляется Сайт не триггерит проверку. Попробуйте использовать режим инкогнито, очистить куки или изменить IP-адрес, чтобы спровоцировать появление капчи.

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