استخدام أداة حل CAPTCHA مع Playwright
حلّ مهمة reCAPTCHA Enterprise أولًا، ثم أرسل solution.token عبر نموذج تطبيقك في Playwright. استخدم الوكيل نفسه وهوية المتصفح المُعادة لطلب المتصفح هذا.
يستهدف المثال أدناه نموذج HTTPS تملكه، ويحتوي على حقل رمز معروف وزر إرسال. وهو تمرير صريح من SDK إلى النموذج، وليس إضافة للمتصفح.
في هذه الصفحة
تجهيز الاعتماديات والصفحة التي تملكها
- 1.
تثبيت Node.js 22+ وPlaywright وChromium
ثبّت حزمة
playwrightوملف متصفح Chromium التنفيذي الخاص بها. ثبّت SDK الرسمي لـ solvethree بلغة JavaScript باستخدام الحزمة القابلة للتنزيلsolvethree-sdk-0.1.0.tgz؛ تتضمن تعليمات التكامل مع Node.js أمر تثبيتها عبر التنزيل المباشر. - 2.
إعداد اسم المضيف في solvethree
يجب أن يتوفر لاسم مضيف صفحة HTTPS التي تملكها ملف تعريف reCAPTCHA نشط في مساحة عملك. أعدّه في وحدة التحكم قبل تشغيل المثال. إرسال اسم مضيف وإجراء في مهمة لا ينشئ ملف التعريف.
- 3.
تعيين متغيرات البيئة الثلاثة
عيّن
TARGET_URLإلى عنوان URL الكامل لصفحة HTTPS التي تملكها، وSOLVETHREE_PROXYإلى عنوان URL للوكيل، وSOLVETHREE_API_KEYإلى مفتاح API لمساحة عملك. شغّل السكربت على الخادم؛ ولا تضع مفتاح API في JavaScript الخاص بالصفحة. يستخدم المثال الإجراءlogin، ويجب تغييره إذا كان تطبيقك يستخدم إجراءً مختلفًا. - 4.
توفير نموذج المثال
يجب أن تحتوي الصفحة على حقل نص متعدد الأسطر باسم
g-recaptcha-responseوزر اسمه الميسّر هوSubmitبالضبط. إذا كان نموذجك مختلفًا، فعدّل آلية التمرير الموضحة أدناه قبل تشغيله.
يُضبط وكيل المهمة ووكيل متصفح Playwright كلٌّ على حدة. لا يوجّه وكيل سياق المتصفح طلبات API التي يرسلها SDK من الخادم تلقائيًا. يزوّد هذا المثال المهمة بوكيل واحد ويعيد استخدامه لحركة مرور المتصفح إلى الوجهة المستهدفة.
الحل ثم الإرسال عبر Playwright
// Install playwright and the official solvethree SDK first.
import { chromium } from 'playwright';
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 chromium.launch();
try {
const context = await browser.newContext({
proxy: {
server: `${proxy.protocol}//${proxy.host}`,
username: decodeURIComponent(proxy.username),
password: decodeURIComponent(proxy.password),
},
userAgent: result.solution.userAgent,
extraHTTPHeaders: { 'sec-ch-ua': result.solution.secChUa },
});
const page = await context.newPage();
await page.goto(target.href);
// This example form has this field and a button named Submit.
// Adapt the selectors/callback to your own application's form contract.
await page.locator('[name="g-recaptcha-response"]').waitFor({ state: 'attached' });
await page.locator('[name="g-recaptcha-response"]').evaluate((field, token) => {
field.value = token;
field.dispatchEvent(new Event('input', { bubbles: true }));
}, result.solution.token);
await Promise.all([
page.waitForResponse(response =>
response.request().method() === 'POST' &&
new URL(response.url()).origin === target.origin),
page.getByRole('button', { name: 'Submit', exact: true }).click(),
]);
// Check your application's success response here.
} finally {
await browser.close();
}تنشئ solve المهمة مرة واحدة وتستعلم دوريًا حتى تصبح جاهزة أو تطرح استثناءً. لا يبدأ المتصفح إلا بعد نجاح هذا الاستدعاء. يستخدم سياقه الوكيل الأصلي، بما في ذلك أي بيانات اعتماد مرمّزة بتنسيق URL، والقيمتين المُعادتين solution.userAgent وsolution.secChUa.
يتلقى النموذج solution.token، وليس معرّف المهمة. ينتظر المثال إرفاق الحقل بالصفحة لأن حقل نص الرمز لا يلزم أن يكون مرئيًا. يعيّن الرمز، ويرسل حدث إدخال، ثم ينقر على زر الإرسال.
- يشير
TARGET_URLإلى عنوان في تطبيقك. تتلقى مهمة الحل اسم مضيفه فيsite؛ وينتقل Playwright إلى عنوان URL الكامل. loginهو إجراء المثال. استبدله بالإجراء الذي يستخدمه تطبيقك.[name="g-recaptcha-response"]هو محدِّد حقل الرمز في المثال. استبدله إذا كان تطبيقك يتوقع الرمز في حقل آخر أو معلمة طلب أخرى.Submitهو الاسم الميسّر لزر المثال. استبدل محدِّد العنصر هذا، أو استخدم مسار الإرسال الفعلي في تطبيقك.- حدث الإدخال جزء من آلية التمرير في هذا المثال التوضيحي. قد يتطلب التطبيق الفعلي أيضًا دالة رد نداء، أو تحديثًا لحالة التطبيق، أو قيمة CSRF، أو جلسة قائمة. لا توجد دالة رد نداء عامة لملء الرمز.
إذا لم يقبل النموذج الرمز
قبل الدفع مقابل حل آخر، افحص طلب التطبيق الصادر باستخدام مراقبة الطلبات والاستجابات في Playwright. تعني جاهزية المهمة أن الحل متاح؛ أما استجابة التطبيق فتوضح ما إذا كان الإرسال قد قُبل.
- الرمز المُرسل مفقود أو لم يتغير.
افحص معلمة الطلب الفعلية، وليس قيمة حقل النص فقط.
جرّب هذا: مرّر
solution.tokenعبر مسار الإرسال الفعلي في التطبيق. لن يفيد تحديث حقل المثال التوضيحي إذا كان التطبيق ينشئ طلبه من حالة منفصلة.- يحتوي الطلب على الرمز، لكنه يُرفض.
قارن الوكيل ووكيل المستخدم وتلميحات العميل واسم المضيف المستهدف والإجراء المستخدمة في الإرسال بتلك المستخدمة في الحل. تحقق من متطلبات الجلسة وCSRF في التطبيق.
جرّب هذا: استخدم الوكيل نفسه للحل والإرسال، وطبّق هوية المتصفح المُعادة، واستوفِ متطلبات نموذج التطبيق قبل الإرسال.
- يفشل السكربت قبل فتح المتصفح.
ميّز بين خطأ طلب HTTP ومهمة انتهت بالفشل. إذا فشلت المهمة، فافحص
errorCodeوerror.جرّب هذا: صحّح مشكلة المدخلات أو ملف التعريف أو الاتصال المُبلّغ عنها بدلًا من تكرار إرسال المدخلات دون تغيير. يطرح SDK استثناءً عند الفشل؛ فلا تتابع إلى خطوة ملء الرمز.
المصادر ومرجع API
شغّل مهمتك الأولى.
ابدأ برصيد قدره $5 في مساحة العمل.