Если вы автоматизируете браузер — для скрейпинга, QA-тестирования или управления аккаунтами, — всё решает один вопрос: пройдёте вы или получите CAPTCHA? А именно — выглядит ли ваш браузер как человек? Виджет на этой странице задаёт этот вопрос вашему текущему браузеру, проверка за проверкой.
Несколько лет назад всё решала одна строчка JavaScript. Selenium, Puppeteer и Playwright устанавливали navigator.webdriver в true, а сайты просто считывали это значение. Сегодня такая проверка почти никого не ловит, потому что любая серьёзная система автоматизации патчит этот флаг ещё до загрузки страницы. Детект ушёл вперёд. В этой статье мы разберём, куда именно.
Классические приметы и почему они перестали работать
Это проверки, которым до сих пор учит любой туториал из 2019 года и которые обходит любой современный stealth-плагин:
navigator.webdriver. Selenium, Puppeteer и Playwright переключают его вtrue, а любой stealth-инструмент одной строкой возвращает его вfalse.- User-Agent с «HeadlessChrome». Старый headless-Chrome сам заявлял о себе в строке User-Agent. Никто, кто хоть немного старается, этого не оставляет.
- Пустые списки плагинов и языков. Значения по умолчанию для headless, которые исправляются одной строкой настройки. Настоящий десктопный Chrome поставляется с PDF-плагинами и всегда сообщает хотя бы один язык.
- Отсутствие объекта
window.chrome. Некоторые автоматизированные сборки его вырезают, что странно смотрится у браузера, который называет себя Chrome.
Ни одна из этих проверок больше не остановит грамотного бота. Они остаются в тесте, потому что мгновенно выдают небрежных и потому что настоящий браузер проходит их без всяких усилий.
Где на самом деле происходит детект сегодня
Проверки, которые всё ещё работают, — это не косметические флаги. Это следствия того, как именно управляют браузером, и потому их гораздо сложнее пропатчить.
Канал DevTools. Puppeteer и Playwright управляют Chrome через Chrome DevTools Protocol и для своей работы включают его домен Runtime, который незаметно сериализует каждый объект, переданный в консоль. Эта сериализация обращается к свойствам, которые больше никто не читает. Залогируйте объект Error с ловушкой на свойстве stack — и канал автоматизации выдаст себя, как бы аккуратно ни были пропатчены поверхностные флаги. Это самый трудный для сокрытия сигнал. Он же срабатывает, если у вас просто открыт DevTools прямо сейчас, — поэтому виджет отдельно на это указывает.
Программный рендеринг. У headless-браузера на сервере нет GPU, поэтому он откатывается к программному рендереру: SwiftShader в Chrome, llvmpipe в Linux. Строка WebGL-рендерера прямым текстом об этом сообщает. Настоящий ноутбук докладывает о GPU от Intel, Apple, AMD или NVIDIA, а «Google SwiftShader» означает сервер, который выдаёт себя за него. Это та же самая строка рендерера, которую по другим причинам считывает наша статья о canvas-фингерпринтинге.
Пропатченные нативные функции. Вот парадокс, лежащий в основе stealth-инструментов: чтобы скрыть navigator.webdriver, плагину приходится его переопределить, а переопределённая встроенная функция перестаёт сообщать [native code], когда скрипт исследует её исходный код. Каждая функция, к которой прикоснулся stealth-плагин, становится уликой его присутствия. Чем тщательнее патчинг, тем больше находок. Расширения для приватности, подменяющие показания canvas или WebGL, спотыкаются на той же проверке — и это стоит знать, даже если вы ничего не автоматизируете.
Согласованность движка. Небольшие внутренние константы — например, точная длина исходного кода eval — фиксированы для каждого JavaScript-движка. Заявите, что вы Chrome, пока константы вашего движка говорят обратное, — и User-Agent разоблачён как маскарадный костюм. Это та же ловушка на противоречиях, что мы описывали для операционной системы в статье Один браузер, пять заявленных ОС и для версии браузера в статье Ваш User-Agent лжёт.
Поведение — слой, до которого stealth-инструментам не дотянуться
Всё вышеописанное касается браузера в состоянии покоя. Сигнал, который не патчит ни один плагин, — это то, что происходит после открытия страницы. Антибот-системы следят за физикой взаимодействия: клик, которому не предшествовало движение мыши, курсор, идущий идеально по прямой, прокрутка без плавного замедления, нажатия клавиш с машинной равномерностью интервалов. Люди «шумят» предсказуемым образом. Скрипты чисты так, как люди не бывают никогда. Статический отпечаток можно подделать один раз; поведение приходится убедительно разыгрывать всю сессию напролёт.
Тест на этой странице только статический, потому что для поведенческой оценки нужны модель и сервер. Но именно в сторону поведения движется коммерческий детект — и именно поэтому пропатчить все флаги всё равно недостаточно.
Как Cloudflare и DataDome вас оценивают
Коммерческие антибот-системы — такие как Cloudflare, DataDome, Kasada и HUMAN — не полагаются ни на одну отдельную проверку. Они соединяют перечисленные выше JavaScript-сигналы с сетевыми отпечатками (TLS-рукопожатие и поведение HTTP/2, которые JavaScript не видит и не может изменить), с репутацией IP и поведенческой оценкой — и сплавляют всё это в единый балл за миллисекунды. DataDome и вовсе обучает отдельную модель для каждого защищаемого сайта. Вы пытаетесь пройти не один тест. Вы пытаетесь выглядеть согласованно во всех сразу.
В этом же и честное ограничение любого теста внутри браузера, включая этот. Он видит клиентскую сторону. Сетевую половину измеряют на сервере — ещё до того, как выполнится хоть одна строчка вашего JavaScript.
ИИ-агенты меняют сам вопрос
Новейшие боты — это ИИ-агенты для браузера. Инструменты вроде computer use от Claude, Operator от OpenAI и Browser Use управляют настоящими браузерами, выполняя задачи за людей, и легко проскакивают классические проверки, потому что под капотом у них зачастую обычный Chrome. Однако устойчивые приметы никуда не деваются. Ими управляют через DevTools Protocol, они часто работают в headless-режиме на серверах с программными GPU, а тайминг их взаимодействия по-машинному чист. Поставщики детекта тихо переходят от вопроса «бот ли это?» к вопросу «это человек, добропорядочный бот или автономный агент?» — и отвечают на него ровно теми сигналами, что собраны в виджете на этой странице.
Что делать на практике
- Никогда не патчьте наполовину. Браузер с явными следами вмешательства — сигнал более редкий и громкий, чем честный. Stealth-плагины, которые исправляют флаги один за другим, производят ровно те улики, за которыми охотятся антибот-системы. Если вы не можете сделать согласованным весь стек, добавление патчей только ухудшает дело.
- Тестируйте свою связку, прежде чем на неё полагаться. Направьте всё, что вы запускаете, на эту страницу и на полное сканирование браузера, прежде чем это будет стоить вам аккаунта или дня скрейпинга. Примета, которую вы нашли сами, — это примета, которую вы можете исправить.
- Если вы управляете несколькими личностями, используйте браузер, согласованный по своей конструкции. Настоящий движок рендеринга, настоящий вывод GPU, нетронутые нативные функции и отпечаток, который согласуется сам с собой — от строки WebGL до списка шрифтов. Именно для этого и существуют антидетект-браузеры. Incogniton собирает каждый профиль как настоящий, внутренне согласованный браузер, так что сигналы выстраиваются в линию, а не противоречат друг другу.
Автоматизация и антидетект-браузеры — легальные инструменты с множеством законных применений: от QA-тестирования и проверки рекламы до управления бизнес-аккаунтами. Разрешает ли их конкретный сайт, определяют правила самого сайта, так что изучите их, прежде чем действовать в больших масштабах.
Хотите увидеть, как держится ваш собственный браузер? Виджет на этой странице проверяет клиентские сигналы автоматизации, а полное сканирование браузера дополнительно запускает тест на утечки WebRTC, хеши отпечатков и перекрёстные проверки платформы и версии.