الشروحات المعمقة

كيفية التعامل مع reCAPTCHA v2 في سير عمل تجريف الويب

عندما تواجه أداة الكشط الخاصة بك تحدي reCAPTCHA v2، يتوقف سير العمل. تنتظر الصفحة أن يقوم الإنسان بحل مربع الاختيار أو شبكة الصور قبل تقديم البيانات التي تحتاجها. أسرع طريقة لاستئناف عملية التجريف هي توجيه اختبار CAPTCHA إلى واجهة برمجة تطبيقات الحل: استخرج مفتاح الموقع وعنوان URL للصفحة، وأرسلهما إلىCaptchaAI، واحصل على رمز مميز صالح، وأدخله مرة أخرى في الصفحة.

يوضح هذا الدليل التدفق الكامل لرمز العمل لـ Python (طلبات السيلينيوم +) وNode.js (Puppeteer).


كيف يعمل سير العمل

تحتوي كل أداة reCAPTCHA v2 على معلمتين تحتاجهما المكشطة:

  1. googlekey — مفتاح الموقع العام المضمن في صفحة HTML
  2. pageurl — عنوان URL الذي يظهر فيه اختبار CAPTCHA

ترسل المكشطة هذه إلى CaptchaAI API، وتنتظر رمزًا مميزًا تم حله، ثم تقوم بإدخال الرمز المميز مرة أخرى في حقل g-recaptcha-response بالصفحة (أو تستدعي وظيفة رد الاتصال). تتحقق الواجهة الخلفية للموقع المستهدف من الرمز المميز ضد Google وتسمح للطلب بالمرور.


بايثون: السيلينيوم + CaptchaAI

import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# Step 1: Open the page with Selenium
driver = webdriver.Chrome()
driver.get("https://example.com/protected-page")

# Step 2: Extract the sitekey
sitekey = driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").get_attribute("data-sitekey")
page_url = driver.current_url

# Step 3: Submit to CaptchaAI
response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url,
    "json": 1
}).json()

task_id = response["request"]

# Step 4: Poll for result
token = None
for _ in range(40):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY",
        "action": "get",
        "id": task_id,
        "json": 1
    }).json()

    if result.get("status") == 1:
        token = result["request"]
        break
    if result.get("request") != "CAPCHA_NOT_READY":
        raise RuntimeError(f"Solve failed: {result['request']}")

# Step 5: Inject the token and submit
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)

# Check for callback
callback = driver.execute_script(
    'var el = document.querySelector(".g-recaptcha"); '
    'return el ? el.getAttribute("data-callback") : null;'
)
if callback:
    driver.execute_script(f'{callback}("{token}");')
else:
    driver.find_element(By.CSS_SELECTOR, "form").submit()

# Step 6: Scrape the data
print(driver.page_source[:500])
driver.quit()

Node.js: Puppeteer + CaptchaAI

const puppeteer = require("puppeteer");

async function scrapeWithCaptcha(url) {
  const browser = await puppeteer.launch({ headless: "new" });
  const page = await browser.newPage();
  await page.goto(url, { waitUntil: "networkidle2" });

  // Extract sitekey
  const sitekey = await page.$eval(".g-recaptcha", (el) => el.dataset.sitekey);

  // Submit to CaptchaAI
  const submitRes = await fetch(
    `https://ocr.captchaai.com/in.php?${new URLSearchParams({
      key: "YOUR_API_KEY",
      method: "userrecaptcha",
      googlekey: sitekey,
      pageurl: url,
      json: 1,
    })}`
  );
  const { request: taskId } = await submitRes.json();

  // Poll for result
  let token;
  for (let i = 0; i < 40; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const res = await fetch(
      `https://ocr.captchaai.com/res.php?${new URLSearchParams({
        key: "YOUR_API_KEY",
        action: "get",
        id: taskId,
        json: 1,
      })}`
    );
    const data = await res.json();
    if (data.status === 1) {
      token = data.request;
      break;
    }
    if (data.request !== "CAPCHA_NOT_READY")
      throw new Error(`Solve failed: ${data.request}`);
  }

  // Inject token
  await page.evaluate((t) => {
    document.getElementById("g-recaptcha-response").innerHTML = t;
    const cb = document.querySelector(".g-recaptcha")?.dataset.callback;
    if (cb && window[cb]) window[cb](t);
  }, token);

  // Wait for navigation after form submit
  await page.waitForNavigation({ waitUntil: "networkidle2" });
  const content = await page.content();
  await browser.close();
  return content;
}

