Comparisons

Cloudflare Managed Challenge vs Interactive Challenge

Kalau Anda melihat status HTTP 503 tanpa CAPTCHA yang tampil sama sekali, itu tandanya situs sedang menjalankan Managed Challenge — sekitar 90% pengunjung lolos begitu saja tanpa berbuat apa-apa. Kalau yang muncul status 403 dengan kotak centang yang wajib diklik, itu Interactive Challenge, opsi lama Cloudflare yang selalu menampilkan CAPTCHA ke semua orang tanpa terkecuali.

Jawaban singkat: 503 tanpa widget terlihat → Managed Challenge, kemungkinan besar sudah lolos. 403 dengan CAPTCHA yang wajib diklik → Interactive Challenge, harus di-solve dulu.

Cloudflare menyediakan kedua aksi ini di aturan WAF, dan operator situs bebas memilih salah satunya. Bagi automasi Anda, pilihan itu langsung menentukan method CaptchaAI yang harus dikirim dan pola respons yang perlu ditangani.


Managed vs Interactive: Beda dalam Satu Tabel

Aspek Managed Challenge Interactive Challenge
Diperkenalkan 2021 Legacy (pra-2021)
Adaptif? Ya (Cloudflare memutuskan per pengunjung) Tidak (selalu interaktif)
Invisible pass mungkin? Ya (~90% pengunjung lolos tanpa tampilan) Tidak (selalu menampilkan CAPTCHA)
Tipe challenge yang digunakan Invisible JS → Turnstile → JS Challenge CAPTCHA selalu terlihat
Direkomendasikan Cloudflare? Ya (default untuk aturan baru) Tidak (dipertahankan untuk backward compatibility)
Gesekan pengguna Rendah (kebanyakan lolos tanpa melihat apa pun) Tinggi (selalu butuh interaksi)
Status HTTP 503 403
Method CaptchaAI turnstile atau cloudflare_challenge turnstile

Cara Kerja Managed Challenge (Modern)

Managed Challenge adalah aksi challenge yang direkomendasikan Cloudflare. Pendekatan ini memakai kerangka keputusan untuk menyajikan challenge yang paling tidak mengganggu:

Alur Keputusan

Aturan WAF memicu Managed Challenge
    ↓
Cloudflare mengevaluasi sinyal pengunjung:
  ├─ Kualitas browser sinyal browser
  ├─ Skor reputasi IP
  ├─ TLS sinyal browser (JA3/JA4)
  ├─ Riwayat request
  ├─ Sinyal perilaku
  └─ Kapabilitas perangkat
    ↓
Penilaian risiko → Level challenge dipilih:
  ├─ RISIKO RENDAH → Invisible pass (tidak ada UI terlihat)
  ├─ RISIKO SEDANG → Turnstile non-interaktif (background PoW)
  ├─ RISIKO TINGGI → Interactive Turnstile (checkbox/widget)
  └─ RISIKO SANGAT TINGGI → Halaman JavaScript challenge (tunggu 5 detik)
    ↓
Challenge selesai
    ↓
Cookie qa_validation_cookie diterbitkan

Contoh Output HTML

Halaman Managed Challenge menggunakan platform challenge Cloudflare:

<!-- Managed Challenge page (when visible) -->
<body>
    <div id="challenge-stage">
        <div id="challenge-body-text">
            Verifying you are human. This may take a few seconds.
        </div>

        <!-- Turnstile widget (when rendered) -->
        <div class="cf-turnstile"
             data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg">
        </div>
    </div>

    <!-- Challenge platform script -->
    <script src="/cdn-cgi/challenge-platform/h/g/orchestrate/managed/v1?ray=...">
    </script>
</body>

Yang Dialami Pengunjung

Ringkasan hasil akhir dari alur keputusan di atas:

  • Browser biasa, IP bagus (~90%) — tidak melihat apa pun, invisible pass.
  • Browser baru, IP netral (~5%) — spinner singkat lalu lanjut normal.
  • Sinyal mencurigakan (~4%) — checkbox Turnstile yang harus diklik.
  • Sinyal berisiko tinggi (~1%) — halaman penuh "Checking your browser..." selama beberapa detik.

