لحلّ reCAPTCHA الخفي (Invisible) عبر CaptchaAI API تكفي إضافتان فوق تدفّق reCAPTCHA v2 المعتاد: مرّر invisible=1 عند إرسال المهمة، ثم احقن الرمز الناتج عبر دالة رد النداء (Callback) بدل وضعه في حقل مخفي. أما بقية المسار فمطابقة للإصدار القياسي: اكتشاف الأداة، إرسال المهمة، استطلاع النتيجة، ثم تمرير الرمز إلى الصفحة.
يختلف الإصدار الخفي في أنه لا يعرض مربع اختيار؛ فهو يعمل في الخلفية لحظة نقر المستخدم على زر أو إرساله نموذجاً، ولا تتابع الصفحة إلا بعد التحقق من الرمز. لذلك يتركّز التحدي الحقيقي في كيفية إدخال الرمز: معظم التطبيقات الخفية تستدعي دالة رد نداء بدل ملء الحقل المخفي g-recaptcha-response مباشرةً، وعليك أن تعثر على هذه الدالة وتستدعيها بنفسك.
غير متأكد أهو الإصدار الخفي أم reCAPTCHA v2 القياسي؟ راجع الفرق بين reCAPTCHA v2 والإصدار الخفي لمعرفة علامات التمييز بينهما.
ما الذي يميّز reCAPTCHA الخفي عن الإصدار المرئي
الفرق بينهما يتلخّص في سطرين:
- المرئي: مربع اختيار ظاهر وحقل
g-recaptcha-responseتملؤه بالرمز ثم ترسل النموذج. - الخفي: لا مربع أصلاً؛ يُطلَق التحدي برمجياً عبر
grecaptcha.execute()أو يُربط بحدث النقر، وتتولّى دالة رد النداء استلام الرمز وإكمال الإرسال.
هذا الفرق مهم عملياً: حقن الرمز في حقل نصي وحده قد لا يكفي، فإن كانت الصفحة تنتظر رد نداء محدداً فلن يتقدّم النموذج حتى تستدعي تلك الدالة بالرمز الصحيح. لهذا نخصّص لها الخطوة 4 كاملةً، فهي مصدر معظم حالات «تم الحل لكن الصفحة لم تتفاعل».
مثال تطبيقي من واقع السوق
تخيّل فريقاً يبني اختبارات جودة آلية لبوابة تسجيل في متجر إلكتروني خليجي، يحمي نموذج «إنشاء حساب» فيه reCAPTCHA خفي يُطلَق عند الضغط على الزر. بدل توقّف الاختبارات عند كل تحدٍّ، يطلب السكربت الرمز من CaptchaAI ثم يحقنه عبر رد النداء نفسه الذي يستدعيه الزر، فيتابع النموذج كأن مستخدماً حقيقياً أكمله.
وإذا شغّل الفريق عشرات جلسات التسجيل بالتوازي — كاختبار حملة تسجيل في موسم ذروة — فإن احتساب CaptchaAI على أساس عدد الـ Threads المتزامنة، لا لكل عملية حل، يبقي التكلفة ثابتة ومتوقعة مهما ارتفع عدد المحاولات ضمن الخطة. الأسعار بالدولار الأمريكي وتُدار من لوحة التحكم.
ما الذي تحتاجه قبل البدء
| المتطلبات | التفاصيل |
|---|---|
| مفتاح CaptchaAI API | captchaai.com/api.php |
| مفتاح الموقع | من data-sitekey على القطعة أو الزر |
| عنوان URL للصفحة | عنوان URL الكامل حيث يتم تشغيل اختبار CAPTCHA غير المرئي |
| أداة المتصفح | Selenium/Puppeteer لتنفيذ رد النداء |
الخطوة 1: اكتشف reCAPTCHA الخفي داخل الصفحة
افحص شيفرة HTML بحثاً عن أحد هذه الأنماط الثلاثة:
<!-- Option 1: div with data-size="invisible" -->
<div class="g-recaptcha" data-sitekey="6LdKlZEU..." data-size="invisible" data-callback="onSubmit"></div>
<!-- Option 2: button with data-sitekey (invisible by default) -->
<button data-sitekey="6LdKlZEU..." data-callback="onSubmit">Submit</button>
<!-- Option 3: programmatic execution -->
<script>
grecaptcha.execute('6LdKlZEU...', {action: 'submit'});
</script>
أيّ من هذه الإشارات يعني أنك أمام reCAPTCHA خفي، لا الإصدار القياسي:
- سمة
data-size="invisible"على عنصر الأداة. - زر يحمل
data-sitekeyدون ظهور مربع اختيار. - استدعاء
grecaptcha.execute()برمجياً بلا حاوية ظاهرة.
الخطوة 2: أرسل المهمة إلى CaptchaAI مع invisible=1
أرسل مفتاح الموقع وعنوان الصفحة إلى نقطة النهاية in.php، واضبط method على userrecaptcha، ثم أضف invisible=1 لتُخبر الخدمة بأن الأداة خفية:
import requests
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "6LdKlZEUAAAAAPoxm...",
"pageurl": "https://example.com/signup",
"invisible": 1,
"json": 1
})
task_id = response.json()["request"]
والطلب نفسه في Node.js:
const params = new URLSearchParams({
key: "YOUR_API_KEY", method: "userrecaptcha",
googlekey: "6LdKlZEUAAAAAPoxm...",
pageurl: "https://example.com/signup",
invisible: 1, json: 1,
});
const res = await fetch(`https://ocr.captchaai.com/in.php?${params}`);
const { request: taskId } = await res.json();
الخطوة 3: استطلع النتيجة حتى يجهز الرمز
استعلم عن الحالة عبر res.php كل بضع ثوانٍ. الحلقة التالية تستطلع حتى 40 مرة بفاصل 5 ثوانٍ — أي نحو 200 ثانية كحدٍّ أقصى — وتخرج فور أن تصبح الحالة جاهزة أو عند ظهور خطأ:
import time
for _ in range(40):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Error: {result['request']}")
الخطوة 4: احقن الرمز عبر دالة رد النداء
هذه هي الخطوة الحاسمة. يتوقّع reCAPTCHA الخفي استدعاء دالة رد نداء، لا مجرد كتابة قيمة في حقل مخفي. يتبع الكود مسارين بالترتيب:
- استخراج اسم دالة رد النداء من
data-callback، ثم استدعاؤها بالرمز. - إن لم توجد دالة، ملء الحقل المخفي
g-recaptcha-responseوإرسال النموذج كخطة بديلة.
# Selenium example
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com/signup")
# Find the callback name
callback = driver.execute_script("""
var el = document.querySelector('[data-callback]');
if (el) return el.getAttribute('data-callback');
var btn = document.querySelector('[data-sitekey]');
if (btn) return btn.getAttribute('data-callback');
return null;
""")
# Execute the callback with the token
if callback:
driver.execute_script(f"window['{callback}']('{token}');")
else:
# Fallback: fill hidden field and submit
driver.execute_script(f"""
document.getElementById('g-recaptcha-response').innerHTML = '{token}';
document.querySelector('form').submit();
""")
والمكافئ في Puppeteer:
// Puppeteer example
await page.evaluate((token) => {
const el = document.querySelector('[data-callback]') || document.querySelector('[data-sitekey]');
const callbackName = el?.getAttribute('data-callback');
if (callbackName && window[callbackName]) {
window[callbackName](token);
} else {
document.getElementById('g-recaptcha-response').innerHTML = token;
document.querySelector('form').submit();
}
}, token);
تلميح: استدعِ رد النداء بعد ملء بقية حقول النموذج مباشرةً؛ فإطلاقه مبكراً قد يجعل الصفحة تتجاهل الإرسال رغم صحة الرمز.
الدالة الكاملة الجاهزة للنسخ
تجمع الدالة التالية الإرسال والاستطلاع ومعالجة الأخطاء في مكان واحد؛ استدعِها للحصول على الرمز ثم مرّره إلى خطوة رد النداء أعلاه:
import requests
import time
def solve_invisible_recaptcha(api_key, sitekey, page_url):
submit = requests.get("https://ocr.captchaai.com/in.php", params={
"key": api_key, "method": "userrecaptcha", "googlekey": sitekey,
"pageurl": page_url, "invisible": 1, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
for _ in range(40):
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.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result.get('request')}")
raise TimeoutError("Timed out")
token = solve_invisible_recaptcha("YOUR_API_KEY", "6LdKlZEU...", "https://example.com/signup")
المشروع الكامل الجاهز للتشغيل
هل تريد مشروعاً كاملاً يشمل إعداد البيئة والاستطلاع وإعادة المحاولة ومعالجة الأخطاء دفعة واحدة؟
يضم المستودع:
- إعداد البيئة ومتغيّرات مفتاح الـ API.
- منطق الاستطلاع مع إعادة المحاولة والمهلات.
- معالجة الأخطاء الشائعة أثناء الحل.
افتح المشروع الكامل القابل للتشغيل على GitHub ←
الأسئلة الشائعة
ما الفرق بين reCAPTCHA الخفي والإصدار v3؟
يتشابهان في غياب مربع الاختيار، لكنهما يختلفان جوهرياً:
| الجانب | reCAPTCHA v3 | reCAPTCHA الخفي |
|---|---|---|
| آلية التشغيل | درجة ثقة في الخلفية دون تدخل المستخدم | يرتبط بفعل صريح كالنقر أو الإرسال |
| ظهور تحدٍّ | لا يعرض تحدياً عادةً | قد يعرض تحدياً عند الشك |
| طريقة الحل | تعتمد على الدرجة التي تقيّمها الصفحة | invisible=1 وحقن الرمز عبر رد النداء |
خلاصةً: الخفي يُرسَل مع invisible=1 ويُحقن رمزه عبر رد النداء، لا عبر درجة تُقيّمها الصفحة.
كم يستغرق حل reCAPTCHA الخفي وكيف تُحتسب تكلفته؟
يفصل بين الوقت والتكلفة عاملان مختلفان:
- الوقت: يعتمد على الحِمل الآني للخدمة، ويستطلع السكربت النتيجة كل خمس ثوانٍ حتى تجهز.
- التكلفة: تُحتسب على أساس عدد الـ Threads المتزامنة ضمن خطتك، لا لكل عملية حل، فيبقى التشغيل عالي التوازي متوقّع الكلفة.
تابع رصيدك من لوحة التحكم بالدولار الأمريكي.
هل يمكن حل reCAPTCHA الخفي دون فتح متصفح حقيقي؟
الحصول على الرمز نفسه لا يتطلب متصفحاً؛ يكفي طلب in.php ثم استطلاع res.php. لكن حقن الرمز عبر رد النداء غالباً يحتاج إلى بيئة متصفح مثل Selenium أو Puppeteer لتشغيل دالة الصفحة، إلا إذا كانت الصفحة تقبل ملء الحقل المخفي وإرسال النموذج مباشرةً.
هل يدعم CaptchaAI نسخة Enterprise من reCAPTCHA الخفي؟
نعم. للنسخة المؤسسية اضبط طلبك كالتالي:
- أضف
enterprise=1إلى جانبinvisible=1في الطلب نفسه. - أبقِ
methodعلىuserrecaptchaدون تغيير.
وتظل بقية الخطوات — الاستطلاع وحقن رد النداء — كما هي.
لماذا يُرفض الرمز أحياناً رغم نجاح الحل؟
غالباً يعود ذلك إلى أحد هذه الأسباب:
- نسيان
invisible=1، فتُعامَل المهمة كإصدار قياسي. - عدم تطابق
pageurlمع الصفحة الفعلية. - استدعاء رد نداء بالاسم الخطأ.
تأكد من مطابقة عنوان الصفحة ومفتاح الموقع، ومن استدعاء الدالة الصحيحة بعد ملء بقية حقول النموذج.
ابدأ بحل reCAPTCHA الخفي الآن
أنشئ مفتاح الـ API من captchaai.com/api.php، أضف invisible=1 إلى شيفرة حل v2 لديك، ثم طبّق نمط حقن رد النداء الموضّح أعلاه لتنتقل من أول محاولة إلى تدفّق ثابت.
وللتلخيص في ثلاث خطوات:
- مرّر
invisible=1عند إرسال المهمة. - استطلع
res.phpحتى يجهز الرمز. - احقن الرمز عبر دالة رد النداء.