تتفوق 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.