Penjelasan Mendalam

Mode Widget Cloudflare Turnstile: Managed, Non-Interaktif, Invisible

Cloudflare Turnstile hadir dengan tiga mode widget yang mengontrol cara challenge disajikan: managed (Cloudflare yang memutuskan), non-interactive (hanya proof-of-work, tidak pernah menampilkan UI), dan invisible (tanpa container widget, berjalan senyap). Mode menentukan apa yang dilihat pengguna, berapa lama challenge berlangsung, dan apakah widget akan terlihat. Untuk otomasi, ketiga mode menghasilkan output yang sama — token cf-turnstile-response — tetapi mendeteksi dan solve-nya memerlukan pemahaman perbedaannya.


Perbandingan Mode

Fitur Managed Non-Interaktif Invisible
Widget terlihat? Terkadang Tidak pernah (hanya spinner) Tidak pernah
Container diperlukan? Ya Ya Ya (tersembunyi)
Interaksi pengguna diperlukan? Terkadang (checkbox) Tidak Tidak
Proof-of-work challenge? Ya (bisa naik eskalasi) Ya (selalu) Ya (selalu)
Bisa kembali ke checkbox interaktif? Ya Tidak (malah gagal) Tidak (malah gagal)
Output token cf-turnstile-response cf-turnstile-response cf-turnstile-response
Metode CaptchaAI turnstile turnstile turnstile
Direkomendasikan untuk Login, registrasi Form low-friction Verifikasi background

Mode Managed (Default)

Mode managed memungkinkan Cloudflare menentukan level challenge per pengunjung. Sebagian besar pengguna lolos tanpa tampilan visual. Traffic mencurigakan melihat checkbox. Traffic sangat mencurigakan mungkin menghadapi challenge lebih kompleks.

Implementasi

<!-- Managed mode (default) -->
<div class="cf-turnstile"
     data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
     data-theme="light">
</div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>

Yang Dilihat Otomasi

Mode managed beradaptasi berdasarkan sinyal pemohon:

Reputasi Widget Ditampilkan Sebagai
Kepercayaan tinggi Pass invisible (tidak ada UI terlihat)
Kepercayaan sedang Widget checkbox (klik untuk verifikasi)
Kepercayaan rendah Challenge interaktif atau blok

Untuk otomasi, mode managed paling umum dan paling bervariasi. Widget mungkin terlihat atau tidak tergantung pada sinyal browser.

Deteksi dalam HTML

def is_managed_mode(html):
    """Check if Turnstile is using managed mode (default)."""
    # Managed mode is the default — no explicit mode attribute
    has_turnstile = "cf-turnstile" in html
    has_explicit_mode = 'data-appearance="interaction-only"' in html or \
                        'data-appearance="always"' in html or \
                        'appearance: "interaction-only"' in html
    return has_turnstile and not has_explicit_mode

Mode Non-Interaktif

Mode non-interactive tidak pernah menampilkan checkbox atau elemen interaktif. Ini menjalankan proof-of-work challenge di background dan hanya menampilkan spinner pemuatan. Jika challenge tidak bisa diselesaikan secara non-interaktif, maka gagal — tidak ada eskalasi ke checkbox.

Implementasi

<!-- Non-interactive mode -->
<div class="cf-turnstile"
     data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
     data-appearance="interaction-only">
</div>

Atau melalui JavaScript API:

turnstile.render('#turnstile-container', {
    sitekey: '0x4AAAAAAAC3DHQhMMQ_Rxrg',
    appearance: 'interaction-only',
    callback: function(token) {
        document.getElementById('cf-turnstile-response').value = token;
    },
});

Perilaku

Page loads → Widget initializes
    ↓
Background proof-of-work runs
    ↓
Success → Token generated (no visible UI)
    OR
Failure → Widget reports error (no fallback to checkbox)

Kapan Situs Menggunakan Non-Interaktif

  • Form komentar dan widget feedback
  • Pendaftaran newsletter
  • Aksi bernilai rendah di mana friction harus minimal
  • API endpoint dengan perlindungan sisi browser

Mode Invisible

Mode invisible benar-benar tidak terlihat — tidak ada container yang muncul di viewport. Widget berjalan saat page load (atau pemicu terprogram) dan menghasilkan token tanpa indikasi visual apapun.

Implementasi

<!-- Invisible mode — container is hidden -->
<div id="turnstile-invisible"
     class="cf-turnstile"
     data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
     data-size="invisible">
</div>

Atau sepenuhnya melalui JavaScript:

// Programmatic invisible Turnstile
turnstile.render('#hidden-container', {
    sitekey: '0x4AAAAAAAC3DHQhMMQ_Rxrg',
    size: 'invisible',
    callback: function(token) {
        // Token ready — submit form automatically
        submitForm(token);
    },
    'error-callback': function() {
        // Challenge failed
        console.error('Invisible Turnstile failed');
    },
});

Tantangan Deteksi

Turnstile invisible lebih sulit dideteksi karena containernya tidak memiliki dimensi terlihat:

import re

