Cloudflare Turnstile é a alternativa CAPTCHA de crescimento com menor latência. Para resolver isso com CaptchaAI, você precisa da chave do site e do URL da página. Este guia cobre todas as maneiras de encontrar a chave do site - desde simples consultas DOM até interceptação de chamadas de renderização JavaScript.
Onde ficam as chaves do site da catraca
As chaves do site da catraca aparecem em três lugares:
- O atributo
data-sitekeyem elementos.cf-turnstile - A chamada JavaScript
turnstile.render() - URL do iframe
srcda catraca
Método 1: atributo DOM
// Browser console
document.querySelectorAll('.cf-turnstile').forEach((el, i) => {
console.log(`Turnstile ${i}:`, {
sitekey: el.getAttribute('data-sitekey'),
action: el.getAttribute('data-action'),
cData: el.getAttribute('data-cdata'),
theme: el.getAttribute('data-theme'),
});
});
Python (HTML estático)
import re
import requests
html = requests.get("https://staging.example.com/qa-login").text
matches = re.findall(
r'class=["\'][^"\']*cf-turnstile[^"\']*["\'][^>]*data-sitekey=["\']([^"\']+)',
html
)
for sk in matches:
print(f"Sitekey: {sk}")
Python (Selênio)
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://staging.example.com/qa-login")
widgets = driver.find_elements(By.CSS_SELECTOR, ".cf-turnstile")
for w in widgets:
sitekey = w.get_attribute("data-sitekey")
action = w.get_attribute("data-action")
print(f"Sitekey: {sitekey}, Action: {action}")
Método 2: chamada de renderização JavaScript
Alguns sites renderizam o Turnstile programaticamente:
turnstile.render('#captcha-container', {
sitekey: '0x4AAAAAAAB...',
callback: function(token) {
document.getElementById('cf-token').value = token;
},
});
Extrair da fonte da página:
# Find turnstile.render calls
render_match = re.search(
r'turnstile\.render\s*\([^,]*,\s*\{([^}]+)\}',
html
)
if render_match:
config = render_match.group(1)
sk = re.search(r'sitekey\s*:\s*["\']([^"\']+)', config)
if sk:
print(f"Sitekey from render: {sk.group(1)}")
Interceptação de Puppeteer
// Intercept turnstile.render before page loads
await page.evaluateOnNewDocument(() => {
window.__turnstileParams = [];
const origRender = window.turnstile?.render;
Object.defineProperty(window, 'turnstile', {
set(val) {
this._turnstile = val;
const orig = val.render;
val.render = function(container, params) {
window.__turnstileParams.push(params);
console.log('Turnstile render:', JSON.stringify(params));
return orig.apply(this, arguments);
};
},
get() { return this._turnstile; }
});
});
await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });
const params = await page.evaluate(() => window.__turnstileParams);
console.log('Captured Turnstile params:', params);
Método 3: Iframe src
Torniquete renderiza um iframe. A chave do site está em seu src:
document.querySelectorAll('iframe').forEach(iframe => {
if (iframe.src.includes('challenges.cloudflare.com')) {
console.log('Turnstile iframe:', iframe.src);
const match = iframe.src.match(/sitekey=([A-Za-z0-9_-]+)/);
if (match) console.log('Sitekey:', match[1]);
}
});
Resolvendo Torniquete com CaptchaAI
Pitão
import requests
import time
API_KEY = "YOUR_API_KEY"
SITEKEY = "0x4AAAAAAAB..."
PAGE_URL = "https://staging.example.com/qa-login"
# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": SITEKEY,
"pageurl": PAGE_URL,
"json": "1",
}).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
# Poll
for _ in range(24):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": "1"
}).json()
if result["status"] == 1:
token = result["request"]
print(f"Turnstile token: {token[:50]}...")
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
JavaScript
const axios = require('axios');
const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'turnstile',
sitekey: '0x4AAAAAAAB...',
pageurl: 'https://staging.example.com/qa-login',
json: 1,
}
});
const taskId = submit.data.request;
// Poll for result
let token = null;
for (let i = 0; i < 24; i++) {
await new Promise(r => setTimeout(r, 5000));
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (poll.data.status === 1) {
token = poll.data.request;
break;
}
}
console.log(`Token: ${token.substring(0, 50)}...`);
envio controlado ao endpoint QA
Turnstile armazena seu token em uma entrada oculta chamada cf-turnstile-response:
# Selenium
driver.execute_script("""
const input = document.querySelector('input[name="cf-turnstile-response"]');
if (input) input.value = arguments[0];
// Also set in the Turnstile widget's callback
const widget = document.querySelector('.cf-turnstile');
const callbackName = widget?.getAttribute('data-callback');
if (callbackName && typeof window[callbackName] === 'function') {
window[callbackName](arguments[0]);
}
""", token)
Solução de problemas
| Problema | Causa | Correção |
|---|---|---|
Nenhum elemento .cf-turnstile encontrado |
Renderizado dinamicamente | Aguarde o carregamento da página ou use MutationObserver |
| Chave do site vazia | Definido via API JavaScript | Procure por turnstile.render em scripts |
| Token rejeitado | Chave do site ou URL da página incorreto | Verifique novamente se ambos os valores correspondem ao site de destino |
Parâmetro method errado |
Usando userrecaptcha para catraca |
Usar method=turnstile |
Perguntas frequentes
O Turnstile é mais difícil de resolver do que o reCAPTCHA?
Não. CaptchaAI lida com ambos. Cloudflare Turnstile normalmente resolve em 10 a 25 segundos, comparável ao reCAPTCHA v2.
O Turnstile tem um modo invisível?
O Turnstile possui modos "gerenciados" e "não interativos" que não mostram um widget visível. Os métodos de extração de sitekey funcionam da mesma forma.
Resolva CAPTCHAs Cloudflare Turnstile com CaptchaAI
Obtenha sua chave API emcaptchaai.com.
Guias relacionados
- Extraindo parâmetros reCAPTCHA da origem da página
- Detecção CAPTCHA do console do navegador
- Cloudflare Turnstile vs hCaptcha vs reCAPTCHA