لا تحتاج إلى Puppeteer أو Playwright في كل سيناريو يتضمن CAPTCHA. باستخدام Axios وCaptchaAI، يمكنك إرسال المهام واسترجاع النتائج عبر HTTP فقط، وهو ما يكفي لعدد كبير من حالات التكامل الخلفي أو الأدوات الخفيفة.
المتطلبات
| المتطلبات | التفاصيل |
|---|---|
| Node.js | 16+ |
| أكسيوس | 1.x |
| مفتاح CaptchaAI API | احصل على واحدة هنا |
npm install axios
عميل CaptchaAI
const axios = require("axios");
class CaptchaAI {
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 });
const text = resp.data;
if (!String(text).startsWith("OK|")) {
throw new Error(`Submit failed: ${text}`);
}
return String(text).split("|")[1];
}
async poll(taskId, timeoutMs = 300000) {
const deadline = Date.now() + timeoutMs;
const params = { key: this.apiKey, action: "get", id: taskId };
while (Date.now() < deadline) {
await new Promise((r) => setTimeout(r, 5000));
const resp = await axios.get(`${this.baseUrl}/res.php`, { params });
const text = String(resp.data);
if (text === "CAPCHA_NOT_READY") continue;
if (text.startsWith("OK|")) return text.split("|").slice(1).join("|");
throw new Error(`Solve failed: ${text}`);
}
throw new Error(`Timeout after ${timeoutMs}ms for task ${taskId}`);
}
async solve(params, timeoutMs = 300000) {
const taskId = await this.submit(params);
return this.poll(taskId, timeoutMs);
}
async getBalance() {
const resp = await axios.get(`${this.baseUrl}/res.php`, {
params: { key: this.apiKey, action: "getbalance" },
});
return parseFloat(resp.data);
}
}
module.exports = CaptchaAI;
حل reCAPTCHA v2 (بدون متصفح)
const CaptchaAI = require("./captchaai");
async function main() {
const solver = new CaptchaAI(process.env.CAPTCHAAI_API_KEY);
// Solve the CAPTCHA without opening any browser
const token = await solver.solve({
method: "userrecaptcha",
googlekey: "6Le-wvkS...",
pageurl: "https://example.com/login",
});
// Submit form with the token using Axios
const resp = await axios.post("https://example.com/login", {
username: "user",
password: "pass",
"g-recaptcha-response": token,
});
console.log(`Login response: ${resp.status}`);
}
main().catch(console.error);
حل Turnstile (بدون متصفح)
const token = await solver.solve({
method: "turnstile",
sitekey: "0x4AAAAA...",
pageurl: "https://example.com",
});
// Submit with Turnstile token
const resp = await axios.post("https://example.com/api/verify", {
"cf-turnstile-response": token,
data: "payload",
});
حل صورة CAPTCHAs
const fs = require("fs");
const imageBuffer = fs.readFileSync("captcha.png");
const imageB64 = imageBuffer.toString("base64");
const text = await solver.solve({
method: "base64",
body: imageB64,
});
console.log(`CAPTCHA text: ${text}`);
// Submit form with solved text
const resp = await axios.post("https://example.com/verify", {
captcha: text,
other_data: "value",
});
سير عمل القشط الكامل
قم بكشط صفحة محمية بـ CAPTCHA بدون أي متصفح:
const CaptchaAI = require("./captchaai");
const axios = require("axios");
const cheerio = require("cheerio");
async function scrapeProtectedPage(url) {
const solver = new CaptchaAI(process.env.CAPTCHAAI_API_KEY);
// Step 1: Fetch the page
const page = await axios.get(url);
const $ = cheerio.load(page.data);
// Step 2: Extract the reCAPTCHA site key
const siteKey = $(".g-recaptcha").attr("data-sitekey");
if (!siteKey) {
console.log("No CAPTCHA found, returning page content");
return page.data;
}
// Step 3: Solve the CAPTCHA
console.log(`Solving CAPTCHA for ${url}...`);
const token = await solver.solve({
method: "userrecaptcha",
googlekey: siteKey,
pageurl: url,
});
// Step 4: Submit form with token
const formAction = $("form").attr("action") || url;
const formData = {};
$("form input").each((_, el) => {
const name = $(el).attr("name");
const value = $(el).attr("value") || "";
if (name) formData[name] = value;
});
formData["g-recaptcha-response"] = token;
const result = await axios.post(formAction, new URLSearchParams(formData), {
headers: { "Content-Type": "application/x-www-form-urlencoded" },
});
return result.data;
}
scrapeProtectedPage("https://example.com/data")
.then((data) => console.log("Success:", typeof data))
.catch(console.error);
الحل المتزامن
async function solveBatch(urls, siteKey) {
const solver = new CaptchaAI(process.env.CAPTCHAAI_API_KEY);
const promises = urls.map(async (url) => {
try {
const token = await solver.solve({
method: "userrecaptcha",
googlekey: siteKey,
pageurl: url,
});
return { url, token, error: null };
} catch (error) {
return { url, token: null, error: error.message };
}
});
const results = await Promise.all(promises);
const solved = results.filter((r) => r.token);
console.log(`Solved ${solved.length}/${urls.length}`);
return results;
}
استكشاف الأخطاء وإصلاحها
| خطأ | السبب | إصلاح |
|---|---|---|
AxiosError: getaddrinfo ENOTFOUND |
مشكلة DNS | تحقق من اتصال الشبكة |
Submit failed: ERROR_WRONG_USER_KEY |
مفتاح API غير صالح | التحقق من المفتاح من لوحة التحكم |
Submit failed: ERROR_ZERO_BALANCE |
لا أموال | إضافة رصيد إلى الحساب |
| تم رفض الرمز المميز بواسطة الموقع المستهدف | انتهت صلاحية الرمز المميز | إرسال الرمز المميز في غضون 60 ثانية |
الأسئلة الشائعة
لماذا تتجنب المتصفحات لحل اختبار CAPTCHA؟
تستهلك المتصفحات ذاكرة وصول عشوائي (RAM) تتراوح من 200 إلى 500 ميجابايت لكل مثيل. يستخدم HTTP النقي مع CaptchaAI حوالي 5 ميغابايت. يعد هذا أكثر كفاءة بنسبة 40 إلى 100 مرة للأتمتة من جانب الخادم.
متى لا أزال بحاجة إلى متصفح؟
عندما يتطلب الموقع عرض JavaScript للمحتوى. بالنسبة لاختبارات CAPTCHA على وجه التحديد، لن تحتاج أبدًا إلى متصفح - يتولى CaptchaAI حلها عن بُعد.
هل يمكنني استخدام الجلب بدلاً من Axios؟
نعم. يتضمن Node.js 18+ fetch الأصلي. معلمات CaptchaAI API هي نفسها.
النقاشات (0)
شارك في النقاش
سجّل الدخول لمشاركة رأيك.
تسجيل الدخوللا توجد تعليقات بعد.