الدروس التطبيقية

استخراج معلمات reCAPTCHA من مصدر الصفحة

يتطلب كل حل reCAPTCHA من خلال CaptchaAI مفتاح الموقع الصحيح وعنوان URL للصفحة. تحتاج بعض أنواع CAPTCHA أيضًا إلى معلمات إضافية - الإجراء (الإصدار 3)، أو البيانات (مواقع Google)، أو علامة المؤسسة. يغطي هذا الدليل كل طريقة استخراج.


المعلمات حسب إصدار reCAPTCHA

المعلمة معيار الإصدار 2 الإصدار 2 غير مرئي v3 المؤسسة
googlekey (مفتاح الموقع) مطلوب مطلوب مطلوب مطلوب
pageurl مطلوب مطلوب مطلوب مطلوب
invisible 1
action مطلوب في بعض الأحيان
data-s في بعض الأحيان في بعض الأحيان
enterprise 1

الأسلوب 1: استخراج سمة HTML

من سمة data-sitekey

import re
import requests

url = "https://example.com/login"
html = requests.get(url).text

# Find data-sitekey
match = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', html)
if match:
    sitekey = match.group(1)
    print(f"Sitekey: {sitekey}")

# Check if invisible
invisible_match = re.search(r'data-size=["\']invisible["\']', html)
is_invisible = bool(invisible_match)
print(f"Invisible: {is_invisible}")

# Find callback
callback_match = re.search(r'data-callback=["\'](\w+)["\']', html)
callback = callback_match.group(1) if callback_match else None
print(f"Callback: {callback}")

# Check for data-s (Google-owned sites)
data_s_match = re.search(r'data-s=["\']([^"\']+)["\']', html)
data_s = data_s_match.group(1) if data_s_match else None
print(f"data-s: {data_s}")

JavaScript (Puppeteer)

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com/login', { waitUntil: 'networkidle2' });

const params = await page.evaluate(() => {
  const widget = document.querySelector('.g-recaptcha');
  if (!widget) return null;

  return {
    sitekey: widget.getAttribute('data-sitekey'),
    size: widget.getAttribute('data-size'),
    callback: widget.getAttribute('data-callback'),
    dataS: widget.getAttribute('data-s'),
    invisible: widget.getAttribute('data-size') === 'invisible',
  };
});

console.log(params);

الطريقة الثانية: استخراج علامة البرنامج النصي

reCAPTCHA v3 ومفاتيح المواقع للمؤسسات

يتم تضمين مفاتيح الموقع v3 في عنوان URL للبرنامج النصي:

# Find sitekey from script src
v3_match = re.search(
    r'recaptcha/(?:api|enterprise)\.js\?.*?render=([A-Za-z0-9_-]+)',
    html
)
if v3_match:
    sitekey = v3_match.group(1)
    print(f"v3 Sitekey: {sitekey}")

# Check enterprise
is_enterprise = 'enterprise.js' in html
print(f"Enterprise: {is_enterprise}")

العثور على معلمة الإجراء

يتم تمرير الإجراء في كود JavaScript، وليس في سمات HTML:

# Search for grecaptcha.execute calls
action_match = re.search(
    r'grecaptcha\.execute\s*\([^,]+,\s*\{[^}]*action\s*:\s*["\']([^"\']+)',
    html
)
if action_match:
    action = action_match.group(1)
    print(f"Action: {action}")

الطريقة الثالثة: استخراج Iframe src

عندما يتم عرض reCAPTCHA داخل إطار iframe:

# Find reCAPTCHA iframe
iframe_match = re.search(
    r'<iframe[^>]+src=["\']([^"\']*recaptcha/api2/anchor[^"\']*)["\']',
    html
)
if iframe_match:
    iframe_src = iframe_match.group(1)
    sitekey_match = re.search(r'k=([A-Za-z0-9_-]+)', iframe_src)
    if sitekey_match:
        sitekey = sitekey_match.group(1)
        print(f"Iframe sitekey: {sitekey}")

الطريقة الرابعة: استخراج عرض JavaScript

بالنسبة للصفحات التي تعرض reCAPTCHA ديناميكيًا باستخدام grecaptcha.render():

