«Антидетекция» — это не одна фича. Это стек из 20+ слоёв защиты, каждый из которых блокирует конкретный сектор детектирования, а вместе они позволяют боту Facebook работать месяцами, не попадаясь. В этой статье я разберу полный стек, который мы в BuzzPost построили за 4 года, с примерами кода и числовыми значениями для реализации.

Это не «общие советы». Это инженерная спецификация системы, обрабатывающей 150+ аккаунтов параллельно без поломок.

Слой 1: User-Agent consistency

UA — это первое впечатление вашего бота. В BuzzPost мы используем реальный UA последнего Chrome на Windows:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36

Три основные инструкции:

  • Одинаковый UA всегда. Смена между sessions = checkpoint.
  • Реальный UA, не выдуманный. Facebook сравнивает с базой известных UAs.
  • UA, соответствующий реальной OS на VDS. Если работаете на Windows VDS — UA Windows. Не macOS.

Когда Chrome обновляется (примерно раз в месяц), UA немного меняется. Мы следуем за этим обновлением и не пытаемся остаться на старом UA — потому что слишком старый UA тоже поднимает флаг. Золотая середина: UA никогда не старше 3 месяцев от текущей версии Chrome.

Слой 2: viewport и window size

Наш default: 1366×768. Почему? Потому что это самое популярное разрешение Windows-экранов. ~22% Windows-экранов в 2026 — это 1366×768. Если ваш бот работает на 1920×1080, вы в меньшинстве, и это спам-сигнал.

Установка window size:

chrome.exe --window-size=1366,768 --window-position=0,0

Важно: window.outerWidth/outerHeight должны быть 1366/768, но window.innerWidth/innerHeight чуть меньше (из-за toolbar). Это естественное соотношение, которое Facebook ожидает.

Рандомизация сбоку: не рандомизация window size (это fingerprint signal), а scroll position — иногда прокрутка вниз перед действием.

Слой 3: locale и timezone

Критично для Израиля: lang=he-IL в Chrome и timezone Asia/Jerusalem в OS. Эти значения выявляются несколькими способами:

  • navigator.language — получает lang flag.
  • navigator.languages — array, default ["he-IL", "he", "en-US", "en"].
  • Intl.DateTimeFormat().resolvedOptions().timeZone"Asia/Jerusalem".
  • HTTP header Accept-Language: he-IL,he;q=0.9,en-US;q=0.8,en;q=0.7.

Израильский Facebook-аккаунт, подключающийся с Accept-Language: ru-RU = сильный сигнал, что что-то не так. У нас в BuzzPost locale устанавливается один раз при создании VDS и фиксируется на всю жизнь.

Слой 4: WebGL и Canvas fingerprint

Как я детально описал в статье headless vs visible, fingerprint WebGL — это критическая точка детектирования. На VDS visible:

  • Мы не передаём --disable-gpu.
  • Мы не используем никакие «anti-fingerprinting» расширения, меняющие renderer (это вредит).
  • Мы опираемся на GPU Hyper-V/KVM, предоставляющий органичный WebGL.

Canvas fingerprint: тоже органичный. Производный от GPU и OS, не искажён.

Слой 5: рандомизация delays

Один из важнейших опор anti-detection. Между каждыми двумя действиями бота — рандомный delay 8-22 секунды. Почему этот диапазон?

  • Меньше 5 секунд = очевидный bot. Человек не может обработать экран + прочитать + кликнуть с такой скоростью.
  • Больше 30 секунд = idle session, выглядит подозрительно (почему пользователь открыл группу и не делал ничего 30 секунд?).
  • 8-22 секунды = естественный диапазон человека, прокручивающего группу, читающего заголовок, решающего опубликовать.

Наш код:

import random, time
def human_pause():
    seconds = random.uniform(8, 22)
    time.sleep(seconds)

Дополнительное улучшение: неравномерное распределение. Большинство раз 10-14 секунд, но иногда 20+. Это приближает distribution к человеческой правде.

Слой 6: timing key-press

Когда бот «печатает» текст, он не вставляет весь текст сразу (send_keys в selenium вставляет «мгновенно», это bot signal). Вместо: посимвольный ввод, 50-150ms между клавишами.

def human_type(element, text):
    for ch in text:
        element.send_keys(ch)
        time.sleep(random.uniform(0.05, 0.15))

Почему 50-150ms? Это диапазон обычной скорости печати (60-100 WPM). Меньше 50ms = bot. Больше 200ms = слепая печать.

