يحدد كشف البوتات في TRACIO المتصفحات الآلية والأدوات التي تعمل بلا واجهة والهجمات المعتمدة على السكربتات، عبر بنية من طبقتين: جمع في المتصفح داخل وكيل TRACIO وتحليل على الخادم. ويغطي أطر الأتمتة الشائعة والمتصفحات بلا واجهة ووكلاء التصفح المعتمدين على الذكاء الاصطناعي والمتصفحات المضادة للكشف بنسبة إيجابيات خاطئة شبه معدومة، مع إضافة زواحف محركات البحث المشروعة تلقائيًا إلى قائمة السماح.
يُجري وكيل المتصفح مجموعة واسعة من الفحوصات ويبلّغ عن نتائجها. وعلى الخادم تُوزَن هذه
النتائج لتُصاغ في درجة بوت، ثم تُربَط الدرجة بحُكم. وهناك عدد قليل من المؤشرات
القاطعة يكفي كلٌّ منها بمفرده لفرض الحُكم bot بصرف النظر عن بقية النتائج.
الفحوصات التي تُنفَّذ، وكيفية ترجيحها، ومواضع العتبات لا تُنشَر — في أي خطة. فتوثيقها يخبر مشغّلي البوتات بالضبط بما ينبغي تغييره لتجاوز الحماية. ما تحصل عليه بدلًا من ذلك هو الحُكم، وتسمية نوع البوت، و— في خطة Business وما فوقها — رموز الأسباب التي تسمّي فئة الملاحظة الكامنة خلف القرار.
كل عملية تعرُّف تحمل حُكمًا بشأن البوت. ويصلك هذا الحُكم بوصفه bot.result في
حمولة webhook وبوصفه result.bot في SDK العميل.
| النتيجة | الوصف |
|---|---|
human | لم يُعثر على مؤشرات أتمتة. وزواحف محركات البحث الموثَّقة تُصنَّف أيضًا human. |
bot | رُصد وصول آلي أو معتمد على سكربت. وترافقه تسمية bot.type. |
uncertain | إشارات مختلطة أو ضعيفة — لا إنسان بوضوح ولا أتمتة بوضوح. |
ويقابل ذلك حقل القرار التشغيلي decision.action (real أو fake أو suspicious)
المستخدَم في لوحة التحكم وفي حمولة webhook.
ويرافق الحُكم الحقل bot.score. في الإصدار 2 من حمولة webhook هو رقم عشري على مقياس
0..100 — وهو الرقم نفسه الذي تعرضه لوحة التحكم لتلك الزيارة. (وفي مخطط الإصدار 1
المجمَّد هو كسر على مقياس 0..1؛ راجع Webhooks.)
يظهر bot.type عندما تكون النتيجة bot. وهو إما اسم بوت أو بيئة تشغيل معروفة،
وإما عائلة حين تكون تسمية الفحص بعينه كاشفة لتفاصيل عمل أداة الكشف:
bot.type | المعنى |
|---|---|
playwright, jsdom, electron | جرى تحديد بيئة تشغيل الأتمتة المذكورة |
browser_use, claude_computer_use, skyvern, genspark, fellou | جرى تحديد وكيل التصفح بالذكاء الاصطناعي المذكور |
automation | أدوات أتمتة، دون تسمية الفحص بعينه |
headless | متصفح يعمل بلا واجهة مستخدم |
antidetect | إصدار مضاد للكشف يزيّف البصمة |
extension | إضافة متصفح تدير الأتمتة أو البروكسي أو VPN |
privacy_browser | إصدار متصفح مشدَّد الخصوصية (مثل Mullvad Browser) |
other | جرى الكشف، لكنه خارج المفردات المنشورة |
القائمة مغلقة عن قصد: أي فحص يُضاف إلى أداة الكشف غدًا يظهر بوصفه other بدل أن
يسرّب اسمه الداخلي. تعامَل مع bot.type بوصفه تسمية تتفرّع عليها منطقيًا، لا بوصفه
قائمة enum شاملة تتحقق منها — فبيئات التشغيل المسمّاة تُضاف مع الوقت.
في خطتَي Business وEnterprise تحمل حمولة webhook مصفوفة reasons — ثمانية عناصر
كحد أقصى، مرتبة حسب الأهمية. والرمز يسمّي فئة الملاحظة، ولا يسمّي أبدًا الفحص
الذي وراءها:
| الرمز | ما الذي يعنيه |
|---|---|
automation_signature | آثار أدوات أتمتة |
headless_browser | متصفح بلا واجهة مستخدم |
anonymous_browser | إصدار مشدَّد الخصوصية أو مضاد للكشف صُمِّم ليبدو عاديًا |
privacy_hardening | إعدادات خصوصية صارمة |
behavior_anomaly | أنماط تفاعل غير بشرية |
fingerprint_tampering | قيم يُفترض أن تتوافق فيما بينها لكنها لا تتوافق |
environment_anomaly | بيئة التشغيل متناقضة داخليًا |
identity_mismatch | الهوية المعلَنة لا تطابق ما يُلاحَظ فعليًا |
virtual_environment | محاكٍ بدل عتاد فعلي |
strong_automation_evidence | مؤشرات بوت قاطعة — حاسمة بمفردها |
detection_signal | فحوصات أخرى جرى تفعيلها |
وقيمة severity هي high أو medium أو low، وهي حصة هذه الفئة من الحُكم في هذه
الزيارة تحديدًا، لا خاصية ثابتة للرمز. فالرمز نفسه قد يصل high في زيارة وlow
في أخرى، فلا تخزّنه في الذاكرة المؤقتة بوصفه ثابتًا.
ويستحق privacy_hardening عناية خاصة: فهو ينطلق لدى الزوار العاديين الحريصين على
خصوصيتهم بقدر ما ينطلق في حالات التهرب. رجّحه مع بقية المؤشرات بدل التصرف بناءً
عليه وحده.
ويأتي virtual_environment من كشف المحاكيات. ولا يوجد على الويب حُكم منفصل بمعنى
«التشغيل تحت مُشرف أجهزة افتراضية»: فالقرائن التي يستطيع المتصفح رؤيتها — عارض
رسوميات برمجي عام، أو عدد أنوية منخفض على نحو غير معتاد — تظهر بالقدر نفسه على
أجهزة عادية بلا تعريف لبطاقة الرسوميات وداخل جلسات سطح المكتب البعيد، لذا لا
نحوّلها إلى حُكم تضطر إلى الشك فيه.
| القدرة | التوافر |
|---|---|
| كشف الأتمتة والمتصفحات بلا واجهة ووكلاء الذكاء الاصطناعي | جميع الخطط |
| قائمة سماح للزواحف الموثَّقة | جميع الخطط |
| كشف المحاكيات | جميع الخطط |
مؤشرات مقاومة الكشف (bot.antidetectScore, 0..100) | Pro وما فوقها |
| رموز الأسباب وكتلة السلوك | Business وما فوقها |
| كشف DevTools | Business وما فوقها |
درجة مقاومة الكشف ما تزال قيد المعايرة. يُبلَّغ عن
bot.antidetectScoreكي تتمكن من مراقبته وضبط سياستك الخاصة — تعامَل معه بوصفه مُدخلًا لقرارك بشأن المخاطر، لا سببًا مستقلًا للحظر.
الفحوصات الخاصة بالأجهزة المحمولة وحدها غير فعّالة على الويب. فكشف الـ root والـ jailbreak والتطبيقات المستنسخة/المزدوجة وFrida يعتمد على إشارات أصلية لا يستطيع المتصفح جمعها. وTRACIO يوفّر حزم SDK للمتصفحات فقط، لذا اعتمد على أحكام الأتمتة والمتصفحات بلا واجهة ووكلاء الذكاء الاصطناعي ومقاومة الكشف والمحاكيات والسلوك، فهي فعّالة بالكامل على الويب.
تُعرَف البوتات الجيدة المعروفة من user-agent الخاص بها، ثم يجري التحقق منها مقابل عنوان IP المتصل: استعلام DNS عكسي على العنوان، والتأكد من أن اسم المضيف الناتج يتبع نطاق المشغّل، ثم استعلام أمامي يؤكد أنه يُترجَم مجددًا إلى العنوان نفسه. وهذا هو إجراء التحقق الذي ينشره مشغّلو الزواحف أنفسهم.
| الزاحف | النطاقات الموثَّقة |
|---|---|
.googlebot.com, .google.com | |
| Bing | .search.msn.com |
| Apple | .applebot.apple.com |
| Yahoo | .crawl.yahoo.net |
| Yandex | .yandex.com, .yandex.net, .yandex.ru |
| DuckDuckGo | .duckduckgo.com |
الزاحف الموثَّق يُصنَّف human. أما الطلب الذي يدّعي أنه Googlebot بينما يثبت أن
عنوان IP الخاص به يعود لجهة أخرى فيُصنَّف بوتًا — في حين أن مجرد غياب الاستعلام أو
انتهاء مهلته لا يُعدّ دليلًا على التزييف.
ديناميكيات التفاعل — حركة المؤشر وإيقاع لوحة المفاتيح والتمرير — تغذّي الحُكم بوصفها
دليلًا على حضور إنسان، لا على أي إنسان هو. وفي خطة Business وما فوقها يُسلَّم
التجميع ضمن كتلة behavior في webhook:
{ "behavior": { "score": 87, "verdict": "human", "confidence": 0.92 }}يمتد score على مقياس 0..100 (كلما ارتفع كان أقرب إلى البشر)، وتكون قيمة verdict
إما human أو uncertain أو bot، بينما يخبرك confidence (0..1) بحجم الأدلة
التي يستند إليها الحُكم — فزيارة قصيرة بحركتَي مؤشر تحصل هنا على قيمة منخفضة حتى لو
بدا الحُكم قاطعًا.
وتوجد الكتلة فقط عندما يكون التقييم السلوكي قد جرى فعلًا لتلك الزيارة. وغياب الكتلة يعني «لا بيانات»، ولا يعني أبدًا «لا شيء مريب» — فلا تقرأ غيابها بوصفه إشارة سليمة.
يوفّر SDK العميل قيمة منطقية عملية هي result.bot.detected، إضافةً إلى confidence
على مقياس 0..100:
const result = await tracio.getResult()
if (result.bot.detected) { console.warn(`Bot detected (confidence ${result.bot.confidence})`) showCaptcha() return}
await login(credentials)على خادمك، تصرَّف بناءً على تسليم webhook. ويوجد الحُكم بشأن البوت
داخل الكائن bot — أي bot.result وbot.type:
// `event` is the webhook delivery body (/docs/webhooks)app.post("/webhook/tracio", async (req, res) => { const event = req.body
if (event.bot?.result === "bot") { await db.blockedRequests.insert({ visitorId: event.visitorId, botType: event.bot.type, ip: event.ip, timestamp: new Date(), }) }
res.status(200).send("OK")})تُحذف القيم الصفرية والفارغة من الحمولة، لذا اقرأ bot.type بحذر بدل أن تجعله حقلًا
مطلوبًا في مخططاتك.
صُمِّم كشف البوتات في TRACIO لنسبة إيجابيات خاطئة شبه معدومة، لكن الحالات الحدّية موجودة:
| السيناريو | المخاطرة | إجراء التخفيف |
|---|---|---|
إضافات متصفح تعدّل navigator | منخفضة | التحقق المتقاطع عبر فحوصات كثيرة يمنع الاعتماد على فحص واحد |
| برمجيات الأمان المؤسسية | منخفضة جدًا | تصنيف «بلا واجهة» يتطلب أدلة داعمة |
| أدوات إمكانية الوصول | لا توجد | واجهات إمكانية الوصول لا تغذّي كشف البوتات |
| مستخدمو VPN/البروكسي | لا توجد | تُتابَع مؤشرات الشبكة بمعزل عن الحُكم بشأن البوت |
إذا واجهت إيجابيات خاطئة، راجع bot.type (ومصفوفة reasons في خطة Business وما
فوقها) لتفهم أي فئة من الملاحظات جرى تفعيلها، ثم عدّل سياستك. راجع
استكشاف الأخطاء وإصلاحها للاطلاع على الأسباب الشائعة.