Kalau script scraping Anda balas dengan 403, jangan langsung mencari solver CAPTCHA — kemungkinan besar itu Browser Integrity Check (BIC), bukan challenge yang bisa diselesaikan. BIC adalah pemeriksaan pasif di level header: Cloudflare menolak request yang jelas bukan browser dan langsung membalas 403, tanpa menyajikan tugas apa pun. Yang membalas 503 justru CAPTCHA challenge (Turnstile, JavaScript challenge, atau Managed Challenge) yang memang dirancang untuk diselesaikan browser sah. Aturan praktisnya: 403 diperbaiki dengan header yang benar, 503 diselesaikan dengan solver.
Ringkasan perbedaan BIC dan CAPTCHA challenge
| Fitur | Browser Integrity Check | CAPTCHA Challenge |
|---|---|---|
| Apa yang diperiksa | Hanya header HTTP | Perilaku browser + lingkungan |
| Butuh JavaScript? | Tidak (level header) | Ya |
| Yang dilihat pengguna | Tidak ada (lolos) atau 403 (gagal) | Widget challenge atau halaman JS |
| Status HTTP saat gagal | 403 | 503 |
| Bisa diselesaikan? | Tidak — perbaiki header | Ya — selesaikan CAPTCHA |
| Cookie diterbitkan | Tidak | qa_validation_cookie |
| Butuh CaptchaAI? | Tidak — perbaiki header request | Ya |
| Aktif secara default | Ya (semua paket Cloudflare) | Tidak (dikonfigurasi per aturan WAF) |
| Berlaku untuk | Setiap request | Hanya yang cocok aturan WAF |
Pegangan cepat:
- 403 hampir selalu soal header — tambal di sisi klien, tanpa solver.
- 503 butuh penyelesaian CAPTCHA lewat CaptchaAI.
- 403 di semua kombinasi header biasanya berarti IP-nya yang bermasalah.
Cara kerja Browser Integrity Check (BIC)
BIC mengevaluasi header request HTTP untuk menyaring traffic non-browser, dan berjalan sebelum challenge apa pun muncul. Karena murni berbasis header, klien HTTP polos seperti requests atau axios hampir selalu tersangkut di sini.
Sinyal yang dievaluasi BIC
| Pemeriksaan | Yang dicari | Kegagalan umum |
|---|---|---|
| Validasi User-Agent | UA hilang, kosong, atau masuk daftar buruk | python-requests/2.31, curl, wget |
| Urutan header | Header dalam urutan yang tidak wajar | Library HTTP non-browser |
| Header browser hilang | Accept, Accept-Language, Accept-Encoding tidak ada |
Klien HTTP minimal |
| Signature bot yang dikenal | UA spammer, UA scanner | Googlebot dari IP non-Google |
| Blocklist IP abusif | IP berbahaya yang sudah dikenal | IP pusat data yang masuk daftar blokir |
Alur pemeriksaan BIC
Request hits Cloudflare edge
↓
BIC evaluates HTTP headers:
├─ User-Agent present and valid?
├─ Required headers (Accept, Accept-Language) present?
├─ Header order consistent with browser?
└─ IP not on abuse list?
↓
Pass → Request forwarded to origin
OR
Fail → 403 Forbidden (no challenge offered)
Melewati BIC dengan header yang benar
BIC lolos begitu request membawa header seperti browser sungguhan:
import requests
# ❌ FAILS BIC — minimal headers
response = requests.get("https://cloudflare-protected.com")
# User-Agent: python-requests/2.31.0
# Result: 403 Forbidden
# ✅ PASSES BIC — browser-like headers
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,"
"image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
}
response = requests.get("https://cloudflare-protected.com", headers=headers)
# Result: 200 OK (passed BIC)
Versi Node.js dengan Axios memakai header yang sama:
const axios = require("axios");
// Browser-like headers to pass BIC
const headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0",
Accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
Connection: "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
};
async function fetchWithBIC(url) {
const response = await axios.get(url, { headers });
console.log(`Status: ${response.status}`);
return response.data;
}
Cara kerja CAPTCHA challenge
CAPTCHA challenge baru berjalan setelah BIC lolos, dan tidak seperti BIC, ia menuntut eksekusi JavaScript. Untuk Turnstile dan Managed Challenge, CaptchaAI memakai metode turnstile; untuk JavaScript dan Interactive Challenge, metode cloudflare_challenge.
Jenis Cloudflare CAPTCHA challenge
| Tipe challenge | Pemicu | Terlihat pengguna? | Metode CaptchaAI |
|---|---|---|---|
| Widget Turnstile | Disematkan di halaman oleh developer | Widget pada form | turnstile |
| Managed Challenge | Cocok aturan WAF | Adaptif (invisible/checkbox) | turnstile |
| JavaScript Challenge | Mode IUAM atau aturan WAF | Halaman "Checking your browser" | cloudflare_challenge |
| Interactive Challenge | Kecurigaan tinggi | Challenge satu halaman penuh | cloudflare_challenge |
Setelah selesai, cookie sesi diterbitkan dan request berikutnya lolos:
Request passes BIC check
↓
WAF rules evaluate bot score, IP, path
↓
Rule triggers CAPTCHA challenge (HTTP 503)
↓
Browser executes JavaScript challenge
↓
Challenge solved → qa_validation_cookie cookie issued
↓
Subsequent requests pass with cookie
Mendiagnosis: blok BIC atau CAPTCHA challenge?
Pastikan jenis bloknya lewat perbandingan status code:
- Minimal 403, browser 200 → BIC saja, perbaiki header.
- Browser 503 dengan halaman challenge → CAPTCHA challenge, butuh solver.
- Kedua-duanya 403 → kemungkinan besar IP yang diblokir.
Fungsi berikut mengotomatiskannya:
import requests
def diagnose_cloudflare_block(url):
"""Determine if block is BIC or CAPTCHA."""
# Intentionally use minimal headers to trigger BIC
minimal_response = requests.get(url, timeout=15, allow_redirects=False)
# Use browser headers to validasi BIC
browser_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
"Accept": "text/html,application/xhtml+xml,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
}
browser_response = requests.get(
url, headers=browser_headers, timeout=15, allow_redirects=False
)
result = {
"minimal_headers_status": minimal_response.status_code,
"browser_headers_status": browser_response.status_code,
}
if minimal_response.status_code == 403 and browser_response.status_code == 200:
result["diagnosis"] = "BIC only — fix headers to pass"
result["fix"] = "Add browser-like headers"
elif minimal_response.status_code == 403 and browser_response.status_code == 403:
result["diagnosis"] = "IP or WAF block — not just BIC"
result["fix"] = "Change IP or check WAF rules"
elif browser_response.status_code == 503:
html = browser_response.text
if "jschl" in html:
result["diagnosis"] = "IUAM JavaScript challenge"
result["fix"] = "Use CaptchaAI cloudflare_challenge method"
elif "cf-turnstile" in html or "challenge-platform" in html:
result["diagnosis"] = "Managed/Turnstile challenge"
result["fix"] = "Use CaptchaAI turnstile method"
else:
result["diagnosis"] = "Unknown Cloudflare challenge"
result["fix"] = "Inspect page source for challenge type"
elif browser_response.status_code == 200:
html = browser_response.text
if "cf-turnstile" in html:
result["diagnosis"] = "Page loads but has Turnstile widget"
result["fix"] = "Use CaptchaAI turnstile method for form submission"
else:
result["diagnosis"] = "No challenge — page accessible"
result["fix"] = "None needed"
return result
# Usage
diagnosis = diagnose_cloudflare_block("https://example-cf-site.com")
print(f"Diagnosis: {diagnosis['diagnosis']}")
print(f"Fix: {diagnosis['fix']}")
Empat pola blok tersering
Blok BIC saja — header minimal ditolak:
Request with python-requests UA → 403
Request with Chrome UA → 200 ✓
Fix: Add proper browser headers. No CaptchaAI needed.
BIC lolos, lalu CAPTCHA challenge muncul:
Request with Chrome UA → 503 (challenge page)
Fix: Headers are fine. Use CaptchaAI to solve the challenge.
BIC dan CAPTCHA sekaligus:
Request with python-requests UA → 403 (BIC block)
Request with Chrome UA → 503 (CAPTCHA challenge)
Fix: First fix headers, then solve CAPTCHA with CaptchaAI.
Blok IP — semua kombinasi header gagal:
Request with python-requests UA → 403
Request with Chrome UA → 403
Fix: Neither BIC nor solvable challenge. IP is blocked.
Try different IP/proxy.
Contoh nyata: tim price-monitoring di Jakarta
Sebuah agensi price-monitoring kecil menjalankan crawler dari region AWS ap-southeast-1 (Singapura). Beberapa target balas 403 sejak request pertama, dan timnya sempat mencoba solver — padahal diagnose_cloudflare_block menunjukkan header minimal 403 dan header browser 200: murni BIC. Cukup pasang User-Agent Chrome plus header Accept-*, target lolos tanpa solver. Situs lain membalas 503, dan di sinilah CaptchaAI masuk lewat metode cloudflare_challenge — solver dipakai hanya saat ada challenge. Satu catatan kepatuhan: sesuai UU Pelindungan Data Pribadi (UU 27/2022), ambil hanya data yang berhak Anda proses.
Header yang aman dan header yang memicu blok
Kumpulan header ini cukup untuk melewati BIC pada mayoritas situs:
CLOUDFLARE_SAFE_HEADERS = {
# Mandatory
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
# Strongly recommended
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
# Sec-Fetch headers (modern Chrome)
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
# Recommended for consistency
"Sec-Ch-Ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": '"Windows"',
}
Sebaliknya, header berikut menandai request sebagai otomatisasi:
| Header | Kenapa gagal |
|---|---|
User-Agent: python-requests/2.31.0 |
Identifier library HTTP yang dikenal |
User-Agent: curl/7.81.0 |
Identifier CLI tool |
Accept tidak ada |
Tidak ada browser yang menghilangkan Accept |
Accept-Language tidak ada |
Semua browser mengirimkannya |
User-Agent: "" (kosong) |
Tidak valid — otomatisasi yang kentara |
User-Agent: Googlebot/2.1 dari IP non-Google |
Identitas bot palsu |
Pemecahan masalah cepat
| Gejala | Penyebab | Solusi |
|---|---|---|
| 403 dengan header minimal, 200 dengan header browser | BIC saja | Pakai header seperti browser |
| 403 di semua kombinasi header | IP diblokir atau aturan WAF | Coba IP atau proxy lain |
| 503 dengan halaman challenge | CAPTCHA challenge (bukan BIC) | Pakai CaptchaAI |
| 403 sesekali | Rate limiting atau berbasis sesi | Turunkan laju request, pertahankan sesi |
| Header benar tapi tetap 403 | Cek TLS sinyal browser (JA3) | Pakai curl_cffi atau browser asli |
Pertanyaan yang sering diajukan
Kenapa saya tetap dapat 403 padahal User-Agent sudah Chrome?
Header yang benar hanya mengurus BIC. Kalau header sudah rapi tapi masih 403, penyebab tersering adalah reputasi IP (IP pusat data yang masuk blocklist) atau cek TLS sinyal browser (JA3/JA4) pada Bot Management. Coba IP lain atau klien seperti curl_cffi.
Apakah CaptchaAI bisa mengatasi Browser Integrity Check?
Tidak. BIC tidak menyajikan challenge yang bisa diselesaikan, jadi perbaiki header HTTP Anda. CaptchaAI menangani CAPTCHA challenge (Turnstile, JavaScript challenge, Managed Challenge) yang muncul setelah BIC lolos.
Apakah IP pusat data cukup untuk melewati BIC?
Tidak selalu. Salah satu sinyal BIC adalah blocklist IP abusif, jadi IP pusat data dengan reputasi buruk bisa tetap kena 403 walau header sudah sempurna. Kalau semua kombinasi header gagal, masalahnya di IP, bukan header.
Berapa lama CaptchaAI menyelesaikan Cloudflare Challenge?
Pada tipe yang didukung, Cloudflare Turnstile umumnya rampung dalam waktu di bawah 10 detik dan Cloudflare Challenge di bawah 15 detik, dengan tingkat keberhasilan tinggi. Angka ini batas SLA, bukan rata-rata.
Ringkasan
Browser Integrity Check menolak request dengan header non-browser (403), sedangkan CAPTCHA challenge menyajikan tugas yang bisa diselesaikan (503). BIC ditambal cukup dengan header seperti browser yang benar, tanpa perlu layanan solver CaptchaAI; CAPTCHA challenge baru memerlukan metode Turnstile atau Cloudflare Challenge. Urutannya selalu sama: diagnosis dulu, perbaiki header untuk BIC, panggil CaptchaAI untuk CAPTCHA, dan ganti IP untuk hard block.