Comparisons

Headless vs Headed Chrome untuk Solve CAPTCHA

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.

Komentar dinonaktifkan untuk artikel ini.