Отпечаток железа: как Яндекс палит ботов по батарее, памяти и ядрам CPU

Как Яндекс вычисляет накрутку ПФ по аппаратному отпечатку: число ядер CPU, deviceMemory, Battery API, DPR экрана и WebGL-рендерер. Как рандомизировать железо без палева.

Отпечаток железа: как Яндекс палит ботов по батарее, памяти и ядрам CPU

Когда речь заходит о том, как Яндекс вычисляет накрутку поведенческих факторов, большинство вспоминает про прокси, антидетект-браузеры и подмену 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-ядерный при тех же куках — это сигнал генерации на лету. Качественный антидетект фиксирует аппаратный отпечаток за профилем и держит его неизменным весь жизненный цикл, о котором мы писали в статье про цикл накрутки и удержание позиций.

Живая батарея

Эмулируйте меняющийся заряд и статус. Часть профилей «на зарядке», часть — нет, уровни распределены по всему диапазону. Это дёшево в реализации, но закрывает один из самых грубых сигналов, который большинство сервисов игнорирует.

Частые ошибки, из-за которых железо выдаёт накрутку

  1. Дефолтные значения виртуалки. Запуск профилей «из коробки» без подмены железа — 4 ядра и 8 ГБ на всех. Первое, что нужно настроить.
  2. Мёртвая или отсутствующая батарея. На десктопных серверах Battery API либо пуст, либо статичен. Живой аудитории так не бывает.
  3. Программный рендер вместо GPU. SwiftShader в WebGL — маркер headless-браузера, который антифрод знает наизусть.
  4. Рассинхрон с user-agent. Мобильный UA поверх десктопного железа — классика палева.
  5. Слишком «чистая» статистика. Идеально ровные значения на всей ферме невозможны у людей. Нужен природный разброс.

Если позиции просели или трафик выглядит «роботным» в отчётах, начните диагностику с аппаратного отпечатка — как это делать по данным Метрики, мы разобрали в статье про аналитику накрутки в Метрике и Вебмастере и про сегмент роботности.

Как самому проверить отпечаток своих ботов

Прежде чем запускать ферму в бой, прогоните профили через проверку — это сэкономит бюджет и убережёт от слива. Практический чек-лист:

  • Откройте с профиля тестовую страницу, которая выводит 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-рендерер — реально то, что все пропускают. Пойду перенастраивать ферму.

🚀

Получите бесплатный расчёт

Напишите нам в Telegram — ответим за 15 минут, рассчитаем стоимость под ваши запросы и регион.

Написать в Telegram

✓ Бесплатно  ·  ✓ Без обязательств  ·  ✓ Ответ за 15 минут

Вопрос — ответ

Ответили на популярные вопросы о нашей работе и продвижении.