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