Улучшение: иногда backspace + исправление, или pause 0.5-1s в середине предложения. Выглядит действительно по-человечески.

Слой 7: mouse paths (Bezier curves, не lines)

Слой, который большинство ботов игнорируют. Когда бот «двигает мышь» к кнопке, идёт ли он прямой линией? Человек так не делает.

Человек двигает мышь по Bezier curve: начинает медленно, ускоряется в середине, замедляется в конце. Наш код вычисляет рандомные control points и выполняет движение в ~30 frames по 16ms каждый (60fps).

def move_mouse_bezier(driver, target_x, target_y):
    # Compute Bezier path with random control points
    ActionChains(driver).move_to_element_with_offset(...)
    # ... 30 micro-movements over 500ms
    pass

Если Facebook слушает события mousemove (а он слушает), он видит разницу. Наивные боты, идущие прямой линией, помечаются за 5 действий.

Слой 8: scroll patterns

Человек, прокручивающий feed Facebook, не делает это с постоянной скоростью. Он прокручивает чуть, останавливается, читает, прокручивает ещё, прокручивает вверх (что-то поймало его взгляд), прокручивает вниз снова. Наш бот делает scroll patterns из 4-8 движений с pauses между ними.

def human_scroll(driver, total_y=2000):
    chunks = random.randint(4, 8)
    for _ in range(chunks):
        delta = total_y // chunks + random.randint(-50, 50)
        driver.execute_script(f"window.scrollBy(0, {delta});")
        time.sleep(random.uniform(0.4, 1.2))
    # Sometimes scroll back up
    if random.random() < 0.2:
        driver.execute_script("window.scrollBy(0, -300);")
        time.sleep(random.uniform(0.5, 1.5))

Слой 9: cookie persistence (как обсуждали в отдельной статье)

Смотрите session persistence и cookies. Кратко: сохранение user-data dir, активное обновление каждые 13 дней, исключение любого delete.

Слой 10: IP isolation

Каждый VDS со своим static IP. Без proxy chains, без shared IPs. Почему?

  • Proxy chains добавляют latency, меняющую performance timing fingerprint.
  • Shared IPs (даже residential) используются другими людьми, которые могут быть забанены сами.
  • Static IP из израильского data-центра — самый «нормальный» для израильского Facebook-аккаунта.

Все наши VDS на инфраструктуре европейских и израильских data-центров, с чистыми IP, прошедшими проверку.

Слой 11: школа прогрева

Новый аккаунт не может начать постить сразу. У нас protocol:

  1. Неделя 1: ежедневный вход в Facebook, прокрутка feed 5-10 минут, лайки на 3-5 постов, ноль личных постов.
  2. Неделя 2: вдобавок, добавление 5-10 реальных друзей, вступление в 3-5 групп, комментарии на 2-3 поста.
  3. Неделя 3: 1-2 личных поста (не групповых), шаринг одного поста.
  4. Неделя 4 и далее: бот начинает постить — стартует с 3-5 постов в день и постепенно растёт.

Аккаунт, начинающий с 50 постов в день в первый день — банится за 24 часа. Этот protocol не опционален.

Слой 12: структурное детектирование (не текстовое)

Подробно в статье rate-limit engineering. Кратко: детектирование outcome поста через структуру ARIA, не текст. Звучит странно называть «детектирование outcome» слоем anti-detection, но так и есть: система, ошибающаяся в 70% случаев — упадёт быстро. Точность = выживание.

Слой 13: watchdog и recovery

Если бот застрял (state mtime > 90 минут), watchdog process перезапускает его. Это не просто bug fix — это antidetection, потому что «застрявший бот» превращается в «забытого бота», вызывающего подозрение.

Итог

Антидетекция в 2026 — это серьёзная инженерия. BuzzPost обрабатывает все 20+ слоёв автоматически — вам не нужно знать, что такое Bezier curve или timezone leak; вы просто открываете панель и видите, что система работает. Каждый клиент получает выделенный VDS со всей защитой готовой. Если хотите начать постить, не теряя аккаунт — купите первый план за 249₪/мес. Один сервер, весь стек.

Подробнее: возможности, headless vs visible, управление множеством аккаунтов.

Слои 14-20: углублённый обзор дополнительных слоёв

Слой 14: рандомизация поста (контент + фото)

