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.