Anda mengirimkan CAPTCHA Turnstile ke CaptchaAI, mendapatkan token kembali, tetapi situs target menolaknya. Token secara teknis telah terpecahkan — masalahnya adalah bagaimana atau kapan Anda menggunakannya. Panduan ini mencakup setiap alasan kegagalan token Turnstile setelah penyelesaian.
Gejala
| Apa yang kamu lihat | Kemungkinan penyebabnya |
|---|---|
| Situs mengembalikan 403 setelah mengirimkan token | Token expiry sebelum diserahkan |
| submit formulir gagal secara diam-diam | Nama bidang untuk pengaturan token salah |
| Token diterima tetapi tindakan diblokir | Ketidakcocokan sitekey — menyelesaikan widget yang salah |
| Berfungsi sekali, lalu gagal | Token sudah digunakan (sekali pakai) |
| Berfungsi di browser, gagal dalam skrip | Cookie atau header tidak ada |
Penyebab 1: Token expiry
Token Turnstile akan expiry dengan cepat — biasanya dalam waktu 300 detik (5 menit). Jika kode Anda memakan waktu terlalu lama antara menerima token dan mengirimkannya, token tersebut akan mati.
Perbaikan: Kirimkan token segera setelah menerimanya.
import requests
import time
API_KEY = "YOUR_API_KEY"
# Submit Turnstile task
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x4AAAAAAADnPIDROz1234",
"pageurl": "https://staging.example.com/qa-login",
"json": 1
}).json()
task_id = submit["request"]
time.sleep(10)
# Poll for result
for _ in range(24):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
# USE TOKEN IMMEDIATELY — do not delay
response = requests.post("https://staging.example.com/qa-login", data={
"username": "user",
"password": "pass",
"cf-turnstile-response": token
})
break
time.sleep(5)
Penyebab 2: sitekey salah
Setiap widget Turnstile memiliki sitekey unik. Jika halaman memiliki beberapa widget atau Anda menyalin kunci yang salah, token akan valid tetapi ditolak.
Cara menemukan sitekey yang benar:
// In browser console on the target page
document.querySelectorAll('[data-sitekey]').forEach(el => {
console.log('Sitekey:', el.getAttribute('data-sitekey'));
console.log('Element:', el);
});
Jika ada beberapa sitekey, gunakan salah satu yang terlampir pada formulir yang Anda kirimkan.
Penyebab 3: Nama bidang salah
Turnstile mengharapkan token di cf-turnstile-response, bukan g-recaptcha-response.
# WRONG — this is for reCAPTCHA
data = {"g-recaptcha-response": token}
# CORRECT — this is for Turnstile
data = {"cf-turnstile-response": token}
Beberapa situs menggunakan nama bidang khusus. Periksa formulir untuk menemukan bidang sebenarnya:
// Check what field the Turnstile widget populates
document.querySelector('[name*="turnstile"], [name*="cf-"]')
Penyebab 4: Token sudah digunakan
Token Turnstile hanya sekali pakai. Jika kode Anda mencoba ulang permintaan dengan token yang sama, upaya kedua akan gagal.
Perbaikan: Selesaikan CAPTCHA baru untuk setiap upaya submit.
Penyebab 5: Cookie atau konteks sesi tidak ada
Cloudflare dapat memvalidasi token terhadap cookie sesi. Jika Anda memecahkan CAPTCHA dalam satu sesi dan mengirimkannya di sesi lain, kemungkinan besar terjadi penolakan.
# Use the SAME session for page load and token submission
session = requests.Session()
# Load the page first to establish cookies
session.get("https://staging.example.com/qa-login")
# Then solve and submit using the same session
token = solve_turnstile(sitekey, pageurl)
session.post("https://staging.example.com/qa-login", data={
"cf-turnstile-response": token
})
Penyebab 6: Ketidakcocokan tindakan atau cData
Beberapa implementasi Turnstile menyertakan parameter action atau cData yang terikat pada token. Jika situs mengharapkan ini, Anda harus melewatinya saat menyelesaikannya.
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x4AAAAAAADnPIDROz1234",
"pageurl": "https://staging.example.com/qa-login",
"action": "login", # If required by the site
"data": "custom_cdata_value", # If required by the site
"json": 1
}).json()
Pohon keputusan
Token solved but rejected
↓
Used within 5 minutes? → No → Solve again, submit immediately
↓ Yes
Correct sitekey? → No → Find the correct sitekey from the page
↓ Yes
Using cf-turnstile-response field? → No → Change field name
↓ Yes
Same session for page load + submit? → No → Use session persistence
↓ Yes
Token used only once? → No → Solve a new token per submission
↓ Yes
Site requires action/cData? → Check page source, add to API call
Pertanyaan Umum
Berapa lama token Turnstile bertahan?
Biasanya 300 detik (5 menit). Beberapa implementasi menetapkan masa berlaku yang lebih pendek. Kirimkan token dalam beberapa detik setelah menerimanya.
Apakah Turnstile sama dengan Cloudflare Challenge?
Tidak. Turnstile adalah widget yang tertanam (seperti reCAPTCHA). Cloudflare Challenge adalah interstisial satu halaman penuh. Mereka menggunakan metode CaptchaAI yang berbeda: turnstile vs cloudflare_challenge.
Mengapa token saya berfungsi di Postman tetapi tidak di skrip saya?
Tukang pos mungkin mengirimkan header atau cookie yang berbeda. Cocokkan header skrip dan status sesi Anda dengan apa yang dikirimkan browser.
Selesaikan CAPTCHA Turnstile di CaptchaAI
Dapatkan penyelesaian Turnstile yang andal dicaptchaai.com.
Panduan terkait
- Cara Mengatasi Cloudflare Turnstile Menggunakan API
- Token expiry Sebelum submit
- Cloudflare Turnstile 403 Setelah Perbaikan Token
- Pengaturan timeout Kustom berdasarkan Jenis CAPTCHA