CAPTCHA'yı CaptchaAI aracılığıyla çözdünüz ve geçerli bir jeton aldınız, ancak bunu tarayıcıya enjekte etmek işe yaramıyor. Bu kılavuz, her birinin nedenlerini ve nasıl düzeltileceğini kapsar.
Yaygın Arıza Noktaları
| Sorun | Belirti | Kök Neden |
|---|---|---|
| Jeton doğru öğeye enjekte edilmedi | Form jeton olmadan gönderilir | Yanlış metin alanı seçici |
| Tokenın süresi gönderilmeden önce doldu | Site yeniden CAPTCHA'yı gösteriyor | Çözme ve gönderme arasında çok yavaş |
| Geri arama tetiklenmedi | Form düğmesi devre dışı kalıyor | Grecaptcha geri araması eksik |
| API'ye yanlış sayfa URL'si gönderildi | Bu alan adı için jeton geçersiz | URL uyuşmazlığı |
| CAPTCHA'nın ötesinde bot tespiti | Belirteç kabul edildikten sonra engellendi | Tarayıcı test profil yapılandırması |
Düzeltme 1: reCAPTCHA v2 için Doğru Token Enjeksiyonu
Belirtecin g-recaptcha-response metin alanına gitmesi VE geri aramanın tetiklenmesi gerekir:
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()
Düzeltme 2: Geri Aramaya Bağlı Formları Yönetme
CAPTCHA geri çağrısı başlatılana kadar bazı formlar devre dışı kalır:
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
Düzeltme 3: Zamanlama – Hemen Çözün ve Kullanın
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")
Düzeltme 4: SPA'lar ve Iframe'ler için doğru sayfa URL'si
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)
Düzeltme 5: CAPTCHA'nın Ötesinde Anti-Bot Tespiti
Geçerli bir belirteç olsa bile site, otomatik tarayıcıları engelleyebilir:
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_argument("--no-sandbox")
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)
# Override navigator.userAgent
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
return driver
driver = create_stealth_driver()
Düzeltme 6: Turnstile Jeton Enjeksiyonu
Cloudflare Turnstile farklı bir enjeksiyon yaklaşımı kullanıyor:
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)
Hata Ayıklama Kontrol Listesi
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
Sorun giderme
| Belirti | Sebep | Düzeltme |
|---|---|---|
| Belirteç ayarlandı ancak form reddediliyor | Geri arama tetiklenmedi | Geri arama işlevini bulun ve arayın |
| Gönder düğmesi devre dışı kalıyor | Geri arama bunu sağlar | Jeton enjeksiyonundan sonra geri aramayı tetikle |
| Gönderimden sonra "Geçersiz CAPTCHA" | Jetonun süresi doldu | Çözme ve gönderme arasındaki süreyi azaltın |
| Form gönderiminden sonra 403 | Bot algılama (CAPTCHA değil) | Gizli tarayıcı seçeneklerini kullanın |
| İsteklerde çalışıyor, tarayıcıda başarısız oluyor | Farklı sayfa URL'si | Driver.current_url'yi pageurl olarak kullanın |
SSS
Belirteç neden isteklerde çalışıyor ancak tarayıcıda çalışmıyor?
Genellikle geri arama işlevi tetiklenmediğinden. Tarayıcı formları, gönderimi etkinleştirmek veya gizli alanları ayarlamak için genellikle geri aramayı kullanır.
Belirli bir tarayıcı kullanmam gerekiyor mu?
Chrome/Chromium en uyumlu olanıdır. Firefox çalışıyor ancak CDP komutları için farklı yaklaşımlara ihtiyaç duyabilir. Güçlü bot tespitine sahip siteler için algılanmayan chromedriver'ı kullanın.
Headless modunu kullanmalı mıyım?
Bazı siteler headless tarayıcıları algılar ve belirteçleri reddeder. Önce headful modunu deneyin, ardından işe yararsa uygun bayraklarla headless moduna geçin.