استكشاف الأخطاء

لماذا يُرجع reCAPTCHA v3 نقاطًا منخفضة

الدرجة المنخفضة في reCAPTCHA v3 ليست خللاً في مفتاح الـ API؛ إنها حكم أصدرته Google على الجلسة كلها قبل أن يصل طلبك إلى الخادم. وفي أغلب الحالات يعود السبب إلى ثلاثة عوامل: عنوان IP يتبع مركز بيانات، جلسة متصفح بلا تاريخ ولا إشارات سلوكية، وقيمة action لا تطابق ما ينتظره الموقع.

ويزيد التشخيص صعوبةً أن الفشل صامت: لا نافذة تحدٍّ ولا رسالة خطأ، بل نموذج يُرفض وكأن البيانات خاطئة. والترتيب أدناه يبدأ من العامل الأكبر أثراً في الدرجة.


فحص سريع قبل تعديل أي سطر في الكود

  1. اقرأ الرقم الحقيقي: الدرجة تصل في استجابة siteverify داخل حقل score، ولا تظهر في المتصفح.
  2. أعد تنفيذ السيناريو يدوياً من متصفح عادي وشبكة منزلية؛ إذا نجح فالمشكلة في بيئة التشغيل لا في الموقع.
  3. قارن قيمة action التي ترسلها بما يستدعيه الموقع فعلاً في grecaptcha.execute().
  4. تأكد أن مفتاح الموقع الذي استخرجته يخص v3، لا مفتاح v2 في الصفحة نفسها.

الأسباب مرتّبة حسب أثرها في الدرجة

1. سمعة عنوان IP والشبكة الخارجة منها

تحتفظ Google بسجل سمعة لكل نطاق عناوين. عناوين مراكز البيانات، والاستضافة السحابية المشتركة، والوكلاء المفرط استخدامهم يحصلون على درجات أدنى مهما كان سلوك المتصفح مثالياً.

الإصلاح:

  • استخدم وكلاء سكنيين أو وكلاء مزودي خدمة الإنترنت بدل نطاقات مراكز البيانات
  • وزّع التنفيذ على عناوين متعددة بدل تكديس الطلبات على عنوان واحد
  • ابتعد عن قوائم البروكسي المجانية؛ سمعتها محروقة سلفاً

2. متصفح بلا تاريخ ولا إشارات سلوكية

المتصفح الذي يعمل بوضع headless وبإعدادات افتراضية يرسل حزمة إشارات ناقصة: لا حركة مؤشر، لا تمرير، لا إيقاع كتابة، وأحياناً navigator.webdriver مكشوف أو خصائص chrome.runtime غير متسقة.

الإصلاح:

  • شغّل مثيل متصفح حقيقي متى أمكن، أو استعن بإضافات مثل puppeteer-extra-plugin-stealth
  • أدخل حركة مؤشر وتمريراً واقعيين قبل استدعاء التنفيذ
  • اضبط مقاس إطار العرض وسلسلة User-Agent على قيم متسقة مع بقية البصمة

وللتفصيل السلوكي: رفع الدرجة السلوكية داخل بيئات اختبار تملكها.

3. غياب ملفات تعريف الارتباط الخاصة بـ Google

الجلسات التي تحمل ملفات تعريف ارتباط حساب Google — NID وSID وHSID — تميل إلى درجات أعلى، لأن خلفها تاريخ تصفح حقيقي. أما ملف التعريف النظيف فيبدو للنموذج وكأنه وُلد قبل ثانية.

الإصلاح: شغّل ملف تعريف ثابتاً يحمل جلسة Google قائمة، أو مُرّ على خدمات Google قبل الصفحة المستهدفة.

4. قيمة action غير مطابقة

كل استدعاء لـ grecaptcha.execute() يحمل سلسلة action مضمّنة في الرمز الناتج. إذا أرسلت login بينما ينتظر الموقع submit_form، فالرمز صالح تقنياً لكنه يُرفض عند التحقق.

الإصلاح: افحص مصدر الصفحة أو تبويب الشبكة في DevTools، واستخرج قيمة action الحرفية ومرّرها كما هي في طلب الـ API.

5. وتيرة الطلبات من الجلسة نفسها

الاستدعاءات المتلاحقة من الجلسة ذاتها تخفض الدرجة في كل نداء لاحق؛ النموذج يقرأ الدفعة السريعة كنمط آلي حتى لو كانت بقية الإشارات سليمة.

الإصلاح:

  • اترك 15-30 ثانية على الأقل بين الطلبات
  • دوّر الجلسات وملفات تعريف المتصفح بدل ملف واحد طوال التشغيل

6. رمز انتهت صلاحيته قبل الإرسال

صلاحية رمز reCAPTCHA v3 دقيقتان، ولمرة واحدة. إن طال ما بين توليد الرمز وإرسال النموذج، رُفض بصرف النظر عن الدرجة التي حملها.

الإصلاح: اطلب الرمز مباشرة قبل الإرسال، لا أثناء تحميل الصفحة ولا من قائمة انتظار.


الإشارات التي يقرأها النموذج قبل إعطاء الدرجة

