Headless browser lebih sering memicu CAPTCHA dibandingkan browser biasa. Situs mendeteksi Chrome, Firefox, dan WebKit headless melalui sinyal browser JavaScript dan memberikan challenge untuk memblokir otomasi. Berikut cara menangani setiap masalah.
Mengapa Headless Browser Mendapatkan Lebih Banyak CAPTCHA
| Metode Deteksi | Apa yang Diperiksa Situs |
|---|---|
sinyal browser otomatis |
Di-set ke true dalam mode headless |
| Dimensi window | Headless sering menggunakan default 800x600 |
| Renderer WebGL | Headless mengembalikan "SwiftShader" |
| Chrome DevTools Protocol | Port CDP terbuka |
| Plugin tidak ada | Tidak ada PDF viewer, Flash, dll. |
| API Permission | Respons berbeda dalam headless |
| User-Agent string | Substring "HeadlessChrome" |
Ketika sinyal-sinyal ini digabungkan, sistem anti-bot (reCAPTCHA, Cloudflare, DataDome) memberikan trust score lebih rendah dan menampilkan CAPTCHA.
Solusi 1: Solve CAPTCHA via API
Daripada mencoba menghindari CAPTCHA sepenuhnya, solve saat muncul. CaptchaAI bekerja dengan headless browser apa pun karena menyelesaikan CAPTCHA di sisi server.
Selenium (Python)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import time
API_KEY = "YOUR_API_KEY"
options = Options()
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
driver.get("https://staging.example.com/qa-login")
# Check for CAPTCHA
recaptcha = driver.find_elements("class name", "g-recaptcha")
if recaptcha:
site_key = recaptcha[0].get_attribute("data-sitekey")
# Solve via CaptchaAI
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": site_key, "pageurl": driver.current_url
})
task_id = resp.text.split("|")[1]
while True:
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY": continue
token = result.text.split("|")[1]
break
# Inject token
driver.execute_script(
f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
)
driver.find_element("css selector", "form").submit()
Puppeteer (Node.js)
const puppeteer = require("puppeteer");
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto("https://staging.example.com/qa-login");
// Check for CAPTCHA
const siteKey = await page
.$eval(".g-recaptcha", (el) => el.getAttribute("data-sitekey"))
.catch(() => null);
if (siteKey) {
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params: {
key: API_KEY,
method: "userrecaptcha",
googlekey: siteKey,
pageurl: page.url(),
},
});
const taskId = submit.data.split("|")[1];
let token;
while (true) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId },
});
if (result.data === "CAPCHA_NOT_READY") continue;
token = result.data.split("|")[1];
break;
}
await page.evaluate((t) => {
document.getElementById("g-recaptcha-response").innerHTML = t;
}, token);
await page.click('button[type="submit"]');
}
Solusi 2: Kurangi Frekuensi CAPTCHA
Meskipun Anda selalu dapat solve CAPTCHA via API, mengurangi frekuensi kemunculannya menghemat waktu dan biaya.
Konfigurasi browser standar
# Selenium
options.add_experimental_option("excludeSwitches", ["enable-automation"])
// Puppeteer
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, "webdriver", { get: () => false });
});
Tetapkan Ukuran Jendela Realistis
# Selenium
driver.set_window_size(1920, 1080)
// Puppeteer
await page.setViewport({ width: 1920, height: 1080 });
Gunakan konfigurasi standar
# Puppeteer
npm install puppeteer-extra puppeteer-extra (mode standar)
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra (mode standar)");
puppeteer.use(StealthPlugin());
# Selenium
pip install undetected-chromedriver
import undetected_chromedriver as uc
driver = uc.Chrome(headless=True)
Solusi 3: Penanganan Cloudflare Challenge
Halaman tantangan Cloudflare memerlukan lebih dari sekadar token – Anda memerlukan cookie qa_validation_cookie:
# CaptchaAI handles full Cloudflare challenges
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "cloudflare_challenge",
"pageurl": "https://example.com",
"proxy": "http://user:pass@proxy:port",
"proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]
# Result includes qa_validation_cookie cookie and user_agent
# Use both to make subsequent requests
Masalah Umum pada Browser
| Browser | Masalah | Solusi |
|---|---|---|
| Chrome headless | sinyal browser otomatis = true |
Gunakan flag --disable-blink-features |
| Puppeteer | Plugin browser tidak ada | Gunakan puppeteer-extra (mode standar) |
| Selenium | Switch enable-automation |
excludeSwitches: ["enable-automation"] |
| Playwright | WebKit sinyal browser | Gunakan channel Chromium dengan konfigurasi standar |
| Semua | Ukuran viewport konsisten | Set ke 1920x1080 atau acak |
Pertanyaan Umum
Apakah mode headless selalu terdeteksi?
Tidak selalu. Dengan konfigurasi standar yang tepat, banyak situs tidak menandai headless browser Anda. Namun sistem anti-bot canggih (Cloudflare, PerimeterX) masih dapat mendeteksi headless melalui sinyal browser tingkat lanjut.
Haruskah saya menggunakan mode headed?
Mode headed mengurangi deteksi tapi memerlukan server display (Xvfb di Linux). Pendekatan API CaptchaAI bekerja terlepas dari mode headed/headless, menjadikannya solusi yang lebih andal.
Bisakah saya menghindari CAPTCHA sepenuhnya?
Tidak bisa diandalkan. Bahkan headless browser yang terkonfigurasi dengan baik pada akhirnya memicu CAPTCHA dalam skala besar. Menggunakan CaptchaAI sebagai layer penanganan CAPTCHA memastikan otomasi Anda tetap berjalan saat challenge muncul.
Panduan Terkait
- Penanganan CAPTCHA Selenium dengan Python
- Solve CAPTCHA Puppeteer dengan Node.js