Pemecahan Masalah

Otomatisasi Browser CAPTCHA Gagal tetapi API Berfungsi: Panduan Debug

Anda memecahkan CAPTCHA melalui CaptchaAI dan mendapatkan token yang valid, tetapi memasukkannya ke browser tidak berhasil. Panduan ini mencakup setiap alasan mengapa dan bagaimana cara memperbaikinya.


Titik Kegagalan Umum

Masalah Gejala Akar Penyebab
Token tidak diinjeksikan ke elemen yang benar Formulir dikirim tanpa token Selektor textarea salah
Token kedaluwarsa sebelum dikirimkan Situs menampilkan CAPTCHA lagi Terlalu lambat antara solve dan submit
Callback tidak terpicu Tombol formulir tetap dinonaktifkan Callback grecaptcha tidak ada
Pageurl salah dikirim ke API Token tidak valid untuk domain ini Ketidakcocokan URL
Deteksi bot di luar CAPTCHA Diblokir setelah token diterima sinyal browser

Perbaiki 1: pengaturan token yang Benar untuk reCAPTCHA v2

Token harus masuk ke textarea g-recaptcha-response DAN callback harus diaktifkan:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time


def inject_recaptcha_token(driver, token):
    """Properly inject reCAPTCHA v2 token in browser."""

    # Step 1: Make the response textarea visible and set the value
    driver.execute_script("""
        // Find all response textareas (may be multiple on page)
        var textareas = document.querySelectorAll('[name="g-recaptcha-response"]');
        textareas.forEach(function(ta) {
            ta.style.display = 'block';
            ta.value = arguments[0];
        });

        // Also set via ID if present
        var byId = document.getElementById('g-recaptcha-response');
        if (byId) {
            byId.style.display = 'block';
            byId.value = arguments[0];
        }
    """, token)

    # Step 2: Trigger the callback
    driver.execute_script("""
        // Try standard callback
        if (typeof ___grecaptcha_cfg !== 'undefined') {
            var clients = ___grecaptcha_cfg.clients;
            for (var key in clients) {
                var client = clients[key];
                // Navigate nested structure to find callback
                for (var prop in client) {
                    var val = client[prop];
                    if (val && typeof val === 'object') {
                        for (var subprop in val) {
                            var subval = val[subprop];
                            if (subval && typeof subval === 'object' && subval.callback) {
                                subval.callback(arguments[0]);
                                return;
                            }
                        }
                    }
                }
            }
        }
        // Fallback: try common callback names
        if (typeof onCaptchaSuccess === 'function') onCaptchaSuccess(arguments[0]);
        else if (typeof captchaCallback === 'function') captchaCallback(arguments[0]);
    """, token)


# Usage
driver = webdriver.Chrome()
driver.get("https://example.com/form")
# ... solve CAPTCHA via CaptchaAI ...
inject_recaptcha_token(driver, token)
time.sleep(1)
driver.find_element(By.CSS_SELECTOR, "button[type=submit]").click()

Perbaiki 2: Tangani Formulir yang Bergantung pada Callback

Beberapa formulir tetap dinonaktifkan hingga panggilan balik CAPTCHA diaktifkan:

def find_and_trigger_callback(driver, token):
    """Find the reCAPTCHA callback and trigger it."""

    # Method 1: Extract callback from data attribute
    callback_name = driver.execute_script("""
        var widget = document.querySelector('.g-recaptcha');
        if (widget) {
            return widget.getAttribute('data-callback');
        }
        return null;
    """)

    if callback_name:
        driver.execute_script(f"window['{callback_name}'](arguments[0]);", token)
        return True

    # Method 2: Extract from grecaptcha config
    triggered = driver.execute_script("""
        try {
            var widgetId = 0;
            var callback = ___grecaptcha_cfg.clients[widgetId].aa.l.callback;
            if (typeof callback === 'function') {
                callback(arguments[0]);
                return true;
            }
        } catch(e) {}
        return false;
    """, token)

    return triggered

Perbaiki 3: Pengaturan Waktu — Selesaikan dan Gunakan Segera

import requests
import time


def solve_and_inject_fast(driver, api_key, sitekey, page_url):
    """Solve CAPTCHA and inject token with minimal delay."""
    # Submit solve request
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": page_url,
        "json": 1,
    }, timeout=30)
    task_id = resp.json()["request"]

    # Poll for result
    time.sleep(15)
    for _ in range(24):
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key, "action": "get",
            "id": task_id, "json": 1,
        }, timeout=15)
        data = resp.json()

        if data.get("status") == 1:
            token = data["request"]

            # IMMEDIATELY inject — don't wait
            inject_recaptcha_token(driver, token)

            # Submit form within 5 seconds
            time.sleep(0.5)
            return True

        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("Solve timeout")

Perbaiki 4: Pageurl yang benar untuk SPA dan Iframe