scrapeWithCaptcha("https://example.com/protected-page").then(console.log);

وضع بلا رأس مقابل وضع الرأس

تكتشف بعض المواقع المتصفحات مقطوعة الرأس وتحظرها حتى قبل ظهور اختبار CAPTCHA. إذا تم حظرك قبل رؤية reCAPTCHA:

  • استخدم headless: "new" في Puppeteer (وضع التخفي الأحدث)
  • أضف --disable-blink-features=AutomationControlled إلى إشارات Chromium
  • استخدم سلسلة وكيل مستخدم حقيقية
  • فكر في استخدام دوران الوكيل مع حلول CaptchaAI

نهج HTTP فقط (بدون متصفح)

إذا أرسل الموقع المستهدف اختبار CAPTCHA في تدفق إرسال النموذج، فيمكنك تخطي المتصفح بالكامل:

import requests
import time

session = requests.Session()
session.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"

# Load the page to get cookies
session.get("https://example.com/protected-page")

# Solve the CAPTCHA
sitekey = "6Le-wvkSAAAAAN..."  # extracted from page HTML
solve_resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY", "method": "userrecaptcha",
    "googlekey": sitekey, "pageurl": "https://example.com/protected-page",
    "json": 1
}).json()

task_id = solve_resp["request"]
time.sleep(15)

# Poll
for _ in range(30):
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        token = result["request"]
        break
    time.sleep(5)

# Submit with token
resp = session.post("https://example.com/protected-page", data={
    "g-recaptcha-response": token,
    "other_field": "value"
})
print(resp.text[:500])

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

هل يؤدي حل reCAPTCHA v2 إلى إبطاء أداة الكشط الخاصة بي؟

يستغرق كل حل 15-60 ثانية. بالنسبة للتجريد بكميات كبيرة، قم بتشغيل حلول متعددة بالتوازي (يدعم CaptchaAI المهام المتزامنة لكل مؤشر ترابط).

هل يمكنني تخزين رموز reCAPTCHA مؤقتًا؟

لا، كل رمز مميز يستخدم مرة واحدة وينتهي بعد دقيقتين تقريبًا. أنت بحاجة إلى حل جديد لكل طلب صفحة محمية.

هل أحتاج إلى متصفح للتعامل مع reCAPTCHA v2؟

ليس دائما. إذا كان الموقع يقبل g-recaptcha-response كحقل POST، فيمكنك استخدام أسلوب HTTP فقط. إذا كان الموقع يتطلب حقن رمز مميز يعتمد على JavaScript، فأنت بحاجة إلى متصفح.

كيف يمكنني التعامل مع الوكلاء الدوارين باستخدام CaptchaAI؟

تقوم CaptchaAI بحل اختبارات CAPTCHA على بنيتها التحتية الخاصة - لا تحتاج إلى تمرير الوكيل الخاص بك لـ reCAPTCHA v2 القياسي. استخدم الوكلاء الخاصين بك لطلبات الكشط التالية.

ماذا لو كان الموقع يستخدم Enterprise reCAPTCHA؟

أضف enterprise=1 إلى طلبك CaptchaAI. يرىكيفية حل reCAPTCHA v2 Enterprise باستخدام API.


ابدأ في تجريف reCAPTCHA v2

  1. احصل على مفتاح API الخاص بك علىcaptchaai.com/api.php
  2. قم باستخراج مفتاح الموقع من الصفحة المستهدفة
  3. استخدم أمثلة التعليمات البرمجية أعلاه لحلها وحقنها
  4. التوسع مع الحلول المتزامنة لسير العمل كبير الحجم

أدلة ذات صلة

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