API Tutorials

Как решить Cloudflare Turnstile через API

Решение 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:

  1. DevTools браузера — откройте вкладку Elements и найдите атрибут data-sitekey или класс cf-turnstile.
  2. Исходный код страницыCtrl+U, поиск по подстроке 0x.
  3. Вкладка 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 параллельно, разложите задачи по нескольким воркерам и берите тариф с числом потоков не меньше желаемой параллельности.


Что читать дальше

Дальше — два материала, которые логично закрывают тему, и прямой путь к первому запросу:

  1. Прочитайте CaptchaAI Quickstart — общий 4-шаговый процесс работы с API
  2. Изучите решение reCAPTCHA v2 — ещё один частый сценарий автоматизации
  3. Зарегистрируйтесь на captchaai.com, получите API-ключ и решите первый Turnstile самостоятельно

Зарегистрируйтесь на CaptchaAI и начните решать Turnstile сегодня.

Комментарии для этой статьи отключены.