Строка HeadlessChrome — не имя одного оператора и не «Automaton» как отдельный бренд, а буквальная настройка по умолчанию инструментов браузерной автоматизации Puppeteer и Playwright: если разработчик не переопределил заголовок явно, движок сам подставляет в User-Agent слово HeadlessChrome вместо обычного Chrome, когда браузер запущен без графического интерфейса. Как и в случае с Python-urllib, curl или Scrapy из этой серии, это заводская метка инструмента, которую использует бесчисленное множество независимых скриптов — не бренд одного сервиса.
Почему эта деталь стала известной «дырой» для анти-бот систем
По независимым техническим разборам, наличие подстроки HeadlessChrome в заголовке — один из самых очевидных и известных сигналов автоматизации, на которые ориентируются системы защиты от ботов вроде Cloudflare Bot Management, DataDome или PerimeterX. Именно поэтому практически все профильные руководства по автоматизации браузера в один голос советуют разработчикам в первую очередь переопределить этот заголовок — например, через метод page.setUserAgent() в Puppeteer или настройку контекста в Playwright, — если задача заключается в том, чтобы не выделяться на фоне обычных пользователей. Следствие для владельца сайта прямое: раз это самая базовая и общеизвестная вещь, которую меняют в первую очередь, «голая» строка с HeadlessChrome в логах — почти всегда либо небрежность автора скрипта, либо инструмент, которому попросту всё равно, что его видно, — но точно не свидетельство продуманной маскировки.
Параметры
| Параметр | Значение |
| Токен / паттерн | headlesschrome |
| Природа строки | Заголовок User-Agent по умолчанию для Chromium/Chrome, запущенного в headless-режиме через Puppeteer, Playwright или похожие инструменты автоматизации браузера |
| Оператор | ❌ Множество независимых пользователей — веб-скрапинг, автоматизированное тестирование, генерация PDF/скриншотов, headless-рендеринг для отчётов и превью |
| Дополнительный признак автоматизации | Помимо самой строки UA, независимые технические источники также перечисляют другие типичные маркеры headless-запуска: свойство navigator.webdriver, возвращающее true, отсутствие или необычный объект window.chrome, пустой список navigator.plugins, неестественно точные и одинаковые интервалы между действиями |
| Изменение заголовка | Тривиально — переопределяется одной строкой кода в обоих основных инструментах, поэтому отсутствие переопределения обычно говорит о невнимательности автора, а не о техническом ограничении |
| Соблюдение robots.txt | Не гарантировано — headless-браузер сам по себе robots.txt не читает, это целиком ответственность автора конкретного скрипта |
| Список IP-адресов | ❌ Неприменимо в принципе — источники организационно и географически не связаны |
Почему это не то же самое, что «Automaton»
Важно отделить саму технологию headless-браузера от конкретного имени, под которым она иногда фигурирует в других списках ботов (например, «Automaton» как часть более общего имени бота-соседа из этой серии). HeadlessChrome — универсальная метка технологии, которую используют тысячи разных, никак не связанных друг с другом инструментов и скриптов, а не единый продукт с собственной документацией и политикой. Присвоение этой строке отдельного «имени бренда» в некоторых каталогах ботов — упрощение, которое может ввести в заблуждение: за одним и тем же токеном в разных случаях стоят совершенно разные задачи и разные авторы.
Подключите домен и посмотрите живую ленту: кто пришёл, с какой сети, что запрашивал и по какому правилу был пропущен или заблокирован.
Как найти в логах
grep -i "headlesschrome" /var/log/nginx/access.log
Поскольку это не единый оператор, привычная схема верификации через whois/ASN может подтвердить происхождение отдельного IP, но не скажет ничего о характере всего класса трафика в целом.
Как настроить доступ
Для публичного сайта разумная политика по умолчанию — рассматривать нераспознанный headless-трафик как сигнал автоматизации без установленной политики:
if ($http_user_agent ~* "headlesschrome") {
return 403;
}
Если внутри организации есть собственные легитимные процессы на headless-браузере (генерация PDF-отчётов, автоматизированное тестирование, скриншоты для превью), правильное решение — задать им собственный, узнаваемый User-Agent через явное переопределение в коде, а не оставлять неотличимыми от общего фона:
// Puppeteer
await page.setUserAgent('CompanyName-InternalReports/1.0 (+https://example.com/bot-info)');
// Playwright (на уровне контекста)
const context = await browser.newContext({
userAgent: 'CompanyName-InternalReports/1.0 (+https://example.com/bot-info)'
});
Правило в robots.txt для этого класса трафика работает ненадёжно — headless-браузер сам по себе его не читает, поэтому основной контроль стоит держать на уровне сервера, а не полагаться на добровольное соблюдение файла политики.
- AhrefsBot: полное руководство
- Googlebot: полное руководство
- Googlebot-Image
- Googlebot-News
- Googlebot-Video
- Google AdsBot
- Storebot-Google
- Mediapartners-Google (AdSense)
- Feedfetcher-Google
- APIs-Google
- Google-Read-Aloud
- Google-Site-Verification и InspectionTool
- Bingbot (MSN Bot)
- YandexBot
- YandexMetrika
- Yandex Userproxy
- MJ12bot
- SemrushBot
- Amazonbot
- DotBot
- FacebookBot
- Amazon SearchBot
- Yandex Direct Fetcher
- Anthropic AI
- Cohere AI
- llmstxtscan
- HetrixTools
- ArchiveTeam ArchiveBot
- crawler_eb
- EECS498
- IntelX
- statdom.ru
- Website-info.net-Robot
Частые вопросы
HeadlessChrome — это конкретный бот или сервис?
Почему эта строка считается таким очевидным сигналом бота?
Какие ещё признаки выдают headless-запуск помимо строки UA?
Это то же самое, что бот «Automaton» из соседних каталогов?
Соблюдает ли headless-браузер robots.txt?
Что делать со своими легитимными headless-процессами (отчёты, тестирование)?
Команда TrafficVeil разрабатывает инструменты защиты сайтов от ботов, DDoS и веб-атак. Разборы ботов пишем по логам подключённых доменов и открытым данным операторов.