يقدم كلا الإصدارين نفس مربع الاختيار "أنا لست روبوتًا" وتحديات شبكة الصور. يكمن الاختلاف في الواجهة الخلفية: تضيف Enterprise رموز الأسباب والقواعد المخصصة وتكامل Google Cloud. لحل المشكلة، التغيير الوحيد هو إضافة enterprise=1 إلى طلب CaptchaAI الخاص بك - ولكن اكتشاف الإصدار الذي يستخدمه الموقع هو الجزء الذي يخطئ فيه المطورون في أغلب الأحيان.
مقارنة الميزات
| ميزة | قياسي v2 | المؤسسة v2 |
|---|---|---|
| القطعة خانة الاختيار | نعم – مظهر متطابق | نعم – مظهر متطابق |
| تحديات الصورة | شبكات 3×3 أو 4×4 | شبكات 3×3 أو 4×4 |
| ملف شبيبة | api.js |
enterprise.js |
| تنفيذ الوظيفة | grecaptcha.execute() |
grecaptcha.enterprise.execute() |
| واجهة برمجة تطبيقات التحقق | siteverify (مجاني) |
recaptchaenterprise.googleapis.com (مدفوع) |
| رموز السبب | لا | نعم (تلقائي، TOO_MUCH_TRAFFIC، وما إلى ذلك) |
| القواعد المخصصة | لا | نعم (حدود لكل إجراء) |
| جوجل السحابية وحدة التحكم | لا | نعم (الإدارة القائمة على المشاريع) |
| كشف تسرب كلمة المرور | لا | نعم |
| تنسيق الرمز المميز | نفس الهيكل | نفس الهيكل |
| المعلمة CaptchaAI | — | enterprise=1 |
| وقت الحل النموذجي | 10-30 ثانية | 10-30 ثانية |
كيفية اكتشاف Enterprise v2
يتمثل الاختلاف الرئيسي في ملف JavaScript الذي تقوم الصفحة بتحميله:
تحقق من علامة البرنامج النصي:
<!-- Standard v2 -->
<script src="https://www.google.com/recaptcha/api.js"></script>
<!-- Enterprise v2 -->
<script src="https://www.google.com/recaptcha/enterprise.js"></script>
** الكشف الآلي (Python): **
import requests
from bs4 import BeautifulSoup
def detect_recaptcha_version(url):
resp = requests.get(url)
soup = BeautifulSoup(resp.text, "html.parser")
enterprise_script = soup.find("script", src=lambda s: s and "enterprise.js" in s)
standard_script = soup.find("script", src=lambda s: s and "recaptcha/api.js" in s)
widget = soup.find(class_="g-recaptcha")
sitekey = widget["data-sitekey"] if widget else None
if enterprise_script:
return {"version": "enterprise_v2", "sitekey": sitekey}
elif standard_script:
return {"version": "standard_v2", "sitekey": sitekey}
return None
info = detect_recaptcha_version("https://example.com/login")
print(info)
الكشف الآلي (Node.js):
const axios = require("axios");
const cheerio = require("cheerio");
async function detectRecaptchaVersion(url) {
const { data } = await axios.get(url);
const $ = cheerio.load(data);
const hasEnterprise = $('script[src*="enterprise.js"]').length > 0;
const hasStandard = $('script[src*="recaptcha/api.js"]').length > 0;
const sitekey = $(".g-recaptcha").attr("data-sitekey");
if (hasEnterprise) return { version: "enterprise_v2", sitekey };
if (hasStandard) return { version: "standard_v2", sitekey };
return null;
}
فحص وحدة تحكم المتصفح:
// Quick check in DevTools
if (document.querySelector('script[src*="enterprise.js"]')) {
console.log("Enterprise v2");
} else if (document.querySelector('script[src*="recaptcha/api.js"]')) {
console.log("Standard v2");
}
الحل باستخدام CaptchaAI
قياسي v2
import requests
import time
# Submit task
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# Poll for token
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
break
المؤسسة v2
import requests
import time
# Submit task — only difference is enterprise=1
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"enterprise": 1 # Required for Enterprise
})
task_id = resp.text.split("|")[1]
# Polling is identical
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
break
حلال عالمي يكتشف تلقائيًا
import requests
import time
from bs4 import BeautifulSoup
class RecaptchaV2Solver:
def __init__(self, api_key):
self.api_key = api_key
def detect_and_solve(self, page_url, page_html=None):
if not page_html:
page_html = requests.get(page_url).text
soup = BeautifulSoup(page_html, "html.parser")
is_enterprise = bool(soup.find("script", src=lambda s: s and "enterprise.js" in s))
widget = soup.find(class_="g-recaptcha")
sitekey = widget["data-sitekey"] if widget else None
if not sitekey:
raise Exception("No reCAPTCHA sitekey found on page")
params = {
"key": self.api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url
}
if is_enterprise:
params["enterprise"] = 1
resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key, "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
return {
"token": result.text.split("|")[1],
"is_enterprise": is_enterprise,
"sitekey": sitekey
}
if result.text != "CAPCHA_NOT_READY":
raise Exception(f"Solve failed: {result.text}")
raise Exception("Solve timed out")
solver = RecaptchaV2Solver("YOUR_API_KEY")
result = solver.detect_and_solve("https://example.com/login")
print(f"Enterprise: {result['is_enterprise']}, Token: {result['token'][:40]}...")
الأخطاء الشائعة
| خطأ | ماذا يحدث | إصلاح |
|---|---|---|
استخدام enterprise=1 على الإصدار القياسي v2 |
قد يعود الرموز غير صالحة | تحقق من وجود enterprise.js قبل إضافة العلم |
حذف enterprise=1 على الإصدار Enterprise v2 |
قد يتم رفض الرمز المميز من خلال الواجهة الخلفية للموقع | قم دائمًا بإضافة enterprise=1 عند وجود enterprise.js |
| استخدام مفتاح الموقع الخاطئ | ERROR_WRONG_GOOGLEKEY |
مقتطف من data-sitekey على عنصر .g-recaptcha |
| الخلط بين v2 Enterprise وv3 Enterprise | معلمات حل خاطئة | يحتوي الإصدار 2 على مربع اختيار؛ v3 غير مرئي بالنتيجة |
حقن الرمز – نفس الشيء بالنسبة لكليهما
# Selenium injection — works for both standard and enterprise
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# If the page uses a callback function
callback = driver.find_element("css selector", ".g-recaptcha").get_attribute("data-callback")
if callback:
driver.execute_script(f'{callback}("{token}");')
// Puppeteer injection — works for both
await page.evaluate((token) => {
document.getElementById("g-recaptcha-response").value = token;
// Find and call callback if present
const widget = document.querySelector(".g-recaptcha");
const cb = widget?.getAttribute("data-callback");
if (cb && typeof window[cb] === "function") {
window[cb](token);
}
}, token);
الأسئلة الشائعة
هل حل Enterprise v2 أصعب؟
لا، آليات التحدي متطابقة — نفس مربع الاختيار ونفس شبكات الصور. تضيف Enterprise تحليلات الواجهة الخلفية (أكواد الأسباب والحدود المخصصة) ولكنها لا تغير صعوبة التحدي بالنسبة للحل.
هل يمكنني استخدام نفس الكود لكلا الإصدارين؟
تقريبا. اختلاف المعلمة الوحيد هو enterprise=1. استخدم أسلوب الاكتشاف التلقائي أعلاه لإنشاء قاعدة تعليمات برمجية واحدة تتعامل مع كليهما. الاكتشاف والاستقصاء وحقن الرمز المميز متطابقان.
هل أحتاج إلى التعامل مع رموز أسباب المؤسسة؟
لا، يتم إرجاع رموز الأسباب بواسطة Google إلى الواجهة الخلفية لموقع الويب أثناء عملية التحقق. فهي غير مرئية لمحلل CAPTCHA. لا يحتاج تكامل CaptchaAI إلى أي تغييرات في رموز الأسباب.
هل تكلفة حل Enterprise v2 أكبر؟
تحقق من صفحة التسعير الحالية لـ CaptchaAI. قد يتم تسعير حلول المؤسسات بشكل مختلف، ولكن جهد تكامل واجهة برمجة التطبيقات هو نفسه.
كيف أعرف إذا كان الكشف يعمل بشكل صحيح؟
إذا قمت بإرسال enterprise=1 لموقع قياسي، فقد ينجح الحل ولكن قد يتم رفض الرمز المميز بواسطة الموقع المستهدف. إذا قمت بحذفه لموقع المؤسسة، يمكن أن يحدث نفس الشيء. تحقق دائمًا من خلال التحقق من عنوان URL للبرنامج النصي أولاً.