حالات الاستخدام

تجريف اختبار CAPTCHA باستخدام Node.js: البرنامج التعليمي الكامل

تتفوق Node.js في I/O-heavy في إلغاء أعباء العمل. عندما تخدم المواقع المستهدفة اختبارات CAPTCHA، فإن واجهة برمجة تطبيقات CaptchaAI تحلها بينما يتعامل البرنامج النصي الخاص بك مع طلبات HTTP. يغطي هذا البرنامج التعليمي سير العمل الكامل باستخدام axios وcherio.

المتطلبات

المتطلبات التفاصيل
Node.js 16+ مع npm
أكسيوس npm install axios
com.cherio npm install cheerio
مفتاح CaptchaAI API منcaptchaai.com

وحدة حل CaptchaAI

// captcha-solver.js
const axios = require("axios");

class CaptchaSolver {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.baseUrl = "https://ocr.captchaai.com";
  }

  async _submit(params) {
    params.key = this.apiKey;
    const resp = await axios.get(`${this.baseUrl}/in.php`, { params });
    if (!resp.data.startsWith("OK|")) {
      throw new Error(`Submit error: ${resp.data}`);
    }
    return resp.data.split("|")[1];
  }

  async _poll(taskId, timeout = 300000) {
    const deadline = Date.now() + timeout;
    while (Date.now() < deadline) {
      await new Promise((r) => setTimeout(r, 5000));
      const resp = await axios.get(`${this.baseUrl}/res.php`, {
        params: { key: this.apiKey, action: "get", id: taskId },
      });
      if (resp.data === "CAPCHA_NOT_READY") continue;
      if (resp.data.startsWith("OK|")) return resp.data.split("|")[1];
      throw new Error(`Solve error: ${resp.data}`);
    }
    throw new Error("Solve timed out");
  }

  async solveRecaptchaV2(siteKey, pageUrl) {
    const taskId = await this._submit({
      method: "userrecaptcha",
      googlekey: siteKey,
      pageurl: pageUrl,
    });
    return this._poll(taskId);
  }

  async solveRecaptchaV3(siteKey, pageUrl, action = "verify") {
    const taskId = await this._submit({
      method: "userrecaptcha",
      googlekey: siteKey,
      pageurl: pageUrl,
      version: "v3",
      action,
    });
    return this._poll(taskId);
  }

  async solveTurnstile(siteKey, pageUrl) {
    const taskId = await this._submit({
      method: "turnstile",
      sitekey: siteKey,
      pageurl: pageUrl,
    });
    return this._poll(taskId);
  }
}

module.exports = CaptchaSolver;

كشط صفحة محمية بواسطة reCAPTCHA

const axios = require("axios");
const cheerio = require("cheerio");
const CaptchaSolver = require("./captcha-solver");

const solver = new CaptchaSolver("YOUR_API_KEY");

async function scrapeProtectedPage(url) {
  // Step 1: Load the page
  const { data: html } = await axios.get(url, {
    headers: {
      "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    },
  });

  const $ = cheerio.load(html);

  // Step 2: Extract site key
  const siteKey = $(".g-recaptcha").attr("data-sitekey");
  if (!siteKey) {
    console.log("No CAPTCHA found, page loaded directly");
    return html;
  }

  console.log("Site key found:", siteKey);

  // Step 3: Solve the CAPTCHA
  const token = await solver.solveRecaptchaV2(siteKey, url);
  console.log("Token received:", token.substring(0, 50));

  // Step 4: Submit with the token
  const result = await axios.post(
    url,
    new URLSearchParams({
      "g-recaptcha-response": token,
      q: "search query",
    }),
    {
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        "User-Agent":
          "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
      },
    }
  );

  return result.data;
}

كشط صفحات متعددة في وقت واحد

