أداة حل الكابتشا لـ
Puppeteer
حلّ التحدي داخل التشغيل بدلًا من إفشال المهمة. مثال عملي بلغة Node.js، والعوامل الثلاثة التي تحدد قبول الرمز token.
import puppeteer from "puppeteer";
const CAPTCHANO_KEY = "cn-YOUR_API_KEY";
async function solve(task) {
const headers = {
Authorization: `Bearer ${CAPTCHANO_KEY}`,
"Content-Type": "application/json",
};
const res = await fetch("https://api.captchano.com/v1/solve?wait=60", {
method: "POST",
headers,
body: JSON.stringify(task),
});
let data = await res.json();
// A solve can outlast the 60 s wait: poll the task until it finishes.
while (data.status === "queued" || data.status === "solving") {
await new Promise((r) => setTimeout(r, 5000));
const poll = await fetch(`https://api.captchano.com/v1/task/${data.id}`, { headers });
data = await poll.json();
}
if (data.status !== "ready") throw new Error(JSON.stringify(data.error ?? data));
return data.solution; // { token, userAgent }
}
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://example.com/signup");
const sitekey = await page.$eval("[data-sitekey]", (el) => el.getAttribute("data-sitekey"));
const { token, userAgent } = await solve({ type: "turnstile", sitekey, url: page.url() });
// Turnstile binds the token to a user agent: replay the one it was minted with.
if (userAgent) await page.setUserAgent(userAgent);
await page.evaluate((t) => {
document.querySelector('[name="cf-turnstile-response"]').value = t;
}, token);
await page.click('button[type="submit"]');ما الذي يحدد قبول الرمز token
- مرّر البروكسي الخاص بك. يجب أن يُنشأ الرمز token خلف عنوان IP الخروج نفسه الذي يرسله. وفي الأنظمة التي تقيّم الجلسة، يكون هذا إلزاميًا، وليس مجرد تحسين.
- طابِق وكيل المستخدم. يربط Turnstile وعدة أنظمة حماية من الروبوتات الرمز token بوكيل مستخدم. نُعيد لك الوكيل المستخدَم كي تعيد استخدامه كما هو تمامًا.
- اطلب متأخرًا. تنتهي صلاحية الرموز token خلال 120 ثانية تقريبًا. اطلب رمزًا عندما تكون مستعدًا للإرسال.
الانتظار المتزامن أم الاستطلاع الدوري
يستخدم المثال ?wait=60، فيُعيد الاستدعاء عملية الحل مكتملة وتبقى خطوة Puppeteer لديك خطية. وإن كنت تفضّل عدم إبقاء الاتصال مفتوحًا، فاحذف المعامل، واحتفظ بالمعرّف id المُعاد، واستطلع GET /v1/task/{id} كل خمس ثوانٍ. يبقى الرمز token الذي دفعت ثمنه قابلًا للاسترجاع لمدة عشر دقائق، لذا فإن انقطاع الاتصال لا يُفقدك عملية الحل.
التكلفة
$0.00598 لكل عملية حل ناجحة لـ reCAPTCHA v2، ولا تُحتسب عمليات الحل الفاشلة أبدًا. راجع الأسعار لكل أنواع التحديات، أو مرجع API للاطلاع على شكل الطلب الكامل.
كيف تندمج عملية الحل في Puppeteer
يتحكم Puppeteer في Chromium من Node.js. عملية الحل مجرد استدعاء fetch واحد بين page.goto والنقر على زر الإرسال، ويضع page.evaluate الرمز token حيث تتوقعه الصفحة.
- 01التشغيل مع البروكسي الخاص بك
شغّل Chromium مع --proxy-server واضبط وكيل المستخدم الذي ستبلّغ عنه في طلب الحل.
- 02اقرأ sitekey
page.$eval('[data-sitekey]', el => el.dataset.sitekey) واسم callback إن وُجد.
- 03الحل
استدعِ API باستخدام fetch مع ?wait=60؛ تحمل الاستجابة الرمز token ووكيل المستخدم المستخدَم.
- 04الإدراج والإرسال
استخدم page.evaluate لكتابة الرمز token وتشغيل callback، ثم انقر على زر الإرسال.
إدراج الرمز token في الصفحة
يضبط page.evaluate حقل الاستجابة ويستدعي callback في سياق الصفحة.
أين تخطئ عمليات التكامل عادةً
يتجاهل Chromium بيانات الاعتماد في --proxy-server. استخدم page.authenticate للمتصفح ومرّر عنوان URL الكامل للبروكسي إلى طلب الحل.
توجد الأداة داخل iframe لكن حقل الاستجابة في الإطار الرئيسي. أدرج الرمز في الإطار الرئيسي.
الرموز token صالحة للاستخدام مرة واحدة. إذا فشل الإرسال، فاطلب حلًا جديدًا بدلًا من إعادة استخدام الرمز الأول.
الأسئلة الشائعة حول الكابتشا في Puppeteer
هل أحتاج إلى puppeteer-extra أو إضافة كابتشا؟
لا. يكفي استدعاء fetch واحد إلى API واستدعاء page.evaluate، وتحتفظ بالتحكم الكامل في توقيت الحل وتكلفته.
هل يعمل في الوضع headless؟
نعم. يُنتَج الرمز token على بنيتنا التحتية، لا في متصفحك، لذا لا فرق في عملية الحل نفسها بين الوضع headless والوضع المرئي. قد تتعامل المواقع مع المتصفحات headless بريبة أكبر، لذا يبقى تمرير وكيل مستخدم واقعي مفيدًا.
هل يمكنني استخدامه مع Playwright لـ Node؟
نعم. الشيفرة شبه متطابقة؛ إذ يحل page.evaluate وpage.locator في Playwright محل نظيريهما في Puppeteer.
كيف أحل Cloudflare Turnstile في Puppeteer؟
اقرأ sitekey من أداة Turnstile، وأرسل type بقيمة turnstile مع عنوان URL للصفحة، ثم اضبط حقل الإدخال cf-turnstile-response واستدعِ callback إذا كانت الصفحة تعرّفه.
أدلة مفيدة
هل أنت مستعد للبناء؟
ابدأ بفترة تجريبية مجانية لمدة 3 أيام، ثم ادفع مقابل كل عملية حل ناجحة مع نمو حركة المرور لديك. لا حاجة إلى بطاقة للفترة التجريبية.