
Когда речь заходит о том, как Яндекс вычисляет накрутку поведенческих факторов, большинство вспоминает про прокси, антидетект-браузеры и подмену Canvas. Но есть целый пласт сигналов, который остаётся в слепой зоне у 8 из 10 тех, кто крутит ПФ самостоятельно, — аппаратный отпечаток. Это данные о «железе» устройства: количество ядер процессора, объём оперативной памяти, состояние батареи, характеристики экрана и видеокарты. По отдельности каждый параметр кажется безобидным, но вместе они складываются в устойчивый профиль, по которому антифрод Яндекса отделяет живого пользователя от фермы ботов быстрее, чем по любому Canvas.
В этом материале разберём на уровне эксперта, какие именно аппаратные параметры считывает браузер, как поисковик использует их для детекта, почему «одинаковое железо» — это приговор для сессии, и как правильно рандомизировать отпечаток, чтобы боты выглядели как парк реальных устройств, а не как клоны одной виртуалки.
Что такое аппаратный отпечаток и почему он важнее, чем кажется
Аппаратный отпечаток (hardware fingerprint) — это совокупность характеристик устройства, которые браузер отдаёт любому сайту через штатные JavaScript-API, даже без разрешения пользователя. Сайту не нужно ставить куки или получать согласие: он просто спрашивает у браузера «сколько у тебя ядер?» — и получает честный ответ. Яндекс.Метрика, установленная на большинстве сайтов, собирает эти данные в фоне и передаёт в поисковые алгоритмы как часть профиля визита.
Ключевая мысль, которую нужно усвоить: поисковик анализирует не отдельный параметр, а связку и её повторяемость. Один визит с 4 ядрами и 8 ГБ памяти — норма. Но если сотня «разных пользователей» за неделю приходит на сайт с абсолютно идентичным набором (4 ядра, 8 ГБ, разрешение 1920×1080, одна и та же видеокарта, батарея всегда 100%) — это не сто человек, это одна машина, притворяющаяся толпой. Именно эту аномалию антифрод ловит без труда.
Какие параметры железа считывает браузер
1. Число ядер процессора — navigator.hardwareConcurrency
Свойство navigator.hardwareConcurrency возвращает количество логических ядер процессора. У реальных пользователей значения распределены естественно: 2, 4, 6, 8, 12, 16 ядер в зависимости от устройства — от бюджетного ноутбука до игрового ПК. Проблема ботоводов в том, что виртуальные машины и серверы по умолчанию рапортуют об одном и том же значении. Дефолтный VPS часто отдаёт 1, 2 или 4 ядра. Когда с одного дата-центра запускается 50 профилей, и все они показывают ровно 4 ядра, — это статистический сигнал, который не спрятать за прокси.
2. Объём оперативной памяти — navigator.deviceMemory
Свойство navigator.deviceMemory отдаёт объём ОЗУ, округлённый до степени двойки: 0.25, 0.5, 1, 2, 4, 8. Обратите внимание — браузер намеренно огрубляет значение, поэтому 16 ГБ и 32 ГБ оба показываются как 8 (максимум по спецификации). У живой аудитории преобладают значения 4 и 8. Если ваши боты все как один показывают 8, а хостинг при этом виртуальный — это ещё один кирпич в стену подозрений.
3. Состояние батареи — Battery Status API
Это самый недооценённый параметр. Через navigator.getBattery() браузер отдаёт уровень заряда (0–100%), статус зарядки и время до полного заряда/разряда. У живых людей заряд — это хаос: 37%, 82%, 14%, кто-то на зарядке, кто-то нет. У ботов на десктопных серверах батареи нет вовсе либо она эмулируется криво: уровень всегда 100%, статус «заряжается» и «charging: true» на всех профилях одновременно. Представьте выборку из тысячи визитов, где у всех батарея ровно 100% и всё на зарядке, — для алгоритма это красный флаг размером с билборд.
4. Экран, плотность пикселей и цветность
Сюда входят screen.width/height, window.devicePixelRatio, глубина цвета, доступная область экрана с учётом панели задач. Реальные устройства дают огромный разброс: мобильные с DPR 2.0–3.0, ноутбуки с масштабом 125%, мониторы 2K и 4K. Боты же часто выдают стандартное 1920×1080 с DPR 1.0 — самое частое «дефолтное» разрешение виртуалок, которое в живой мобильной выдаче встречается заметно реже.
5. Видеокарта через WebGL
Через WebGL-расширение WEBGL_debug_renderer_info сайт узнаёт производителя и модель видеочипа (например, «Apple M2» или «Intel Iris Xe»). Этот параметр обязан согласовываться с остальным железом и user-agent. Если UA говорит «iPhone», а рендерер — «Google SwiftShader» (программный рендер, типичный для headless-браузеров), связка рассыпается мгновенно.
Как Яндекс превращает железо в детектор накрутки
Антифрод не выносит вердикт по одному визиту. Он строит статистическую картину и ищет в ней противоестественные скопления. Вот основные механики, работающие именно на аппаратном отпечатке:
- Кластеризация по идентичности. Алгоритм группирует визиты с одинаковым набором железа. Естественный трафик даёт «размазанное облако», накрутка — плотные кластеры одинаковых профилей.
- Проверка внутренней согласованности. Мобильный user-agent обязан сопровождаться мобильным железом: DPR > 1, наличие батареи, touch-события, разумное число ядер. Рассинхрон «мобильный UA + десктопное железо» — прямой признак эмуляции.
- Аномалии распределения. В живой аудитории заряд батареи, число ядер и объём памяти подчиняются природным распределениям. Слишком «ровная» статистика (все 100%, все 4 ядра) статистически невозможна для настоящих людей.
- Сопоставление с историей устройства. Яндекс помнит, с каким железом раньше приходил конкретный профиль/куки. Если «то же устройство» вдруг сменило число ядер и видеокарту — это признак генерируемого на лету отпечатка.
Мы подробно разбирали смежные механики в статьях про Canvas и WebGL отпечаток и сборку цифровой личности через User-Agent и cookie — аппаратный отпечаток работает с ними в одной связке, и ломать нужно всё вместе, а не по частям.
Таблица: живое устройство против плохо настроенного бота
| Параметр | Живой пользователь | Типичный бот на VPS |
|---|---|---|
| Ядра CPU | 2, 4, 6, 8, 12, 16 — разброс | всегда 4 (дефолт виртуалки) |
| Память (deviceMemory) | 4 и 8 преобладают | всегда 8 |
| Батарея | случайный заряд, разный статус | 100%, «заряжается», у всех |
| Экран/DPR | множество комбинаций | 1920×1080, DPR 1.0 |
| Видеокарта (WebGL) | реальные GPU под платформу | SwiftShader / программный рендер |
| Согласованность с UA | полная | рассинхрон мобайл/десктоп |
Как правильно рандомизировать аппаратный отпечаток
Задача не в том, чтобы «спрятать» железо, а в том, чтобы каждый бот выглядел как отдельное правдоподобное устройство, а вся ферма — как естественная выборка живой аудитории. Вот принципы, которые отличают качественную накрутку от кустарной:
Реалистичное распределение, а не случайные числа
Нельзя просто рандомить ядра от 1 до 64 — в природе нет процессоров с 37 ядрами. Значения должны браться из реального распределения устройств рунета: доля 4-ядерных, 8-ядерных и так далее, с перекосом в сторону мобильных, потому что львиная доля трафика Яндекса — мобильная. Мы разбирали важность мобильного профиля в материале про мобильный и десктопный ПФ.
Согласованность связки
Число ядер, память, видеокарта, экран и user-agent должны описывать одно и то же устройство. Если профиль притворяется флагманским смартфоном — у него должно быть 8 ядер, DPR около 3.0, мобильный GPU и живая батарея с меняющимся зарядом. Собранный «по кусочкам» профиль, где каждый параметр случаен и не связан с остальными, палится именно на несогласованности.
Стабильность профиля во времени
Одно устройство не меняет железо между визитами. Если профиль сегодня 4-ядерный, а завтра 8-ядерный при тех же куках — это сигнал генерации на лету. Качественный антидетект фиксирует аппаратный отпечаток за профилем и держит его неизменным весь жизненный цикл, о котором мы писали в статье про цикл накрутки и удержание позиций.
Живая батарея
Эмулируйте меняющийся заряд и статус. Часть профилей «на зарядке», часть — нет, уровни распределены по всему диапазону. Это дёшево в реализации, но закрывает один из самых грубых сигналов, который большинство сервисов игнорирует.
Частые ошибки, из-за которых железо выдаёт накрутку
- Дефолтные значения виртуалки. Запуск профилей «из коробки» без подмены железа — 4 ядра и 8 ГБ на всех. Первое, что нужно настроить.
- Мёртвая или отсутствующая батарея. На десктопных серверах Battery API либо пуст, либо статичен. Живой аудитории так не бывает.
- Программный рендер вместо GPU. SwiftShader в WebGL — маркер headless-браузера, который антифрод знает наизусть.
- Рассинхрон с user-agent. Мобильный UA поверх десктопного железа — классика палева.
- Слишком «чистая» статистика. Идеально ровные значения на всей ферме невозможны у людей. Нужен природный разброс.
Если позиции просели или трафик выглядит «роботным» в отчётах, начните диагностику с аппаратного отпечатка — как это делать по данным Метрики, мы разобрали в статье про аналитику накрутки в Метрике и Вебмастере и про сегмент роботности.
Как самому проверить отпечаток своих ботов
Прежде чем запускать ферму в бой, прогоните профили через проверку — это сэкономит бюджет и убережёт от слива. Практический чек-лист:
- Откройте с профиля тестовую страницу, которая выводит
navigator.hardwareConcurrency,navigator.deviceMemory, данныеgetBattery(),devicePixelRatioи WebGL-рендерер. Сравните значения между профилями — они обязаны различаться. - Проверьте согласованность: мобильный user-agent должен идти с мобильным GPU, высоким DPR и живой батареей. Любой рассинхрон — переделывать.
- Убедитесь, что видеокарта — реальная модель, а не SwiftShader и не пустая строка.
- Прогоните заряд батареи: у выборки профилей он должен быть разным, а не «100% на зарядке» у всех.
- Через сутки повторите проверку тех же профилей — железо не должно измениться. Плавающий отпечаток хуже статичного.
Если хотя бы один пункт проваливается, накрутка будет работать против вас: чем больше визитов с палевным железом, тем быстрее сайт уйдёт под фильтр. Подробнее о том, как безопасно наращивать объём, — в материале про безопасный суточный лимит визитов.
Вывод
Аппаратный отпечаток — это фундамент, на котором держится вся маскировка бота. Можно идеально подменить Canvas, купить дорогие мобильные прокси и выстроить безупречное поведение, но если сотня «пользователей» приходит с одинаковыми 4 ядрами, 8 ГБ и вечно заряженной батареей, антифрод Яндекса склеит их в один кластер и обнулит эффект накрутки. Правильная работа с железом — это реалистичные распределения, полная согласованность связки, стабильность профиля во времени и живая батарея. Именно на этом уровне детализации проходит граница между накруткой, которая выводит в ТОП, и той, что приводит сайт под фильтр.
Больше о поведенческом продвижении и других услугах — на главной странице ProfSEO24.
Закажите накрутку ПФ в ProfSEO24
Выводим сайты в ТОП-1 Яндекса за счёт поведенческих факторов на базе ИИ — без риска фильтров. Более 300 сайтов в ТОП-1, первые сдвиги по позициям за 3 дня. Рассчитаем стоимость под вашу нишу и регион.
Заказать накрутку ПФ Написать в TelegramКомментарии
Игорь Северцев
Про батарею вообще не думал. Гонял 40 профилей с одной виртуалки, у всех Battery API отдавал 100% charging. Теперь понятно, почему кластер так быстро схлопнулся.
Марина_К
А как задать deviceMemory отдельно на каждый профиль? В моём антидетекте вижу только подмену Canvas и user-agent, про память ничего нет.
Admin
Марина, если в антидетекте нет подмены deviceMemory и hardwareConcurrency — это уже слабый инструмент. Нормальные браузеры (Dolphin, Octo, AdsPower) это умеют в настройках профиля, ищите раздел Hardware/Navigator. Если раздела нет — параметр отдаётся реальный, и все профили с одной машины палятся по одинаковой памяти.
seomaster77
SwiftShader — вот это боль. Полгода лил трафик через headless и не понимал, почему отказы под 90%. Рендерер программный у всех был.
Дмитрий Л.
Вопрос: а Яндекс реально хранит историю железа по кукам? Или это теория? Просто если да, то пересоздавать профили с нуля бессмысленно.
Admin
Дмитрий, хранит — и не только по кукам, но и по связке отпечатков. Поэтому важно не пересоздавать железо у живого профиля: если куки те же, а число ядер вдруг сменилось — это и есть сигнал генерации на лету. Профиль ведём стабильным весь цикл, об этом есть отдельная статья про удержание.
Ольга В.
Спасибо за таблицу, наглядно. Сразу пошла проверять свои профили — и правда, у всех 1920×1080 и DPR 1.0. Мобильных вообще нет, а трафик у Яндекса в основном мобильный.
Артём (SEO)
Коллеги, а кто-нибудь реально эмулирует меняющийся заряд батареи? Технически это как вообще делается — через переопределение getBattery?
Admin
Артём, да, через переопределение промиса getBattery() на уровне профиля: подставляется случайный level и charging из реалистичного диапазона, плюс события изменения заряда. В хороших антидетектах это встроено, в самописных решениях дописывается инъекцией скрипта до загрузки страницы.
Кирилл
По факту получается, что дешёвые сервисы накрутки на этом и палятся. Никто не заморачивается железом, льют с дефолтных виртуалок.
Наталья Ким
А для мобильных профилей DPR какой ставить? У меня телефоны показывают 2.75, это норм или слишком специфично?
Admin
Наталья, 2.75 абсолютно нормально — это реальный DPR многих Android-флагманов. Главное, чтобы значение соответствовало заявленной модели в user-agent и разрешению экрана. Диапазон 2.0–3.5 для мобильных — рабочий, лишь бы связка была согласованной.
RostovDesign
Полезно. Добавлю: ещё touch-события забывают. Мобильный UA, а maxTouchPoints = 0. Тоже сразу видно эмуляцию.
Владислав
Читаю и понимаю, что самому это всё не потянуть. Проще заказать у тех, кто уже настроил распределения. Сколько по времени первые результаты?
Admin
Владислав, первые сдвиги по позициям обычно видны уже за 3 дня, стабильный рост — через 2–3 недели. По железу и распределениям у нас всё настроено, можно обсудить вашу нишу и запросы в Telegram или через заявку на сайте.
Евгений П.
Проверил свои профили по чек-листу из статьи — три из пяти пунктов провалились. Спасибо, что разжевали, а то лил в пустоту.
Алина
А если использовать реальные телефоны (девайс-ферма), железо же будет настоящим и разным? Или там свои нюансы?
Максим Гринёв
Топ-материал. Наконец кто-то объяснил, почему «всё по инструкции», а результата нет. Дьявол в деталях железа.
Сергей_Т
Забрал в закладки. Батарея и WebGL-рендерер — реально то, что все пропускают. Пойду перенастраивать ферму.