استخدام أداة حل CAPTCHA مع Puppeteer

بقلم solvethreeمدة القراءة: 3 دقيقة

استخدم SDK الرسمي بلغة JavaScript للحصول على رمز reCAPTCHA v3 Enterprise، ثم مرّر solution.token إلى نموذجك عبر Puppeteer. يحلّ SDK المهمة؛ لكنه لا يطبّق الحل على متصفح ولا يوفّر إضافة للمتصفح.

يستهدف المثال أدناه نموذج HTTPS تملكه، ويحتوي على حقل نص متعدد الأسطر g-recaptcha-response وزر إرسال. هذه متطلبات نموذج المثال التوضيحي، وليست واجهة عامة للصفحات المحمية بواسطة reCAPTCHA.

في هذه الصفحة

تجهيز الاعتماديات والنموذج الذي تملكه

  1. 1.

    تثبيت Puppeteer وSDK

    استخدم Node.js 22 أو أحدث. باستخدام npm، ثبّت puppeteer وأرشيف tar الخاص بـ SDK الرسمي من https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. يُستورد SDK باسم @solvethree/sdk؛ استخدم عنوان URL للتنزيل بدلًا من افتراض وجود إصدار في سجل npm. احفظ المثال كوحدة ES، مثل ملف ينتهي بالامتداد .mjs.

  2. 2.

    إعداد ملف تعريف الموقع

    أعدّ اسم المضيف الذي تملكه في وحدة تحكم solvethree، وتأكد من أن ملف تعريفه نشط لمساحة عملك. إرسال اسم مضيف وإجراء لا ينشئ ملف التعريف هذا. يستخدم المثال الإجراء login؛ غيّره إلى الإجراء المُعدّ لتطبيقك.

  3. 3.

    تعيين متغيرات البيئة

    عيّن TARGET_URL إلى نموذج HTTPS الذي تملكه، وSOLVETHREE_PROXY إلى عنوان URL لوكيل HTTP أو HTTPS، وSOLVETHREE_API_KEY إلى مفتاح مساحة عملك. احتفظ بالمفتاح في عملية Node.js، وليس في JavaScript الخاص بالصفحة. يستخدم المثال وكيلًا واحدًا لكلٍّ من الحل والإرسال عبر المتصفح.

قيمة site للمهمة هي اسم المضيف المستخرج من TARGET_URL، وليست عنوان URL الكامل للصفحة. في طلبات reCAPTCHA، أرسل site وaction وواحدًا فقط من proxy أو proxyCandidates؛ ولا تضف حقل type أو url. يستخدم هذا المثال proxy حتى يتمكن Puppeteer من استخدام الوكيل نفسه مباشرةً.

الحل ثم فتح Puppeteer بالهوية نفسها

Puppeteer + Node.js · حل نموذج HTTPS تملكه
// Install puppeteer and the official solvethree SDK first.
import puppeteer from 'puppeteer';
import { Solvethree } from '@solvethree/sdk';

const target = new URL(process.env.TARGET_URL); // Your configured HTTPS page.
const proxy = new URL(process.env.SOLVETHREE_PROXY);
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const result = await client.solve({
  site: target.hostname, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
});
const browser = await puppeteer.launch({
  args: [`--proxy-server=${proxy.protocol}//${proxy.host}`],
});
try {
  const page = await browser.newPage();
  if (proxy.username) await page.authenticate({
    username: decodeURIComponent(proxy.username),
    password: decodeURIComponent(proxy.password),
  });
  await page.setUserAgent({ userAgent: result.solution.userAgent });
  await page.setExtraHTTPHeaders({ 'sec-ch-ua': result.solution.secChUa });
  await page.goto(target.href);
  // Adapt these selectors and any required callback to your own form.
  await page.waitForSelector('[name="g-recaptcha-response"]');
  await page.$eval('[name="g-recaptcha-response"]', (field, token) => {
    field.value = token;
    field.dispatchEvent(new Event('input', { bubbles: true }));
  }, result.solution.token);
  await Promise.all([
    page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
    page.click('button[type="submit"]'),
  ]);
  // Check your application's success response here.
} finally {
  await browser.close();
}

تنشئ client.solve المهمة مرة واحدة وتستعلم دوريًا حتى تصبح جاهزة أو تطرح استثناءً. لا يشغّل هذا المثال Puppeteer إلا بعد عودة الاستدعاء. يستخدم المتصفح وكيل المهمة، ويجري المصادقة عند وجود بيانات اعتماد للوكيل، ويطبّق solution.userAgent وsolution.secChUa قبل الانتقال إلى الصفحة.

لا تستبدل ذلك الوكيل أو هوية المتصفح بقيم غير مرتبطة بهما عند إرسال الرمز. إذا انتقلت لاحقًا إلى proxyCandidates، فاستخدم الدالة المساعدة successfulProxy في SDK لاختيار الوكيل الأصلي الذي نجح لاستخدامه في المتصفح.

إذا فشل الحل، فافحص errorCode وerror للمهمة بدلًا من إعادة المحاولة بالمدخلات نفسها دون تغيير. أخطاء طلبات HTTP منفصلة عن حالات فشل المهام النهائية. تغلق كتلة finally المتصفح المحلي بعد انتهاء العمل عليه؛ وإغلاق الصفحات ليس آلية لإلغاء مهمة بعيدة.

تعديل افتراضات النموذج في المثال التوضيحي

  • يحدّد [name="g-recaptcha-response"] حقل النص في المثال التوضيحي. استبدله إذا كان تطبيقك يتلقى الرمز عبر حقل آخر أو معلمة طلب أخرى. القيمة المطلوب إرسالها هي solution.token، وليست معرّف المهمة.
  • يحدّد button[type="submit"] زر الإرسال في المثال التوضيحي. استخدم عنصر التحكم أو آلية الإرسال الفعلية في تطبيقك.
  • يعيّن المثال الرمز ويرسل حدث input. لا يحلّ ذلك محل دالة رد نداء خاصة بالتطبيق. أضف أي دالة رد نداء وقيمة CSRF وحقول تسجيل دخول وإعداد للجلسة مطلوبة قبل الإرسال.
  • استبدل التعليق الأخير الخاص بالتحقق من النجاح بتوكيد يتحقق من استجابة تطبيقك أو حالته الناتجة. لا تثبت جاهزية مهمة الحل أن التطبيق قد قبل الرمز.

إذا أعدت استخدام متصفح قيد التشغيل، فاختر BrowserContext الخاص به بعناية: الصفحة الجديدة ليست تلقائيًا جلسة منفصلة. حافظ على ترابط متطلبات جلسة النموذج بدلًا من خلط صفحات من مسارات عمل غير مرتبطة.

شغّل مهمتك الأولى.

ابدأ برصيد قدره $5 في مساحة العمل.

إنشاء مساحة عمل
استخدام أداة حل CAPTCHA مع Puppeteer · solvethree