Kenapa Perbedaannya Penting bagi Tim Automasi Indonesia

Salah tebak jenis challenge bukan cuma soal kerapian kode:

  • Task dengan method yang salah tetap menahan satu thread sampai timeout, bukan langsung dilepas untuk task berikutnya — pada paket BASIC ($15/bulan, 5 thread), beberapa kali salah tebak saat scraping paralel sudah cukup membuat antrean macet.
  • Situs yang bermigrasi dari Interactive ke Managed Challenge biasanya tidak mengumumkannya. Automasi Anda baru sadar setelah status code yang biasanya 403 tiba-tiba berubah jadi 503.
  • Tim scraping dan price-monitoring yang menjalankan worker paralel dari region seperti AWS ap-southeast-3 (Jakarta) atau ap-southeast-1 (Singapura) umumnya menaruh pemeriksaan status HTTP ini di baris pertama pipeline, sebelum task dikirim ke CaptchaAI — jauh lebih murah daripada retry berulang setelah task gagal.

Interactive Challenge: Opsi Lama yang Masih Aktif

Interactive Challenge selalu menampilkan CAPTCHA visual yang wajib diinteraksikan pengunjung. Tidak ada jalur invisible — setiap pengunjung melihat dan harus menyelesaikan challenge-nya sendiri.

Alur Interactive Challenge

Aturan WAF memicu Interactive Challenge
    ↓
Full-page CAPTCHA disajikan (HTTP 403)
    ↓
Pengunjung harus berinteraksi dengan widget CAPTCHA
    ↓
CAPTCHA diselesaikan
    ↓
Cookie qa_validation_cookie diterbitkan

Tampilan yang Dilihat Semua Pengunjung

Setiap pengunjung melihat challenge full-page dengan widget mirip Turnstile:

<!-- Interactive Challenge page -->
<body>
    <div id="challenge-running">
        <div class="main-wrapper">
            <h2>Please verify you are human</h2>

            <!-- Always-visible challenge widget -->
            <div class="challenge-widget">
                <!-- Checkbox + verification -->
            </div>
        </div>
    </div>
</body>

Kenapa Cloudflare Tidak Lagi Merekomendasikannya

  • Selalu terlihat — 100% pengunjung menghadapi challenge, tanpa pengecualian.
  • Gesekan lebih tinggi — setiap pengunjung wajib berinteraksi sebelum lanjut.
  • Bounce rate lebih tinggi — sebagian pengguna memilih pergi daripada menyelesaikannya.
  • Tidak ada adaptasi risiko — pengunjung yang track record-nya baik tetap kena challenge.
  • Masalah aksesibilitas — interaksi wajib menyulitkan sebagian pengguna.

Migrasi dari Interactive ke Managed Challenge

Cloudflare merekomendasikan migrasi dari Interactive Challenge ke Managed Challenge. Kalau situs yang Anda otomasi ikut bermigrasi, ini yang berubah di sisi automasi Anda:

  • Interactive → Managed: berpeluang mulai lolos invisible (~90% kemungkinan).
  • HTTP 403 → 503: perbarui pemeriksaan kode status di kode Anda.
  • Selalu terlihat → adaptif: widget mungkin tidak ada di HTML sama sekali.
  • Sitekey tetap sama: kode solve CaptchaAI tidak perlu diubah.
  • Output qa_validation_cookie sama: penanganan cookie tetap sama seperti sebelumnya.

Cara Mendeteksi Challenge yang Sedang Anda Hadapi

Sebelum mengirim task apa pun ke CaptchaAI, cek dulu jenis challenge-nya lewat status HTTP dan penanda di HTML. Fungsi berikut membaca kedua sinyal itu sekaligus dan langsung merekomendasikan method yang tepat:

import requests
import re

