Troubleshooting

Cloudflare Challenge vs Turnstile: Cara Mendeteksi

Halaman abu-abu bertuliskan "Checking your browser" dan kotak centang kecil di form login sama-sama berasal dari Cloudflare, tapi keduanya butuh method CaptchaAI yang sama sekali berbeda. Kirim turnstile ke halaman full-page challenge — atau sebaliknya — dan hasilnya selalu ERROR_CAPTCHA_UNSOLVABLE, bukan sekadar solve yang lambat. Sebelum menulis satu baris kode deteksi pun, ada satu pertanyaan yang langsung menjawab jenis proteksi mana yang sedang Anda hadapi.


Satu Pertanyaan Penentu Jenis Proteksi

Lupakan dulu tanda HTML atau kode Python. Jawab satu hal ini: halaman yang Anda buka menampilkan konten aslinya, atau tidak?

  • Kalau tidak — layar kosong atau spinner dengan pesan "Checking your browser" yang memblokir seluruh halaman — itu Cloudflare Challenge, interstisial full-page yang harus lolos verifikasi dulu sebelum konten asli tampil.
  • Kalau ya — halaman terlihat normal sepenuhnya, hanya ada kotak centang kecil atau widget tak terlihat di dalam form — itu Cloudflare Turnstile, komponen yang tertanam di halaman yang sudah selesai dimuat.

Jawaban itu langsung menentukan tiga hal: method API yang dikirim (cloudflare_challenge atau turnstile), apakah proxy wajib disertakan, dan format hasil yang akan dikembalikan CaptchaAI ke sistem Anda.


Dampak Salah Tebak: Thread Terbuang, Antrean Macet

Sebelum masuk ke cara identifikasi, penting untuk paham kenapa ini bukan sekadar soal kerapian kode. Ini daftar kesalahan yang paling sering muncul di log CaptchaAI, dan cara memperbaikinya:

Kesalahan Akibat Perbaikan
Kirim turnstile untuk halaman Challenge ERROR_CAPTCHA_UNSOLVABLE Ganti ke cloudflare_challenge
Kirim cloudflare_challenge untuk Turnstile Format respons salah Ganti ke turnstile
Tidak menyertakan proxy untuk Challenge ERROR_PROXY_NOT_AUTHORIZED Tambahkan proxy — wajib untuk Challenge
Tidak menyertakan sitekey untuk Turnstile ERROR_BAD_PARAMETERS Ambil sitekey dari HTML halaman

Task yang gagal karena salah method tetap menahan satu thread sampai timeout, bukan langsung dilepas untuk task berikutnya.

Di paket BASIC ($15/bulan, 5 thread), beberapa kali salah tebak saat scraping paralel sudah cukup membuat antrean macet total. Tim scraping dan price-monitoring Indonesia yang menjalankan worker dari region seperti AWS ap-southeast-3 (Jakarta) atau ap-southeast-1 (Singapura) biasanya menaruh pengecekan jenis proteksi ini sebagai langkah pertama di pipeline, bukan sesudah task gagal dan kuota thread sudah terpakai percuma.


Mengenali Cloudflare Challenge (Full-Page Interstitial)

Cloudflare Challenge memblokir akses ke konten sampai verifikasi selesai — Anda melihatnya sebelum halaman asli sempat dimuat sama sekali, bukan sesuatu yang muncul di dalam halaman, melainkan menggantikan seluruh halaman untuk sementara. Di browser, tandanya: pesan "Checking your browser before accessing...", loading spinner khas Cloudflare, judul tab berisi "Just a moment...", dan URL yang tidak berubah walau isi halamannya jelas bukan konten situs.

Berikut penandanya di HTML:

<!-- Cloudflare Challenge page indicators -->
<title>Just a moment...</title>
<div id="challenge-running">...</div>
<div class="cf-browser-verification">...</div>

Cek otomatis lewat request HTTP, tanpa perlu membuka browser sama sekali:

import requests

resp = requests.get("https://example.com")

is_cf_challenge = (
    resp.status_code == 403 and
    "Just a moment" in resp.text or
    "cf-browser-verification" in resp.text or
    "challenge-platform" in resp.text
)

if is_cf_challenge:
    print("Cloudflare Challenge detected — use method: cloudflare_challenge")

Mengenali Cloudflare Turnstile (Widget Tertanam di Form)

Turnstile bukan halaman terpisah — ia widget yang muncul di dalam halaman yang sudah dimuat sepenuhnya, persis seperti reCAPTCHA yang ditempatkan di dalam form. Anda tidak akan pernah melihat Turnstile menutupi seluruh layar; konten lain di halaman tetap terlihat dan bisa diakses normal, dan widgetnya sendiri bertuliskan "Verify you are human".

Tanda di HTML:

<!-- Turnstile widget indicators -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAADnPIDROz1234"></div>

<!-- Or loaded via JavaScript -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js"></script>

Cek otomatis lewat request HTTP:

import requests

resp = requests.get("https://staging.example.com/qa-login")

is_turnstile = (
    "cf-turnstile" in resp.text or
    "challenges.cloudflare.com/turnstile" in resp.text
)

if is_turnstile:
    # Extract sitekey
    if 'data-sitekey="' in resp.text:
        start = resp.text.index('data-sitekey="') + 14
        end = resp.text.index('"', start)
        sitekey = resp.text[start:end]
        print(f"Turnstile detected — sitekey: {sitekey}")
        print("Use method: turnstile")

Ringkasan: Tabel Perbandingan Cepat

Setelah mengenali ciri masing-masing, ini rangkumannya untuk referensi cepat saat debugging:

