Cloudflare Turnstile adalah alternatif CAPTCHA yang tumbuh paling cepat. Untuk solve dengan CaptchaAI, Anda perlu sitekey dan URL halaman. Panduan ini mencakup semua cara menemukan sitekey — dari query DOM sederhana hingga intercept panggilan JavaScript render.
Di Mana Sitekey Turnstile Berada
Sitekey Turnstile muncul di tiga tempat:
- Atribut
data-sitekeypada elemen.cf-turnstile - Panggilan JavaScript
turnstile.render() - URL
srciframe Turnstile
Metode 1: Atribut 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 Statis)
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 (Selenium)
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}")
Metode 2: Panggilan Render JavaScript
Beberapa situs merender Turnstile secara terprogram:
turnstile.render('#captcha-container', {
sitekey: '0x4AAAAAAAB...',
callback: function(token) {
document.getElementById('cf-token').value = token;
},
});
Ekstrak dari sumber halaman:
# 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)}")
Intercept 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);
Metode 3: Iframe src
Turnstile merender iframe. Sitekey ada di src-nya:
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]);
}
});
Solve Turnstile dengan CaptchaAI
Python
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)}...`);
pengaturan token
Turnstile menyimpan token di hidden input bernama 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)
Pemecahan Masalah
| Masalah | Penyebab | Solusi |
|---|---|---|
Tidak ditemukan elemen .cf-turnstile |
Dirender secara dinamis | Tunggu pemuatan halaman atau gunakan MutationObserver |
| Sitekey kosong | Diatur melalui JavaScript API | Cari turnstile.render dalam skrip |
| Token ditolak | Sitekey atau URL halaman salah | Periksa kembali kedua nilai cocok dengan situs target |
Parameter method salah |
Menggunakan userrecaptcha untuk Turnstile |
Gunakan method=turnstile |
Pertanyaan Umum
Apakah Turnstile lebih sulit di-solve daripada reCAPTCHA?
Tidak. CaptchaAI menangani keduanya. Turnstile biasanya selesai dalam 10–25 detik, sebanding dengan reCAPTCHA v2.
Apakah Turnstile memiliki mode invisible?
Turnstile memiliki mode "managed" dan "non-interactive" yang tidak menampilkan widget yang terlihat. Metode ekstraksi sitekey bekerja sama.
Solve CAPTCHA Cloudflare Turnstile dengan CaptchaAI
Dapatkan kunci API Anda di captchaai.com.
Panduan Terkait
- Mengekstrak Parameter reCAPTCHA dari Source Halaman
- Cloudflare Turnstile: Deteksi Implementasi
- Cara Solve Cloudflare Turnstile dengan API