العودة إلى المدونة

كيفية تجنب اكتشاف الأتمتة من خلال هجمات التوقيت: الحماية في سيلينيوم وبوبتيير

هجمات التوقيت هي واحدة من أكثر الطرق تعقيدًا لاكتشاف الأتمتة. نستعرض كيفية الحماية من تحليل زمن تنفيذ الإجراءات في المتصفح.

📅٢١ رجب ١٤٤٧ هـ
```html

هجمات التوقيت - هي طريقة لاكتشاف الروبوتات تعتمد على تحليل زمن تنفيذ الإجراءات في المتصفح. تقوم أنظمة مكافحة الاحتيال الحديثة مثل فيسبوك، جوجل، تيك توك وغيرها من المنصات بتحليل ليس فقط ما تفعله، ولكن أيضًا مدى سرعة ذلك. النقرات السريعة جدًا، تحميل الصفحات الفوري، وعدم وجود فترات توقف طبيعية - كل هذا يكشف عن الأتمتة. في هذه المقالة، سنستعرض الطرق التقنية لحماية المطورين من هجمات التوقيت عند العمل مع Selenium وPuppeteer ومتصفحات مكافحة الكشف.

ما هي هجمات التوقيت وكيف تعمل

هجوم التوقيت - هو طريقة لاكتشاف الأتمتة تعتمد على قياس الفترات الزمنية بين إجراءات المستخدم. تجمع أنظمة مكافحة الاحتيال بيانات القياس: كم من الوقت مضى من تحميل الصفحة إلى أول نقرة، ومدى سرعة تمرير المستخدم، وما إذا كانت هناك فترات توقف عند ملء النماذج. تتم مقارنة هذه البيانات مع نماذج سلوكية للأشخاص الحقيقيين.

المقاييس الزمنية الرئيسية التي تحللها أنظمة الحماية:

  • الوقت حتى أول تفاعل (TTFI) - الوقت من تحميل الصفحة إلى أول إجراء (نقرة، تمرير، إدخال نص). عادةً ما تبدأ الروبوتات في العمل على الفور بعد تحميل DOM، بينما يستغرق الإنسان من 0.5 إلى 3 ثوانٍ.
  • أنماط توقيت النقرات - الفترات الزمنية بين النقرات. غالبًا ما تنقر السكربتات الآلية بنفس التردد (على سبيل المثال، كل 2 ثانية بالضبط)، بينما ينقر الإنسان بشكل عشوائي.
  • ثبات سرعة الكتابة - سرعة إدخال النص. تدخل الروبوتات النص على الفور أو بتأخير ثابت بين الأحرف، بينما يقوم الإنسان بذلك بسرعة متغيرة مع فترات توقف.
  • سرعة حركة الماوس - سرعة حركة المؤشر. يقوم Selenium بشكل افتراضي بنقل المؤشر على الفور إلى النقطة المطلوبة، بينما يتحرك الإنسان بالماوس بتسارع وتباطؤ.
  • سلوك التمرير - أنماط تمرير الصفحة. غالبًا ما تقوم الروبوتات بالتمرير بدقة إلى عدد ثابت من البيكسلات، بينما يقوم الإنسان بذلك بشكل غير منتظم مع توقفات.

تستخدم أنظمة الاكتشاف التعلم الآلي لتحليل هذه المقاييس. تقوم ببناء ملف تعريف سلوكي وتحسب احتمال أن يكون المستخدم روبوتًا. إذا كانت الأنماط الزمنية مثالية جدًا أو سريعة جدًا - فهذا علم أحمر.

مهم: هجمات التوقيت فعالة بشكل خاص ضد الأتمتة الجماعية. إذا كنت تقوم بتشغيل 100 متصفح بنفس الأنماط الزمنية، فإن نظام مكافحة الاحتيال سيكتشفها بسهولة من خلال الشذوذات الإحصائية.

طرق اكتشاف الأتمتة من خلال أنماط زمنية

تستخدم أنظمة مكافحة الاحتيال الحديثة عدة طبقات من تحليل الخصائص الزمنية. دعونا نستعرض تقنيات محددة تستخدمها فيسبوك، جوجل، كلاودفلير وغيرها من المنصات.

1. تحليل واجهة برمجة التطبيقات للأداء

توفر المتصفحات واجهة برمجة التطبيقات للأداء، التي تجمع بيانات قياس تفصيلية حول تحميل الصفحة. تقوم أنظمة مكافحة الاحتيال بتحليل:

// مثال على بيانات واجهة برمجة التطبيقات للأداء
performance.timing = {
  navigationStart: 1234567890000,
  domLoading: 1234567890150,      // +150ms
  domInteractive: 1234567890300,  // +300ms
  domComplete: 1234567890500,     // +500ms
  loadEventEnd: 1234567890600     // +600ms
}

// أنماط مشبوهة للروبوتات:
// - تحميل سريع جدًا (domComplete < 200ms)
// - فترات زمنية مثالية بين الأحداث
// - عدم وجود تأخيرات عند تحميل الموارد الخارجية

غالبًا ما تظهر المتصفحات بدون رأس (خاصة الإصدارات القديمة من Puppeteer وSelenium) قيمًا غير طبيعية سريعة لـ navigationStart وdomLoading، لأنها لا تحمل الصور والخطوط والموارد الأخرى بنفس الطريقة التي يقوم بها المتصفح العادي.

2. تحليل توقيت الأحداث

تتعقب متتبعات JavaScript الطوابع الزمنية لجميع الأحداث (النقرات، حركات الماوس، ضغطات المفاتيح) وتحلل الأنماط:

// مثال على جمع بيانات قياس الأحداث
const events = [];

document.addEventListener('click', (e) => {
  events.push({
    type: 'click',
    timestamp: performance.now(),
    x: e.clientX,
    y: e.clientY
  });
});

// تحليل الأنماط المشبوهة:
// - تحدث النقرات كل N مللي ثانية بالضبط
// - لا توجد حركات دقيقة للماوس قبل النقر
// - تحدث أول نقرة على الفور بعد تحميل الصفحة

3. ديناميات ضغطات المفاتيح

عند ملء النماذج، تحلل أنظمة مكافحة الاحتيال ديناميات ضغطات المفاتيح - وهي مؤشر بيومتري فريد لكل شخص:

  • زمن الضغط - الوقت الذي يتم فيه الضغط على المفتاح (من keydown إلى keyup). يتراوح لدى البشر من 50 إلى 200 مللي ثانية، بينما يكون ثابتًا لدى الروبوتات.
  • زمن الطيران - الوقت بين رفع مفتاح واحد والضغط على المفتاح التالي. لدى البشر - من 100 إلى 500 مللي ثانية مع تباينات، بينما لدى الروبوتات - تأخير ثابت.
  • إيقاع الكتابة - الإيقاع العام للكتابة. يقوم البشر بالتوقف عند علامات الترقيم، وتصحيح الأخطاء، بينما لا تفعل الروبوتات ذلك.

مثال على الاكتشاف: إذا كنت تستخدم element.send_keys("نص") في Selenium، يتم إدخال النص بالكامل في 1-2 مللي ثانية - وهذا يكشف الأتمتة على الفور.

محاكاة تأخيرات بشرية في الكود

المستوى الأول من الحماية ضد هجمات التوقيت هو إضافة تأخيرات بين الإجراءات. ولكن من المهم عدم إدراج time.sleep(2) فقط، بل محاكاة سلوك طبيعي.

محاكاة أساسية للتأخيرات في بايثون (Selenium)

import time
import random
from selenium import webdriver
from selenium.webdriver.common.by import By

def human_delay(min_sec=0.5, max_sec=2.0):
    """تأخير عشوائي يحاكي الإنسان"""
    delay = random.uniform(min_sec, max_sec)
    time.sleep(delay)

driver = webdriver.Chrome()
driver.get("https://example.com")

# تأخير قبل أول إجراء (الإنسان يقرأ الصفحة)
human_delay(1.5, 4.0)

# نقرة على العنصر
button = driver.find_element(By.ID, "submit-btn")
button.click()

# تأخير قبل الإجراء التالي
human_delay(0.8, 2.5)

محاكاة متقدمة مع توزيع طبيعي

يبدو التوزيع المتساوي (uniform) غير طبيعي. تخضع التأخيرات البشرية لتوزيع طبيعي مع شذوذات:

import numpy as np

def realistic_delay(mean=1.5, std_dev=0.5, min_val=0.3, max_val=5.0):
    """
    تأخير بتوزيع طبيعي
    mean: متوسط زمن التأخير
    std_dev: الانحراف المعياري
    min_val, max_val: الحدود (لتجنب القيم المتطرفة)
    """
    delay = np.random.normal(mean, std_dev)
    delay = max(min_val, min(max_val, delay))  # تحديد النطاق
    time.sleep(delay)
    return delay

# الاستخدام
realistic_delay(mean=2.0, std_dev=0.7)  # متوسط 2 ثانية، ولكن مع تباينات

تأخيرات سياقية

تتطلب الإجراءات المختلفة أوقاتًا مختلفة. أنشئ ملفات تعريف للتأخيرات لمختلف السيناريوهات:

class HumanBehavior:
    """ملفات تعريف التأخيرات لأنواع مختلفة من الإجراءات"""
    
    @staticmethod
    def page_load_delay():
        """تأخير بعد تحميل الصفحة (قراءة المحتوى)"""
        return realistic_delay(mean=2.5, std_dev=1.0, min_val=1.0, max_val=6.0)
    
    @staticmethod
    def before_click():
        """تأخير قبل النقر (البحث عن العنصر بالعين)"""
        return realistic_delay(mean=0.8, std_dev=0.3, min_val=0.3, max_val=2.0)
    
    @staticmethod
    def before_typing():
        """تأخير قبل بدء إدخال النص"""
        return realistic_delay(mean=1.2, std_dev=0.5, min_val=0.5, max_val=3.0)
    
    @staticmethod
    def between_form_fields():
        """تأخير بين حقول النموذج"""
        return realistic_delay(mean=0.6, std_dev=0.2, min_val=0.2, max_val=1.5)

# الاستخدام في السكربت
driver.get("https://example.com/login")
HumanBehavior.page_load_delay()

username_field = driver.find_element(By.ID, "username")
HumanBehavior.before_typing()
# ... إدخال اسم المستخدم ...

HumanBehavior.between_form_fields()

password_field = driver.find_element(By.ID, "password")
HumanBehavior.before_typing()
# ... إدخال كلمة المرور ...

عشوائية زمن تنفيذ الإجراءات

التأخيرات المتساوية بين الإجراءات - هي شذوذ إحصائي. إذا كنت تقوم بتشغيل 100 نسخة من السكربت، وجميعها تنقر على الزر بعد 2.5 ثانية بالضبط بعد التحميل - فهذا سهل الاكتشاف. تحتاج إلى العشوائية على عدة مستويات.

1. عشوائية ترتيب الإجراءات

أضف تنوعًا في تسلسل الإجراءات. على سبيل المثال، قبل ملء النموذج، قم أحيانًا بتمرير الصفحة، وأحيانًا لا:

def fill_form_naturally(driver):
    # 30% احتمال تمرير الصفحة قبل الملء
    if random.random() < 0.3:
        driver.execute_script("window.scrollBy(0, 200)")
        human_delay(0.5, 1.5)
    
    # 20% احتمال النقر في مكان عشوائي (محاكاة القراءة)
    if random.random() < 0.2:
        body = driver.find_element(By.TAG_NAME, "body")
        body.click()
        human_delay(0.3, 0.8)
    
    # الإجراء الرئيسي - ملء النموذج
    username_field = driver.find_element(By.ID, "username")
    type_like_human(username_field, "myusername")

2. سرعة كتابة متغيرة

بدلاً من إدخال النص على الفور، قم بمحاكاة الكتابة حرفًا بحرف مع سرعة متغيرة:

def type_like_human(element, text):
    """إدخال النص مع محاكاة سرعة الكتابة البشرية"""
    for char in text:
        element.send_keys(char)
        
        # تأخير أساسي بين الأحرف
        base_delay = random.uniform(0.05, 0.15)
        
        # فترات إضافية عند الفراغات وعلامات الترقيم
        if char in [' ', '.', ',', '!', '?']:
            base_delay += random.uniform(0.1, 0.3)
        
        # "تأخيرات تفكير" عشوائية (احتمال 5% لتأخير طويل)
        if random.random() < 0.05:
            base_delay += random.uniform(0.5, 1.5)
        
        time.sleep(base_delay)
    
    # أحيانًا نقوم بارتكاب خطأ مطبعي ونقوم بتصحيحه (احتمال 10%)
    if random.random() < 0.1:
        time.sleep(random.uniform(0.2, 0.5))
        element.send_keys(Keys.BACKSPACE)
        time.sleep(random.uniform(0.1, 0.3))
        element.send_keys(text[-1])  # إدخال الحرف الأخير مرة أخرى

3. Puppeteer: إدخال نص ببطء

في Puppeteer، هناك خيار مدمج delay لطريقة type()، ولكن يجب عليك جعله عشوائيًا:

// الاستخدام الأساسي (غير موصى به - تأخير ثابت)
await page.type('#username', 'myusername', { delay: 100 });

// النهج الصحيح - العشوائية لكل حرف
async function typeWithVariableSpeed(page, selector, text) {
  await page.click(selector);
  
  for (const char of text) {
    await page.keyboard.type(char);
    
    // تأخير عشوائي من 50 إلى 150 مللي ثانية
    let delay = Math.random() * 100 + 50;
    
    // فترة إضافية عند الفراغات
    if (char === ' ') {
      delay += Math.random() * 200 + 100;
    }
    
    // فترات طويلة عشوائية (احتمال 5%)
    if (Math.random() < 0.05) {
      delay += Math.random() * 1000 + 500;
    }
    
    await page.waitForTimeout(delay);
  }
}

// الاستخدام
await typeWithVariableSpeed(page, '#username', 'myusername');

حركة الماوس الطبيعية وسرعة التمرير

لا تقوم Selenium وPuppeteer بتحريك مؤشر الماوس بشكل افتراضي - بل تنقلانه على الفور إلى النقطة المطلوبة وتقوم بالنقر. هذه واحدة من أكثر علامات الأتمتة وضوحًا. لمحاكاة حركة الماوس البشرية، تحتاج إلى مكتبات خاصة.

مكتبة pyautogui لحركة الماوس السلسة

تتيح لك مكتبة pyautogui تحريك المؤشر على طول منحنى بيزير مع تسارع وتباطؤ:

import pyautogui
from selenium.webdriver.common.action_chains import ActionChains

def move_mouse_naturally(driver, element):
    """حركة سلسة للماوس نحو العنصر مع محاكاة بشرية"""
    # الحصول على إحداثيات العنصر
    location = element.location
    size = element.size
    
    # النقطة المستهدفة (مركز العنصر + عشوائية بسيطة)
    target_x = location['x'] + size['width'] / 2 + random.randint(-5, 5)
    target_y = location['y'] + size['height'] / 2 + random.randint(-5, 5)
    
    # حركة سلسة بسرعة متغيرة
    # duration - زمن الحركة (0.5-1.5 ثانية للواقعية)
    duration = random.uniform(0.5, 1.5)
    
    # tweening - وظيفة التسارع (easeInOutQuad تحاكي الحركة البشرية)
    pyautogui.moveTo(target_x, target_y, duration=duration, tween=pyautogui.easeInOutQuad)
    
    # فترة قصيرة قبل النقر (الإنسان لا ينقر على الفور)
    time.sleep(random.uniform(0.05, 0.15))
    
    # نقرة
    element.click()

مهم: تعمل هذه الطريقة فقط إذا كانت Selenium تتحكم في نافذة المتصفح الحقيقية (ليس بدون رأس). في وضع الرأس بدون رأس، تكون حركة الماوس عديمة الفائدة، حيث لا ترى أنظمة مكافحة الاحتيال المؤشر.

Puppeteer: محاكاة حركة الماوس

في Puppeteer، يمكنك استخدام مكتبة ghost-cursor لحركة المؤشر الواقعية:

// التثبيت: npm install ghost-cursor
const { createCursor } = require("ghost-cursor");
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  const cursor = createCursor(page);
  
  await page.goto("https://example.com");
  
  // حركة سلسة نحو العنصر والنقر
  const button = await page.$("#submit-btn");
  await cursor.click(button);  // المؤشر يتحرك على طول منحنى بيزير!
  
  // بدلاً من ذلك - الحركة نحو الإحداثيات
  await cursor.move("#username");  // فقط نحرك المؤشر دون النقر
  await page.waitForTimeout(300);
  await cursor.click();  // ننقر في الموقع الحالي
})();

محاكاة التمرير

لا يقوم الإنسان بتمرير الصفحة بدقة 500 بيكسل في كل مرة. يجب أن يكون التمرير غير متساوٍ، مع فترات توقف وأحيانًا تمرير للخلف:

def scroll_like_human(driver, target_position=None):
    """
    محاكاة تمرير بشري
    target_position: الموقع المستهدف بالبيكسل (إذا كان None - نمرر حتى النهاية)
    """
    current_position = driver.execute_script("return window.pageYOffset;")
    
    if target_position is None:
        # نمرر حتى نهاية الصفحة
        target_position = driver.execute_script("return document.body.scrollHeight;")
    
    while current_position < target_position:
        # خطوة تمرير عشوائية (100-400 بيكسل)
        scroll_step = random.randint(100, 400)
        current_position += scroll_step
        
        # نمرر
        driver.execute_script(f"window.scrollTo(0, {current_position});")
        
        # فترة بين التمريرات (الإنسان يقرأ المحتوى)
        time.sleep(random.uniform(0.3, 1.2))
        
        # أحيانًا نمرر قليلاً للخلف (احتمال 10%)
        if random.random() < 0.1:
            back_scroll = random.randint(50, 150)
            current_position -= back_scroll
            driver.execute_script(f"window.scrollTo(0, {current_position});")
            time.sleep(random.uniform(0.2, 0.6))

# الاستخدام
scroll_like_human(driver, target_position=2000)  # نمرر حتى 2000 بيكسل

زمن تحميل الصفحات وطلبات AJAX

تقوم أنظمة مكافحة الاحتيال بتحليل ليس فقط إجراءات المستخدم، ولكن أيضًا خصائص تحميل الصفحات. غالبًا ما يتم تحميل المتصفحات بدون رأس بسرعة غير طبيعية، لأنها لا تحمل الصور، ولا تنفذ بعض السكربتات، ولا تقوم بتنسيق CSS.

المشكلة: تحميل سريع جدًا

قارن القيم النموذجية لواجهة برمجة التطبيقات للأداء لمتصفح عادي وبدون رأس:

المقياس متصفح عادي بدون رأس (مشبوه)
domContentLoaded 800-2000 مللي ثانية 50-200 مللي ثانية
loadEventEnd 2000-5000 مللي ثانية 100-500 مللي ثانية
عدد الموارد المحملة 50-200 (صور، CSS، JS) 5-20 (فقط الحرجة)

الحل: تأخير تحميل قسري

أضف تأخيرًا صناعيًا بعد تحميل الصفحة لجعل المقاييس تبدو أكثر طبيعية:

def load_page_naturally(driver, url):
    """تحميل الصفحة مع محاكاة زمن تحميل طبيعي"""
    start_time = time.time()
    driver.get(url)
    
    # الانتظار حتى يتم تحميل DOM بالكامل
    WebDriverWait(driver, 10).until(
        lambda d: d.execute_script("return document.readyState") == "complete"
    )
    
    # حساب زمن التحميل الفعلي
    actual_load_time = time.time() - start_time
    
    # إذا كان التحميل سريعًا جدًا (< 1 ثانية)، أضف تأخيرًا
    if actual_load_time < 1.0:
        additional_delay = random.uniform(1.0, 2.5) - actual_load_time
        time.sleep(additional_delay)
    
    # تأخير إضافي لـ "قراءة الصفحة"
    time.sleep(random.uniform(0.5, 2.0))

# الاستخدام
load_page_naturally(driver, "https://example.com")

انتظار طلبات AJAX

تقوم المواقع الحديثة بتحميل المحتوى بشكل غير متزامن عبر AJAX. إذا بدأ سكربتك في العمل قبل الانتهاء من جميع طلبات AJAX - فهذا مشبوه. استخدم الانتظارات الصريحة:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def wait_for_ajax(driver, timeout=10):
    """انتظار انتهاء جميع طلبات AJAX (jQuery)"""
    WebDriverWait(driver, timeout).until(
        lambda d: d.execute_script("return jQuery.active == 0")
    )

# للمواقع بدون jQuery - انتظار عنصر معين
def wait_for_dynamic_content(driver, selector, timeout=10):
    """انتظار ظهور عنصر تم تحميله ديناميكيًا"""
    WebDriverWait(driver, timeout).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, selector))
    )
    # تأخير إضافي بعد ظهور العنصر
    time.sleep(random.uniform(0.3, 0.8))

إعداد الحماية في متصفحات مكافحة الكشف

إذا كنت تعمل في التحكيم، أو تعدد الحسابات، أو مهام أخرى حيث تكون الخصوصية حرجة، استخدم متصفحات مكافحة الكشف: Dolphin Anty، AdsPower، Multilogin، GoLogin. تحتوي على آليات مدمجة للحماية من هجمات التوقيت، ولكن يجب إعدادها بشكل صحيح.

Dolphin Anty: إعداد الكتابة البشرية

في Dolphin Anty، هناك وظيفة "محاكاة الكتابة البشرية" - محاكاة تلقائية لكتابة النص البشري. الإعداد:

  • افتح ملف التعريف الخاص بالمتصفح → علامة التبويب "الأتمتة"
  • قم بتمكين "محاكاة الكتابة البشرية"
  • قم بإعداد المعلمات:
    • متوسط سرعة الكتابة: 150-250 حرفًا في الدقيقة (سرعة واقعية)
    • التباين: 30-50% (تباين السرعة بين الأحرف)
    • فترة عند علامات الترقيم: مفعلة (فترات عند علامات الترقيم)
    • أخطاء عشوائية: 2-5% (أخطاء عشوائية مع تصحيح)

بعد ذلك، سيقوم أي إدخال نص عبر واجهة برمجة التطبيقات Dolphin بمحاكاة الإنسان تلقائيًا.

AdsPower: إعداد حركة الماوس

يتيح لك AdsPower تسجيل أنماط حركة الماوس لمستخدم حقيقي وإعادة إنتاجها:

  1. افتح الملف الشخصي → "الإعدادات المتقدمة" → "سلوك الماوس"
  2. اختر وضع "تسجيل مستخدم حقيقي":
    • افتح المتصفح في الوضع العادي
    • قم بأداء إجراءات نموذجية (نقرات، تمرير، حركات الماوس)
    • سجل AdsPower مسارات الحركات
  3. عند الأتمتة عبر واجهة برمجة التطبيقات، سيقوم AdsPower بإعادة إنتاج الأنماط المسجلة مع تباينات

Multilogin: ضوضاء Canvas وتوقيت WebGL

تضيف Multilogin ضوضاء (noise) في بصمات Canvas وWebGL، مما يؤثر على هجمات التوقيت المتعلقة بالتنسيق:

  • الملف الشخصي → "إعدادات بصمة الأصابع" → "Canvas"
  • قم بتمكين "ضوضاء Canvas" (تضيف تأخيرات صغيرة في تنسيق Canvas)
  • قم بتمكين "إخفاء بيانات WebGL" (يخفي خصائص GPU التي تؤثر على سرعة التنسيق)

هذا يحمي من الاكتشاف من خلال تحليل زمن تنفيذ Canvas.toDataURL() وعمليات WebGL.

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

تقنيات متقدمة لتجاوز اكتشاف التوقيت

بالنسبة للمنصات المحمية بشكل خاص (جوجل، فيسبوك، مواقع البنوك)، قد تكون الطرق الأساسية غير كافية. دعونا نستعرض التقنيات المتقدمة.

1. استبدال واجهة برمجة التطبيقات للأداء

يمكنك إعادة تعريف طرق واجهة برمجة التطبيقات للأداء لإرجاع قيم واقعية بدلاً من القيم الحقيقية:

// حقن السكربت لاستبدال performance.now()
const script = `
  (function() {
    const originalNow = performance.now.bind(performance);
    let offset = 0;
    let lastValue = 0;
    
    performance.now = function() {
      const realValue = originalNow();
      // إضافة ضوضاء عشوائية إلى الزمن
      const noise = Math.random() * 2 - 1; // من -1 إلى +1 مللي ثانية
      let fakeValue = realValue + offset + noise;
      
      // ضمان الترتيب (الزمن لا يعود للخلف)
      if (fakeValue <= lastValue) {
        fakeValue = lastValue + 0.1;
      }
      
      lastValue = fakeValue;
      return fakeValue;
    };
  })();
