استخدم هذه الصفحة عندما يحتاج تدفق أتمتة Playwright إلى مسار ثابت لحل رموز التحقق مع إرشادات عملية لتكامل واجهة برمجة التطبيقات.
يتيح Death By Captcha (DBC) لسكربتات Playwright حل تحديات الكابتشا عبر API بدلاً من التفاعل اليدوي: يستخرج سكربتُك معاملات التحدٍّ من الصفحة، ثم يطلب حلاً من DBC، ويعيد حقن النتيجة في الصفحة ويتابع المسار. هذه صفحة البدء السريع: التثبيت، ونموذج قابل للتشغيل، وملاحظات المهام المدعومة.
Node.js:
npm install playwright deathbycaptcha-lib
Python:
pip install deathbycaptcha-official
استخدم بيانات حساب DBC في العميل. أنشئ حسابًا وراجع الأسعار والرصيد قبل تشغيل المسار.
const { chromium } = require('playwright');
const { HttpClient } = require('deathbycaptcha-lib');
const client = new HttpClient(process.env.DBC_USERNAME, process.env.DBC_PASSWORD);
const DEMO_URL = 'https://www.google.com/recaptcha/api2/demo';
async function solveRecaptchaV2(pageUrl, sitekey) {
const balance = await new Promise((resolve, reject) =>
client.get_balance((b) => (b ? resolve(b) : reject(new Error('Could not read balance')))));
if (balance <= 0) throw new Error('No balance - top up before solving.');
return new Promise((resolve, reject) =>
client.decode(
{ extra: { type: 4, token_params: JSON.stringify({ googlekey: sitekey, pageurl: pageUrl }) } },
(solution) => (solution && solution.text ? resolve(solution.text) : reject(new Error('No solution yet - retry')))
));
}
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(DEMO_URL, { timeout: 60000 });
// 1. extract the challenge parameters
const sitekey = await page.getAttribute('#recaptcha-demo', 'data-sitekey');
// 2. request the solution token from DBC (type 4 = reCAPTCHA v2 token)
const token = await solveRecaptchaV2(DEMO_URL, sitekey);
// 3. inject the token and trigger the page callback
await page.evaluate((t) => {
const el = document.getElementById('g-recaptcha-response');
if (!el) return;
el.style.display = 'block';
el.value = t;
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
const cfg = window.___grecaptcha_cfg;
if (!cfg || !cfg.clients) return;
for (const k of Object.keys(cfg.clients)) {
const c = cfg.clients[k];
for (const key of Object.keys(c)) {
const item = c[key];
if (item && typeof item.callback === 'function') return item.callback(t);
if (item && item.W && typeof item.W.callback === 'function') return item.W.callback(t);
}
}
}, token);
// 4. submit and wait for success
await page.click('#recaptcha-demo-submit');
await page.waitForSelector('.recaptcha-success', { timeout: 15000 });
console.log('solved');
await browser.close();
})();
النسخة الكاملة القابلة للتشغيل: examples/playwright في مستودع عميل Node.js الرسمي
| الموضوع | ملاحظة |
|---|---|
| أنواع الكابتشا (API) | reCAPTCHA v2 وv3 وCloudflare Turnstile وGeeTest وDataDome وكابتشا الصور/النص. |
| الرصيد | تُدفع الحلول من رصيد الحساب؛ تحقق منه قبل فك الترميز. |
| إعادات المحاولة | عدم عودة الحل مؤقت: أعد المحاولة بتراجع زمني كما يفعل المثال الرسمي. |
| API مقابل الإضافة | يستخدم هذا المسار API داخل سكربتك؛ إضافة المتصفح هي المسار بدون برمجة للتصفح اليدوي. |
| المتصفحات المدعومة | Chromium وFirefox وWebKit عبر Playwright (تم التحقق من العينة على Chromium). |
| المنطقة | لماذا يهم | الممارسة الموصى بها |
|---|---|---|
| اتساق الوكيل | يقلل من مخاطر عدم تطابق التحقق في تدفقات الرمز المميز. | حافظ على مسار الحل والإرسال محاذيًا في سياق الأتمتة. |
| الانضباط المهلة | يمنع الأكشاك في قائمة الانتظار وتشغيل CI غير المستقر. | استخدم عمليات إعادة المحاولة المحدودة مع المعالجة الاحتياطية الحتمية. |
| معالجة خاصة بالنوع | تحتاج فئات التحدي المختلفة إلى حقول حمولة مختلفة. | ابدأ من صفحات نوع واجهة برمجة التطبيقات (API) وتحقق من صحة نوع واحد في كل مرة. |
بالنسبة إلى طرح حل Playwright captcha، تحقق من صحة نوع واحد من رموز التحقق أولاً، ثم قم بتوسيع التغطية من خلال فحوصات الموثوقية والتسعير لحجم الإنتاج.