Satu cookie yang menentukan apakah request otomatis Anda diloloskan atau dilempar kembali ke halaman challenge: cookie qa_validation_cookie milik Cloudflare Challenge. Selama cookie itu valid dan cocok dengan IP serta User-Agent yang Anda pakai, sesi scraping berjalan mulus; begitu kedaluwarsa, Cloudflare menahan Anda lagi. Panduan ini membedah properti cookie tersebut, faktor apa saja yang mengikatnya, dan cara CaptchaAI menyelesaikan challenge untuk mendapatkannya.
Alur Cloudflare Challenge: dari request sampai cookie terbit
Sebelum menyentuh kode, pahami dulu urutan kejadiannya. Cloudflare tidak langsung memblokir — ia menaruh satu lapisan pemeriksaan di depan halaman:
- Browser meminta halaman yang dilindungi Cloudflare
- Cloudflare menilai sinyal risiko (reputasi IP, header request, TLS sinyal browser)
- Jika ditandai mencurigakan, Cloudflare membalas 403 atau 503 berisi halaman challenge JavaScript
- Halaman challenge menjalankan pemeriksaan browser dan bisa menampilkan widget Turnstile
- Setelah berhasil, Cloudflare menetapkan cookie
qa_validation_cookielalu redirect ke URL awal - Request berikutnya yang membawa cookie tersebut lolos tanpa challenge
Intinya, seluruh alur ini bertujuan menerbitkan satu cookie. Setelah cookie ada di tangan, sisa sesi Anda tinggal membawanya di setiap request.
Tiga tingkat challenge yang perlu Anda kenali
Cloudflare tidak menyajikan satu challenge seragam. Ada tiga tingkat, dan tiap tingkat berperilaku 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 tingkat tersebut lewat solver Cloudflare Challenge, jadi Anda tidak perlu mendeteksi sendiri tingkat mana yang sedang dilayani situs target.
Properti cookie dan faktor yang mengikatnya
Setelah challenge lolos, inilah cookie yang Anda dapat:
| 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 |
Yang sering membuat cookie ditolak bukan cookie-nya sendiri, melainkan konteks pemakaiannya. Cookie terikat ke beberapa faktor sekaligus:
- Alamat IP — memakai cookie dari IP berbeda biasanya gagal
- User-Agent — harus cocok dengan UA yang dipakai saat solve challenge
- TLS sinyal browser — sebagian konfigurasi mengikat cookie ke TLS ClientHello
Artinya, cookie bukan tiket bebas yang bisa dipindah-pindah. Ia hanya berlaku dalam kombinasi IP + User-Agent (dan kadang TLS) yang sama seperti saat diterbitkan.
Solve Cloudflare Challenge dengan CaptchaAI
Polanya mengikuti empat langkah yang sama seperti tipe CAPTCHA lain:
- Kirim task ke
in.php - Simpan task ID yang dikembalikan
- Polling hasil di
res.php - Pakai token yang diterima
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)}...`);
Suntikkan token dan ambil cookie-nya
Token dari solver belum menjadi cookie. Anda masih perlu menyuntikkannya ke halaman challenge supaya Cloudflare menerbitkan 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]}...")
Pakai ulang cookie di sesi berikutnya
Setelah cookie ada di tangan, Anda tidak perlu membuka browser penuh untuk setiap request. Cukup bawa cookie plus User-Agent yang sama di sesi HTTP biasa:
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
Jaga cookie tetap hidup: lifetime dan solve ulang
Cookie qa_validation_cookie punya masa berlaku terbatas dan pasti kedaluwarsa. Rancang alur agar cookie di-solve ulang otomatis sebelum habis, bukan setelah request gagal:
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
Buffer 60 detik pada contoh di atas memberi ruang agar solve ulang selesai sebelum cookie lama benar-benar mati, sehingga tidak ada request yang jatuh di tengah sesi.
Konteks untuk tim automation dan QA di Indonesia
Banyak pekerjaan scraping dan QA di Indonesia dikerjakan tim kecil serta kontraktor freelance yang sangat sensitif terhadap biaya. Di sinilah model harga berbasis thread CaptchaAI terasa pas: Anda membayar per thread yang berjalan bersamaan, bukan per solve. Paket BASIC ($15/bulan, 5 thread) cukup untuk satu worker scraper, sedangkan ADVANCE ($90/bulan, 50 thread) menopang crawler paralel yang harus me-refresh banyak cookie qa_validation_cookie sekaligus — biayanya tetap berapa pun jumlah challenge yang diselesaikan.
Karena cookie terikat ke IP, jaga egress jaringan Anda tetap konsisten. Kalau worker di-deploy di ap-southeast-1 (Singapura) atau ap-southeast-3 (Jakarta), pastikan proses solve dan request berjalan lewat rute jaringan yang sama supaya Cloudflare tidak menolak cookie karena IP berbeda. Kondisi jaringan mobile-first juga membuat buffer solve ulang menjadi lebih penting, bukan sekadar formalitas.
Satu catatan kepatuhan: di bawah UU Pelindungan Data Pribadi (UU 27/2022), olah hanya data yang memang berhak Anda proses dan patuhi aturan perlindungan data pribadi.
Mengatasi masalah yang sering muncul
| 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) |
Pola yang terlihat di tabel ini konsisten: hampir semua kegagalan berakar pada ketidakcocokan konteks (IP atau User-Agent), bukan pada cookie yang salah.
Pertanyaan umum
Apakah CaptchaAI benar-benar menyelesaikan Cloudflare Challenge, bukan cuma Turnstile biasa?
Ya. Selain widget Cloudflare Turnstile, solver Cloudflare Challenge menangani JS Challenge, Managed Challenge, dan Interactive Challenge. hCaptcha dan FunCaptcha berada di luar cakupan dan belum didukung.
Apakah saya perlu IP yang sama saat solve dan saat memakai cookie?
Umumnya ya. Cloudflare kerap mengikat cookie ke IP asal dan User-Agent. Jalankan solve dan request melalui rute jaringan yang sama, lalu samakan string User-Agent-nya.
Berapa thread yang saya butuhkan untuk me-refresh cookie dalam jumlah besar?
Tergantung berapa banyak cookie yang kedaluwarsa bersamaan. Satu worker cukup dengan BASIC ($15/bulan, 5 thread); crawler paralel yang menyegarkan puluhan cookie sekaligus lebih nyaman di ADVANCE ($90/bulan, 50 thread).
Bisakah cookie qa_validation_cookie dipakai lintas mesin?
Hanya jika mesin-mesin itu berbagi IP yang sama dan memakai User-Agent identik. Tanpa keduanya, Cloudflare akan menolak cookie dan memunculkan challenge lagi.