Логотип «GitHub»

Cloudflare Turnstile

Turnstile widget

Основанный на токенах метод обхода капчи Cloudflare Turnstile. Поддерживаются два вида капчи Cloudflare Turnstile, как Standalone Captcha, так и Cloudflare Challenge page.

Есть два разных случая, которые требуют разного подхода:

  • Standalone Captcha - виджет капчи размещен на странице веб-сайта, смотрите нашу демо страницу Turnstile
  • Cloudflare Challenge page - капча отображается на странице проверки Cloudflare

Standalone Captcha

Чтобы обойти Standalone Captcha, вам просто нужно найти sitekey, получить токен из нашего API, а затем передать его вашей целевой странице в качестве значения элемента ввода с именем cf-turnstile-response или g-recaptcha-response для режима совместимости с reCAPTCHA. Также токен может быть обработан с помощью функции обратного вызова, переданной в вызов turnstile.render.

Cloudflare Challenge page

Это гораздо более сложный случай. Вам следует перехватить вызов turnstile.render и получить следующие значения:

  • cData
  • chlPageData
  • action

Также вам нужно будет перехватить определение функции обратного вызова и передать в запросе userAgent вашего браузера.

Чтобы перехватить необходимые параметры, вы можете встроить следующий JavaScript на страницу, перед загрузкой виджета Cloudflare Turnstile капчи.

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)  

Другой подход заключается в перехвате запроса к api.js скрипту и замене его вашим собственным скриптом, который возвращает параметры и делает обратный вызов доступным глобально.

Наконец, когда вы получили решение:

  • выполните функцию обратного вызова, передавая полученный токен в качестве аргумента

Типы задач

  • TurnstileTaskProxyless - мы используем собственный пул прокси-серверов для решения капч
  • TurnstileTask - мы используем переданный вами прокси

Спецификация для типа задачи TurnstileTaskProxyless

Свойство Тип Обязателен Описание
type Строка Да Тип задачи:
TurnstileTaskProxyless
TurnstileTask
websiteURL Строка Да Полный URL-адрес целевой веб-страницы, на которую загружается капча. Мы не открываем страницу, это не проблема, если страница доступна только для авторизованных пользователей
websiteKey Строка Да Turnstile sitekey. Значение sitekey можно найти внутри свойства data-sitekey элемента div Turnstile капчи
userAgent Строка Да User-Agent вашего браузера. Должен совпадать с User-Agent который вы используете для доступа к сайту. Используйте только современные браузеры, выпущенные в последние 6 месяцев
action Строка Нет* Требуется для Cloudflare Challenge page. Значение параметра action вызова turnstile.render
data Строка Нет* Требуется для Cloudflare Challenge page. Значение параметра cData вызова turnstile.render
pagedata Строка Нет* Требуется для Cloudflare Challenge page. Значение параметра chlPageData вызова turnstile.render

Спецификация для типа задачи TurnstileTask

Задача TurnstileTask расширяет TurnstileTaskProxyless, добавляя набор параметров, связанных с прокси, перечисленных ниже.

Свойство Тип Обязателен Описание
proxyType Строка Да Тип прокси:
http
socks4
socks5
proxyAddress Строка Да IP-адрес прокси-сервера или имя хоста
proxyPort Число Да Порт прокси-сервера
proxyLogin Строка Нет Логин используемый для аунтефикации на прокси-сервере
proxyPassword Строка Нет Пароль используемый для аунтефикации на прокси-сервере

Примеры запросов

Метод: createTask
Эндпоинт API: https://api.2captcha.com/createTask

Standalone Captcha

TurnstileTaskProxyless пример запроса

{
    "clientKey":"YOUR_API_KEY",
    "task": {
        "type":"TurnstileTaskProxyless",
        "websiteURL":"https://2captcha.com/demo/cloudflare-turnstile",
        "websiteKey":"0x4AAAAAAAVrOwQWPlm3Bnr5"
    }
}

TurnstileTask пример запроса

{
    "clientKey":"YOUR_API_KEY",
    "task": {
        "type":"TurnstileTask",
        "websiteURL":"https://2captcha.com/demo/cloudflare-turnstile",
        "websiteKey":"0x4AAAAAAAVrOwQWPlm3Bnr5",
        "proxyType":"http",
        "proxyAddress":"1.2.3.4",
        "proxyPort":"8080",
        "proxyLogin":"user23",
        "proxyPassword":"p4$w0rd"
    }
}

Cloudflare Challenge Pages

TurnstileTaskProxyless пример запроса

{
    "clientKey":"YOUR_API_KEY",
    "task": {
        "type":"TurnstileTaskProxyless",
        "websiteURL":"https://2captcha.com/demo/cloudflare-turnstile",
        "websiteKey":"0x4AAAAAAAVrOwQWPlm3Bnr5",
        "action": "managed",
        "data": "80001aa1affffc21",
        "pagedata": "3gAFo2l...55NDFPRFE9",
        "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
    }
}

TurnstileTask пример запроса

{
    "clientKey":"YOUR_API_KEY",
    "task": {
        "type":"TurnstileTask",
        "websiteURL":"https://2captcha.com/demo/cloudflare-turnstile",
        "websiteKey":"0x4AAAAAAAVrOwQWPlm3Bnr5",
        "action": "managed",
        "data": "80001aa1affffc21",
        "pagedata": "3gAFo2l...55NDFPRFE9",      
        "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
        "proxyType":"http",
        "proxyAddress":"1.2.3.4",
        "proxyPort":"8080",
        "proxyLogin":"user23",
        "proxyPassword":"p4$w0rd"
    }
}

Пример ответа

Метод: getTaskResult
Эндпоинт API: https://api.2captcha.com/getTaskResult

{
    "errorId": 0,
    "status": "ready",
    "solution": {
        "token": "0.zrSnRHO7h0HwSjSCU8oyzbjEtD8p.d62306d4ee00c77dda697f959ebbd7bd97",
        "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
    },
    "cost": "0.00145",
    "ip": "1.2.3.4",
    "createTime": 1692863536,
    "endTime": 1692863556,
    "solveCount": 1
}

Примеры кода

// https://github.com/2captcha/2captcha-php

require(__DIR__ . '/../src/autoloader.php');

$solver = new \TwoCaptcha\TwoCaptcha('YOUR_API_KEY');

try {
    $result = $solver->turnstile([
        'sitekey' => '0x4AAAAAAAVrOwQWPlm3Bnr5',
        'url'     => 'https://2captcha.com/demo/cloudflare-turnstile',
    ]);
} catch (\Exception $e) {
    die($e->getMessage());
}
# https://github.com/2captcha/2captcha-python

import sys
import os

sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

from twocaptcha import TwoCaptcha

api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY')

solver = TwoCaptcha(api_key)

try:
    result = solver.turnstile(
        sitekey='0x4AAAAAAAVrOwQWPlm3Bnr5',
        url='https://2captcha.com/demo/cloudflare-turnstile',
    )

except Exception as e:
    sys.exit(e)

else:
    sys.exit('solved: ' + str(result))
require 'api_2captcha'

client =  Api2Captcha.new("YOUR_API_KEY")

result = client.turnstile({
sitekey: '0x4AAAAAAAVrOwQWPlm3Bnr5',
pageurl: 'https://2captcha.com/demo/cloudflare-turnstile'
})

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