عندما يكمل المستخدم تحدي reCAPTCHA v2، تستدعي Google وظيفة رد اتصال JavaScript التي يحددها الموقع. يقوم رد الاتصال هذا عادةً بتمكين زر إرسال أو التحقق من صحة النموذج أو إرسال طلب AJAX. بعد إدخال رمز مميز تم حله من CaptchaAI، تحتاج إلى تشغيل نفس رد الاتصال - وإلا فلن يتعرف النموذج على أن اختبار CAPTCHA قد تم حله.
كيف تعمل عمليات الاسترجاعات
يحدد الموقع رد اتصال في أداة reCAPTCHA:
<div class="g-recaptcha"
data-sitekey="6Le-SITEKEY"
data-callback="onCaptchaSuccess"
data-expired-callback="onCaptchaExpired">
</div>
<script>
function onCaptchaSuccess(token) {
document.getElementById('submit-btn').disabled = false;
document.getElementById('captcha-token').value = token;
}
</script>
عندما يقوم المستخدم بحل اختبار CAPTCHA، يستدعي JavaScript من Google onCaptchaSuccess(token). تتلقى الدالة سلسلة الرمز المميز كوسيطة فقط لها.
العثور على وظيفة رد الاتصال
الطريقة الأولى: التحقق من سمة رد اتصال البيانات
// In browser console
const widget = document.querySelector('.g-recaptcha');
const callbackName = widget?.getAttribute('data-callback');
console.log('Callback:', callbackName);
الطريقة الثانية: التحقق من الأجزاء الداخلية لـ grecaptcha
تستخدم بعض المواقع grecaptcha.render() مع خيار رد الاتصال بدلاً من السمة data-callback:
// Search page source for grecaptcha.render
document.querySelectorAll('script:not([src])').forEach(s => {
if (s.textContent.includes('grecaptcha.render')) {
console.log(s.textContent.match(/callback\s*:\s*(\w+)/)?.[1]);
}
});
الطريقة الثالثة: اعتراض تسجيل رد الاتصال
قم بتشغيل هذا في DevTools قبل تحميل الصفحة (المصادر → Snippets):
const origRender = grecaptcha.render;
grecaptcha.render = function(container, params) {
console.log('Render callback:', params.callback);
console.log('Expired callback:', params['expired-callback']);
return origRender.apply(this, arguments);
};
تشغيل رد الاتصال بعد حقن الرمز المميز
بايثون (السيلينيوم)
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
API_KEY = "YOUR_API_KEY"
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# Extract sitekey and callback
sitekey = driver.find_element(
By.CSS_SELECTOR, ".g-recaptcha"
).get_attribute("data-sitekey")
callback = driver.find_element(
By.CSS_SELECTOR, ".g-recaptcha"
).get_attribute("data-callback")
# Solve with CaptchaAI
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": driver.current_url,
"json": "1",
}).json()
task_id = resp["request"]
token = None
for _ in range(24):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": "1"
}).json()
if result["status"] == 1:
token = result["request"]
break
# Inject token into textarea
driver.execute_script("""
document.querySelector('textarea[name="g-recaptcha-response"]').value = arguments[0];
""", token)
# Trigger the callback
if callback:
driver.execute_script(f"window['{callback}'](arguments[0]);", token)
print(f"Triggered callback: {callback}")
else:
# Fallback: try ___grecaptcha_cfg
driver.execute_script("""
try {
var widgetId = Object.keys(___grecaptcha_cfg.clients)[0];
var callback = ___grecaptcha_cfg.clients[widgetId].aa.l.callback;
if (typeof callback === 'function') callback(arguments[0]);
} catch(e) {}
""", token)
print("Triggered callback via ___grecaptcha_cfg")
JavaScript (Puppeteer)
const puppeteer = require('puppeteer');
// After solving and getting the token...
await page.evaluate((token, callbackName) => {
// Set textarea value
const textarea = document.querySelector(
'textarea[name="g-recaptcha-response"]'
);
textarea.value = token;
textarea.style.display = 'block'; // sometimes hidden
// Trigger callback
if (callbackName && typeof window[callbackName] === 'function') {
window[callbackName](token);
console.log(`Called ${callbackName}()`);
} else {
// Fallback: search grecaptcha config
try {
const clients = ___grecaptcha_cfg.clients;
const widgetId = Object.keys(clients)[0];
const cb = clients[widgetId]?.aa?.l?.callback;
if (typeof cb === 'function') cb(token);
} catch (e) {}
}
}, token, callbackName);
المواقع دون رد الاتصال بالبيانات
بعض المواقع لا تستخدم رد الاتصال. بدلاً من ذلك، يقومون بالتحقق من grecaptcha.getResponse() عند إرسال النموذج. بالنسبة لهذه المواقع، قم بتجاوز الوظيفة:
driver.execute_script("""
const token = arguments[0];
document.querySelector('textarea[name="g-recaptcha-response"]').value = token;
// Override getResponse to return the token
if (typeof grecaptcha !== 'undefined') {
grecaptcha.getResponse = function() { return token; };
}
""", token)
# Then submit the form normally
driver.find_element(By.CSS_SELECTOR, "form").submit()
عمليات الاسترجاعات منتهية الصلاحية
تحدد بعض المواقع data-expired-callback لتعطيل زر الإرسال عند انتهاء صلاحية الرمز المميز. إذا كان الرمز المميز الخاص بك على وشك انتهاء الصلاحية، فقد يتم تشغيل رد الاتصال هذا وإعادة قفل النموذج. حل بالقرب من وقت التقديم لتجنب ذلك.
// Check for expired callback
const expiredCallback = document.querySelector('.g-recaptcha')
?.getAttribute('data-expired-callback');
console.log('Expired callback:', expiredCallback);
استكشاف الأخطاء وإصلاحها
| مشكلة | السبب | إصلاح |
|---|---|---|
| لا يزال النموذج معطلاً بعد الحقن | لم يتم تشغيل رد الاتصال | ابحث عن وظيفة رد الاتصال واستدعها |
ReferenceError: function not defined |
رد الاتصال المحدد في الإغلاق | استخدم ___grecaptcha_cfg الاحتياطي |
| تم إدخال الرمز ولكن لم يتم إرسال AJAX | يؤدي رد الاتصال إلى تشغيل AJAX، وليس إرسال النموذج | تحقق مما تفعله وظيفة رد الاتصال |
| تم قبول الرمز المميز ولكن الصفحة تظهر خطأ | انتهت صلاحية الرمز المميز قبل رد الاتصال | حل أقرب إلى وقت التقديم |
الأسئلة الشائعة
ماذا لو لم يكن هناك رد اتصال على الإطلاق؟
تتحقق بعض المواقع من الرمز المميز الموجود على جانب الخادم فقط عند إرسال النموذج. في هذه الحالة، يكفي تعيين قيمة منطقة النص g-recaptcha-response وإرسال النموذج.
هل يمكن تغيير اسم وظيفة رد الاتصال بين عمليات تحميل الصفحة؟
نعم في بعض المواقع قم دائمًا باستخراج اسم رد الاتصال ديناميكيًا من DOM بدلاً من ترميزه بشكل ثابت.
هل يستخدم reCAPTCHA v3 نفس آلية رد الاتصال؟
لا، يستخدم reCAPTCHA v3 grecaptcha.execute() الذي يُرجع وعدًا. لا توجد أداة مرئية أو سمة data-callback.
قم بحل reCAPTCHA v2 باستخدام معالجة رد الاتصال المناسبة باستخدام CaptchaAI
احصل على مفتاح API الخاص بك علىcaptchaai.com.