«Антидетекция» — это не одна фича. Это стек из 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: ежедневный вход в Facebook, прокрутка feed 5-10 минут, лайки на 3-5 постов, ноль личных постов.
- Неделя 2: вдобавок, добавление 5-10 реальных друзей, вступление в 3-5 групп, комментарии на 2-3 поста.
- Неделя 3: 1-2 личных поста (не групповых), шаринг одного поста.
- Неделя 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-4567050 123 4567050.123.45670501234567+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 до того, как дети проснулись». Это выглядит правдоподобно, потому что соответствует тысячам реальных пользователей.