async function scrapePages(urls, siteKey, concurrency = 3) {
  const results = [];
  const queue = [...urls];

  const worker = async () => {
    while (queue.length > 0) {
      const url = queue.shift();
      try {
        const token = await solver.solveRecaptchaV2(siteKey, url);
        const { data } = await axios.post(
          url,
          new URLSearchParams({ "g-recaptcha-response": token }),
          {
            headers: {
              "User-Agent":
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
            },
          }
        );
        results.push({ url, data, success: true });
        console.log(`Scraped: ${url}`);
      } catch (err) {
        results.push({ url, error: err.message, success: false });
        console.error(`Failed: ${url} - ${err.message}`);
      }
    }
  };

  // Run workers concurrently
  const workers = Array(concurrency)
    .fill(null)
    .map(() => worker());
  await Promise.all(workers);

  return results;
}

// Usage
const urls = [
  "https://example.com/page/1",
  "https://example.com/page/2",
  "https://example.com/page/3",
];
const results = await scrapePages(urls, "6Le-wvkS...", 3);

التعامل مع ملفات تعريف الارتباط والجلسات

استخدم axios مع استمرارية ملفات تعريف الارتباط للمواقع التي تتطلب ملفات تعريف الارتباط للجلسة:

const { wrapper } = require("axios-cookiejar-support");
const { CookieJar } = require("tough-cookie");

const jar = new CookieJar();
const client = wrapper(
  axios.create({
    jar,
    headers: {
      "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    },
  })
);

async function scrapeWithSession(url, siteKey) {
  // Initial page load sets cookies
  await client.get(url);

  // Solve CAPTCHA
  const token = await solver.solveRecaptchaV2(siteKey, url);

  // Submit with maintained cookies
  const result = await client.post(
    url,
    new URLSearchParams({ "g-recaptcha-response": token })
  );

  return result.data;
}

تحليل النتائج مع Cheerio

function parseResults(html) {
  const $ = cheerio.load(html);
  const items = [];

  $(".result-item").each((_, el) => {
    items.push({
      title: $(el).find(".title").text().trim(),
      url: $(el).find("a").attr("href"),
      description: $(el).find(".description").text().trim(),
    });
  });

  return items;
}

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

المشكلة السبب الإجراء
حلقات CAPTCHA_NOT_READY إلى أجل غير مسمى مفتاح موقع خاطئ أو حل بطيء التحقق من مفتاح الموقع. زيادة المهلة
403 Forbidden على البريد ملفات تعريف الارتباط أو الرؤوس المفقودة استخدام ملفات تعريف الارتباط الخاصة بالجلسة؛ أضف رأس Referer
لا يستطيع Cheerio العثور على العناصر المحتوى الديناميكي استخدم Puppeteer للمواقع التي يتم عرضها بواسطة JS
ECONNREFUSED معدل محدود حسب الموقع المستهدف إضافة تأخيرات؛ تدوير الوكلاء

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

متى يجب علي استخدام Puppeteer بدلاً من axios؟

استخدم axios + Cheerio عندما يقوم الموقع المستهدف بإرجاع HTML مع عمليات إرسال النماذج القياسية. استخدم Puppeteer عندما يتطلب الموقع تنفيذ JavaScript، أو العرض الديناميكي، أو تفاعلات المستخدم المعقدة.

هل يمكنني حل اختبارات CAPTCHA متعددة في نفس الوقت؟

نعم. قم بإرسال مهام CAPTCHA متعددة إلى CaptchaAI بشكل متزامن واستطلاع لكل نتيجة. يوضح مثال الكشط المتزامن أعلاه هذا النمط.

كيف أتعامل مع المواقع المحمية بواسطة Cloudflare؟

إذا كان الموقع يستخدم Turnstile، فاستخدم solver.solveTurnstile(). للحصول على صفحات تحدي Cloudflare الكاملة، استخدمحل Cloudflare Challengeوالتي تقوم بإرجاع ملفات تعريف الارتباط cf_clearance.

أدلة ذات صلة

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