def identify_challenge_type(url):
    """Determine if a URL uses Managed or Interactive Challenge."""
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0.0.0",
        "Accept": "text/html,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
    }

    response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
    html = response.text
    status = response.status_code

    result = {
        "url": url,
        "status": status,
        "challenge_type": None,
        "cf_ray": response.headers.get("cf-ray", ""),
        "solve_method": None,
    }

    if status == 200:
        # Check for inline Turnstile widget (not a challenge page)
        if "cf-turnstile" in html:
            result["challenge_type"] = "turnstile_widget"
            result["solve_method"] = "turnstile"
        else:
            result["challenge_type"] = "none"
        return result

    if status == 503:
        # 503 indicates Managed Challenge or IUAM
        if "managed" in html or "challenge-platform" in html:
            result["challenge_type"] = "managed_challenge"
            result["solve_method"] = "turnstile"  # Managed renders as Turnstile
        elif "jschl" in html:
            result["challenge_type"] = "iuam_js_challenge"
            result["solve_method"] = "cloudflare_challenge"
        else:
            result["challenge_type"] = "unknown_503"
        return result

    if status == 403:
        if "challenge" in html.lower():
            result["challenge_type"] = "interactive_challenge"
            result["solve_method"] = "turnstile"
        else:
            result["challenge_type"] = "waf_block"
            result["solve_method"] = None  # Hard block, not solvable
        return result

    return result


# Usage
info = identify_challenge_type("https://protected-site.com/login")
print(f"Challenge: {info['challenge_type']}")
print(f"Solve with: {info['solve_method']}")

Tabel referensi sinyalnya:

Sinyal Managed Challenge Interactive Challenge IUAM WAF Block
Status HTTP 503 403 503 403
challenge-platform dalam HTML
Path managed dalam skrip
jschl dalam HTML
Selalu menampilkan widget
Invisible pass mungkin

Checklist Cepat Sebelum Kirim Task ke CaptchaAI

  • Periksa dulu apakah halaman menampilkan halaman challenge interstisial penuh, atau menyematkan widget di dalam alur aplikasi yang sudah termuat.
  • Cari penanda cf-chl, container Turnstile, dan hook callback sebelum memutuskan method mana yang dikirim.
  • Catat hasil deteksi bersama URL halaman dan identitas proxy yang dipakai, supaya perubahan pola target yang berulang cepat terlihat di log Anda.

Cara Solve Kedua Jenis Challenge dengan CaptchaAI

Solve Managed Challenge

Managed Challenge biasanya tampil sebagai widget Turnstile. Gunakan method turnstile CaptchaAI, dengan fallback ke cloudflare_challenge kalau tidak ada sitekey yang terdeteksi:

import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_managed_challenge(url, sitekey=None):
    """Solve Cloudflare Managed Challenge."""
    # If sitekey not provided, extract from page
    if not sitekey:
        import re
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                          "AppleWebKit/537.36 Chrome/120.0.0.0",
        }
        page = requests.get(url, headers=headers, timeout=15)
        match = re.search(
            r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', page.text
        )
        sitekey = match.group(1) if match else None

    if not sitekey:
        # No visible Turnstile — try cloudflare_challenge method
        return solve_js_challenge(url)

    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": url,
        "json": 1,
    })

    task_id = submit.json()["request"]

    for _ in range(60):
        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.get("status") == 1:
            return result["request"]

    raise TimeoutError("Solve timed out")


def solve_js_challenge(url):
    """Fallback to cloudflare_challenge method."""
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "cloudflare_challenge",
        "sitekey": "managed",
        "pageurl": url,
        "json": 1,
    })

    task_id = submit.json()["request"]

    for _ in range(60):
        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.get("status") == 1:
            return result["request"]

    raise TimeoutError("Solve timed out")

Solve Interactive Challenge

Interactive Challenge selalu menampilkan widget yang terlihat. Method-nya sama dengan Managed Challenge yang tampil — tetap turnstile:

def solve_interactive_challenge(url, sitekey):
    """Solve Cloudflare Interactive Challenge (legacy)."""
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": url,
        "json": 1,
    })

    task_id = submit.json()["request"]

    for _ in range(60):
        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.get("status") == 1:
            return result["request"]

    raise TimeoutError("Solve timed out")

Implementasi Node.js untuk Kedua Tipe

Satu fungsi yang bisa menangani kedua jenis sekaligus, tinggal ganti parameter type:

const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