# Find grecaptcha.render calls
render_match = re.search(
    r'grecaptcha\.render\s*\([^,]*,\s*\{([^}]+)\}',
    html
)
if render_match:
    config = render_match.group(1)
    sk = re.search(r'sitekey\s*:\s*["\']([A-Za-z0-9_-]+)', config)
    cb = re.search(r'callback\s*:\s*["\']?(\w+)', config)
    sz = re.search(r'size\s*:\s*["\'](\w+)', config)
    print(f"Sitekey: {sk.group(1) if sk else 'not found'}")
    print(f"Callback: {cb.group(1) if cb else 'not found'}")
    print(f"Size: {sz.group(1) if sz else 'not found'}")

وظيفة الاستخراج كاملة

import re
import requests

def extract_recaptcha_params(url):
    html = requests.get(url, timeout=15).text
    params = {"pageurl": url}

    # Sitekey from data-sitekey
    sk = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)', html)
    if sk:
        params["sitekey"] = sk.group(1)

    # Sitekey from script render parameter (v3)
    if "sitekey" not in params:
        v3 = re.search(r'render=([A-Za-z0-9_-]{20,})', html)
        if v3:
            params["sitekey"] = v3.group(1)

    # Sitekey from iframe
    if "sitekey" not in params:
        iframe = re.search(r'recaptcha.*?k=([A-Za-z0-9_-]+)', html)
        if iframe:
            params["sitekey"] = iframe.group(1)

    # Sitekey from grecaptcha.render
    if "sitekey" not in params:
        render = re.search(r'sitekey\s*:\s*["\']([A-Za-z0-9_-]+)', html)
        if render:
            params["sitekey"] = render.group(1)

    # Version detection
    if re.search(r'data-size=["\']invisible', html):
        params["invisible"] = True
    if 'enterprise.js' in html:
        params["enterprise"] = True

    # Action (v3)
    action = re.search(
        r'action\s*:\s*["\']([^"\']+)',
        html[html.find('grecaptcha.execute'):] if 'grecaptcha.execute' in html else ''
    )
    if action:
        params["action"] = action.group(1)

    # data-s
    ds = re.search(r'data-s=["\']([^"\']+)', html)
    if ds:
        params["data_s"] = ds.group(1)

    # Callback
    cb = re.search(r'data-callback=["\'](\w+)', html)
    if cb:
        params["callback"] = cb.group(1)

    return params

# Usage
params = extract_recaptcha_params("https://example.com/login")
for k, v in params.items():
    print(f"  {k}: {v}")

الناتج المتوقع:

  pageurl: https://example.com/login
  sitekey: 6Le-SITEKEY-abc123
  invisible: True
  callback: onCaptchaComplete

إرسال المعلمات المستخرجة إلى CaptchaAI

data = {
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": params["sitekey"],
    "pageurl": params["pageurl"],
    "json": "1",
}

if params.get("invisible"):
    data["invisible"] = "1"
if params.get("enterprise"):
    data["enterprise"] = "1"
if params.get("action"):
    data["action"] = params["action"]
if params.get("data_s"):
    data["data-s"] = params["data_s"]

resp = requests.post("https://ocr.captchaai.com/in.php", data=data).json()

استكشاف الأخطاء وإصلاحها

مشكلة السبب إصلاح
لم يتم العثور على مفتاح الموقع تستخدم الصفحة العرض الديناميكي استخدم Puppeteer/Selenium بدلاً من HTML الثابت
مفتاح الموقع خاطئ مثيلات reCAPTCHA المتعددة تحقق من تعيينات عناصر واجهة المستخدم للنموذج الذي ترسله
لم يتم العثور على الإجراء تم تعريفه في ملف JS خارجي جلب وبحث ملفات JavaScript المرتبطة
يتغير data-s لكل طلب جوجل يجددها قم باستخراج data-s الطازج لكل حل

الأسئلة الشائعة

هل يمكنني استخراج المعلمات دون تحميل الصفحة في المتصفح؟

نعم، بالنسبة لمعظم المواقع، يكون مفتاح الموقع موجودًا في مصدر HTML. لكن اختبارات CAPTCHA التي يتم عرضها بواسطة JavaScript تتطلب متصفحًا أو متصفحًا بدون رأس.

هل مفتاح الموقع هو نفس مفتاح API؟

لا. مفتاح الموقع هو مفتاح عام مخصص لموقع الويب. إنها آمنة للمشاركة ويمكن رؤيتها في مصدر الصفحة.


استخدم المعلمات المستخرجة مع CaptchaAI لحل موثوق

احصل على مفتاح API الخاص بك علىcaptchaai.com.


أدلة ذات صلة

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