القرار الذي يتخذه reCAPTCHA — هل أنت إنسان أم روبوت؟ — يُحسم غالباً قبل أن تلمس المربع. فالنظام يجمع عشرات الإشارات من المتصفح والشبكة وحركة المؤشر منذ لحظة تحميل الصفحة، ثم يمنح جلستك درجة ثقة تحدّد ما إذا كنت ستمرّ بصمت أم تواجه تحدياً بصرياً. فهم هذه الإشارات يساعد فرق التطوير على تشخيص سبب رسوب جلساتها المشروعة، لا على إخفاء أي شيء.
هذا المقال تشخيصي وتعليمي: هدفه أن تفصل بين مشكلات تهيئة المتصفح والجلسة وبين مشكلات الحل نفسها، وأن تستخدم هذه المعرفة داخل بيئات اختبار مصرّح بها يملكها فريقك.
يوزّع reCAPTCHA عمله على خمس طبقات كشف متتابعة، تلتقط كل واحدة منها ما تفوّته سابقتها:
- فحص بيئة JavaScript والمتصفحات مقطوعة الرأس.
- بصمات Canvas وWebGL المرتبطة بالعتاد.
- التحليل السلوكي للمؤشر ولوحة المفاتيح والتوقيت.
- سمعة عنوان IP وبصمة الشبكة.
- الذكاء التراكمي عبر الجلسات والمواقع.
الطبقة الأولى: فحص بيئة JavaScript والمتصفحات مقطوعة الرأس
تبدأ الطبقة الأولى بتشغيل شيفرة JavaScript داخل صفحتك، تطرح على المتصفح أسئلة يصعب على أدوات الأتمتة الإجابة عليها بصدق.
مؤشر navigator.webdriver
أوضح إشارة على الإطلاق:
// Selenium/Puppeteer set this automatically
navigator.webdriver === true // → Automation detected
// Real browser
navigator.webdriver === undefined // or false → Normal browser
عندما تساوي قيمة
navigator.webdriverالقيمةtrue، يضع reCAPTCHA علامة فورية على الجلسة، وتنخفض درجتها عادةً إلى 0.1 أو أقل — وهذا وحده كافٍ لإظهار تحدٍّ بصري.
واجهات المتصفح الغائبة أو المختلفة
يبحث reCAPTCHA عن واجهات برمجية تُهملها المتصفحات مقطوعة الرأس أو تنفّذها بشكل مغاير:
// Probes reCAPTCHA performs (simplified)
const checks = {
// Chrome-specific object
hasChrome: !!window.chrome,
hasChromeRuntime: !!(window.chrome && window.chrome.runtime),
// Plugin and MIME type arrays
pluginCount: navigator.plugins.length,
mimeTypeCount: navigator.mimeTypes.length,
// Notification permission
notificationPermission: Notification.permission,
// Speech synthesis voices
speechVoices: window.speechSynthesis.getVoices().length,
// Performance observer
hasPerformanceObserver: typeof PerformanceObserver !== "undefined",
};
تُترجَم هذه الفحوص إلى مجموعة توقّعات؛ وأي انحراف عنها يرفع الشبهة:
window.chrome: كائن كامل في Chrome حقيقي، وغائب أو ناقص في النسخة مقطوعة الرأس.navigator.plugins: من ملحقين إلى خمسة عادةً، مقابل مصفوفة فارغة في الأتمتة.navigator.permissions: كائن يدعم الاستعلام، وقد يكون مفقوداً أو يرمي استثناءً في البيئات الآلية.Notification.permission: القيمة"default"الطبيعية مقابل استثناء أو قيمة شاذة.window.speechSynthesis: قائمة أصوات مأهولة مقابل قائمة فارغة أو مفقودة.
التلاعب بسلسلة النماذج الأولية
تحاول أدوات الأتمتة المتقدمة إعادة تعريف هذه الواجهات لتبدو طبيعية، لكن إعادة التعريف نفسها تترك أثراً يمكن كشفه:
// reCAPTCHA may check if native functions were modified
const nativeToString = Function.prototype.toString;
const pluginsToString = navigator.plugins.toString();
// Overridden functions have different toString output:
// Native: "function get plugins() { [native code] }"
// Overridden: "function () { return [...fakePlugins] }"
الطبقة الثانية: بصمات Canvas وWebGL
تقوم الطبقة الثانية على حقيقة أن العتاد ومحركات العرض تختلف من جهاز لآخر بطريقة يصعب تقليدها باتساق عبر الجلسات.
بصمة Canvas
يرسم reCAPTCHA عناصر مخفية على لوحة Canvas ثم يقرأ بيانات البكسل؛ وتتغيّر النتيجة حسب نظام التشغيل ووحدة الرسوميات ومحرك عرض الخطوط وإعدادات التنعيم:
// Simplified canvas fingerprint
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
ctx.textBaseline = "alphabetic";
ctx.font = "14px Arial";
ctx.fillStyle = "#f60";
ctx.fillRect(125, 1, 62, 20);
ctx.fillStyle = "#069";
ctx.fillText("CaptchaTest,!", 2, 15);
const fingerprint = canvas.toDataURL();
// Unique per browser/OS/GPU combination
ما الذي يثير الشبهة هنا؟ ثلاث حالات رئيسية:
- تطابق البصمة نفسها عبر أنظمة تشغيل ومتصفحات مُعلَنة مختلفة — مؤشر على تلاعب متعمّد بالبصمة.
- إرجاع عمليات Canvas بيانات فارغة أو موحّدة — سمة بيئة مقطوعة الرأس.
- تطابق البصمة مع نمط معروف مسبقاً لمتصفح Chrome مقطوع الرأس.
بصمة WebGL
const gl = document.createElement("canvas").getContext("webgl");
const debugInfo = gl.getExtension("WEBGL_debug_renderer_info");
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
// Real browser: "ANGLE (NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0)"
// Headless Chrome: "Google Inc. (Google SwiftShader)" ← Strong bot signal
الاسم SwiftShader هو عارض الرسوميات البرمجي من Google، ويُستخدم حين لا يتوفّر عتاد رسومي فعلي؛ وظهوره إشارة قوية إلى بيئة مقطوعة الرأس.
الطبقة الثالثة: التحليل السلوكي
هذه أقوى طبقات reCAPTCHA؛ فهي تراقب سلوكك من لحظة تحميل الصفحة حتى إرسال النموذج، ويصعب محاكاتها لأنها تقيس التذبذب الطبيعي في الحركة والكتابة والتوقيت.
نصيحة تشخيصية: إذا كانت اختباراتك الآلية المشروعة ترسب رغم سلامة المتصفح، فغالباً السبب في هذه الطبقة تحديداً — إدخال فوري بلا أحداث ماوس أو لوحة مفاتيح حقيقية.
تحليل حركة الماوس
reCAPTCHA records:
├─ Mouse coordinates at ~60fps intervals
├─ Velocity and acceleration at each point
├─ Trajectories between clickable elements
├─ Hover patterns over links and buttons
├─ Micro-movements while "stationary"
└─ Natural overshoot when targeting elements
Human pattern:
- Curved paths with variable speed
- Natural acceleration/deceleration (Fitts's Law)
- Random micro-jitter during hovering
- Occasional overshoot and correction
Bot pattern:
- Zero mouse events (no mouse simulation)
- Straight lines at constant speed
- Perfect targeting (no overshoot)
- Identical patterns across sessions
إيقاع لوحة المفاتيح
reCAPTCHA records:
├─ Inter-key interval for each key pair
├─ Key hold duration (keydown to keyup)
├─ Error rate (backspace frequency)
├─ Typing rhythm consistency
└─ Input method (keyboard vs paste vs JavaScript)
Human pattern:
- Variable intervals (80-300ms typical)
- Faster for common character pairs
- Occasional errors and corrections
- keydown → keypress → keyup sequence
Bot pattern:
- Constant intervals or instant input
- No keypress events (value set via JS)
- Zero errors
- All characters appear simultaneously
التوقيت وتسلسل التفاعل
reCAPTCHA records:
├─ Time from page load to first interaction
├─ Time from CAPTCHA rendering to click
├─ Scroll events and depths
├─ Focus/blur events on form fields
└─ Tab between fields vs click between fields
Suspicious patterns:
- First interaction < 1 second after page load
- CAPTCHA clicked immediately after rendering
- No scroll events before interacting with below-fold content
- All form fields filled in <500ms
الذكاء التراكمي عبر الجلسات
قبل الانتقال إلى الشبكة، تجدر الإشارة إلى الطبقة التي تربط كل ما سبق: يتتبّع reCAPTCHA الأنماط عبر جلسات ومواقع متعددة، حتى إن السلوك السيئ في موقع واحد قد يخفض درجتك على مواقع أخرى تشترك في ملف المتصفح نفسه.
- ارتباط بصمة الجلسة: بصمة متصفح واحدة تُطلق طلبات سريعة عبر مواقع كثيرة.
- تحليل نمط الحل: إجابات صحيحة ضمن نوافذ زمنية متطابقة، بينما تتفاوت أوقات البشر.
- ارتباط الاستجابة للتحدي: جلسات متعددة تحل تحديات متطابقة خلال ثوانٍ.
- الخط الزمني لملفات تعريف الارتباط: جلسات جديدة متكررة من عنوان IP نفسه دون استمرارية كوكيز.
الطبقة الرابعة: سمعة الشبكة وعنوان IP
حين تصل الطبقات السابقة إلى نتيجة غير حاسمة، تُرجّح سمعة الشبكة الكفّة في اتجاه أو آخر.
قاعدة بيانات سمعة عنوان IP
تحتفظ Google باستخبارات واسعة حول عناوين IP، ويمكن تلخيص أبرز فئاتها في الجدول التالي:
| الفئة | أمثلة | لماذا تُرفَع الشبهة |
|---|---|---|
| نطاقات مراكز البيانات | AWS، GCP، Azure، DigitalOcean | زيارات المستخدمين الحقيقيين نادراً ما تأتي منها |
| مزوّدو VPN أو بروكسي معروفون | خدمات تجارية شائعة | تُستخدم كثيراً لإخفاء المصدر |
| عقد خروج Tor | قائمة عامة تُحدَّث بانتظام | ارتباط مرتفع بحركة آلية |
| سجل إساءة سابق | عناوين متورطة في إساءة استخدام | مخاطرة مثبتة تاريخياً |
| قفزات جغرافية سريعة | تغيّر الموقع خلال دقائق | نمط تنقّل عبر VPN |
بصمة مصافحة TLS
ينتج كل عميل HTTP بصمة مصافحة TLS مميزة (JA3/JA4):
Chrome 120: JA3 = 771,4865-4866-4867-49195-49199-49196..
Python/requests: JA3 = 771,4866-4867-4865-49196-49200..
curl/libcurl: JA3 = 771,49196-49200-159-52393-52392..
يتحقق reCAPTCHA من توافق بصمة TLS مع وكيل المستخدم المُعلَن؛ فوكيل مستخدم Chrome مقروناً ببصمة Python يكشف التعارض فوراً ويوسم الجلسة كأتمتة.
تحليل ترويسات HTTP
Real Chrome headers:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,...
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br
Sec-CH-UA: "Not_A Brand";v="8", "Chromium";v="120"
Sec-CH-UA-Platform: "Windows"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Automation headers (missing or different):
- Missing Sec-CH-UA headers
- Missing Accept-Language
- Non-standard Accept header
- Missing Sec-Fetch-* headers
كيف تتعامل حلول API مع كل هذه الطبقات
الحلول المعتمدة على API — مثل CaptchaAI — لا تدخل في مواجهة نظام الكشف داخل متصفحك، بل تنقل مهمة الحل بالكامل إلى بيئة منفصلة ومهيّأة مسبقاً:
Your automation:
Extracts sitekey + pageurl from target page
↓
Sends to CaptchaAI API (HTTPS request to ocr.captchaai.com)
↓
CaptchaAI's solver environment:
├─ Real browser with genuine fingerprint (not headless)
├─ Human-like behavioral patterns
├─ Clean residential IP
├─ Valid cookies and session history
├─ Matching TLS/header fingerprints
└─ Solves the challenge with human-like behavior
↓
Returns valid g-recaptcha-response token
↓
Your automation:
Submits token to target website
↓
Target website validates token with Google
→ Google sees a legitimate solve from a trusted environment
→ Token validated: success = true
الفكرة الجوهرية: شيفرة الأتمتة لديك لا تتفاعل مع reCAPTCHA مباشرةً على الإطلاق. تتكفّل بيئة الحل بكل البصمات والتحليل السلوكي وإكمال التحدي، ويبقى دورك إرسال الرمز الناتج
g-recaptcha-responseإلى نموذج الموقع المستهدف.
ولنأخذ مثالاً من المنطقة: فريق اختبار جودة في شركة تجارة إلكترونية بالقاهرة يشغّل اختبارات تسجيل دخول آلية على بيئة تجريبية يملكها. وبدل محاولة تعديل بصمة المتصفح يدوياً — وهو ما يرصده reCAPTCHA بسرعة — يرسل الفريق مفتاح الموقع وعنوان الصفحة إلى واجهة CaptchaAI ويستقبل رمزاً صالحاً، فتبقى اختباراته مستقرة دون العبث بإعدادات المتصفح.
مثال بايثون
import requests
import time
API_KEY = "YOUR_API_KEY"
# Your automation only needs sitekey and pageurl
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6LcR_RsTAAAAAN_r0GEkGBfq3L7KmU5JbPHJtwNp",
"pageurl": "https://example.com/login",
"json": 1,
})
task_id = submit.json()["request"]
# Poll for token
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"]
# Submit this token to the target site's form
print("Token received — submit to target form")
break
مثال Node.js
const axios = require("axios");
async function solveRecaptcha(sitekey, pageurl) {
const API_KEY = "YOUR_API_KEY";
const { data: submit } = await axios.post(
"https://ocr.captchaai.com/in.php",
new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: sitekey,
pageurl: pageurl,
json: 1,
})
);
const taskId = submit.request;
for (let i = 0; i < 60; i++) {
await new Promise(r => setTimeout(r, 5000));
const { data: result } = await axios.get(
"https://ocr.captchaai.com/res.php",
{ params: { key: API_KEY, action: "get", id: taskId, json: 1 } }
);
if (result.status === 1) return result.request;
}
throw new Error("Timeout");
}
الأسئلة الشائعة
هل يستطيع reCAPTCHA معرفة أنني استخدمت خدمة حل عبر API؟
يتحقق reCAPTCHA من صحة الرمز مقابل سجلاته الخاصة. فإذا أنتجت بيئة الحل رمزاً مشروعاً بسلوك يشبه الإنسان، كان الرمز صالحاً، ولا يحمل بذاته أي معلومة عن كيفية إنشائه؛ وترى Google حلاً بشرياً عادياً لا خدمة خارجية.
لماذا تحصل جلساتي الحقيقية أحياناً على درجة منخفضة في reCAPTCHA v3؟
درجة reCAPTCHA v3 تراكمية وتعتمد على سمعة عنوان IP وسجل الجلسة والسلوك. وقد تنخفض بسبب بروكسي مشترك، أو متصفح جديد بلا كوكيز، أو شبكة شركة يخرج منها عدد كبير من المستخدمين — دون أي أتمتة من طرفك.
هل يكفي تغيير وكيل المستخدم لتفادي وسم الأتمتة؟
لا يكفي. وكيل المستخدم مجرد ترويسة نصية، بينما تقارن الطبقات الأخرى بين ما تُعلنه وبين بصمة TLS والواجهات البرمجية والسلوك الفعلي. تغيير النص وحده يخلق تعارضاً يرفع الشبهة بدل أن يخفّضها.
ما الفرق بين reCAPTCHA v2 وv3 من زاوية الكشف؟
يعتمد v2 على تفاعل ظاهر — المربع أو اختيار الصور — مدعوماً بالتحليل السلوكي، بينما يعمل v3 في الخلفية ويعيد درجة بين 0 و1 دون تحدٍّ مرئي. كلاهما يشترك في طبقات البصمة والشبكة، غير أن v3 يعتمد أكثر على الإشارات التراكمية.
هل يرفع استخدام بروكسي سكني درجة الثقة تلقائياً؟
ليس بالضرورة. البروكسي السكني النظيف قد يحسّن سمعة عنوان IP، لكنه لا يعالج الإشارات الأخرى: بصمة المتصفح، والتحليل السلوكي، وتوافق TLS. فالدرجة النهائية حصيلة كل الطبقات معاً، لا عنوان IP وحده.
ملخص
يرصد reCAPTCHA الأتمتة عبر خمس طبقات متكاملة: فحص بيئة JavaScript، وبصمات Canvas وWebGL، والتحليل السلوكي، وسمعة الشبكة وعنوان IP، والذكاء التراكمي عبر الجلسات. وتعالج حلول API مثل CaptchaAI هذه الطبقات بحل التحدي في بيئة منفصلة مهيّأة وإعادة رمز صالح، فلا تتفاعل شيفرتك مع reCAPTCHA مباشرةً، ويبقى الرمز الناتج مطابقاً لما تتوقعه Google من جلسة سليمة.
مقالات ذات صلة
- حل reCAPTCHA v2 Callback عبر API
- التعامل مع reCAPTCHA v2 وTurnstile في الموقع نفسه
- نظرة معمّقة على reCAPTCHA Enterprise Assessment API