Вы перешли от голого HTTP к настоящему браузеру. TLS-отпечаток — честно Chrome. IP — резидентный. А сайт всё равно знает. В 2026 году детект headless-браузеров ушёл далеко за navigator.webdriver — нынешнее поколение проверок детектит сам протокол автоматизации, а большинство "stealth"-плагинов латают вчерашние сигналы, громко выставляя напоказ сегодняшние.
Эта статья размечает, что сайты реально проверяют сейчас, примерно в порядке проверки, и что реально помогает на каждом слое. Она завершает трилогию детекта вместе с TLS-фингерпринтингом JA3/JA4 (сетевой слой) и репутацией IP и ASN (адресный слой) — это слой браузера.
navigator.webdriver — по спецификации обязан быть true под автоматизацией. Stealth-сборки Playwright/Puppeteer его прячут; флаг Chrome --disable-blink-features=AutomationControlled справляется нативно. Сайты всё ещё проверяют, потому что это бесплатно и ловит наивных ботов.HeadlessChrome/ в User-Agent. Чинится новым headless-режимом (headless=new), который использует путь настоящего бинарника Chrome.navigator.plugins, нет chrome.runtime, outerWidth 0×0. Старый headless-режим проваливал всё это; новый в основном проходит.Если цель проверяет только Уровень 1, современный Playwright с headless=new проходит насквозь. Серьёзные цели ушли дальше много лет назад.
Playwright и Puppeteer управляют Chrome через Chrome DevTools Protocol, и CDP оставляет рантайм-побочки, которые JavaScript страницы может наблюдать:
// Классическая утечка CDP: коллбэки сериализации
const err = new Error();
Object.defineProperty(err, "stack", {
get() {
// Этот getter срабатывает ВО ВРЕМЯ сериализации console -
// что бывает только когда подключён DevTools/CDP
window.__cdp_detected = true;
},
});
console.debug(err);
Вариации этого — побочки геттеров при сериализации console, аномалии тайминга в Runtime.evaluate, поведение toString() на пропатченных нативных функциях — есть в каждом коммерческом анти-бот бандле. Ключевое: это детектит протокол, а не headless-режим. Headed, пропатченный под stealth, идеально человекоподобный Chrome всё равно провалится, если управляется через CDP.
Что помогает:
Помимо артефактов, современные системы проверяют, внутренне ли непротиворечива легенда вашего браузера:
| Проверка | Признак бота |
|---|---|
| Хэш рендера Canvas / WebGL | Программный рендеринг SwiftShader/llvmpipe = серверный GPU; или хэш, общий для 10 000 "разных юзеров" |
| Шрифты и кодеки | Набор шрифтов Linux-сервера под Windows User-Agent |
| Часовой пояс × локаль × гео IP | Intl говорит UTC, IP говорит Техас, Accept-Language говорит de-DE |
| Метрики экрана | 1920×1080 без панели задач, devicePixelRatio ровно 1, окно ни разу не меняло размер |
| Число ядер / память | 96 ядер, отданных странице, которая прикидывается телефоном |
| Поведенческие микросигналы | Нулевая энтропия мыши, мгновенное заполнение форм, прокрутка одинаковыми шагами по 100px |
Вот где умирает самодельный stealth: каждый ваш патч должен согласовываться с каждым другим сигналом. Подделанный Windows UA на Linux-контейнере одновременно противоречит шрифтам, строкам GPU и TCP-отпечаткам. Согласованность бьёт идеальность — честный headed Linux Chrome набирает больше очков, чем криво подделанный "Windows".
Ничто из этого не имеет значения, если адресный слой выжжен: безупречный браузер на дата-центровом ASN всё равно "безупречный браузер в дата-центре" — а пороги детекта headless адаптивны к репутации IP. Тот же браузер получает больше JavaScript-challenge с помеченного IP. Резидентные выходы фактически снижают уровень придирчивости, который должен пережить слой браузера:
browser = p.chromium.launch(
headless=False, # headed переживает больше проверок
args=["--disable-blink-features=AutomationControlled"],
proxy={
"server": "us.jibaoproxy.com:913",
"username": "USERNAME", "password": "PASSWORD",
},
)
toString() сам по себе сигнал. Меньше, но согласованных патчей — выигрыш.Резидентные IP, совпадающие с легендой вашего отпечатка — $5 бесплатного баланса, без карты.
Начать бесплатноНовым пользователям — 5U при регистрации, бонус к первому пополнению. Акция ограничена по времени.