فئة الإشارة ما الذي يُقاس
حركة المؤشر مسارات طبيعية، تسارع، وقفات قصيرة
التمرير نمط تمرير الصفحة وعمقه
إيقاع الكتابة توقيت ضغطات المفاتيح والفواصل بينها
بصمة المتصفح Canvas، WebGL، الخطوط، الإضافات
الجلسة وملفات تعريف الارتباط ملفات Google، تاريخ التصفح
سمعة عنوان IP مركز بيانات مقابل اتصال سكني، سجل الإساءة
زمن التفاعل المدة على الصفحة قبل تشغيل الإجراء

لا إشارة واحدة حاسمة؛ الدرجة تجميعية، ولهذا نادراً ما يكفي إصلاح عنصر واحد.


مثال تشغيلي: اختبارات ليلية لمتجر إلكتروني

فريق QA في متجر إلكتروني بالرياض يشغّل اختبارات قبول ليلية على نموذج تسجيل الدخول في بيئته الخاصة: تمر نهاراً وتفشل بعد منتصف الليل. السبب لم يكن الموقع، بل نافذة تشغيل تكدّس أكثر من 300 محاولة من عنوان IP واحد في منطقة سحابية أوروبية، بينما جمهور المتجر وشبكاته محلية.

بعد توزيع التنفيذ على وكلاء سكنيين إقليميين، وفاصل 20-30 ثانية بين المحاولات، وملف تعريف متصفح ثابت بدل ملف نظيف كل دورة، عادت الدرجات فوق عتبة الموقع البالغة 0.5. والفوترة في CaptchaAI على عدد الـ threads المتزامنة لا على عدد عمليات الحل: خطة ADVANCE بسعر $90 شهرياً مع 50 thread تكفي لهذه الدفعات بالتوازي.


حل reCAPTCHA v3 عبر CaptchaAI

يحل CaptchaAI اختبار reCAPTCHA v3 من بيئات متصفح حقيقية، وينتج رموزاً تسجّل عادةً 0.3؛ وهو ما يكفي لمعظم المواقع لا لمن يضع عتبة أعلى. الدرجة تحددها Google، والخدمة تعيدها كما هي.

import requests
import time

response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "version": "v3",
    "googlekey": "SITE_KEY",
    "action": "login",
    "pageurl": "https://example.com/login",
    "json": 1
})

task_id = response.json()["request"]

for _ in range(30):
    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"]
        print(f"Token received: {token[:50]}...")
        break
const axios = require('axios');

async function solveV3(sitekey, pageurl, action) {
  const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
    params: {
      key: 'YOUR_API_KEY', method: 'userrecaptcha', version: 'v3',
      googlekey: sitekey, action, pageurl, json: 1
    }
  });

  const taskId = data.request;
  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
    });
    if (res.data.status === 1) return res.data.request;
  }
  throw new Error('Timeout');
}

قائمة تحقق سريعة

الفحص الإجراء
قيمة action مطابقة؟ قارنها باستدعاء grecaptcha.execute() في مصدر الصفحة
الرمز حديث؟ استخدمه خلال دقيقتين من توليده
نوع عنوان IP؟ انتقل إلى وكيل سكني
إشارات المتصفح؟ فعّل الإضافات المناسبة وصحّح علامة webdriver
وتيرة الطلبات؟ فاصل 15-30 ثانية بين عمليات الحل
ملفات ارتباط Google؟ ملف تعريف يحمل جلسة Google
مفتاح الموقع صحيح؟ مفتاح v3 لا مفتاح v2

أسئلة شائعة

أين أرى الدرجة التي حصلت عليها فعلاً؟

الدرجة لا تظهر في المتصفح؛ تصل إلى خادم الموقع في استجابة siteverify ضمن الحقلين score وaction. إن كنت تختبر موقعاً تملكه، سجّل الحقلين مؤقتاً لتعمل على أرقام لا تخمين؛ ومع موقع طرف ثالث يبقى دليلك نمط الرفض.

هل يختلف السلوك في reCAPTCHA v3 Enterprise؟

نموذج التقييم واحد، لكن Enterprise يمنح مالك الموقع تحكماً أدق: عتبات وقواعد منفصلة لكل action. لذلك قد يُقبل الرمز في مسار ويُرفض في آخر. ويدعم CaptchaAI reCAPTCHA v3 وv3 Enterprise.

غيّرت الوكيل فقط ولم تتحسن الدرجة — لماذا؟

لأن الدرجة تجميعية: تغيير عنصر واحد مع بقاء البصمة والسلوك قد يجعل التركيبة أقل اتساقاً — فعنوان سكني في الرياض مع لغة متصفح وتوقيت جهاز لا يطابقانه تناقضٌ بحد ذاته. عالج الطبقات الثلاث معاً: الشبكة، والبصمة، والسلوك.

كم تدوم صلاحية الرمز، وهل يمكن إعادة استخدامه؟

دقيقتان فقط، ولمرة واحدة. لا تولّد الرموز مسبقاً ولا تضعها في قائمة انتظار؛ اجعل طلب الرمز آخر خطوة قبل الإرسال.

هل يؤثر موقع الخادم الجغرافي في النتيجة؟

بشكل غير مباشر، نعم. نطاق مركز بيانات مزدحم في منطقة بعيدة عن جمهور الموقع يضعف سمعة العنوان ويجعل النمط شاذاً. أما شبكة إقليمية قريبة من المستخدمين الحقيقيين فتعطي نتائج أفضل.


أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.