def get_correct_pageurl(driver):
    """Get the URL that reCAPTCHA actually sees."""

    # Check if CAPTCHA is in an iframe
    iframes = driver.find_elements(By.TAG_NAME, "iframe")

    for iframe in iframes:
        src = iframe.get_attribute("src") or ""
        if "recaptcha" in src or "anchor" in src:
            # CAPTCHA is in iframe — use parent page URL
            return driver.current_url

    # For SPAs, use current URL (may differ from initial load)
    return driver.current_url


# WRONG — using the URL you navigated to
pageurl = "https://example.com/form"  # May have redirected

# CORRECT — using the URL the browser is actually on
pageurl = get_correct_pageurl(driver)

Perbaiki 5: Deteksi Anti-Bot Di Luar CAPTCHA

Bahkan dengan token yang valid, situs tersebut dapat memblokir browser otomatis:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service


def create_stealth_driver():
    """Create a browser that avoids basic bot detection."""
    options = Options()

    # Remove automation indicators
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option("useAutomationExtension", False)

    # Set realistic window size
    options.add_argument("--window-size=1920,1080")

    driver = webdriver.Chrome(options=options)

    # Konfigurasi browser standar
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
    })

    return driver


driver = create_stealth_driver()

Perbaiki 6: pengaturan token Turnstile

Cloudflare Turnstile menggunakan pendekatan injeksi yang berbeda:

def inject_turnstile_token(driver, token):
    """Inject Turnstile token into the page."""
    driver.execute_script("""
        // Find Turnstile response input
        var inputs = document.querySelectorAll(
            'input[name="cf-turnstile-response"], ' +
            'input[name="g-recaptcha-response"]'
        );

        inputs.forEach(function(input) {
            input.value = arguments[0];
        });

        // Trigger change event
        inputs.forEach(function(input) {
            input.dispatchEvent(new Event('change', { bubbles: true }));
            input.dispatchEvent(new Event('input', { bubbles: true }));
        });

        // Try Turnstile callback
        if (window.turnstile) {
            var widgets = document.querySelectorAll('[data-callback]');
            widgets.forEach(function(w) {
                var cb = w.getAttribute('data-callback');
                if (typeof window[cb] === 'function') {
                    window[cb](arguments[0]);
                }
            });
        }
    """, token)

Daftar Periksa Debug

def debug_captcha_injection(driver, token):
    """Print debug info to diagnose injection failures."""
    info = driver.execute_script("""
        var result = {};

        // Check textarea exists
        var ta = document.querySelector('[name="g-recaptcha-response"]');
        result.textarea_found = !!ta;
        result.textarea_value_set = ta ? ta.value.length > 0 : false;

        // Check reCAPTCHA loaded
        result.grecaptcha_loaded = typeof grecaptcha !== 'undefined';

        // Check for callback
        var widget = document.querySelector('.g-recaptcha');
        result.has_data_callback = widget ? !!widget.getAttribute('data-callback') : false;
        result.callback_name = widget ? widget.getAttribute('data-callback') : null;

        // Current URL
        result.current_url = window.location.href;

        // Check for errors in console (basic)
        result.has_submit_button = !!document.querySelector('button[type=submit], input[type=submit]');

        return result;
    """)

    for key, value in info.items():
        print(f"  {key}: {value}")

    return info

Pemecahan Masalah

Gejala Penyebab Solusi
Token diset tapi formulir ditolak Callback tidak terpicu Temukan dan panggil fungsi callback
Tombol kirim tetap dinonaktifkan Callback yang mengaktifkannya belum dipanggil Picu callback setelah pengaturan token
"CAPTCHA tidak valid" setelah dikirim Token sudah kedaluwarsa Kurangi waktu antara solve dan submit
403 setelah pengiriman formulir Deteksi bot (bukan CAPTCHA) Gunakan opsi konfigurasi browser standar
Berfungsi di request, gagal di browser URL halaman berbeda Gunakan driver.current_url sebagai pageurl

Pertanyaan Umum

Mengapa token berfungsi di request tapi tidak di browser?

Biasanya karena fungsi callback tidak terpicu. Formulir browser sering mengandalkan callback untuk mengaktifkan pengiriman atau menyetel kolom tersembunyi.

Apakah saya perlu menggunakan browser tertentu?

Chrome/Chromium paling kompatibel. Firefox berfungsi tetapi mungkin memerlukan pendekatan berbeda untuk perintah CDP. Gunakan driver chrome yang tidak terdeteksi untuk situs dengan deteksi bot yang kuat.

Haruskah saya menggunakan mode tanpa kepala?

Beberapa situs mendeteksi browser tanpa kepala dan menolak token. Coba mode headful terlebih dahulu, lalu alihkan ke headless dengan tanda yang sesuai jika berhasil.


Panduan Terkait

  • Cloudflare Turnstile 403 Setelah Perbaikan Token
  • Cara Memecahkan reCAPTCHA v2 dengan API
  • Cara Menyelesaikan Cloudflare Turnstile dengan API
Komentar dinonaktifkan untuk artikel ini.