Kasus Penggunaan

Masalah CAPTCHA pada Headless Browser dan Cara Mengatasinya

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
Komentar dinonaktifkan untuk artikel ini.