Cloudflare Turnstile
Основанный на токенах метод обхода капчи 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'
})