من منظور مطوّر الأتمتة، الخبر الجيد بسيط: رمز reCAPTCHA Enterprise يُحَلّ مثل reCAPTCHA v2/v3 القياسي — تُرسل الطلب بالطريقة userrecaptcha وتضيف علامة واحدة هي enterprise=1. أمّا «تحليل المخاطر التفصيلي» و«أسباب النتيجة» و«Account Defender» فتحدث على خادم صاحب الموقع، لا في جانب العميل.
يجيب هذا الدليل عن أربعة أسئلة عملية:
- ما الذي تضيفه Enterprise فوق reCAPTCHA v3؟
- كيف تبدو استجابة Assessment API وما معنى حقولها؟
- كيف تكتشف أنّ الصفحة تستخدم Enterprise؟
- كيف تحلّ رموزها في الأتمتة عبر CaptchaAI؟
الأساسيات: ما هي Enterprise ولماذا تختلف
reCAPTCHA Enterprise مقابل الإصدار القياسي
الفرق الجوهري ليس في شكل الرمز بل في كمّ المعلومات التي يحصل عليها صاحب الموقع بعد التحقق:
| ميزة | reCAPTCHA v3 (مجاني) | reCAPTCHA Enterprise |
|---|---|---|
| التسجيل | 0.0-1.0 درجة | 0.0-1.0 درجة + أسباب النتيجة |
| تحليل المخاطر | الأساسية | تفصيلية (إشارات الاحتيال، معلومات الحساب) |
| ** أسباب النتيجة ** | غير متوفر | أسباب محددة تشرح النتيجة |
| المدافع عن الحساب | لا | نعم (يتتبع دورة حياة الحساب) |
| تكامل WAF | لا | نعم (Cloudflare، Fastly، F5) |
| التقييم السريع | لا | نعم (من جانب الخادم فقط، لا يوجد JS) |
| ** كشف تسرب كلمة المرور ** | لا | نعم |
| التسعير | مجاني (مليون تقييم/month) | 1 دولار لكل 1000 تقييم (0-1 مليون مجانًا) |
| نقطة نهاية واجهة برمجة التطبيقات | google.com/recaptcha/api/siteverify | recaptchaenterprise.googleapis.com |
انتبه إلى تقسيم الأدوار:
- مالك الموقع يستفيد من كل الميزات أعلاه عند التحقق من الرموز.
- مطوّر الأتمتة الذي يحلّ الرمز على صفحة طرف ثالث لا يرى هذا التحليل.
كيف يعمل Assessment API خطوة بخطوة
تنقسم دورة حياة التقييم إلى شقّين: شقّ في المتصفح يولّد الرمز، وشقّ على الخادم يحوّله إلى قرار وصول مدعوم بتحليل المخاطر.
Client-side:
1. Load reCAPTCHA Enterprise script
2. Call grecaptcha.enterprise.execute(SITE_KEY, {action: 'LOGIN'})
3. Receive token
4. Send token to your backend
Server-side:
1. Create assessment via Enterprise API
2. Receive detailed risk analysis
3. Make access decision based on score + reasons
4. Optionally annotate the assessment (report fraud/legitimate)
التكامل التقني: من العميل إلى الخادم
من جهة العميل عبر JavaScript SDK
الفرق الظاهر عن reCAPTCHA v3 هو اسم السكربت وكائن الـ API:
<script src="https://www.google.com/recaptcha/enterprise.js?render=SITE_KEY"></script>
<script>
grecaptcha.enterprise.ready(function() {
grecaptcha.enterprise.execute('SITE_KEY', { action: 'LOGIN' })
.then(function(token) {
// Send token to backend
fetch('/api/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token: token })
});
});
});
</script>
الفروق الأساسية محصورة في ثلاث نقاط:
- عنوان السكربت يستخدم
.../recaptcha/enterprise.jsبدلاً من.../recaptcha/api.js - كائن الـ API هو
grecaptcha.enterpriseبدلاً منgrecaptcha - الدالة
execute()تُرجِع الرمز المميز بالتنسيق نفسه
اكتشاف Enterprise من كود الصفحة
قبل اختيار طريقة الحل، حدّد إصدار صفحة الهدف. الدالة التالية تفحص مصدر HTML وتستخرج sitekey وأسماء الإجراءات:
import requests
import re
def detect_recaptcha_enterprise(url):
"""Detect if a page uses reCAPTCHA Enterprise."""
html = requests.get(url, timeout=10).text
indicators = {
"is_enterprise": False,
"is_standard": False,
"site_key": None,
"actions": [],
}
# Enterprise detection
if "recaptcha/enterprise.js" in html:
indicators["is_enterprise"] = True
match = re.search(r"render=([A-Za-z0-9_-]+)", html)
if match:
indicators["site_key"] = match.group(1)
# Standard v3 detection
elif "recaptcha/api.js?render=" in html:
indicators["is_standard"] = True
match = re.search(r"render=([A-Za-z0-9_-]+)", html)
if match:
indicators["site_key"] = match.group(1)
# Extract action names
actions = re.findall(r"action:\s*['\"](\w+)['\"]", html)
indicators["actions"] = list(set(actions))
return indicators
print(detect_recaptcha_enterprise("https://example.com/login"))
إنشاء التقييم من جهة الخادم
هذا الجزء يخصّ مالك الموقع: بعد استلام الرمز، ينشئ الخادم تقييماً عبر مكتبة Google Cloud.
from google.cloud import recaptchaenterprise_v1
from google.cloud.recaptchaenterprise_v1 import Assessment
def create_assessment(project_id, site_key, token, action):
"""Create a reCAPTCHA Enterprise assessment."""
client = recaptchaenterprise_v1.RecaptchaEnterpriseServiceClient()
event = recaptchaenterprise_v1.Event()
event.site_key = site_key
event.token = token
event.expected_action = action
assessment = recaptchaenterprise_v1.Assessment()
assessment.event = event
request = recaptchaenterprise_v1.CreateAssessmentRequest()
request.assessment = assessment
request.parent = f"projects/{project_id}"
response = client.create_assessment(request)
return response
بنية استجابة التقييم
تجمع الاستجابة النتيجة وأسبابها وخصائص الرمز وتقييم Account Defender في كائن JSON:
{
"name": "projects/123456/assessments/abcdef123",
"event": {
"token": "...",
"siteKey": "6Le...",
"expectedAction": "LOGIN",
"hashedAccountId": "abc123..."
},
"riskAnalysis": {
"score": 0.9,
"reasons": [
"AUTOMATION",
"TOO_MUCH_TRAFFIC"
],
"extendedVerdictReasons": [
"BROWSER_ERROR"
]
},
"tokenProperties": {
"valid": true,
"hostname": "example.com",
"action": "LOGIN",
"createTime": "2025-01-15T10:30:00Z",
"invalidReason": ""
},
"accountDefenderAssessment": {
"labels": ["PROFILE_MATCH"]
}
}
قراءة التقييم: النتيجة ودفاع الحساب
أسباب النتيجة (Score Reasons)
لا تكتفي Enterprise برقم بل تشرح سبب انخفاضه. تأتي الإشارات في مجموعتين:
- أسباب رئيسية تؤثر مباشرة في النتيجة.
- أسباب موسّعة تضيف تفاصيل تقنية دون أثر رقمي.
ويوضّح الجدول التالي أشهر الأسباب الرئيسية وتأثيرها التقريبي:
| السبب | الوصف | تأثير النتيجة |
|---|---|---|
AUTOMATION |
تم اكتشاف وكيل مستخدم تلقائي أو متصفح بدون رأس | -0.3 إلى -0.7 |
UNEXPECTED_ENVIRONMENT |
عدم تناسق بيئة المتصفح أو الجهاز | -0.2 إلى -0.4 |
TOO_MUCH_TRAFFIC |
حجم الطلب مرتفع من IP أو الجلسة | -0.1 إلى -0.3 |
UNEXPECTED_USAGE_PATTERNS |
تنحرف الإشارات السلوكية عن الأعراف البشرية | -0.2 إلى -0.5 |
LOW_CONFIDENCE_SCORE |
البيانات غير كافية لإجراء تقييم موثوق | متغير |
SUSPECTED_CARDING |
نمط المعاملة يطابق الاحتيال على بطاقة الائتمان | -0.3 إلى -0.6 |
SUSPECTED_CHARGEBACK |
خطر رد المبالغ المدفوعة بناءً على إشارات المعاملة | -0.2 إلى -0.4 |
أسباب الحكم الموسّعة
| السبب | الوصف |
|---|---|
BROWSER_ERROR |
أخطاء تنفيذ JavaScript في CAPTCHA SDK |
SITE_MISMATCH |
تم إنشاء الرمز المميز لموقع مختلف عن الذي تم التحقق من صحته |
FAILED_TWO_FACTOR |
فشلت المصادقة الثنائية مؤخرًا |
Account Defender وتتبّع دورة حياة الحساب
يتتبّع Account Defender سلوك الحساب عبر الزمن ويضع عليه تسميات (labels) تصف اعتياديته:
{
"accountDefenderAssessment": {
"labels": [
"PROFILE_MATCH",
"SUSPICIOUS_LOGIN_ACTIVITY",
"SUSPICIOUS_ACCOUNT_CREATION",
"RELATED_ACCOUNTS_NUMBER_HIGH"
]
}
}
| التسمية | معنى |
|---|---|
PROFILE_MATCH |
يتطابق السلوك مع ملف التعريف المعروف لهذا الحساب |
SUSPICIOUS_LOGIN_ACTIVITY |
نمط تسجيل الدخول ينحرف عن المعتاد (الجهاز الجديد، الموقع) |
SUSPICIOUS_ACCOUNT_CREATION |
يبدو إنشاء الحساب آليًا |
RELATED_ACCOUNTS_NUMBER_HIGH |
حسابات متعددة مرتبطة بنفس الجهاز/session |
طبقة الشبكة: تكامل reCAPTCHA Enterprise مع WAF
تفرض Enterprise تحديات CAPTCHA على حافة الشبكة قبل وصول الطلب إلى الخادم الأصلي، عبر التكامل مع أبرز مزوّدي WAF:
- Cloudflare
- Fastly
- F5 BIG-IP
التكامل مع Cloudflare WAF
Request arrives at Cloudflare edge
↓
Cloudflare WAF rule evaluates request
↓
Rule triggers reCAPTCHA Enterprise challenge
↓
Client solves CAPTCHA → token returned
↓
Cloudflare validates token via Enterprise API
↓
If valid + score above threshold → request forwarded to origin
تكامل F5 BIG-IP
F5 iRule or policy evaluates request
↓
Triggers reCAPTCHA Enterprise challenge page
↓
Client solves → token validated server-side
↓
F5 forwards or blocks based on assessment score
حلّ reCAPTCHA Enterprise في سير عمل الأتمتة
الخطوات الأربع
المسار مطابق لـ reCAPTCHA القياسي مع علامة واحدة إضافية:
- أرسِل
sitekeyوpageurlبالطريقةuserrecaptchaمعenterprise=1. - احفظ معرّف المهمة العائد.
- استطلِع النتيجة دورياً عبر
res.phpحتى الاكتمال. - احقن الرمز في النموذج المستهدف.
مثال: فريق ضمان جودة في الخليج
تخيّل فريق ضمان جودة في متجر إلكتروني خليجي يختبر تسجيل الدخول المحمي بـ reCAPTCHA Enterprise قبل موسم التخفيضات. لا يحتاج مساراً مختلفاً: يرسل sitekey مع enterprise=1 عبر userrecaptcha نفسها.
import requests
import time
API_KEY = "YOUR_API_KEY"
# Enterprise is solved with the same method
# The solver handles the Enterprise variant automatically
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6LcR_RsTAAAAAN_r0GEkGBfq3L7KmU5JbPHJtwNp",
"pageurl": "https://enterprise-site.com/login",
"enterprise": 1, # Flag for Enterprise variant
"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"Enterprise token: {token[:50]}...")
break
التنفيذ في Node.js
النمط نفسه في Node.js:
const axios = require("axios");
async function solveEnterprise(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,
enterprise: 1,
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");
}
التمييز بين Enterprise والقياسي على صفحة الهدف
عند التعامل مع مواقع متعددة، حدّد الإصدار تلقائياً:
def identify_recaptcha_version(html):
"""Determine which reCAPTCHA version a page uses."""
if "recaptcha/enterprise.js" in html:
return "enterprise"
elif "recaptcha/api.js?render=" in html:
return "v3"
elif "g-recaptcha" in html and 'data-size="invisible"' in html:
return "v2_invisible"
elif "g-recaptcha" in html:
return "v2"
else:
return "none"
حلّ المشكلات الشائعة مع Enterprise
أغلب المشكلات ترجع إلى علامة enterprise مفقودة أو معلمة action غير مطابقة:
| قضية | التشخيص | الحل |
|---|---|---|
| تم رفض الرمز المميز بواسطة Enterprise API | استخدام الطريقة القياسية لموقع المؤسسة | أضف enterprise=1 إلى طلب الحل |
| سجل دائمًا 0.1 على الرغم من الرمز المميز | عدم تطابق معلمة الإجراء | تحقق من تطابق action مع ما ترسله الصفحة |
| "SITE_MISMATCH" في الأسباب | تم إنشاء الرمز المميز للمجال الخاطئ | تأكد من أن pageurl يطابق الهدف تمامًا |
| "الأتمتة" في أسباب النتيجة | تم اكتشاف بيئة الحلال | يتعامل CaptchaAI مع هذه المشكلة — إذا استمرت المشكلة، فاتصل بالدعم |
| الرمز صالح ولكن الموقع لا يزال محظورًا | يستخدم الموقع عمليات فحص إضافية تتجاوز اختبار CAPTCHA | التحقق من وجود طبقات أخرى للكشف عن الروبوت (WAF، بصمة الإصبع) |
أسئلة شائعة
هل يزيد حلّ Enterprise من تكلفتك على CaptchaAI؟
لا يوجد رسم إضافي مرتبط بنوع الـ CAPTCHA. تعتمد باقات CaptchaAI على عدد الـ Threads المتزامنة مع حلول غير محدودة لكل Thread، بدءاً من BASIC بسعر 15 دولاراً شهرياً (5 threads). فرمز Enterprise يستهلك Thread مثل القياسي تماماً.
متى أحتاج تمرير enterprise=1 وماذا يحدث لو نسيته؟
تحتاجها فقط عندما تستخدم صفحة الهدف سكربت enterprise.js. إذا نسيتها على موقع Enterprise فقد يُرفض الرمز أو تنخفض النتيجة، وهو أول ما تفحصه عند فشل التحقق. أمّا مع reCAPTCHA v3 القياسي فلا تضِفها.
ماذا يعني ظهور "AUTOMATION" في أسباب النتيجة؟
يعني أنّ خادم الموقع رصد إشارات بيئة آلية. لكن هذه الأسباب مرئية لمالك الموقع فقط، ولا تظهر لك عند حلّ الرمز على موقع طرف ثالث؛ وتفيدك فقط عند اختبار موقعك الخاص.
كيف أميّز Enterprise عن الإصدار القياسي على صفحة الهدف؟
افحص عنوان السكربت وكائن الـ API: تستخدم Enterprise ملف recaptcha/enterprise.js والكائن grecaptcha.enterprise.execute()، بينما القياسي يستخدم recaptcha/api.js وgrecaptcha.execute().
هل أحتاج حساب Google Cloud لحلّ اختبارات Enterprise؟
لا. بصفتك مطوّر أتمتة، تكفيك قيمة sitekey وخدمة حلّ مثل CaptchaAI. حساب Google Cloud مطلوب فقط لمالك الموقع كي يتحقق من التقييمات.
الخلاصة
تمدّ reCAPTCHA Enterprise الإصدار القياسي بتحليل مخاطر وأسباب نتيجة وAccount Defender وتكامل WAF، لكن كل ذلك يجري على خادم مالك الموقع. من زاوية الأتمتة يبقى الأمر مباشراً: احلل الرمز عبر CaptchaAI بإضافة enterprise=1، واكتشف Enterprise عبر recaptcha/enterprise.js في مصدر الصفحة مع تطابق action.
مقالات ذات صلة
- حلّ استدعاء reCAPTCHA v2 من نوع Callback عبر الـ API
- التعامل مع reCAPTCHA v2 وTurnstile في الموقع نفسه
- حلّ reCAPTCHA v3 Enterprise عبر الـ API