Решение Cloudflare Turnstile через API сводится к трём действиям: получить sitekey со страницы, отправить его с pageurl в CaptchaAI и подставить токен в поле формы cf-turnstile-response. Кликать по виджету не нужно — Turnstile обычно вообще не показывает пользователю видимый челлендж, а собирает сигналы браузера в фоне.
Ниже — рабочий процесс с примерами на Python и Node.js. Не знакомы с CaptchaAI API? Начните с CaptchaAI Quickstart — общий 4-шаговый процесс.
Если сценарий затрагивает staging-форму с персональными данными пользователей, собирайте только то, что вправе обрабатывать: для аудитории в РФ это требование 152-ФЗ «О персональных данных», для трансграничных команд — GDPR-style due diligence.
Что нужно для решения Turnstile через API
| Параметр | Значение |
|---|---|
| API-ключ CaptchaAI | Из дашборда на captchaai.com |
| Turnstile sitekey | Извлекается со страницы (начинается с 0x) |
| pageurl | Полный URL страницы, где стоит виджет Turnstile |
| Язык | Python 3.7+ или Node.js 14+ |
Если инфраструктура крутится в европейских регионах или в Казахстане/Центральной Азии, заложите запас по таймауту опроса: время в пути до ocr.captchaai.com заметно зависит от региона хостинга и качества мобильной сети.
Шаг 1. Извлеките sitekey Turnstile со страницы
Sitekey обычно находится прямо в HTML страницы, в div или script:
<div class="cf-turnstile" data-sitekey="0x4AAAAAAAC3DHQFLr1GavNl"></div>
Или рендерится через JavaScript:
turnstile.render('#widget', {
sitekey: '0x4AAAAAAAC3DHQFLr1GavNl',
callback: function(token) { /* ... */ }
});
Три способа найти sitekey:
- DevTools браузера — откройте вкладку Elements и найдите атрибут
data-sitekeyили классcf-turnstile. - Исходный код страницы —
Ctrl+U, поиск по подстроке0x. - Вкладка Network — фильтр по
challenges.cloudflare.com, sitekey виден в параметрах запроса.
Turnstile sitekey всегда начинается с
0xи обычно состоит из 22 символов — этим он отличается от ключей reCAPTCHA, которые начинаются с6L.
Шаг 2. Отправьте sitekey и pageurl в CaptchaAI API
POST-запрос на https://ocr.captchaai.com/in.php с параметром method=turnstile:
import requests
API_KEY = "YOUR_CAPTCHAAI_KEY"
SITEKEY = "0x4AAAAAAAC3DHQFLr1GavNl"
PAGEURL = "https://staging.example.com/qa-login"
r = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": SITEKEY,
"pageurl": PAGEURL,
"json": 1,
})
data = r.json()
if data["status"] != 1:
raise RuntimeError(f"submit failed: {data}")
task_id = data["request"]
print("task id:", task_id)
Node.js:
const axios = require("axios");
const { data } = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: {
key: process.env.CAPTCHAAI_KEY,
method: "turnstile",
sitekey: "0x4AAAAAAAC3DHQFLr1GavNl",
pageurl: "https://staging.example.com/qa-login",
json: 1,
},
});
if (data.status !== 1) throw new Error(`submit failed: ${JSON.stringify(data)}`);
const taskId = data.request;
Успешный ответ: {"status": 1, "request": "<task_id>"}. Сохраните task_id для следующего шага.
Шаг 3. Опросите res.php и получите токен
Cloudflare Turnstile обычно решается быстрее, чем за 10 секунд. Подождите 10 секунд, затем опрашивайте res.php каждые 5 секунд, максимум 40 итераций:
import time
time.sleep(10)
for _ in range(40):
r = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
})
res = r.json()
if res["status"] == 1:
token = res["request"]
break
if res["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(f"solver error: {res}")
time.sleep(5)
else:
raise TimeoutError("turnstile solving timed out")
print("token (первые 60 символов):", token[:60])
Возвращаемый токен — Base64-строка, обычно начинается с 0. и имеет длину 400–600 символов.
На нестабильном мобильном соединении растягивайте окно опроса: 40 попыток по 5 секунд обычно хватает с запасом даже при обрыве и повторном открытии TCP-сессии.
Шаг 4. Подставьте токен в форму и отправьте её
Токен нужно поместить в скрытое поле cf-turnstile-response формы и отправить форму штатным способом.
Selenium:
driver.execute_script(
"document.querySelector('[name=cf-turnstile-response]').value = arguments[0];",
token,
)
driver.find_element("css selector", "form").submit()
Playwright:
page.evaluate(
"(t) => document.querySelector('[name=cf-turnstile-response]').value = t",
token,
)
page.click("button[type=submit]")
Чистый HTTP: добавьте cf-turnstile-response=<token> в тело формы application/x-www-form-urlencoded — браузер для этого не нужен вовсе.
Токен Turnstile живёт примерно 120–300 секунд. Используйте его сразу, иначе бэкенд вернёт
timeout-or-duplicate.
Готовый скрипт целиком (Python)
Тот же процесс в виде функции solve_turnstile() для CI-воркера:
import os, time, requests
API = "https://ocr.captchaai.com"
KEY = os.environ["CAPTCHAAI_KEY"]
def solve_turnstile(sitekey: str, pageurl: str) -> str:
r = requests.post(f"{API}/in.php", data={
"key": KEY, "method": "turnstile",
"sitekey": sitekey, "pageurl": pageurl, "json": 1,
}, timeout=30)
j = r.json()
if j["status"] != 1:
raise RuntimeError(f"submit: {j}")
tid = j["request"]
time.sleep(10)
for _ in range(40):
r = requests.get(f"{API}/res.php", params={
"key": KEY, "action": "get", "id": tid, "json": 1,
}, timeout=30)
j = r.json()
if j["status"] == 1:
return j["request"]
if j["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(f"poll: {j}")
time.sleep(5)
raise TimeoutError("timeout")
if __name__ == "__main__":
print(solve_turnstile("0x4AAAAAAAC3DHQFLr1GavNl", "https://staging.example.com/qa-login"))
Коды ошибок CaptchaAI при решении Turnstile
| Код | Значение | Что делать |
|---|---|---|
ERROR_WRONG_USER_KEY |
Неверный формат ключа | Проверьте CAPTCHAAI_KEY без пробелов |
ERROR_KEY_DOES_NOT_EXIST |
Ключ не найден | Скопируйте ключ заново из кабинета |
ERROR_ZERO_BALANCE |
Нулевой баланс | Пополните баланс и повторите |
ERROR_PAGEURL |
Некорректен pageurl | Передавайте полный URL с https:// |
ERROR_CAPTCHA_UNSOLVABLE |
Не удалось решить | Сверьте sitekey и pageurl, повторите |
Полный список — в гайде по reCAPTCHA v2.
Почему Turnstile всё равно не проходит
Sitekey обновился между заходами
Некоторые сайты выдают новый sitekey при каждом визите на страницу. Извлекайте его заново перед каждой отправкой задачи, а не один раз при первом запуске сценария.
pageurl не совпадает со страницей виджета
Бэкенд Turnstile сверяет URL с той страницей, где реально стоит виджет. Путь должен совпадать один в один; query-параметры обычно можно отбросить без вреда.
TLS-профиль клиента слишком заметен
Голый requests часто отличим от настоящего браузера по TLS-сигнатуре. Используйте curl_cffi, Playwright или обычный браузер вместо чистого HTTP-клиента.
Токен использован слишком поздно
У вас около 2 минут с момента получения токена. Передавайте его в форму сразу после ответа res.php, не откладывайте на потом.
Прокси низкого качества
Дешёвые datacenter-IP чаще провоцируют дополнительные проверки со стороны Cloudflare. Для стабильного прохождения используйте резидентный прокси.
Частые вопросы про решение Turnstile
Сколько стоит решение Turnstile через CaptchaAI?
Тарификация по потокам, не по числу решений: BASIC — $15/мес за 5 потоков с неограниченным числом решений на поток. Фиксированная цена в USD удобна тем, кто выставляет счета в другой валюте.
Нужен ли прокси для решения Turnstile?
Нет, сам вызов in.php/res.php прокси не требует. Прокси нужен только если целевой сайт ограничивает запросы по IP — для Turnstile это реже, чем для полного Cloudflare Challenge.
Как отличить Turnstile от полного Cloudflare Challenge?
Turnstile — виджет на странице, похожий на reCAPTCHA. Cloudflare Challenge — полноэкранная заглушка «Checking your browser…» перед самой страницей.
Sitekey каждый раз новый — можно ли его закешировать?
Нет, если сайт генерирует sitekey динамически — извлекайте его при каждом запуске сценария, а не однократно.
Сколько потоков нужно, чтобы решать Turnstile параллельно?
Каждый поток CaptchaAI обрабатывает одну задачу одновременно. Чтобы решать несколько форм Turnstile параллельно, разложите задачи по нескольким воркерам и берите тариф с числом потоков не меньше желаемой параллельности.
Что читать дальше
Дальше — два материала, которые логично закрывают тему, и прямой путь к первому запросу:
- Прочитайте CaptchaAI Quickstart — общий 4-шаговый процесс работы с API
- Изучите решение reCAPTCHA v2 — ещё один частый сценарий автоматизации
- Зарегистрируйтесь на captchaai.com, получите API-ключ и решите первый Turnstile самостоятельно
Зарегистрируйтесь на CaptchaAI и начните решать Turnstile сегодня.