Не должно быть двух одинаковых постов. Бот использует AI (GPT-4 или локальную модель) для написания вариантов того же контента. Например, «квартира в аренду Кирьят-Моцкин» может быть:

  • «В аренду в Кирьят-Моцкин: уютная и светлая 3-комнатная квартира»
  • «Предлагаем в аренду в Кирьят-Моцкин — 3 комнаты, отличное состояние!»
  • «3-комнатная квартира в аренду в Кирьят-Моцкин, заезд сразу»

Фото: пул 20-30 фото на каждую квартиру, и в каждом посте другое фото. Если реальных фото недостаточно, лёгкая обработка (crop, color shift, новые метаданные) той же фотографии создаёт вариант.

Слой 15: управление hashtags

Hashtags ротируются. Не использовать в каждом посте те же 5 hashtags. Дополнительно, вариация в порядке hashtags — иногда в конце поста, иногда в середине.

Слой 16: phone number consistency

Номер телефона, появляющийся в постах недвижимости, — это contact клиента. Он тоже проходит лёгкую рандомизацию формата:

  • 050-123-4567
  • 050 123 4567
  • 050.123.4567
  • 0501234567
  • +972-50-123-4567

Facebook не помечает номера телефонов, но одинаковые посты с одинаковым форматом номера считаются больше спамом.

Слой 17: time-of-day distribution

Посты распределяются по 4-5 окнам времени за 24 часа, большинство ночью (00:00-07:00). Не концентрировать все 24 поста в 2 часа.

Слой 18: group rotation

Бот не постит в одну группу дважды в день. Если есть 50 целевых групп, первый день 25 групп, второй день остальные 25. Через 7 дней — возврат к ротации.

Слой 19: управление хешами фото

Facebook вычисляет perceptual hash для каждой фотографии. Если одно фото загружено в 3 разные группы, Facebook видит связь. У нас выполняется image aging: каждое фото не возвращается в ту же группу 7 дней, а после 7 дней — вариант фото (другой crop, другая обрезка).

Слой 20: monitor + alerting

Полная система включает dashboards, alerts и health checks. Если один пост провалился — alert. Если 3 поста подряд провалились — серьёзный alert. Если общий уровень ошибок поднимается с 5% до 15% — критический alert.

Вопросы, которые задают клиенты

«А если Facebook добавит новый слой детектирования?»

Мы отслеживаем проблему. Когда что-то меняется — весь наш парк (150+ аккаунтов) видит тот же феномен одновременно, и это ясный signal. Мы обновляем detector в среднем за 48 часов.

«Как я узнаю, что бот работает правильно?»

В панели есть полная dashboard: сколько постов сегодня, процент успеха, красные алерты, если что-то не так.

Приложение: флаги Chrome, которые нельзя передавать

Не каждый флаг хорош. Вот чёрный список флагов, которые компрометируют anti-detection:

  • --headless — самоочевидно
  • --disable-gpu — искажает WebGL fingerprint
  • --no-sandbox — не пересекает порог детектирования, но в production не рекомендуется
  • --disable-web-security — ломает CORS, на который Facebook опирается
  • --disable-features=VizDisplayCompositor — оптимизация рендеринга, влияющая на fingerprint
  • --use-fake-ui-for-media-stream — помечает как automated
  • --enable-automation — название говорит само за себя

Если строите своё, начните с minimal flag set и добавляйте только необходимое. Каждый флаг — potential signal.

Связь между слоями

Важно понимать, что слои не независимы. Они работают вместе. Если у вас реальный UA, но неправильная timezone, signal ломается. Если у вас отличные mouse paths, но вы работаете на constant scroll — подозрительно. Все слои должны быть согласованы.

Это и создаёт «deep faking» человечности: 20+ маленьких деталей, согласующихся друг с другом, создающих правдоподобную картину. Когда Facebook пытается определить bot, он проверяет не только провал первого слоя — он ищет inconsistencies между слоями.

Пример: UA говорит «Windows 10 + Chrome 121», но timezone говорит «America/New_York», но IP из Израиля, но locale «en-US». Это не пользователь — это кто-то, кто ошибся в нескольких параметрах. Даже если это реальный пользователь, который живёт в Америке и поднялся в Израиль — это сочетание редкое.

Поэтому выделенный VDS — это не просто «простое решение», а правильное решение: каждый параметр подогнан под одну фиксированную persona. Нет смены, нет противоречий. Все 20+ слоёв складываются в «израильский пользователь среднего возраста на Windows 10 в Крайот, прокручивающий feed недвижимости в 04:30 до того, как дети проснулись». Это выглядит правдоподобно, потому что соответствует тысячам реальных пользователей.