Mode browser tidak memengaruhi cara CaptchaAI menyelesaikan CAPTCHA — solving terjadi di server API, bukan di jendela Chrome Anda. Yang berubah hanya seberapa sering CAPTCHA muncul dan skor reCAPTCHA v3 yang dilihat situs target.
Tim yang deploy dari laptop (headed) ke server (headless) sering kaget saat skor v3 anjlok dari 0,9 ke 0,2 — bukan bug, tapi sinyal deteksi yang berbeda di kedua mode. Berikut cara memilih mode yang tepat dan mengintegrasikan CaptchaAI di keduanya.
Perbandingan headless vs headed Chrome untuk solve CAPTCHA
Angka bersifat indikatif; hasil aktual bergantung versi Chrome dan situs target.
| Faktor | Chrome Headless | Chrome Headed |
|---|---|---|
| Startup | Cepat | Lebih lambat |
| Memori per tab | ~100-200 MB | ~300-500 MB |
| Deploy server | Native | Butuh Xvfb |
| Deteksi CAPTCHA | Tinggi | Rendah |
| Skor reCAPTCHA v3 | 0,1-0,3 (bot) | 0,7-0,9 (manusia) |
| Debugging | Sulit, tanpa visual | Mudah |
| Scaling concurrent | Sangat baik | Boros resource |
Kapan pakai headless, kapan pakai headed?
Pakai headless saat:
- Server atau CI/CD tanpa display
- Scaling di atas 50 sesi concurrent
- Memori server terbatas
Pakai headed saat:
- Debugging alur CAPTCHA
- Skor reCAPTCHA v3 penting untuk alur Anda
- Situs target memblokir sinyal headless
Pakai headed + Xvfb saat:
- Butuh resistensi deteksi setara headed di server
- reCAPTCHA v3 rendah walau sudah headless
- Anggaran memori memungkinkan (~2x per sesi)
Tim scraping Indonesia yang deploy ke AWS ap-southeast-1/ap-southeast-3 umumnya default ke headless untuk hemat memori. Biaya CaptchaAI dihitung per thread aktif, bukan per mode browser.
Bagaimana sistem CAPTCHA mengenali Chrome headless
Deteksi biasanya berupa kombinasi beberapa sinyal browser sekaligus:
Sinyal deteksi
// Tests that CAPTCHA systems run
// 1. WebDriver flag (biggest tell)
sinyal browser otomatis // true in headless, undefined in real browser
// 2. Chrome object completeness
window.chrome // Missing or incomplete in headless
// 3. Plugins
navigator.plugins.length // 0 in headless, 3+ in headed
// 4. WebGL renderer
// Headless: "SwiftShader Renderer"
// Headed: "ANGLE (NVIDIA GeForce GTX 1080...)"
// 5. User-Agent contains "Headless"
navigator.userAgent.includes("Headless") // Old Chrome versions
// 6. Screen dimensions
screen.width === 0 // Some headless configs
// 7. Notification permission
Notification.permission // "denied" in headless without override
Ringkasan hasil pengujian di tiga konfigurasi:
Signal Headed Headless New Headless (v112+)
─────────────────────────────────────────────────────────────
webdriver false true true
chrome object full partial improved
plugins 5 0 0
WebGL renderer ANGLE Swift Swift
screen.width 1920 800 800
UA "HeadlessChrome" no yes no (removed)
Mode "headless baru" Chrome 112+ dan skor deteksinya
Perbedaan dua flag headless Chrome sejak v112:
--headless(lama): basis kode terpisah, gampang dikenali--headless=new: basis rendering sama dengan mode headed
from selenium import webdriver
# Old headless (more detectable)
options = webdriver.ChromeOptions()
options.add_argument("--headless") # Legacy mode
# New headless (less detectable)
options = webdriver.ChromeOptions()
options.add_argument("--headless=new") # Shares headed rendering
driver = webdriver.Chrome(options=options)
Mode ini memperbaiki sebagian vektor deteksi lama, tapi sinyal browser otomatis tetap terbaca.
Menyelesaikan CAPTCHA di mode headless dengan CaptchaAI (Python)
CaptchaAI menyelesaikan CAPTCHA di server memakai sitekey dan URL halaman, jadi headless tidak mengurangi tingkat keberhasilan:
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
API_KEY = "YOUR_API_KEY"
API_URL = "https://ocr.captchaai.com"
def create_headless_driver():
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
options.add_argument(
"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
)
return webdriver.Chrome(options=options)
def solve_captcha(site_url, sitekey):
resp = requests.post(f"{API_URL}/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": site_url,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{API_URL}/res.php", params={
"key": API_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Solve timeout")
# Full headless workflow
driver = create_headless_driver()
try:
driver.get("https://example.com/form")
time.sleep(2)
sitekey = driver.execute_script(
"return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)
if sitekey:
token = solve_captcha(driver.current_url, sitekey)
driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
""")
driver.find_element(By.CSS_SELECTOR, "form").submit()
finally:
driver.quit()
Ringkasan alur: ambil sitekey → kirim ke in.php → polling res.php → isi token ke form.
Menjalankan Chrome headed di server tanpa GUI (Xvfb)
Kalau skor v3 di headless terlalu rendah, jalankan Chrome headed di server lewat Xvfb.
Linux dengan Xvfb
# Install
sudo apt-get install xvfb
# Run with virtual display
xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" python script.py
Python dengan PyVirtualDisplay:
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(1920, 1080))
display.start()
options = webdriver.ChromeOptions()
# No --headless flag = headed mode in virtual display
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(options=options)
# Now runs headed Chrome with real rendering, but no physical display
Docker dengan Xvfb:
FROM python:3.12-slim
RUN apt-get update && apt-get install -y \
xvfb \
chromium \
chromium-driver \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app
WORKDIR /app
CMD ["xvfb-run", "--auto-servernum", "python", "main.py"]
Headless dengan konfigurasi tambahan browser (Node.js)
Sebagian tim menambah konfigurasi browser di atas headless agar plugin dan navigator mendekati kondisi headed — ini mengurangi frekuensi CAPTCHA, bukan menggantikan solving-nya:
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra (mode standar)");
puppeteer.use(StealthPlugin());
async function headlessStealth() {
const browser = await puppeteer.launch({
headless: "new",
args: [
"--no-sandbox",
"--window-size=1920,1080",
],
});
const page = await browser.newPage();
await page.setViewport({ width: 1920, height: 1080 });
// Additional konfigurasi standar
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, "webdriver", {
get: () => undefined,
});
Object.defineProperty(navigator, "plugins", {
get: () => [1, 2, 3, 4, 5],
});
});
await page.goto("https://example.com/form");
// Detect and solve CAPTCHA with CaptchaAI
const sitekey = await page.evaluate(() =>
document.querySelector("[data-sitekey]")?.getAttribute("data-sitekey")
);
if (sitekey) {
// Call CaptchaAI API (see other guides for full implementation)
const token = await solveCaptchaAI(page.url(), sitekey);
await page.evaluate((t) => {
document.querySelector("#g-recaptcha-response").value = t;
}, token);
}
await browser.close();
}
Tolok ukur performa: headless vs headed vs headed + Xvfb
Angka bersumber dari pengamatan dan laporan pengguna; hasil dapat berbeda tergantung lingkungan dan volume.
| Skenario | Headless | Headed | Headed + Xvfb |
|---|---|---|---|
| Waktu mulai | ~1 dtk | ~2 dtk | ~2,5 dtk |
| Memori per tab | 100-200 MB | 300-500 MB | 300-500 MB |
| Page load rata-rata | 1,5 dtk | 2,5 dtk | 2,5 dtk |
| Skor reCAPTCHA v3 | 0,1-0,3 | 0,7-0,9 | 0,5-0,8 |
| Maks sesi (VPS 8 GB) | 30-40 | 10-15 | 10-15 |
| Tingkat keberhasilan | Sama (API) | Sama (API) | Sama (API) |
Insight utama: tingkat keberhasilan sama persis di ketiganya — mode browser hanya memengaruhi frekuensi CAPTCHA dan skor v3, bukan apakah CaptchaAI bisa menyelesaikannya.
Masalah umum dan solusinya
Penyebab dan perbaikan untuk kendala yang paling sering muncul:
| Masalah | Penyebab | Solusi |
|---|---|---|
| Headless terdeteksi | Sinyal browser otomatis terbaca | Tambah konfigurasi browser / CDP standar |
| Skor v3 rendah di headless | Sinyal rendering tidak ada | Pindah ke headed + Xvfb |
| Xvfb crash saat start | Konflik nomor display | Gunakan --auto-servernum |
| Memori tinggi di headed | Proses GPU aktif | Tambahkan --disable-gpu |
| Screenshot kosong headless | Viewport belum diset | Set --window-size=1920,1080 |
Pertanyaan umum
Apakah mode browser memengaruhi tingkat keberhasilan CaptchaAI?
Tidak. CaptchaAI menyelesaikan CAPTCHA di server memakai sitekey dan URL — headless atau headed sama-sama menghasilkan tingkat keberhasilan yang sama.
Berapa banyak sesi headless bisa jalan sekaligus di VPS 8 GB?
- Headless (~100-200 MB/tab): 30-40 sesi concurrent
- Headed atau headed + Xvfb (~300-500 MB/tab): 10-15 sesi
Apakah biaya CaptchaAI berubah kalau saya pindah ke headed + Xvfb?
Tidak. CaptchaAI menagih per thread aktif, bukan per mode browser — BASIC ($15/bulan, 5 thread) berlaku sama apa pun kombinasinya.
Apakah --headless=new benar-benar tidak terdeteksi?
Lebih baik dari headless lama, tapi tetap bisa dideteksi lewat sinyal browser otomatis atau jumlah plugin.
Mode mana yang paling praktis untuk debugging?
- Headed lokal: lihat langsung kapan CAPTCHA muncul dan token terisi
- Setelah stabil, pindahkan ke headless (atau headed + Xvfb) untuk produksi
Panduan terkait
Pilih mode browser yang tepat untuk alur kerja CAPTCHA Anda — dapatkan API key CaptchaAI dan solve CAPTCHA dalam konfigurasi apa pun.