CaptchaNo
[ التكامل ]

أداة حل الكابتشا لـ
Puppeteer

حلّ التحدي داخل التشغيل بدلًا من إفشال المهمة. مثال عملي بلغة ⁦Node.js⁩، والعوامل الثلاثة التي تحدد قبول الرمز token.

Puppeteer · Node.js
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

  1. مرّر البروكسي الخاص بك. يجب أن يُنشأ الرمز token خلف عنوان IP الخروج نفسه الذي يرسله. وفي الأنظمة التي تقيّم الجلسة، يكون هذا إلزاميًا، وليس مجرد تحسين.
  2. طابِق وكيل المستخدم. يربط Turnstile وعدة أنظمة حماية من الروبوتات الرمز token بوكيل مستخدم. نُعيد لك الوكيل المستخدَم كي تعيد استخدامه كما هو تمامًا.
  3. اطلب متأخرًا. تنتهي صلاحية الرموز 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 حيث تتوقعه الصفحة.

  1. 01
    التشغيل مع البروكسي الخاص بك

    شغّل Chromium مع --proxy-server واضبط وكيل المستخدم الذي ستبلّغ عنه في طلب الحل.

  2. 02
    اقرأ sitekey

    page.$eval('[data-sitekey]', el => el.dataset.sitekey) واسم callback إن وُجد.

  3. 03
    الحل

    استدعِ API باستخدام fetch مع ?wait=60؛ تحمل الاستجابة الرمز token ووكيل المستخدم المستخدَم.

  4. 04
    الإدراج والإرسال

    استخدم page.evaluate لكتابة الرمز token وتشغيل callback، ثم انقر على زر الإرسال.

إدراج الرمز token في الصفحة

يضبط page.evaluate حقل الاستجابة ويستدعي callback في سياق الصفحة.

[ المزالق ]

أين تخطئ عمليات التكامل عادةً

مصادقة البروكسي

يتجاهل Chromium بيانات الاعتماد في --proxy-server. استخدم page.authenticate للمتصفح ومرّر عنوان URL الكامل للبروكسي إلى طلب الحل.

الأدوات داخل iframe

توجد الأداة داخل iframe لكن حقل الاستجابة في الإطار الرئيسي. أدرج الرمز في الإطار الرئيسي.

رمز token منتهي الصلاحية عند إعادة المحاولة

الرموز 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 أيام، ثم ادفع مقابل كل عملية حل ناجحة مع نمو حركة المرور لديك. لا حاجة إلى بطاقة للفترة التجريبية.

اطّلع على خططنا
هل أنت وكيل ذكاء اصطناعي؟ اطّلع على خيارات الإعداد ←