`;

// Puppeteer: الحقن عند إنشاء الصفحة
await page.evaluateOnNewDocument(script);

تحذير: يمكن اكتشاف هذه الطريقة من خلال التحقق من سلامة الطرق الأصلية. استخدمها فقط على المواقع التي لا تحتوي على حماية قوية.

2. تقليل سرعة المعالج والشبكة

يتيح لك بروتوكول أدوات مطور Chrome تقليل سرعة المعالج والشبكة بشكل مصطنع، لجعل مقاييس التحميل تبدو أكثر طبيعية:

// Puppeteer: تقليل سرعة المعالج إلى النصف
const client = await page.target().createCDPSession();
await client.send('Emulation.setCPUThrottlingRate', { rate: 2 });

// تقليل سرعة الشبكة (محاكاة 3G)
await page.emulateNetworkConditions({
  offline: false,
  downloadThroughput: 1.5 * 1024 * 1024 / 8, // 1.5 ميجابت في الثانية
  uploadThroughput: 750 * 1024 / 8,          // 750 كيلوبت في الثانية
  latency: 40                                 // 40 مللي ثانية تأخير
});

سيؤدي ذلك إلى زيادة زمن تحميل الصفحات وتنفيذ JavaScript، مما يجعل الملف الشخصي أكثر تشابهًا مع المستخدم الحقيقي بسرعة إنترنت متوسطة.

3. محاكاة النشاط الخلفي

لا يجلس المستخدمون الحقيقيون على علامة تبويب واحدة - بل يتنقلون بين علامات التبويب، ويقلصون النوافذ، ويشتتون انتباههم. قم بمحاكاة ذلك:

async function simulateTabSwitch(page) {
  // محاكاة التبديل إلى علامة تبويب أخرى (واجهة برمجة التطبيقات لرؤية الصفحة)
  await page.evaluate(() => {
    Object.defineProperty(document, 'hidden', {
      get: () => true,
      configurable: true
    });
    
    document.dispatchEvent(new Event('visibilitychange'));
  });
  
  // فترة (المستخدم ينظر إلى علامة تبويب أخرى)
  await page.waitForTimeout(Math.random() * 3000 + 2000);
  
  // العودة إلى علامة التبويب
  await page.evaluate(() => {
    Object.defineProperty(document, 'hidden', {
      get: () => false,
      configurable: true
    });
    
    document.dispatchEvent(new Event('visibilitychange'));
  });
}

// الاستخدام: "نتشتت" عشوائيًا أثناء العمل
if (Math.random() < 0.15) {  // احتمال 15%
  await simulateTabSwitch(page);
}

4. استخدام علامات توقيت حقيقية للمستخدم

تقوم بعض المواقع بإنشاء علامات زمنية خاصة بها عبر واجهة برمجة التطبيقات لتوقيت المستخدم. أضف علامات زمنية واقعية:

// إنشاء علامات زمنية واقعية
await page.evaluate(() => {
  // محاكاة "تفكير" المستخدم قبل الإجراء
  performance.mark('user-started-reading');
  
  setTimeout(() => {
    performance.mark('user-found-button');
    performance.measure('reading-time', 'user-started-reading', 'user-found-button');
  }, Math.random() * 2000 + 1000);
});

5. تدوير البروكسي لتقليل الارتباط الإحصائي

حتى إذا كانت كل نسخة من سكربتك تحتوي على تأخيرات عشوائية، يمكن لأنظمة مكافحة الاحتيال اكتشاف الارتباط إذا كانت جميع الطلبات تأتي من نفس IP. استخدم تدوير البروكسي:

  • لأغراض الزحف والمهام الجماعية: بروكسي مركز البيانات مع تدوير تلقائي كل 5-10 دقائق
  • للتعامل مع وسائل التواصل الاجتماعي والإعلانات: بروكسي سكني مع ربط للجلسة (جلسات لزجة)
  • للمنصات المحمولة (إنستغرام، تيك توك): بروكسي محمول مع تدوير حسب المؤقت أو حسب الطلب

يقلل تدوير IP من احتمال أن تتمكن أنظمة مكافحة الاحتيال من جمع بيانات كافية لتحليل إحصائي لأنماط توقيتك.

الخاتمة

هجمات التوقيت - هي طريقة معقدة لاكتشاف الأتمتة، تتطلب نهجًا شاملاً للحماية. الاستنتاجات الرئيسية:

  • لا تستخدم تأخيرات ثابتة - قم دائمًا بتدوير الزمن بين الإجراءات باستخدام توزيع طبيعي
  • قم بمحاكاة التأخيرات السياقية - تتطلب الإجراءات المختلفة أوقاتًا مختلفة (قراءة الصفحة ≠ النقر على الزر)
  • أضف تنوعًا في تسلسل الإجراءات - تمريرات عشوائية، نقرات، تبديلات علامات التبويب
  • استخدم حركة ماوس سلسة - مكتبات ghost-cursor (Puppeteer) أو pyautogui (Selenium)
  • قم بمحاكاة سرعة الكتابة الطبيعية - إدخال حرف بحرف مع فترات توقف عند علامات الترقيم
  • قم بإعداد متصفحات مكافحة الكشف - تحتوي Dolphin Anty وAdsPower وMultilogin على آليات مدمجة للحماية من هجمات التوقيت
  • قم بالدمج مع بروكسي عالية الجودة - يقلل تدوير IP من إمكانية التحليل الإحصائي

تذكر: لا توجد حماية مثالية. تتطور أنظمة مكافحة الاحتيال باستمرار، مضيفةً طرق اكتشاف جديدة. مهمتك هي تقريب سلوك السكربت إلى المستخدم الحقيقي وتحديث طرق التجاوز بانتظام.

إذا كنت تعمل مع أتمتة المتصفحات لأغراض الزحف، الاختبار أو مهام أخرى، نوصي باستخدام بروكسي سكني - حيث توفر أعلى مستوى من الخصوصية وتقلل من خطر الاكتشاف حسب عنوان IP. بالنسبة للمنصات المحمولة، فإن البروكسي المحمول هو الأنسب، حيث تحاكي المستخدمين الحقيقيين لمشغلي الهاتف المحمول.

```