Эта статья была полезной?
Как обойти 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) сразу после открытия страницы, до любых действий, которые могут вызвать появление капчи.
Инструкция:
- Откройте страницу входа в режиме инкогнито и нажмите F12 (Инструменты разработчика).
- Перейдите на вкладку Консоль (Console).
- Сразу же вставьте следующий скрипт и нажмите Enter. Не обновляйте страницу после этого!
javascript
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)
- Теперь выполните действие, которое вызывает появление капчи (например, введите email и пароль и нажмите кнопку входа).
- В консоли мгновенно появится JSON-объект с актуальными параметрами. Скопируйте его.
- Немедленно отправьте эти параметры в запросе на решение через API. Не обновляйте страницу, иначе параметры станут недействительными.
Обратите внимание: скрипт не только извлекает параметры, но и сохраняет оригинальный callback виджета в глобальную переменную window.tsCallback. Именно через эту функцию необходимо передать полученный токен, чтобы сайт принял решение.
Примеры кода
Python + requests
Пример отправки задачи с параметрами, скопированными из консоли.
python
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
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
window.tsCallback("ПОЛУЧЕННЫЙ_ТОКЕН");
Именно этот вызов сообщает сайту, что капча успешно решена, и разблокирует форму для отправки. Если вы не вызовете callback или передадите токен иным способом, сайт отклонит решение.
Тестирование в режиме песочницы
Перед запуском автоматизации проверьте корректность извлеченных параметров в Песочнице 2captcha.
- Скопируйте JSON из консоли и отправьте задачу через API.
- Перейдите в Песочницу: https://2captcha.com/setting#sandbox и переключитесь в режим Работник (Worker).
- Если вы увидите корректно загружающийся виджет Turnstile, значит, параметры собраны верно. Если виджет выдает ошибку, убедитесь, что вы отправили запрос мгновенно после появления JSON в консоли, не обновляя страницу.
Частые ошибки и решения
| Ошибка / Проблема | Причина | Решение |
|---|---|---|
| Ошибка валидации или истечения срока | Параметры pagedata или data устарели. | Эти параметры одноразовые. Перехватывайте их заново через консольный скрипт и отправляйте в API мгновенно, без обновления страницы. |
| Скрипт перехвата не сработал | Скрипт был внедрен после того, как капча уже загрузилась. | Внедряйте скрипт сразу после открытия страницы, до любых действий, которые могут вызвать появление виджета. |
| Ошибка несоответствия User-Agent | userAgent в задаче API отличается от реального. | Убедитесь, что скрипт перехвата корректно считал navigator.userAgent, и вы не меняете его вручную в API. |
| Сайт не принимает токен | Токен не был передан через callback. | Обязательно вызывайте window.tsCallback(token) после получения токена. Внедрение в скрытые поля не работает на этом сайте. |
| window.tsCallback is not a function | Скрипт перехвата не сохранил callback. | Проверьте, что вы внедряли скрипт ДО появления капчи. Если виджет уже загрузился, перезагрузите страницу и внедрите скрипт заново. |
| Капча не появляется | Сайт не триггерит проверку. | Попробуйте использовать режим инкогнито, очистить куки или изменить IP-адрес, чтобы спровоцировать появление капчи. |
Полезные ссылки
- Песочница для тестирования API: https://2captcha.com/setting#sandbox
- Документация API по Cloudflare Turnstile: https://2captcha.com/api-docs/cloudflare-turnstile
- Python SDK на GitHub: https://github.com/2captcha/2captcha-python
- Другие примеры обхода капч на сайтах: https://2captcha.com/h?category=sites