Pemecahan Masalah

Cloudflare Turnstile — Error dan Pemecahan Masalah

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:

  1. URL halaman tidak tepat — terutama pada halaman challenge Cloudflare, konteksnya lebih ketat
  2. Sitekey salah — diambil dari elemen yang salah atau instance widget yang berbeda
  3. 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=1 dalam request polling. Respons JSON mungkin menyertakan user_agent solver, 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 utama
  • g-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?

  1. Pastikan pageurl cocok dengan halaman tempat widget dimuat.
  2. Periksa apakah halaman mengharapkan token di cf-turnstile-response, g-recaptcha-response, atau keduanya.
  3. Periksa apakah halaman menggunakan fungsi callback dan bukan (atau sebagai tambahan) hidden field.
  4. 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:

  1. Verifikasi sitekey — Ekstrak dari data-sitekey atau turnstile.render()
  2. Verifikasi pageurl — Gunakan URL yang tepat, termasuk protokol dan path
  3. Periksa jalur token — Apakah halaman menggunakan cf-turnstile-response, g-recaptcha-response, atau callback?
  4. Gunakan json=1 — Selalu gunakan respons JSON saat polling hasil Turnstile
  5. 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

Komentar dinonaktifkan untuk artikel ini.