Полгода я жил в одном и том же цикле. Собираешь скрапер, вечером он проходит все страницы, а к обеду следующего дня отдаёт сплошные капчи и 403. Добавляешь puppeteer‑stealth, сверху ещё десяток заплаток, гонишь трафик через резидентные прокси, и всё равно на третьи сутки прилетает бан. Я устал чинить симптомы и сел разбираться, что именно нас выдаёт.
Вывод, к которому я пришёл, оказался неприятным. Антидетект, который живёт в JavaScript, спалится по определению. Дело не в том, что конкретные патчи кривые. Дело в том, что сам способ переопределить геттер из JS оставляет след, который читается тривиально. Спрашиваешь у подменённой функции toString(), а она вместо [native code] показывает твою реализацию. Стелс‑библиотека это, конечно, тоже патчит, но тогда детектор идёт на уровень глубже. Он проверяет консистентность между главным фреймом, воркером и iframe, ловит утечку Runtime.enable, сверяет форму TLS‑хендшейка (JA3/JA4) с тем, что заявляет User‑Agent. Где‑нибудь одно из этих мест обязательно разъедется, потому что правки натянуты поверх браузера, а не встроены в него.
Отсюда выросла простая мысль. Если проблема в том, что мы правим страницу, то править надо не страницу, а движок. Так появился Fortress, сборка Chromium, где антидетект зашит прямо в C++ Blink, V8 и BoringSSL, а не в инъекции поверх DOM. Каждый подменённый геттер это настоящий C++ геттер, поэтому toString() во всех реалмах честно отдаёт [native code], и сверка «главный фрейм против воркера» ничего не находит, потому что расхождения просто нет.
Я не хочу делать вид, что это решает вообще всё, поэтому сразу помечу, где твёрдый факт, а где мои условия проверки. Проверял на четырёх публичных детекторах. CreepJS показывает 0% headless и 0% stealth. Sannysoft и BrowserScan показывают всё зелёное, BrowserScan пишет «Normal». Живой Cloudflare Turnstile проходит без ручного клика. Всё это воспроизводится скриптом tools/gauntlet.py из репозитория, так что можно не верить мне на слово, а прогнать самому. Отдельно оговорю, чего я не заявляю. Я не говорю, что это обходит кастомные серверные антифроды конкретных площадок или поведенческий анализ. Это про фингерпринт браузера, не про поведение сессии.
С точки зрения кода менять почти нечего. Движок поднимает сырой CDP на порту 9222 без утечки Runtime.enable, поэтому свой существующий Playwright или Puppeteer переписывать не надо. Меняешь адрес подключения, и остальной код работает как работал. Персона при этом собирается когерентно, то есть платформа, GPU, таймзона, язык, набор голосов и раскладка клавиатуры съезжаются в один правдоподобный Windows‑девайс на каждый запуск, а не в набор случайных значений, которые сами себе противоречат.
Отдельно про то, почему я вообще выкладываю это открыто. Готовые антидетект‑браузеры вроде Dolphin или Octo стоят от 50 до 100 долларов в месяц и остаются чёрным ящиком, ты не видишь, что именно они патчат. Fortress лежит под BSD-3, все 34 патча это маленькие однофайловые диффы в patches/, каждый читается за минуту, и движок можно пересобрать самому одним скриптом. Раз в месяц происходит ребейз на свежий upstream Chromium.
Репозиторий и инструкцию по сборке найдёте [https://github.com/tiliondev/fortress]. Если полезете смотреть патчи и найдёте место, где персона всё‑таки разъезжается, напишите в issues, мне правда интересно, где оно течёт.
ссылка на оригинал статьи https://habr.com/ru/articles/1057754/