Как обойти Cloudflare Turnstile с помощью Python#

logoNextCaptcha
March 26,2026

Что такое Cloudflare Turnstile?#

Cloudflare Turnstile — это интеллектуальная альтернатива CAPTCHA, предназначенная для проверки пользователей без навязчивых задач. В отличие от традиционных CAPTCHA, требующих выбора изображений или ввода текста, Turnstile выполняет невидимые проверки в браузере, чтобы определить, является ли посетитель человеком. Он широко используется на сайтах с сервисами Cloudflare и может стать серьёзным препятствием для веб-скрейпинга и автоматизации.

Предварительные требования#

Перед началом убедитесь, что у вас установлен Python 3.7 или выше. Вам также понадобится API-ключ NextCaptcha — зарегистрируйтесь на NextCaptcha для получения бесплатных пробных кредитов. Затем установите NextCaptcha Python SDK:
pip install nextcaptcha-python

Быстрый старт с SDK NextCaptcha#

Сначала создайте экземпляр NextCaptchaAPI с вашим API-ключом. Ваш клиентский ключ можно найти в панели управления NextCaptcha:
from nextcaptcha import NextCaptchaAPI
 
api = NextCaptchaAPI(client_key="YOUR_CLIENT_KEY")
Затем вызовите метод turnstile, указав URL целевого сайта и ключ сайта Turnstile. Ключ находится в атрибуте data-sitekey виджета Turnstile на целевой странице:
result = api.turnstile(
    website_url="https://example.com",
    website_key="0x4XXXXXXXXXXXXXXXXX"
)
 
if result["status"] == "ready":
    token = result["solution"]["token"]
    print(f"Turnstile token: {token}")

Полный пример с обработкой ошибок#

Вот готовый к продакшену пример с обработкой ошибок и поддержкой переменных окружения:
import os
import sys
from nextcaptcha import NextCaptchaAPI
 
CLIENT_KEY = os.getenv("NEXTCAPTCHA_KEY", "YOUR_CLIENT_KEY")
WEBSITE_URL = "https://example.com"
WEBSITE_KEY = "0x4XXXXXXXXXXXXXXXXX"
 
api = NextCaptchaAPI(client_key=CLIENT_KEY)
 
try:
    result = api.turnstile(
        website_url=WEBSITE_URL,
        website_key=WEBSITE_KEY
    )
 
    if result["status"] == "ready":
        token = result["solution"]["token"]
        print(f"Turnstile solved successfully!")
        print(f"Token: {token[:50]}...")
    else:
        print(f"Failed to solve: {result.get('errorDescription', 'Unknown error')}")
        sys.exit(1)
 
except Exception as e:
    print(f"Error: {e}")
    sys.exit(1)

Использование API напрямую (без SDK)#

Если вы не хотите использовать SDK, можно вызывать API NextCaptcha напрямую через библиотеку requests. Этот подход даёт полный контроль над HTTP-запросами:
import requests
import time
 
API_KEY = "YOUR_API_KEY"
WEBSITE_URL = "https://example.com"
WEBSITE_KEY = "0x4XXXXXXXXXXXXXXXXX"
 
# Step 1: Create task
response = requests.post("https://api.nextcaptcha.com/createTask", json={
    "clientKey": API_KEY,
    "task": {
        "type": "TurnstileTaskProxyless",
        "websiteURL": WEBSITE_URL,
        "websiteKey": WEBSITE_KEY
    }
})
 
data = response.json()
if data.get("errorId", 0) != 0:
    print(f"Error creating task: {data.get('errorDescription')}")
    exit()
 
task_id = data["taskId"]
print(f"Task created: {task_id}")
 
# Step 2: Poll for result
while True:
    time.sleep(3)
    result = requests.post("https://api.nextcaptcha.com/getTaskResult", json={
        "clientKey": API_KEY,
        "taskId": task_id
    }).json()
 
    if result["status"] == "ready":
        token = result["solution"]["token"]
        print(f"Solved! Token: {token[:50]}...")
        break
    elif result["status"] == "failed":
        print(f"Failed: {result.get('errorDescription')}")
        break
    else:
        print("Waiting for solution...")
Этот подход требует двух вызовов API: createTask для отправки задачи Turnstile и getTaskResult для опроса результата. Рекомендуется интервал опроса 3 секунды, чтобы избежать ограничения частоты запросов.

Итоги#

В этом руководстве мы рассмотрели два способа обхода Cloudflare Turnstile с помощью Python: через SDK NextCaptcha для простого подхода и через прямой API для полного контроля. NextCaptcha автоматически решает задачу Turnstile и возвращает валидный токен. Подробнее см. по ссылкам ниже: