الشروحات المعمقة

عوامل نتيجة اختبار reCAPTCHA: التحليل الفني الكامل

السكربت نفسه قد يحصل على 0.9 حين يعمل من متصفحك على جهازك، ثم يهبط إلى 0.1 حين ترفعه إلى خادم VPS في فرانكفورت دون تغيير سطر واحد من الكود. السبب أن reCAPTCHA v3 لا تقيّم الكود، بل تقيّم الجلسة كاملة: من أين جاء الطلب، وكيف تصرّف المتصفح داخل الصفحة، وما تاريخ ملف المتصفح هذا مع Google.

محرك Advanced Risk Analysis — أو ARA — يجمع عشرات الإشارات ويُخرج رقماً واحداً بين 0.0 لروبوت شبه مؤكد و1.0 لإنسان شبه مؤكد، وعلى أساسه يقرر الموقع: مرور صامت، أو مربع اختيار، أو شبكة صور، أو رفض مباشر. لا تنشر Google الخوارزمية، لكن سنوات من الاختبار المقارن حدّدت العائلات الخمس التي تحرّك الرقم وحجم أثر كل منها تقريبياً.

كيف تتكوّن الدرجة: خمس عائلات من الإشارات

يمكن اختصار ما يفعله ARA بهذه الصيغة المبسّطة:

Final Score = f(Browser Signals, Behavioral Signals, Network Signals, 
                History Signals, Environmental Signals)

العائلات الخمس لا تتساوى في الوزن:

  • الإشارات السلوكية — الوزن الأعلى: حركة المؤشر وإيقاع الكتابة والتمرير.
  • إشارات المتصفح — وزن مرتفع: واجهات JavaScript والبصمة الرسومية.
  • إشارات الشبكة — وزن متوسط إلى مرتفع: سمعة عنوان IP وبصمة TLS والرؤوس.
  • إشارات التاريخ — وزن متوسط: جلسة Google وملفات تعريف الارتباط السابقة.
  • الإشارات البيئية — وزن منخفض إلى متوسط: المنطقة الزمنية والأبعاد والبطارية.

والقاعدة التي تحكم كل ما يلي: التناقض بين إشارتين يكلّفك أكثر من نقص إشارة واحدة.

سمعة عنوان IP: أسرع طريقة لخسارة نصف الدرجة

تحتفظ Google بقاعدة سمعة لكل عنوان IP تُبنى من:

  • نتائج تحديات reCAPTCHA السابقة الصادرة من العنوان نفسه
  • نطاقات مراكز البيانات المعروفة — AWS وGCP وAzure وDigitalOcean وغيرها
  • نطاقات مزوّدي الخوادم الوسيطة وشبكات VPN المعروفة
  • بلاغات إساءة الاستخدام المسجّلة على العنوان
  • إشارات الاحتيال في البحث والإعلانات
نوع عنوان IP التأثير المعتاد على الدرجة
سكني بسجل نظيف محايد إلى +0.1
سكني بسجل إساءة محدود -0.1 إلى -0.2
مركز بيانات -0.3 إلى -0.5
خادم وسيط أو VPN معروف -0.2 إلى -0.4
عقدة خروج Tor -0.4 إلى -0.6
عنوان مُبلّغ عنه حديثاً -0.3 إلى -0.6

مثال من السوق العربي: فريق في القاهرة أو الرياض يختبر بوابة دفع محلية عبر سكربت QA يعمل من خادم VPS في فرانكفورت — الخيار المعتاد لتقليل الكلفة. المتصفح يرسل Accept-Language: ar-EG والمنطقة الزمنية Africa/Cairo، بينما عنوان IP مسجّل في مركز بيانات ألماني. هنا يجتمع خصمان: خصم نطاق مركز البيانات، وخصم التناقض بين اللغة والمنطقة الزمنية والموقع الجغرافي. الحل ليس في الكود بل في البنية: وكيل سكني داخل البلد المستهدف، ثم ضبط اللغة والمنطقة الزمنية على ما يعلنه ذلك العنوان.

بصمة الاتصال: TLS ورؤوس HTTP

تكشف مصافحة TLS مجموعات التشفير والامتدادات التي يدعمها العميل، ولكل عميل بصمة مميزة تُعرف باسم JA3 أو JA4:

  • Chrome — ترتيب تشفير محدد، وTLS 1.3، وامتدادات GREASE.
  • مكتبة requests في Python — ترتيب مختلف، بلا GREASE، وقائمة امتدادات أبسط.
  • curl — الحد الأدنى من الامتدادات، وأنماط خاصة بـ OpenSSL.

وبصمة TLS التي لا تنتمي إلى متصفح حقيقي تخصم من 0.2 إلى 0.4، وتُقرأ قبل أن يصل الطلب إلى الصفحة أصلاً.

أما الرؤوس التي يفحصها خادم reCAPTCHA في الطلب الوارد فأربعة أساسية:

  • User-Agent — يطابق إصداراً حقيقياً منشوراً؛ الإصدارات القديمة ومعرّفات أدوات الأتمتة إشارة سلبية.
  • Accept-Language — تفضيلات محلية مثل ar-EG,ar;q=0.9,en;q=0.8؛ غيابه أو كونه عاماً يخصم.
  • Accept-Encoding — القيمة المتوقعة gzip, deflate, br.
  • Sec-CH-UA — تلميحات عميل متطابقة مع المتصفح المُعلن؛ غيابها نمط ما قبل 2022.

بصمة المتصفح: ما تكشفه اللوحة القماشية وWebGL

بصمة Canvas

يرسم reCAPTCHA عناصر canvas مخفية ثم يعيد قراءة بيانات البكسل، والناتج بصمة تكاد تكون فريدة لكل تركيبة متصفح ونظام تشغيل وبطاقة رسومات:

// reCAPTCHA performs something similar to:
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.textBaseline = "top";
ctx.font = "14px 'Arial'";
ctx.fillText("Hello", 2, 2);
const fingerprint = canvas.toDataURL();

كيف تُقرأ النتيجة:

  • بصمة متسقة مع المتصفح ونظام التشغيل المعلنَين — محايدة
  • بصمة تطابق نمطاً معروفاً للتشغيل بلا واجهة رسومية — من -0.3 إلى -0.5
  • عمليات canvas محجوبة أو تعيد بيانات موحّدة — من -0.4 إلى -0.6

وحجب البصمة أسوأ من تركها: الحجب نفسه إشارة نادرة بين المستخدمين العاديين.

عارض WebGL

سلسلة العارض في WebGL تكشف بطاقة الرسومات المستخدمة:

const gl = document.createElement('canvas').getContext('webgl');
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
// Expected: "ANGLE (NVIDIA GeForce GTX 1060...)"
// Headless: "SwiftShader" or "Google SwiftShader"

ظهور SwiftShader — عارض Google البرمجي المستخدم في Chrome بلا واجهة رسومية — مؤشر قوي على الأتمتة، ويخفض الدرجة بين 0.3 و0.5. وهو ما يكشف معظم الحاويات العاملة على خوادم بلا بطاقة رسومات.

واجهات JavaScript التي تكشف التشغيل بلا واجهة

يستعلم reCAPTCHA عن واجهات تفتقر إليها المتصفحات بلا واجهة رسومية أو تنفّذها بشكل مختلف:

الواجهة المفحوصة القيمة المتوقعة في متصفح حقيقي ما يظهر عند التشغيل بلا واجهة
navigator.webdriver undefined أو false true مع Selenium وPuppeteer
navigator.plugins PluginArray بعنصر واحد أو أكثر فارغة أو غائبة
navigator.languages مصفوفة بسلاسل لغة محلية مصفوفة فارغة أو غائبة
navigator.hardwareConcurrency من 2 إلى 16 بما يطابق المعالج صفر أحياناً أو غير معرّفة
navigator.deviceMemory من 2 إلى 16 جيجابايت غائبة في بعض البيئات
window.chrome كائن يحوي runtime وغيره غائب في Chrome بلا واجهة
Notification.permission default أو granted أو denied تُطلق خطأً أو غائبة

القيم المفقودة أو غير المنطقية في هذه الواجهات وحدها قد تخصم من 0.3 إلى 0.5 نقطة.

السلوك داخل الصفحة: أثقل إشارة في المعادلة

يبدأ جمع الإشارات السلوكية من لحظة تحميل الصفحة لا من لحظة إرسال النموذج، ولهذه العائلة الوزن الأعلى.

إيقاع لوحة المفاتيح

Inter-key timing:
  Human: Variable (50-300ms between keys, varies by key pair)
  Bot: Constant (all keys at same interval, or instant paste)

Key events:
  Human: keydown → keypress → keyup for each character
  Bot: May skip keypress, or fire all events simultaneously

Corrections:
  Human: Occasional backspace, re-typing
  Bot: Perfect input without corrections

الإدخال الفوري للنص — عبر الحافظة أو بتعيين قيمة الحقل من JavaScript مباشرة — يخفض الدرجة بين 0.1 و0.2، لأن الإيقاع الثابت تماماً بين الحروف لا يشبه أي كتابة بشرية.

حركة المؤشر

يسجّل reCAPTCHA إحداثيات المؤشر وطوابعها الزمنية طوال الزيارة، والفارق واضح في خمسة أوجه:

  • عدد الأحداث — الإنسان: من 50 إلى أكثر من 500 حدث لكل زيارة؛ السكربت: من 0 إلى 5.
  • المسار — الإنسان: منحنيات بسرعات متغيرة؛ السكربت: خطوط مستقيمة بسرعة ثابتة.
  • التسارع — الإنسان: تسارع وتباطؤ طبيعيان؛ السكربت: بدء وتوقف لحظيان.
  • الحركات الدقيقة — الإنسان: اهتزاز بسيط أثناء التحويم؛ السكربت: سكون تام بين الإجراءات.
  • تجاوز الهدف — الإنسان: يتخطى الهدف قليلاً ثم يصحّح؛ السكربت: إصابة دقيقة في المنتصف.

غياب حركة المؤشر تماماً يخصم بين 0.4 و0.7، وهو أكبر خصم منفرد في القائمة كلها.

التمرير وترتيب التفاعل

  • التمرير — الإنسان يمرّر تدريجياً بزخم وسرعة متغيرة ويتوقف للقراءة؛ السكربت لا يمرّر أو يقفز إلى منطقة النموذج. غياب أحداث التمرير قبل النموذج يخصم من 0.2 إلى 0.3.
  • ترتيب العناصر — الإنسان ينقر في أنحاء الصفحة ويحوم فوق الروابط ويقرأ قبل التعبئة؛ السكربت يقصد الحقول مباشرة ثم يرسل. هذا النمط يخصم من 0.1 إلى 0.3.

إشارات التاريخ: ما تعرفه Google قبل فتح الصفحة

جلسة حساب Google

المستخدم المسجّل دخوله في حساب Google وله سجل تصفح يبدأ من درجة أعلى:

  • وجود ملفات SID وHSID وSSID يعني جلسة Google نشطة
  • غياب ملفات Google كلياً يعني مستخدماً مجهولاً ودرجة بداية أدنى

الجلسة النشطة ترفع الدرجة بين 0.1 و0.3.

ملفات تعريف الارتباط الخاصة بـ reCAPTCHA

يضع reCAPTCHA ملفاته بعد كل تحدٍّ يُحل بنجاح:

  • _GRECAPTCHA — أثر حل ناجح سابق
  • rc::a وrc::b وrc::c — بيانات تحليل المخاطر

الجلسة الجديدة الخالية من هذه الملفات تبدأ أدنى بمقدار 0.1 إلى 0.2، لذا يفيد الاحتفاظ بملف تعريف المتصفح بين عمليات التشغيل بدل جلسة نظيفة في كل مرة.

السمعة عبر المواقع

تتابع Google سلوك reCAPTCHA عبر كل المواقع التي يزورها ملف المتصفح نفسه؛ السلوك السليم على موقع "أ" يرفع الدرجة في موقع "ب"، والعكس صحيح.

الإشارات البيئية: الاتساق قبل كل شيء

المنطقة الزمنية مقابل الموقع الجغرافي

const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
// Should match IP geolocation
// "America/New_York" with a New York IP → consistent
// "America/New_York" with a Tokyo IP → suspicious

المنطقة الزمنية المعلَنة يجب أن تتسق مع الموقع الجغرافي لعنوان IP. متصفح يعلن Asia/Riyadh من مركز بيانات أوروبي تناقض صريح، وإصلاحه مجاني: اضبط المنطقة الزمنية واللغة على بلد الوكيل المستخدم.

أبعاد الشاشة والنافذة

screen.width, screen.height       // Physical screen
window.innerWidth, innerHeight    // Browser window
window.outerWidth, outerHeight    // Including browser chrome

الأبعاد غير الواقعية — 0×0، أو ضخمة على غير المعتاد، أو مطابقة تماماً للقيمة الافتراضية في كل تشغيل — تخصم من 0.1 إلى 0.2.

حالة البطارية

navigator.getBattery().then(battery => {
    battery.level;    // 0.0 to 1.0
    battery.charging; // true/false
});

واجهة البطارية إشارة ثانوية لا أكثر: جهاز يبلّغ دائماً عن شحن مكتمل واتصال بالتيار يتسق مع بيئة تطوير مكتبية أكثر من هاتف حقيقي.

ما الذي يرفع الدرجة فعلاً — وبأي كلفة

الأرقام التالية تستند إلى بيانات مرصودة وتقارير مستخدمين. قد تختلف النتائج بحسب بيئة التشغيل والحجم والتوقيت.

الإجراء الأثر المتوقع الصعوبة
تشغيل Chrome حقيقي بدل الوضع بلا واجهة +0.3 إلى +0.5 منخفضة
إزالة علامة navigator.webdriver +0.2 إلى +0.3 منخفضة
محاكاة حركة المؤشر داخل الصفحة +0.2 إلى +0.4 متوسطة
استخدام عناوين IP سكنية +0.2 إلى +0.3 منخفضة تقنياً، مرتفعة الكلفة
الاحتفاظ بملفات Google بين الجلسات +0.1 إلى +0.2 متوسطة
مطابقة بصمة TLS مع Chrome +0.1 إلى +0.3 مرتفعة
محاكاة استكشاف الصفحة قبل النموذج +0.1 إلى +0.2 متوسطة

