لقد قمت بحل اختبار CAPTCHA عبر CaptchaAI وحصلت على رمز صالح، ولكن إدخاله في المتصفح لا يعمل. يغطي هذا الدليل كل الأسباب وكيفية إصلاح كل منها.
نقاط الفشل المشتركة
| المشكلة | أعراض | السبب الجذري |
|---|---|---|
| لم يتم إدخال الرمز المميز في العنصر الصحيح | يتم إرسال النموذج بدون رمز مميز | محدد منطقة النص خاطئ |
| انتهت صلاحية الرمز المميز قبل الإرسال | يعرض الموقع اختبار CAPTCHA مرة أخرى | بطيء جدًا بين الحل والإرسال |
| لم يتم تشغيل رد الاتصال | يظل زر النموذج معطلاً | رد اتصال grecaptcha مفقود |
| تم إرسال عنوان URL خاطئ إلى API | الرمز غير صالح لهذا المجال | عنوان URL غير متطابق |
| اكتشاف الروبوتات خارج نطاق اختبار CAPTCHA | تم الحظر بعد قبول الرمز المميز | بصمة المتصفح |
الإصلاح 1: حقن الرمز المميز الصحيح لـ reCAPTCHA v2
يجب أن ينتقل الرمز المميز إلى منطقة النص g-recaptcha-response ويجب إطلاق رد الاتصال:
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()
الإصلاح 2: التعامل مع النماذج المعتمدة على رد الاتصال
تظل بعض النماذج معطلة حتى يتم تشغيل رد اتصال CAPTCHA:
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
الإصلاح 3: التوقيت - الحل والاستخدام على الفور
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")
الإصلاح 4: تصحيح عنوان URL الخاص بـ SPA وإطارات 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)
الإصلاح 5: اكتشاف برامج مكافحة الروبوتات بما يتجاوز اختبار CAPTCHA
حتى مع وجود رمز صالح، قد يحظر الموقع المتصفحات الآلية:
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("--disable-blink-features=AutomationControlled")
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.webdriver
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
return driver
driver = create_stealth_driver()
الإصلاح 6: حقن رمز Turnstile
يستخدم Cloudflare Turnstile طريقة حقن مختلفة:
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)
قائمة التحقق من التصحيح
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
استكشاف الأخطاء وإصلاحها
| أعراض | السبب | إصلاح |
|---|---|---|
| تم تعيين الرمز المميز ولكن تم رفض النموذج | لم يتم تشغيل رد الاتصال | ابحث عن وظيفة رد الاتصال واستدعها |
| يبقى زر الإرسال معطلاً | رد الاتصال يتيح ذلك | تشغيل رد الاتصال بعد حقن الرمز المميز |
| "اختبار CAPTCHA غير صالح" بعد الإرسال | انتهت صلاحية الرمز المميز | تقليل الوقت بين الحل والإرسال |
| 403 بعد تقديم النموذج | اكتشاف الروبوتات (وليس اختبار CAPTCHA) | استخدم خيارات المتصفح الخفي |
| يعمل في الطلبات، ويفشل في المتصفح | عنوان URL مختلف | استخدم driver.current_url كعنوان URL للصفحة |
الأسئلة الشائعة
لماذا يعمل الرمز المميز في الطلبات وليس في المتصفح؟
عادةً بسبب عدم تشغيل وظيفة رد الاتصال. تعتمد نماذج المتصفح غالبًا على رد الاتصال لتمكين الإرسال أو تعيين الحقول المخفية.
هل أحتاج إلى استخدام متصفح معين؟
Chrome/Chromium هو الأكثر توافقًا. يعمل Firefox ولكنه قد يحتاج إلى أساليب مختلفة لأوامر CDP. استخدم برنامج chromedriver الذي لم يتم اكتشافه للمواقع التي تتمتع باكتشاف قوي للروبوتات.
هل يجب علي استخدام وضع مقطوعة الرأس؟
تكتشف بعض المواقع المتصفحات مقطوعة الرأس وترفض الرموز المميزة. جرب وضع الرأس أولاً، ثم قم بالتبديل إلى وضع بدون رأس مع الأعلام المناسبة إذا كان يعمل.
النقاشات (0)
شارك في النقاش
سجّل الدخول لمشاركة رأيك.
تسجيل الدخوللا توجد تعليقات بعد.