async function solveCloudflareChallenge(url, type = "managed") {
  const method = type === "js_challenge" ? "cloudflare_challenge" : "turnstile";
  const sitekey =
    type === "js_challenge" ? "managed" : await extractSitekey(url);

  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: {
      key: API_KEY,
      method,
      sitekey: sitekey || "managed",
      pageurl: url,
      json: 1,
    },
  });

  const taskId = submit.data.request;

  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));

    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId, json: 1 },
    });

    if (result.data.status === 1) {
      return result.data.request;
    }
  }

  throw new Error("Solve timed out");
}

async function extractSitekey(url) {
  try {
    const response = await axios.get(url, {
      headers: { "User-Agent": "Mozilla/5.0 Chrome/120.0.0.0" },
      validateStatus: () => true,
    });
    const match = response.data.match(
      /data-sitekey=["']([0-9x][A-Za-z0-9_-]+)["']/
    );
    return match ? match[1] : null;
  } catch {
    return null;
  }
}

Troubleshooting: Masalah yang Sering Muncul

  • 503 tanpa widget yang terlihat — Managed Challenge lolos secara invisible. Tidak perlu tindakan apa pun, Anda sudah lolos.
  • 503 dengan "Checking your browser" — naik level ke JS challenge. Gunakan method cloudflare_challenge.
  • 403 dengan CAPTCHA terlihat — Interactive Challenge (legacy). Gunakan method turnstile.
  • 403 tanpa challenge — blok WAF, bukan challenge. Ganti IP atau pola request Anda.
  • Jenis challenge berubah-ubah secara acak — Managed Challenge beradaptasi dengan sinyal baru. Tangani Turnstile maupun JS challenge di kode Anda.
  • qa_validation_cookie dari satu jenis ditolak untuk jenis lain — alur challenge berbeda pada domain yang sama. Selesaikan challenge apa pun yang sedang disajikan.

Pertanyaan yang Sering Diajukan

Kenapa banyak situs sekarang mengembalikan 503, padahal dulu 403?

Karena mereka bermigrasi dari Interactive ke Managed Challenge — perubahan yang direkomendasikan Cloudflare tapi jarang diumumkan ke publik. Kalau automasi Anda tiba-tiba menerima 503 pada situs yang biasanya 403, itu tanda paling umum migrasi baru saja terjadi.

Apakah method turnstile otomatis menangani Managed Challenge yang naik level ke JS challenge?

Tidak otomatis. Kalau sitekey Turnstile tidak ditemukan di HTML, itu tandanya Managed Challenge sudah naik ke level JS challenge penuh — kirim ulang task dengan method cloudflare_challenge, bukan turnstile.

Berapa lama waktu solve untuk Managed Challenge dan Interactive Challenge?

Tergantung bentuk akhirnya:

  • Tampil sebagai widget Turnstile: biasanya selesai di bawah 10 detik.
  • Naik level jadi JS challenge penuh: di bawah 15 detik.

Keduanya dengan tingkat keberhasilan tinggi pada tipe yang didukung CaptchaAI.

Kemungkinan besar cookie itu diterbitkan dari alur challenge lama sebelum migrasi selesai sepenuhnya. Solve ulang challenge yang sedang disajikan saat ini — jangan pakai cookie hasil solve dari sebelum migrasi, meski nama cookie-nya sama.


Ringkasan: Tiga Hal yang Perlu Diingat

  • Keduanya sama-sama menghasilkan cookie qa_validation_cookie.
  • Pakai method turnstile untuk sebagian besar kasus, cloudflare_challenge untuk halaman JS challenge penuh.
  • Managed Challenge adalah standar modern hari ini; Interactive Challenge tinggal menunggu giliran situs-situs lama untuk bermigrasi.

Managed Challenge memilih tingkat kesulitan secara adaptif per pengunjung — dari invisible pass sampai JS challenge penuh — sementara Interactive Challenge selalu menampilkan CAPTCHA ke semua orang tanpa kecuali.

Solve keduanya dengan CaptchaAI — satu API key, satu paket thread untuk semua tipe challenge Cloudflare yang didukung.

Panduan Lain yang Relevan

Komentar dinonaktifkan untuk artikel ini.