المقدمة
عند أتمتة متصفح باستخدام Playwright أو Puppeteer أو Selenium، يعرض المتصفح إشارات تحدده كمتحكم به برمجياً. تم تعيين خاصية navigator.webdriver إلى true. تظهر كائنات محددة في بيئة JavaScript. تترك بروتوكولات وحدة التحكم والتصحيح آثاراً. يتصرف وضع headless بشكل مختلف عن الوضع برأس بطرق دقيقة.
هذه الإشارات موجودة لأن أطر العمل تحتاج إلى نقاط ربط في المتصفح للعمل. المشكلة أن هذه النقاط نفسها يمكن أن يلاحظها أي JavaScript يعمل على الصفحة.
إشارات التعرف
navigator.webdriver
قدمت مواصفات W3C WebDriver navigator.webdriver. عندما يتم التحكم في متصفح عبر بروتوكول WebDriver، تُرجع هذه الخاصية true. تم تصميمه كآلية شفافية، لكنه الآن الإشارة الأكثر شيوعاً للتعرف على الأتمتة.
في Chromium القياسي، يتم تعيين هذه القيمة على مستوى C++ أثناء تهيئة المتصفح عندما يكون العلم --enable-automation موجوداً، والذي يضيفه Playwright و Puppeteer افتراضياً.
نقاط حقن الإطار
يحقن كل إطار عمل أتمتة الكود في نقاط معينة:
- Playwright يحقن دوال الربط (
__playwright__binding__) وسكريبتات التهيئة في كل سياق صفحة جديد - Puppeteer يحقن مساعدات سكريبت التقييم وكود إدارة جلسة CDP
- Selenium يستخدم بروتوكول WebDriver الذي يعين أعلام الأتمتة على مستوى المتصفح
آثار CDP
يمكّن بروتوكول Chrome DevTools الأدوات الخارجية من التحكم في المتصفح. عندما تكون جلسة CDP نشطة، تصبح عدة إشارات قابلة للملاحظة:
Runtime.enableوConsole.enableتغيران سلوكconsole.logوتتبع مكدس الأخطاء- تظهر اتصالات جلسة CDP على نقاط نهاية WebSocket محددة
- يتغير سلوك المتصفح عندما تكون نطاقات CDP نشطة
فروق وضع Headless
يختلف وضع headless في Chromium القياسي عن الوضع برأس بعدة طرق. قد تكون مصفوفة navigator.plugins فارغة. قد يعود WebGL إلى العرض البرمجي. قد تحتوي أبعاد النافذة على قيم غير معتادة.
حدود Stealth Plugins
تحاول Stealth Plugins التنظيف بعد قيام الإطار بالفعل بتعيين قيم الأتمتة. تحل محل navigator.webdriver بـ getter جافا سكريبت، وتحذف كائنات الإطار من النطاق العام، وتصحح خصائص أخرى مميزة.
هذا النهج له ضعف أساسي: يحدث التنظيف في JavaScript، بعد تهيئة سياق الصفحة. القيم الأصلية موجودة بإيجاز قبل الكتابة فوقها، وآثار تصحيح JavaScript نفسها قابلة للملاحظة.
يمكن للمواقع:
- التحقق من تعديلات واصف الخاصية على
navigator.webdriver - ملاحظة أن
Object.getOwnPropertyDescriptorيُرجع getter بدلاً من قيمة - ملاحظة الفروق الزمنية بين الحالة الأولية والحالة المصححة
- البحث عن أنماط الكود الخاصة بـ Stealth Plugins نفسها
كيف يحل BotCloud هذا
يزيل BotCloud إشارات الأتمتة على مستوى المحرك، قبل تنفيذ أي كود صفحة:
navigator.webdriverيُرجعfalseأصلياً، وليس من خلال تجاوز JavaScript- لا توجد كائنات ربط إطار في سياقات الصفحة
- نشاط جلسة CDP معزول عن JavaScript على الصفحة
- أوضاع headless و headed تنتج سلوكاً قابلاً للملاحظة متطابقاً
لأن هذه التغييرات تحدث في محرك المتصفح نفسه، لا يوجد تصحيح JavaScript للكشف عنه، لا يوجد فجوة زمنية للاستفادة منها، ولا يوجد شذوذ واصف خاصية للعثور عليه.
التأثيرات العملية
مع BotCloud، يمكنك استخدام سطح API Playwright أو Puppeteer الكامل بدون أي Stealth Plugins أو حلول بديلة للتكوين. تبقى سكريبتات الأتمتة الخاصة بك نظيفة وتركز على منطق العمل بدلاً من تجنب التعرف.
// لا حاجة لـ Stealth Plugin - فقط اتصل وقم بالأتمتة
const browser = await puppeteer.connect({
browserWSEndpoint: 'wss://cloud.bots.win?token=YOUR_TOKEN',
});
const page = await browser.newPage();
await page.goto('https://example.com');
// navigator.webdriver غير صحيح، لا آثار أتمتة مسربة