Tutorial

Ekstraksi Sitekey Cloudflare Turnstile

Cloudflare Turnstile adalah alternatif CAPTCHA yang tumbuh paling cepat. Untuk solve dengan CaptchaAI, Anda perlu sitekey dan URL halaman. Panduan ini mencakup semua cara menemukan sitekey — dari query DOM sederhana hingga intercept panggilan JavaScript render.


Di Mana Sitekey Turnstile Berada

Sitekey Turnstile muncul di tiga tempat:

  1. Atribut data-sitekey pada elemen .cf-turnstile
  2. Panggilan JavaScript turnstile.render()
  3. URL src iframe Turnstile

Metode 1: Atribut DOM

// Browser console
document.querySelectorAll('.cf-turnstile').forEach((el, i) => {
  console.log(`Turnstile ${i}:`, {
    sitekey: el.getAttribute('data-sitekey'),
    action: el.getAttribute('data-action'),
    cData: el.getAttribute('data-cdata'),
    theme: el.getAttribute('data-theme'),
  });
});

Python (HTML Statis)

import re
import requests

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

matches = re.findall(
    r'class=["\'][^"\']*cf-turnstile[^"\']*["\'][^>]*data-sitekey=["\']([^"\']+)',
    html
)
for sk in matches:
    print(f"Sitekey: {sk}")

Python (Selenium)

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://staging.example.com/qa-login")

widgets = driver.find_elements(By.CSS_SELECTOR, ".cf-turnstile")
for w in widgets:
    sitekey = w.get_attribute("data-sitekey")
    action = w.get_attribute("data-action")
    print(f"Sitekey: {sitekey}, Action: {action}")

Metode 2: Panggilan Render JavaScript

Beberapa situs merender Turnstile secara terprogram:

turnstile.render('#captcha-container', {
  sitekey: '0x4AAAAAAAB...',
  callback: function(token) {
    document.getElementById('cf-token').value = token;
  },
});

Ekstrak dari sumber halaman:

# Find turnstile.render calls
render_match = re.search(
    r'turnstile\.render\s*\([^,]*,\s*\{([^}]+)\}',
    html
)
if render_match:
    config = render_match.group(1)
    sk = re.search(r'sitekey\s*:\s*["\']([^"\']+)', config)
    if sk:
        print(f"Sitekey from render: {sk.group(1)}")

Intercept Puppeteer

// Intercept turnstile.render before page loads
await page.evaluateOnNewDocument(() => {
  window.__turnstileParams = [];
  const origRender = window.turnstile?.render;
  Object.defineProperty(window, 'turnstile', {
    set(val) {
      this._turnstile = val;
      const orig = val.render;
      val.render = function(container, params) {
        window.__turnstileParams.push(params);
        console.log('Turnstile render:', JSON.stringify(params));
        return orig.apply(this, arguments);
      };
    },
    get() { return this._turnstile; }
  });
});

await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });

const params = await page.evaluate(() => window.__turnstileParams);
console.log('Captured Turnstile params:', params);

Metode 3: Iframe src

Turnstile merender iframe. Sitekey ada di src-nya:

document.querySelectorAll('iframe').forEach(iframe => {
  if (iframe.src.includes('challenges.cloudflare.com')) {
    console.log('Turnstile iframe:', iframe.src);
    const match = iframe.src.match(/sitekey=([A-Za-z0-9_-]+)/);
    if (match) console.log('Sitekey:', match[1]);
  }
});

Solve Turnstile dengan CaptchaAI

Python

import requests
import time

API_KEY = "YOUR_API_KEY"
SITEKEY = "0x4AAAAAAAB..."
PAGE_URL = "https://staging.example.com/qa-login"

# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "turnstile",
    "sitekey": SITEKEY,
    "pageurl": PAGE_URL,
    "json": "1",
}).json()

if resp["status"] != 1:
    raise Exception(f"Submit error: {resp['request']}")

task_id = resp["request"]

# Poll
for _ in range(24):
    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["status"] == 1:
        token = result["request"]
        print(f"Turnstile token: {token[:50]}...")
        break
    if result["request"] != "CAPCHA_NOT_READY":
        raise Exception(f"Error: {result['request']}")

JavaScript

const axios = require('axios');

const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: {
    key: 'YOUR_API_KEY',
    method: 'turnstile',
    sitekey: '0x4AAAAAAAB...',
    pageurl: 'https://staging.example.com/qa-login',
    json: 1,
  }
});
const taskId = submit.data.request;

// Poll for result
let token = null;
for (let i = 0; i < 24; i++) {
  await new Promise(r => setTimeout(r, 5000));
  const poll = await axios.get('https://ocr.captchaai.com/res.php', {
    params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
  });
  if (poll.data.status === 1) {
    token = poll.data.request;
    break;
  }
}
console.log(`Token: ${token.substring(0, 50)}...`);

pengaturan token

Turnstile menyimpan token di hidden input bernama cf-turnstile-response:

# Selenium
driver.execute_script("""
    const input = document.querySelector('input[name="cf-turnstile-response"]');
    if (input) input.value = arguments[0];

    // Also set in the Turnstile widget's callback
    const widget = document.querySelector('.cf-turnstile');
    const callbackName = widget?.getAttribute('data-callback');
    if (callbackName && typeof window[callbackName] === 'function') {
        window[callbackName](arguments[0]);
    }
""", token)

Pemecahan Masalah

Masalah Penyebab Solusi
Tidak ditemukan elemen .cf-turnstile Dirender secara dinamis Tunggu pemuatan halaman atau gunakan MutationObserver
Sitekey kosong Diatur melalui JavaScript API Cari turnstile.render dalam skrip
Token ditolak Sitekey atau URL halaman salah Periksa kembali kedua nilai cocok dengan situs target
Parameter method salah Menggunakan userrecaptcha untuk Turnstile Gunakan method=turnstile

Pertanyaan Umum

Apakah Turnstile lebih sulit di-solve daripada reCAPTCHA?

Tidak. CaptchaAI menangani keduanya. Turnstile biasanya selesai dalam 10–25 detik, sebanding dengan reCAPTCHA v2.

Apakah Turnstile memiliki mode invisible?

Turnstile memiliki mode "managed" dan "non-interactive" yang tidak menampilkan widget yang terlihat. Metode ekstraksi sitekey bekerja sama.


Solve CAPTCHA Cloudflare Turnstile dengan CaptchaAI

Dapatkan kunci API Anda di captchaai.com.


Panduan Terkait

  • Mengekstrak Parameter reCAPTCHA dari Source Halaman
  • Cloudflare Turnstile: Deteksi Implementasi
  • Cara Solve Cloudflare Turnstile dengan API
Komentar dinonaktifkan untuk artikel ini.