Sebagian besar kegagalan Cloudflare Turnstile tidak terjadi secara acak. Error tersebut terbagi dalam tiga kategori: error tahap submit (pengiriman ke API ditolak), error tahap hasil (polling gagal atau timeout), dan kegagalan validasi halaman target (API mengembalikan token valid tapi halaman masih menolaknya).
Tiga masalah khusus Turnstile yang paling sering terjadi:
- URL halaman tidak tepat — terutama pada halaman challenge Cloudflare, konteksnya lebih ketat
- Sitekey salah — diambil dari elemen yang salah atau instance widget yang berbeda
- Token diterapkan melalui jalur yang salah — halaman mengharapkan
cf-turnstile-response, callback, atau keduanya
CaptchaAI solve Turnstile dengan tingkat keberhasilan 100% dalam waktu kurang dari 10 detik. Saat integrasi Anda gagal, masalahnya hampir selalu pada parameter yang Anda kirim atau cara Anda menerapkan token yang dikembalikan.
Titik Kegagalan Khusus Turnstile
Sebelum mendalami kode error, pahami tiga hal yang membuat Turnstile berbeda dari jenis CAPTCHA lain:
1. URL Halaman yang Tepat Lebih Penting
Token Turnstile terikat erat dengan konteks halaman. Pada halaman challenge Cloudflare (layar verifikasi full-page), menggunakan URL yang salah — bahkan path yang sedikit berbeda — akan menyebabkan token ditolak.
2. Dua Jalur Aplikasi Token
Token yang dikembalikan dapat diterapkan dua cara, dan menggunakan yang salah akan gagal secara diam-diam:
| Metode | Kapan Digunakan |
|---|---|
Hidden field — masukkan ke cf-turnstile-response (dan terkadang g-recaptcha-response) |
Saat halaman menggunakan form standar dengan hidden input |
Fungsi callback — memanggil fungsi yang didefinisikan dalam turnstile.render() atau data-callback |
Saat halaman menggunakan validasi terprogram, bukan form |
3. Token Hanya Sekali Pakai
Token Turnstile hanya dapat diverifikasi satu kali. Jika otomasi Anda secara tidak sengaja mengirimkannya dua kali, atau ada race condition, upaya kedua akan gagal.
Error Tahap Submit
Ini terjadi saat mengirimkan task ke https://ocr.captchaai.com/in.php.
ERROR_WRONG_USER_KEY
Penyebab: Format kunci API salah (harus 32 karakter).
Perbaikan: Verifikasi kunci dari captchaai.com/api.php.
ERROR_KEY_DOES_NOT_EXIST
Penyebab: Kunci diformat dengan benar tapi tidak tertaut ke akun aktif.
Perbaikan: Periksa dashboard Anda. Pastikan akun aktif dan kuncinya benar.
ERROR_ZERO_BALANCE
Penyebab: Tidak ada thread gratis di paket Anda.
Perbaikan: Tunggu thread dikosongkan, kurangi concurrency, atau upgrade paket.
ERROR_PAGEURL
Penyebab: Parameter pageurl tidak ada.
Perbaikan: Tambahkan URL lengkap — protokol, domain, dan path:
pageurl=https://staging.example.com/qa-login
ERROR_BAD_PARAMETERS
Penyebab: Parameter yang diperlukan tidak ada atau formatnya salah. Untuk Turnstile, parameter yang wajib:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
key |
String | Ya | Kunci API CaptchaAI Anda |
method |
String | Ya | Harus turnstile |
sitekey |
String | Ya | Sitekey widget Turnstile |
pageurl |
String | Ya | URL halaman lengkap |
Opsional tapi berguna:
| Parameter | Tipe | Deskripsi |
|---|---|---|
action |
String | Nilai data-action atau parameter action dari turnstile.render() |
proxy |
String | Format: login:password@IP:PORT |
proxytype |
String | HTTP, HTTPS, SOCKS4, SOCKS5 |
Perbaikan: Pastikan semua field wajib ada dan diketik dengan benar.
Respons HTML atau 500/502
Penyebab: Error server sementara.
Perbaikan: Tunggu 5–10 detik dan coba lagi.
Cara Menemukan Sitekey Turnstile
Sitekey adalah parameter yang paling sering salah. Di sinilah cara menemukannya:
Opsi 1 — atribut data-sitekey:
<div class="cf-turnstile" data-sitekey="0x4AAAAAAAB1example"></div>
Opsi 2 — panggilan turnstile.render():
turnstile.render('#captcha-container', {
sitekey: '0x4AAAAAAAB1example',
callback: function(token) {
document.getElementById('cf-turnstile-response').value = token;
}
});
Opsi 3 — mencegat panggilan render (lanjutan):
Jika sitekey dimuat secara dinamis, Anda dapat mendefinisikan ulang turnstile.render sebelum widget diinisialisasi untuk menangkap parameter:
// Inject ini sebelum skrip Turnstile dimuat
const originalRender = window.turnstile.render;
window.turnstile.render = function(container, params) {
console.log('Sitekey:', params.sitekey);
console.log('Action:', params.action);
return originalRender.call(this, container, params);
};
Error Tahap Hasil
Ini terjadi saat polling https://ocr.captchaai.com/res.php.
CAPCHA_NOT_READY
Bukan error. Solving masih dalam proses. Solve Turnstile di CaptchaAI biasanya butuh kurang dari 10 detik.
Perbaikan: Tunggu 5 detik dan poll lagi.
ERROR_WRONG_ID_FORMAT
Penyebab: ID captcha mengandung karakter non-numerik.
Perbaikan: Gunakan ID persis yang dikembalikan oleh in.php, tidak diubah.
ERROR_WRONG_CAPTCHA_ID
Penyebab: ID tidak cocok dengan task yang disubmit.
Perbaikan: Pastikan Anda polling ID yang benar dari respons submit.
ERROR_EMPTY_ACTION
Penyebab: Parameter action tidak ada dalam request polling Anda.
Perbaikan: Selalu sertakan action=get:
https://ocr.captchaai.com/res.php?key=YOUR_KEY&action=get&id=CAPTCHA_ID&json=1
Catatan: Untuk Turnstile, selalu gunakan
json=1dalam request polling. Respons JSON mungkin menyertakanuser_agentsolver, yang diperlukan beberapa halaman yang dilindungi Cloudflare agar validasi token berhasil.
ERROR_CAPTCHA_UNSOLVABLE
Penyebab: Solving gagal — mungkin sitekey salah atau konfigurasi halaman tidak didukung.
Perbaikan: Verifikasi sitekey, refresh request, dan coba lagi.
ERROR_INTERNAL_SERVER_ERROR
Penyebab: Masalah sisi server.
Perbaikan: Tunggu 10 detik dan coba lagi.
Kegagalan Validasi Halaman Target
Ini yang paling sulit di-debug karena API berhasil mengembalikan token, tapi halaman target menolaknya.
Kegagalan 1: Token Dimasukkan ke Field yang Salah
Gejala: Form disubmit tapi halaman menampilkan error validasi atau refresh.
Halaman Turnstile dapat mengharapkan token di berbagai field:
cf-turnstile-response— hidden input Turnstile utamag-recaptcha-response— beberapa halaman menggunakan ini sebagai fallback
Perbaikan: Periksa form halaman untuk kedua field. Dalam otomasi browser:
# Selenium — inject into both fields for safety
driver.execute_script("""
var cfField = document.querySelector('[name="cf-turnstile-response"]');
var gField = document.querySelector('[name="g-recaptcha-response"]');
if (cfField) cfField.value = arguments[0];
if (gField) gField.value = arguments[0];
""", token)
Kegagalan 2: Callback Tidak Terpicu
Gejala: Token ada di field, namun form masih memblokir pengiriman.
Penyebab: Halaman menggunakan fungsi callback, bukan (atau sebagai tambahan) hidden field. Callback menangani logika tambahan seperti mengaktifkan tombol submit atau mengirim AJAX request.
Perbaikan: Temukan dan panggil callback:
// Cek atribut data-callback
const callbackName = document.querySelector('.cf-turnstile').getAttribute('data-callback');
if (callbackName && window[callbackName]) {
window[callbackName](token);
}
// Atau jika diteruskan di turnstile.render()
// Anda mungkin perlu intercept panggilan render untuk menangkapnya
Kegagalan 3: Konteks Halaman yang Salah
Gejala: Token ditolak meskipun sitekey benar dan solve baru.
Penyebab: pageurl yang digunakan dalam API request tidak cocok dengan konteks halaman sebenarnya. Ini umum terjadi pada:
- Halaman challenge Cloudflare — URL mungkin menyertakan query parameter atau path yang penting
- Single-page application — URL yang terlihat mungkin berbeda dari URL yang memuat widget Turnstile
Perbaikan: Gunakan tab Network di DevTools untuk menemukan URL persis tempat widget Turnstile dimuat. Gunakan URL itu sebagai pageurl.
Kegagalan 4: Token Digunakan Kembali
Gejala: Solving pertama berhasil, solving berikutnya gagal.
Penyebab: Token Turnstile hanya sekali pakai. Setelah diverifikasi server Cloudflare, token menjadi tidak valid.
Perbaikan: Minta solving baru untuk setiap submit form. Jangan cache atau gunakan kembali token.
Referensi Cepat Perbaikan Error
| Error / Gejala | Tahap | Kemungkinan Penyebab | Perbaikan |
|---|---|---|---|
ERROR_WRONG_USER_KEY |
Submit | Format kunci API salah | Verifikasi kunci 32 karakter |
ERROR_KEY_DOES_NOT_EXIST |
Submit | Kunci tidak valid | Periksa dashboard |
ERROR_ZERO_BALANCE |
Submit | Tidak ada thread gratis | Tunggu atau upgrade paket |
ERROR_PAGEURL |
Submit | pageurl tidak ada |
Tambahkan URL lengkap |
ERROR_BAD_PARAMETERS |
Submit | Sitekey, method, atau pageurl tidak ada | Verifikasi semua field wajib |
CAPCHA_NOT_READY |
Polling | Solving sedang berlangsung | Tunggu 5 detik, coba lagi |
ERROR_WRONG_ID_FORMAT |
Polling | ID captcha non-numerik | Gunakan ID persis dari in.php |
ERROR_WRONG_CAPTCHA_ID |
Polling | ID captcha tidak valid | Verifikasi ID submit |
ERROR_EMPTY_ACTION |
Polling | action=get tidak ada |
Tambahkan parameter action |
| Token ditolak halaman | Validasi | Field salah, callback tidak terpicu, URL salah | Periksa nama field, panggil callback, verifikasi pageurl yang tepat |
| Solving kedua gagal | Validasi | Token digunakan kembali | Minta token baru per submit |
Python: Solve Turnstile
import time
import requests
API_KEY = "YOUR_CAPTCHAAI_API_KEY"
SITEKEY = "0x4AAAAAAAB1example"
PAGE_URL = "https://staging.example.com/qa-login"
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"
def solve_turnstile(api_key, sitekey, pageurl):
"""Submit a Turnstile challenge and return the solved token."""
# Submit
submit_resp = requests.post(
SUBMIT_URL,
data={
"key": api_key,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": pageurl,
"json": 1,
},
timeout=30,
)
submit_resp.raise_for_status()
submit_data = submit_resp.json()
if submit_data.get("status") != 1:
raise RuntimeError(f"Submit failed: {submit_data}")
captcha_id = submit_data["request"]
print(f"Task created — captcha ID: {captcha_id}")
# Wait before first poll (Turnstile is fast — 10 seconds is usually enough)
time.sleep(10)
# Poll for result
for _ in range(60):
result_resp = requests.get(
RESULT_URL,
params={
"key": api_key,
"action": "get",
"id": captcha_id,
"json": 1,
},
timeout=30,
)
result_resp.raise_for_status()
result_data = result_resp.json()
if result_data.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result_data.get("status") == 1:
return result_data["request"]
raise RuntimeError(f"Polling error: {result_data}")
raise TimeoutError("Turnstile solve timed out")
# Usage
token = solve_turnstile(API_KEY, SITEKEY, PAGE_URL)
print(f"Solved token: {token[:80]}...")
# Inject into cf-turnstile-response and/or g-recaptcha-response
# Then submit the form
Node.js: Solve Turnstile
const API_KEY = "YOUR_CAPTCHAAI_API_KEY";
const SITEKEY = "0x4AAAAAAAB1example";
const PAGE_URL = "https://staging.example.com/qa-login";
const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function solveTurnstile(apiKey, sitekey, pageurl) {
// Submit
const submitResp = await fetch(SUBMIT_URL, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: apiKey,
method: "turnstile",
sitekey: sitekey,
pageurl: pageurl,
json: "1",
}),
});
const submitData = await submitResp.json();
if (submitData.status !== 1) {
throw new Error(`Submit failed: ${JSON.stringify(submitData)}`);
}
const captchaId = submitData.request;
console.log(`Task created — captcha ID: ${captchaId}`);
// Turnstile is fast — wait 10 seconds before first poll
await sleep(10_000);
// Poll for result
for (let i = 0; i < 60; i++) {
const resultResp = await fetch(
`${RESULT_URL}?${new URLSearchParams({
key: apiKey,
action: "get",
id: captchaId,
json: "1",
})}`
);
const resultData = await resultResp.json();
if (resultData.request === "CAPCHA_NOT_READY") {
await sleep(5_000);
continue;
}
if (resultData.status === 1) {
return resultData.request;
}
throw new Error(`Polling error: ${JSON.stringify(resultData)}`);
}
throw new Error("Turnstile solve timed out");
}
// Usage
solveTurnstile(API_KEY, SITEKEY, PAGE_URL)
.then((token) => {
console.log(`Solved token: ${token.slice(0, 80)}...`);
// Inject into cf-turnstile-response and/or g-recaptcha-response
})
.catch(console.error);
Turnstile vs Cloudflare Challenge: Mana yang Anda Hadapi?
| Sinyal | Turnstile | Cloudflare Challenge |
|---|---|---|
| Yang terlihat | Widget tertanam di halaman (checkbox atau invisible) | Layar verifikasi Cloudflare full-page |
| Yang dikembalikan CaptchaAI | Token untuk dimasukkan ke form | Cookie qa_validation_cookie |
| Metode API | turnstile |
cloudflare_challenge |
| Perlu proxy? | Opsional | Ya (wajib) |
Jika Anda menghadapi Cloudflare Challenge full-page (bukan widget tertanam), Anda memerlukan Cloudflare Challenge Solver yang mengembalikan cookie qa_validation_cookie dan memerlukan proxy.
Pertanyaan Umum
Mengapa Turnstile gagal meskipun request terlihat benar?
Tiga penyebab paling umum: (1) pageurl sedikit salah — terutama pada halaman challenge Cloudflare, (2) sitekey diambil dari elemen yang salah, atau (3) token dimasukkan ke field atau jalur callback yang salah.
Apa error Turnstile yang paling umum?
Menggunakan URL halaman yang salah. Token Turnstile terikat erat dengan konteks halaman — bahkan path berbeda atau query parameter yang hilang dapat menyebabkan penolakan.
Apa arti CAPCHA_NOT_READY?
Solving masih dalam proses. Tunggu 5 detik dan poll lagi. Solve Turnstile biasanya selesai dalam kurang dari 10 detik.
Apa yang harus dilakukan jika API mengembalikan token tapi halaman masih menolaknya?
- Pastikan
pageurlcocok dengan halaman tempat widget dimuat. - Periksa apakah halaman mengharapkan token di
cf-turnstile-response,g-recaptcha-response, atau keduanya. - Periksa apakah halaman menggunakan fungsi callback dan bukan (atau sebagai tambahan) hidden field.
- Pastikan token hanya digunakan sekali — token Turnstile hanya sekali pakai.
Apakah CaptchaAI mendukung proxy untuk Turnstile?
Ya. Tambahkan proxy dan proxytype ke request Anda. Proxy opsional untuk widget Turnstile standalone tapi direkomendasikan di halaman challenge Cloudflare.
Apa perbedaan Turnstile dan Cloudflare Challenge?
Turnstile adalah widget tertanam yang mengembalikan token. Cloudflare Challenge adalah verifikasi full-page yang mengembalikan cookie qa_validation_cookie. Keduanya menggunakan metode API dan pola integrasi berbeda, meskipun sama-sama produk Cloudflare.
Perbaiki Alur Turnstile Anda
Jika integrasi Turnstile Anda gagal:
- Verifikasi sitekey — Ekstrak dari
data-sitekeyatauturnstile.render() - Verifikasi pageurl — Gunakan URL yang tepat, termasuk protokol dan path
- Periksa jalur token — Apakah halaman menggunakan
cf-turnstile-response,g-recaptcha-response, atau callback? - Gunakan
json=1— Selalu gunakan respons JSON saat polling hasil Turnstile - Jangan gunakan ulang token — Minta solving baru untuk setiap submit
Mulai dengan CaptchaAI Turnstile Solver, verifikasi parameter Anda terhadap dokumentasi API, dan baca Cara Kerja Cloudflare Turnstile jika Anda perlu latar belakang mekanisme widget.
Log iterasi
| Iterasi | Fokus | Perubahan |
|---|---|---|
| Draf 1 | Struktur dan konten | Draf pemecahan masalah awal — 3 tahap kesalahan, tabel kesalahan untuk diperbaiki, FAQ |
| Draf 2 | Akurasi teknis | Kode kesalahan terverifikasi, parameter pintu putar, dan jalur token terhadap captchaai.com/api-docs. Menambahkan tabel parameter. Konfirmasi method=turnstile dan kedua kolom cf-turnstile-response / g-recaptcha-response. |
| Draf 3 | Kode dan kedalaman injeksi | Menambahkan contoh penyelesaian Python dan Node.js. Menambahkan metode ekstraksi kunci situs (3 pendekatan). Menambahkan kode injeksi Selenium untuk kedua bidang token. Menambahkan kode deteksi panggilan balik. |
| Draf 4 | Konten diferensiasi | Menambahkan tabel perbandingan Cloudflare Turnstile vs Cloudflare Challenge. Menambahkan catatan persyaratan json=1 untuk user_agent. Menambahkan teknik intersepsi render untuk kunci situs dinamis. |
| Draf 5 | Pemolesan QA terakhir | Diverifikasi semua kode kesalahan cocok dengan dokumen resmi. Menambahkan tabel referensi cepat. Intro yang diperketat. Menambahkan peringatan token sekali pakai. Tautan silang yang dikonfirmasi ke artikel cluster. Jawaban FAQ sudah siap skema. |
Ringkasan aset visual
Gambar pahlawan
- Teks alternatif: Pemecahan masalah pengembang kesalahan Cloudflare Turnstile — alur permintaan, pengaturan token, dan kegagalan validasi
- Harus ditampilkan: Alur pemecahan masalah teknis dengan tahapan kesalahan dan jalur perbaikan
- Nama file: cloudflare-turnstile-errors-troubleshooting-hero.png
Visual dalam artikel 1
- Penempatan: Setelah "Kesalahan tahap hasil"
- Jenis: Pohon keputusan
- Teks alternatif: Pohon keputusan untuk kegagalan Cloudflare Turnstile — kesalahan permintaan vs kesalahan jajak pendapat vs penolakan halaman
- Nama file: cloudflare-turnstile-error-decision-tree.png
Visual dalam artikel 2
- Penempatan: Setelah "Kegagalan validasi halaman target"
- Jenis: Diagram penyebab dan perbaikan
- Teks alternatif: Diagram yang menunjukkan alasan token Cloudflare Turnstile ditolak dan perbaikan untuk setiap penyebabnya
- Nama file: cloudflare-turnstile-validation-causes-fixes.png
Artikel Terkait
- Cloudflare Challenge Vs Mendeteksi Cloudflare Turnstile
- Perbandingan Geetest Vs Cloudflare Turnstile
- Cloudflare Turnstile 403 Setelah Perbaikan Token