المقارنات

الاختلافات بين حلول Standard وEnterprise reCAPTCHA v2

يقدم كلا الإصدارين نفس مربع الاختيار "أنا لست روبوتًا" وتحديات شبكة الصور. يكمن الاختلاف في الواجهة الخلفية: تضيف 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 للبرنامج النصي أولاً.


أدلة ذات صلة

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