def detect_invisible_turnstile(html):
    """Detect invisible Turnstile on a page."""
    indicators = {
        "script_loaded": "challenges.cloudflare.com/turnstile" in html,
        "size_invisible": 'data-size="invisible"' in html or
                          "size: 'invisible'" in html or
                          'size: "invisible"' in html,
        "api_render_call": "turnstile.render" in html,
        "response_field": "cf-turnstile-response" in html,
    }

    if indicators["script_loaded"] and indicators["size_invisible"]:
        return {"mode": "invisible", "confidence": "high"}
    elif indicators["script_loaded"] and indicators["api_render_call"]:
        return {"mode": "invisible_or_programmatic", "confidence": "medium"}
    elif indicators["response_field"]:
        return {"mode": "turnstile_present", "confidence": "low"}

    return {"mode": "none", "confidence": "high"}

Mengekstrak Sitekey di Semua Mode

Terlepas dari mode, sitekey diperlukan untuk solve. Ekstrak dari mode apapun:

import re

def extract_turnstile_sitekey(html):
    """Extract Turnstile sitekey from page HTML (works for all modes)."""

    # Pattern 1: data-sitekey attribute in HTML
    match = re.search(r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', html)
    if match:
        return match.group(1)

    # Pattern 2: JavaScript render call
    match = re.search(r"sitekey:\s*['\"]([0-9x][A-Za-z0-9_-]+)['\"]", html)
    if match:
        return match.group(1)

    # Pattern 3: Turnstile config object
    match = re.search(r"siteKey['\"]?\s*[:=]\s*['\"]([0-9x][A-Za-z0-9_-]+)['\"]", html)
    if match:
        return match.group(1)

    return None

Solve Ketiga Mode dengan CaptchaAI

Ketiga mode Turnstile di-solve secara identik dengan CaptchaAI. Mode tidak mempengaruhi API call:

Python

import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_turnstile(sitekey, page_url):
    """Solve any Turnstile mode — managed, non-interactive, or invisible."""
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": page_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("Turnstile solve timed out")


# Use with any mode
token = solve_turnstile("0x4AAAAAAAC3DHQhMMQ_Rxrg", "https://staging.example.com/qa-login")
print(f"Token: {token[:50]}...")

Node.js

const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

async function solveTurnstile(sitekey, pageUrl) {
  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: {
      key: API_KEY,
      method: "turnstile",
      sitekey,
      pageurl: pageUrl,
      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("Turnstile solve timed out");
}

// Same function works for all Turnstile modes
solveTurnstile("0x4AAAAAAAC3DHQhMMQ_Rxrg", "https://staging.example.com/qa-login")
  .then((token) => console.log("Token:", token.substring(0, 50)));

Pemecahan Masalah

Gejala Penyebab Solusi
Token valid tapi form menolaknya Sitekey salah (berbeda dari widget yang terlihat) Periksa sitekey yang dirender JavaScript
Widget tidak ditemukan di HTML Mode invisible dimuat setelah render awal Tunggu page load penuh, periksa respons XHR
Beberapa widget Turnstile di halaman Sitekey berbeda untuk form berbeda Cocokkan sitekey dengan form spesifik
data-size="compact" membingungkan deteksi Compact adalah varian ukuran, bukan mode Compact menggunakan mode managed secara default
Atribut data-action ada Tag action untuk analitik, bukan mode Sertakan action dalam solve jika diperlukan untuk validasi
Token kedaluwarsa sebelum disubmit Token Turnstile kedaluwarsa dalam 300 detik Solve sesaat sebelum submit

Pertanyaan Umum

Apakah mode Turnstile mempengaruhi solve CaptchaAI?

Tidak. CaptchaAI menggunakan metode turnstile yang sama untuk ketiga mode. Sitekey dan URL halaman adalah satu-satunya parameter yang diperlukan. Mode tidak mengubah format token atau alur validasi.

Bagaimana saya tahu mode mana yang digunakan situs?

Periksa HTML untuk atribut data-appearance atau data-size. Jika data-size="invisible" ada, itu mode invisible. Jika data-appearance="interaction-only" ada, itu non-interactive. Jika tidak ada yang diset, itu mode managed (default).

Bisakah situs beralih mode secara dinamis?

Ya. Beberapa situs menggunakan mode managed secara default dan beralih ke non-interactive untuk halaman atau segmen pengguna tertentu. Sitekey biasanya tetap sama. Selalu deteksi ulang mode saat navigasi.

Berapa perbedaan tingkat keberhasilan antar mode?

CaptchaAI mencapai tingkat keberhasilan 100% pada semua mode Turnstile. Mode hanya mempengaruhi pengalaman yang dihadapi pengguna — challenge level API serupa.


Ringkasan

Tiga mode widget Cloudflare Turnstile — managed, non-interactive, dan invisible — mengontrol pengalaman pengguna tetapi menghasilkan token cf-turnstile-response yang sama. Untuk otomasi, semua mode di-solve secara identik menggunakan CaptchaAI Turnstile Solver dengan tingkat keberhasilan 100%. Perbedaan utama bagi developer adalah deteksi: mode managed menampilkan HTML yang terlihat, sementara mode invisible memerlukan analisis halaman lebih dalam untuk menemukan sitekey.

Artikel Terkait

  • Cloudflare Challenge vs Turnstile: Cara Mendeteksi
  • Cloudflare Turnstile 403 Setelah Submit Token — Perbaikan
  • Ekstraksi Sitekey Cloudflare Turnstile
Komentar dinonaktifkan untuk artikel ini.