Perbandingan

Headless vs Headed Chrome untuk Solve CAPTCHA

Chrome headless berjalan tanpa window yang visible — cepat, ringan, cocok untuk server. Namun sistem CAPTCHA secara aktif mendeteksi mode headless. Berikut cara memilih mode yang tepat dan solve CAPTCHA di kedua mode.


Perbandingan Cepat

Faktor Chrome Headless Chrome Headed
Kecepatan Cepat (tanpa overhead rendering) Lebih lambat (render UI)
Memori ~100-200 MB ~300-500 MB
Deploy server Native Butuh virtual display
Deteksi CAPTCHA Tinggi (sinyal terdeteksi) Rendah (seperti pengguna asli)
Skor reCAPTCHA v3 0,1-0,3 (rentang bot) 0,7-0,9 (rentang manusia)
Debugging Lebih sulit (tanpa visual) Mudah (lihat halaman)
Scaling Sangat baik (resource rendah) Banyak resource

Cara CAPTCHA Mendeteksi Chrome Headless

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

Hasil Uji Deteksi

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 (v112+)

Chrome 112+ memperkenalkan --headless=new, yang menggunakan basis kode yang sama dengan Chrome 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 headless baru memperbaiki beberapa vektor deteksi tapi masih menampilkan sinyal browser otomatis dan tidak memiliki plugin.


Headless + CaptchaAI (Python)

CaptchaAI bekerja sama baiknya dalam mode headless karena menyelesaikan CAPTCHA di sisi server — mode browser tidak memengaruhi API solving:

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()

Headed di Server (Virtual Display)

Jalankan Chrome headed di server tanpa display menggunakan 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 + Konfigurasi standar (Node.js)

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();
}

Kapan Menggunakan Setiap Mode

Gunakan Headless Saat:

  • Berjalan di server/CI tanpa display
  • Scaling hingga 50+ sesi concurrent
  • Memori terbatas
  • CaptchaAI menangani semua solve CAPTCHA (mode browser tidak relevan)

Gunakan Headed Saat:

  • Debugging alur CAPTCHA secara visual
  • Skor reCAPTCHA v3 penting (skor lebih tinggi dalam headed)
  • Situs target memblokir headless secara spesifik
  • Berjalan pada mesin dengan display

Gunakan Headed + Virtual Display Saat:

  • Perlu resistensi deteksi tingkat tinggi di server
  • reCAPTCHA v3 memberikan skor rendah dalam headless
  • Anggaran memungkinkan memori ekstra (~2x per sesi)

Tolok Ukur Performa

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 concurrent (8 GB) 30-40 10-15 10-15
Success rate CAPTCHA Sama (API) Sama (API) Sama (API)

Insight utama: Success rate CaptchaAI sama, terlepas dari mode browser. Mode hanya memengaruhi seberapa sering CAPTCHA muncul dan skor reCAPTCHA v3.


Pemecahan Masalah

Masalah Penyebab Solusi
Headless terdeteksi Flag sinyal browser otomatis Gunakan konfigurasi standar atau pengaturan CDP standar
Skor v3 rendah di headless Sinyal rendering tidak ada Beralih ke headed + Xvfb
Xvfb crash Konflik nomor display Gunakan --auto-servernum
Memori tinggi di headed Proses GPU Tambahkan flag --disable-gpu
Screenshot kosong headless Viewport salah Set --window-size=1920,1080

Pertanyaan Umum

Apakah CaptchaAI peduli jika saya menggunakan headless atau headed?

Tidak. CaptchaAI menyelesaikan CAPTCHA di sisi server menggunakan sitekey dan URL. Mode browser tidak memengaruhi solving.

Apakah mode headless baru (--headless=new) aman dari deteksi?

Lebih baik dari headless lama tapi masih bisa dideteksi. Situs yang memeriksa sinyal browser otomatis atau jumlah plugin akan tetap menandainya.

Bisakah saya mendapatkan skor reCAPTCHA v3 di atas 0,7 dalam headless?

Jarang. Mode headless menghasilkan sinyal seperti bot. Gunakan headed + Xvfb untuk skor lebih tinggi, atau gunakan solving v3 CaptchaAI yang mengembalikan token skor tinggi.

Haruskah saya investasi pada konfigurasi standar atau cukup gunakan CaptchaAI?

Keduanya. standar mengurangi frekuensi CAPTCHA (lebih sedikit solve = biaya lebih rendah). CaptchaAI menangani CAPTCHA yang tetap muncul.


Panduan Terkait

  • Puppeteer + CaptchaAI untuk QA
  • Chrome DevTools Protocol + CaptchaAI

Pilih mode browser yang tepat untuk alur kerja CAPTCHA Anda — dapatkan API key CaptchaAI dan solve CAPTCHA dalam konfigurasi apa pun.

Komentar dinonaktifkan untuk artikel ini.