ترتيب التنفيذ المنطقي، من الأعلى عائداً إلى الأقل:

  1. شغّل Chrome بواجهة رسومية حقيقية.
  2. أزل علامة navigator.webdriver.
  3. مرّر الطلبات عبر وكيل سكني في بلد الجمهور المستهدف.
  4. أضف حركة مؤشر وتمريراً قبل لمس أي حقل.
  5. احتفظ بملف تعريف المتصفح بين عمليات التشغيل.

البديل: اطلب رمزاً جاهزاً من CaptchaAI

بدل ضبط خمس عائلات من الإشارات وصيانتها مع كل تحديث، يمكنك إرسال المهمة إلى CaptchaAI واستلام قيمة g-recaptcha-response صالحة لوضعها في النموذج:

import requests
import time

API_KEY = "YOUR_API_KEY"

# Request a high-score token
submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": "6LcR_RsTAAAAAN_r0GEkGBfq3L7KmU5JbPHJtwNp",
    "pageurl": "https://example.com/login",
    "version": "v3",
    "action": "login",
    "json": 1,
})

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

for _ in range(60):
    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:
        token = result["request"]
        print(f"High-score token received")
        break

المهمة تُرسل إلى in.php، ثم تُستطلع النتيجة من res.php كل بضع ثوانٍ حتى تعود الحالة 1 ومعها الرمز. ويجب أن يطابق action المُرسل الإجراء المستخدم في الصفحة نفسها. بيئة الحل مضبوطة أصلاً على مستوى المتصفح والسلوك والشبكة، ويمكنك رفع الدرجة العائدة بإرفاق cookies من جلسة مُسخّنة وuserAgent واقعي وproxy سكني.

التسعير قائم على الـ threads لا على عدد عمليات الحل: خطة BASIC عند $15 شهرياً مع 5 threads، وخطة ADVANCE عند $90 شهرياً مع 50 thread، وكل خطة تشمل عدداً غير محدود من عمليات الحل خلال الشهر.

أسئلة شائعة

هل يمكن طلب درجة محددة من CaptchaAI API؟

لا توجد معلمة score-target أو ما يعادلها، لأن الدرجة تصدر عن Google لا عن مزوّد الحل. ما تتحكم فيه هو الإشارات المرفقة بالطلب: cookies وuserAgent وproxy.

لماذا تنخفض الدرجة عند التشغيل من خادم سحابي رغم نجاح السكربت محلياً؟

لأن نطاقات مراكز البيانات مصنّفة مسبقاً لدى Google، فيبدأ الخصم — من 0.3 إلى 0.5 — قبل تنفيذ أي سطر JavaScript، ويُضاف إليه غياب أي تاريخ تصفح لهذا العنوان الجديد.

هل يكفي تشغيل Chrome بواجهة رسومية لرفع الدرجة؟

يعالج ذلك عائلة واحدة فقط — إشارات المتصفح — ويعطي عادة من 0.3 إلى 0.5. لكن جلسة بلا حركة مؤشر ولا تمرير، قادمة من مركز بيانات، ستبقى منخفضة: الإشارات تتراكم ولا تعوّض إحداها الأخرى.

هل تنفع ملفات تعريف الارتباط المنسوخة من متصفح آخر؟

تنفع بشرط الاتساق. ملفات مأخوذة من جلسة على User-Agent ومنطقة زمنية وعنوان IP مختلفة تزيد احتمال التناقض بدل أن ترفع الدرجة، فاربطها دائماً بالبصمة والشبكة نفسها التي جُمعت منها.

هل تؤثر اللغة العربية أو المنطقة الزمنية المحلية على الدرجة؟

اللغة العربية ليست عاملاً سلبياً بذاتها. المهم هو الاتساق: ar-SA مع Asia/Riyadh وعنوان IP سعودي تركيبة سليمة، أما ar-SA مع عنوان أمريكي ومنطقة America/New_York فتناقض يُقرأ كإشارة خطر.

الخلاصة

الدرجة حصيلة خمس عائلات: بصمة المتصفح، والتحليل السلوكي، وسمعة الشبكة، وتاريخ ملف المتصفح مع Google، والاتساق البيئي. وأرخص المكاسب موجودة في الشبكة والمتصفح قبل أن تبدأ في محاكاة السلوك. وإذا كان سير عملك يحتاج درجات مرتفعة ومستقرة دون صيانة يومية لهذه الطبقات كلها، أرسل المهمة إلى CaptchaAI وأرفق cookies وuserAgent وproxy سكنياً مع كل طلب.

مقالات ذات صلة

أدلة ذات صلة

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