Penjelasan Mendalam

Panduan Cookie Cloudflare Challenge qa_validation_cookie

Saat Cloudflare menandai pengunjung sebagai mencurigakan, halaman challenge interstisial akan ditampilkan. Setelah diselesaikan, browser menerima cookie qa_validation_cookie yang memberikan akses untuk sesi tersebut. Panduan ini menjelaskan cara kerja alur challenge dan cara CaptchaAI menanganinya.


Cara Kerja Halaman Cloudflare Challenge

  1. Pengguna meminta halaman yang dilindungi Cloudflare
  2. Cloudflare mengevaluasi sinyal risiko (IP reputation, header, TLS sinyal browser)
  3. Jika ditandai, Cloudflare mengembalikan 403 atau 503 dengan halaman JavaScript challenge
  4. Halaman challenge menjalankan pemeriksaan browser dan mungkin menampilkan widget Turnstile
  5. Jika berhasil, Cloudflare menetapkan qa_validation_cookie dan redirect ke URL asli
  6. Request berikutnya dengan cookie lolos tanpa challenge

Properti Detail
Nama qa_validation_cookie
Domain Domain situs target (mis. .example.com)
Path /
Lifetime Biasanya 30 menit hingga 24 jam
HttpOnly Ya
Secure Ya (hanya HTTPS)
SameSite None

Cookie terkait dengan beberapa faktor:

  • Alamat IP — Menggunakan cookie dari IP berbeda biasanya gagal
  • User-Agent — Harus cocok dengan UA yang digunakan saat solve challenge
  • TLS sinyal browser — Beberapa konfigurasi terikat ke TLS ClientHello

Jenis Challenge

Cloudflare menyajikan tingkat challenge yang berbeda:

Challenge Kode respons Interaksi pengguna Deskripsi
JS Challenge 503 Tidak ada Eksekusi JavaScript saja
Managed Challenge 403 Mungkin Cloudflare memutuskan — mungkin menampilkan Turnstile atau lolos diam-diam
Interactive Challenge 403 Ya Selalu menampilkan widget Turnstile

CaptchaAI menyelesaikan ketiga jenis tersebut melalui solver Cloudflare Challenge.


Solve dengan CaptchaAI

Python

import requests
import time

API_KEY = "YOUR_API_KEY"
TARGET_URL = "https://example.com/protected-page"

# Submit Cloudflare Challenge task
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "turnstile",
    "sitekey": "0x0000000000000000000000",  # may be generic for CF challenge
    "pageurl": TARGET_URL,
    "json": "1",
}).json()

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

task_id = resp["request"]
print(f"Task ID: {task_id}")

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

JavaScript

const axios = require('axios');

const API_KEY = 'YOUR_API_KEY';
const TARGET_URL = 'https://example.com/protected-page';

const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: {
    key: API_KEY,
    method: 'turnstile',
    sitekey: '0x0000000000000000000000',
    pageurl: TARGET_URL,
    json: 1,
  }
});
const taskId = submit.data.request;

// Poll
let token = null;
for (let i = 0; i < 30; i++) {
  await new Promise(r => setTimeout(r, 5000));
  const poll = await axios.get('https://ocr.captchaai.com/res.php', {
    params: { key: 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)}...`);

Menggunakan Token yang Di-Solve

Setelah solve, injeksikan token ke halaman challenge untuk mendapatkan qa_validation_cookie:

# With Selenium
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(TARGET_URL)  # Load the challenge page

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

    // Trigger form submit or callback
    const form = document.querySelector('form');
    if (form) form.submit();
""", token)

# Wait for redirect and extract cookies
import time
time.sleep(3)
cookies = driver.get_cookies()
qa_validation_cookie = next(
    (c for c in cookies if c['name'] == 'qa_validation_cookie'), None
)
if qa_validation_cookie:
    print(f"qa_validation_cookie: {qa_validation_cookie['value'][:30]}...")
session = requests.Session()
session.cookies.set("qa_validation_cookie", qa_validation_cookie["value"], domain=".example.com")
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})

# Now access protected pages
resp = session.get("https://example.com/api/data")
print(resp.status_code)  # 200

Cookie qa_validation_cookie bisa kedaluwarsa. Rencana untuk solve ulang:

import datetime

def is_cookie_valid(cookie):
    if not cookie:
        return False
    expiry = cookie.get("expiry", 0)
    return datetime.datetime.now().timestamp() < expiry - 60  # 60s buffer

def get_or_refresh_clearance(driver, target_url, solve_func):
    cookies = driver.get_cookies()
    cf = next((c for c in cookies if c["name"] == "qa_validation_cookie"), None)
    if is_cookie_valid(cf):
        return cf["value"]

    # Re-solve
    token = solve_func(target_url)
    # ... inject and extract new cookie

Pemecahan Masalah

Masalah Penyebab Solusi
Cookie ditolak setelah di-solve IP mismatch Gunakan proxy yang sama untuk solving dan request
Cookie kedaluwarsa cepat TTL pendek diatur situs Solve ulang sebelum kedaluwarsa; periksa field expiry
403 meskipun cookie valid User-Agent mismatch Cocokkan UA antara sesi solve dan request
Halaman challenge tidak dimuat JavaScript dinonaktifkan Gunakan browser lengkap (Selenium, Puppeteer)

Pertanyaan Umum

Hanya jika berbagi IP yang sama dan Anda mencocokkan string User-Agent. Cloudflare sering mengikat cookie ke IP asal.

Biasanya 30 menit hingga 24 jam, bergantung pada konfigurasi Cloudflare pemilik situs.


Panduan Terkait

  • Ekstraksi Sitekey Cloudflare Turnstile
  • Cara Solve Cloudflare Turnstile via API
Komentar dinonaktifkan untuk artikel ini.