Aspek Cloudflare Challenge Cloudflare Turnstile
Bentuk Interstisial full-page Widget yang tertanam di form
Tampilan Memblokir seluruh halaman, pesan "Checking your browser" Kotak centang kecil atau widget tak terlihat
Method CaptchaAI cloudflare_challenge turnstile
Hasil yang dikembalikan Cookie qa_validation_cookie String token
Proxy Wajib Direkomendasikan
User-Agent Wajib Tidak wajib

Deteksi Otomatis: Satu Fungsi untuk Kedua Jenis

Daripada menjalankan dua pengecekan terpisah setiap request, gabungkan logikanya jadi satu fungsi yang langsung menentukan method mana yang harus dipakai sebelum task dikirim ke CaptchaAI:

def detect_cloudflare_type(url):
    """Detect which Cloudflare protection a URL uses."""
    resp = requests.get(url, allow_redirects=True)

    # Check for full-page Challenge
    if resp.status_code in [403, 503]:
        if any(marker in resp.text for marker in [
            "Just a moment",
            "cf-browser-verification",
            "challenge-platform",
            "challenge-running"
        ]):
            return {"type": "cloudflare_challenge", "method": "cloudflare_challenge"}

    # Check for embedded Turnstile
    if "cf-turnstile" in resp.text or "challenges.cloudflare.com/turnstile" in resp.text:
        sitekey = None
        if 'data-sitekey="' in resp.text:
            start = resp.text.index('data-sitekey="') + 14
            end = resp.text.index('"', start)
            sitekey = resp.text[start:end]
        return {"type": "turnstile", "method": "turnstile", "sitekey": sitekey}

    return {"type": "none", "method": None}


# Usage
result = detect_cloudflare_type("https://example.com")
print(f"Protection: {result['type']}")
print(f"CaptchaAI method: {result['method']}")

Cara Solve Masing-masing via API CaptchaAI

Setelah jenisnya diketahui, payload API-nya berbeda satu sama lain — jangan sampai tertukar, karena masing-masing method mengharapkan parameter yang berbeda pula. Untuk Cloudflare Challenge, proxy dan User-Agent wajib disertakan:

data = {
    "key": "YOUR_API_KEY",
    "method": "cloudflare_challenge",
    "pageurl": "https://example.com",
    "proxy": "host:port:user:pass",   # WAJIB
    "proxytype": "HTTP",               # WAJIB
    "userAgent": "Mozilla/5.0 ...",    # WAJIB
    "json": 1
}
# Mengembalikan cookie qa_validation_cookie — set ke sesi Anda

Untuk Cloudflare Turnstile, cukup kirim sitekey dan pageurl — tidak perlu proxy maupun User-Agent:

data = {
    "key": "YOUR_API_KEY",
    "method": "turnstile",
    "sitekey": "0x4AAAAAAADnPIDROz1234",
    "pageurl": "https://staging.example.com/qa-login",
    "json": 1
}
# Mengembalikan token — inject ke field cf-turnstile-response

Pertanyaan yang Sering Ditanyakan

Apakah salah pilih method bikin thread saya boros?

Ya. Task yang dikirim dengan method salah tetap menahan satu thread sampai gagal atau timeout, bukan langsung dilepas untuk task lain.

Kalau volume scraping Anda tinggi, cek dulu jenis proteksinya sebelum kirim task — jauh lebih murah daripada retry berkali-kali, apalagi kalau paralelisasi Anda sudah tinggi.

Turnstile vs Challenge, mana yang lebih cepat diselesaikan?

Turnstile biasanya selesai dalam waktu di bawah 10 detik, sementara Challenge di bawah 15 detik — keduanya dengan tingkat keberhasilan tinggi pada tipe yang didukung CaptchaAI.

Bisakah satu situs memakai Cloudflare Challenge dan Turnstile sekaligus?

Bisa. Situs yang sama bisa menampilkan Challenge saat akses pertama, lalu Turnstile di dalam form login-nya.

Anda perlu menyelesaikan keduanya secara berurutan, bukan salah satu saja — deteksi Challenge dulu, baru deteksi Turnstile setelah halaman login termuat.

Deteksi saya mengembalikan "none" tapi saya yakin situs ini pakai Cloudflare — kenapa?

Sebagian proteksi Cloudflare hanya aktif untuk aksi tertentu, seperti POST request atau panggilan API, atau untuk User-Agent tertentu. Coba akses ulang dengan User-Agent yang terlihat seperti bot untuk memicu challenge-nya.

Apakah cara deteksi ini berlaku juga untuk reCAPTCHA atau GeeTest v3?

Konsepnya sama — cek tanda HTML dan status respons sebelum kirim task — tapi sitekey dan method API-nya berbeda per tipe. CaptchaAI mendukung reCAPTCHA v2/v3 dan GeeTest v3 dengan method masing-masing; dokumentasinya terpisah dari panduan ini.


Dapatkan API Key CaptchaAI

Setelah tahu jenis proteksinya, tinggal kirim task dengan method yang tepat sejak percobaan pertama. Satu akun CaptchaAI sudah mencakup:

  • Solve Cloudflare Challenge dan Turnstile dengan method dan payload yang tepat
  • Satu paket thread yang sama untuk semua tipe CAPTCHA yang didukung, tanpa biaya tambahan per jenis

Dapatkan API key CaptchaAI dan mulai solve dari percobaan pertama.


Panduan Lain yang Relevan

Kalau Anda sudah tahu jenis proteksinya, lanjutkan ke panduan solve lengkap per jenis, atau ke referensi error kalau masih menemui kendala:

Komentar dinonaktifkan untuk artikel ini.