
Любая страница может спросить у браузера, что подключено к машине по части мультимедиа, и получить ответ без единого запроса разрешений. Метод перечисления медиаустройств возвращает список того, что видит система: камеры, микрофоны, устройства вывода звука. Пока пользователь не дал доступ к камере и микрофону, названия устройств скрыты, но количество, типы и служебные групповые идентификаторы отдаются свободно. И этого более чем достаточно, чтобы понять, за чем сидит посетитель — за ноутбуком, за телефоном или за виртуалкой в стойке дата-центра.
У живого ноутбука почти всегда есть встроенная вебкамера, микрофон и как минимум один выход звука. У телефона — две камеры и микрофон. У серверной виртуальной машины медиаустройств нет вообще, и список приходит пустым. Пустой список — редчайшее состояние для реального посетителя, поэтому он работает не как маскировка, а как маркер. Дальше — как устроен этот сигнал, что именно из него вытягивает антифрод и как приводить наборы устройств в правдоподобный вид. Тема продолжает разговор про аппаратный отпечаток железа и про AudioContext-фингерпринт.
Что отдаёт браузер до выдачи разрешений
Ответ метода — массив объектов, по одному на каждое обнаруженное устройство. В каждом объекте четыре поля, и все они полезны для идентификации в разной степени:
- Тип устройства. Видеовход, аудиовход или аудиовыход. Это поле доступно всегда, без разрешений, и уже по нему считывается класс машины.
- Идентификатор устройства. Без выданного разрешения обычно пустой, но сам факт того, пустой он или заполнен, тоже информация: он говорит о состоянии разрешений в профиле.
- Групповой идентификатор. Ключевое поле. Он объединяет устройства, физически принадлежащие одному аппарату: камера ноутбука и её встроенный микрофон получают общую группу. По распределению групп видно физическую конфигурацию машины, даже когда названия скрыты.
- Название устройства. Появляется после выдачи разрешения. Строка предельно говорящая: в ней встречаются модель камеры, название звукового кодека, наименование виртуального драйвера.
Даже до выдачи разрешений из этого складывается портрет: сколько камер, сколько микрофонов, сколько выходов, как они сгруппированы. Для антибот-системы этого хватает, чтобы отделить настольную машину от телефона, а обе — от безголового окружения в дата-центре.
Вопрос «сколько у вас камер» звучит безобидно, пока не вспомнишь, что ответ на него у сервера всегда один и тот же — ноль. Ноль камер и ноль микрофонов на сотне «разных пользователей» — не отпечаток, а признание.
Почему набор устройств так хорошо разделяет аудиторию
Класс машины виден сразу
Устройства распределяются по классам почти без перекрытий. Мобильный аппарат несёт две камеры и микрофон, а отдельного списка аудиовыходов у него в браузере чаще всего нет вовсе. Ноутбук даёт камеру, микрофон и как минимум один выход. Настольный компьютер бывает и без камеры, но с колонками. Безголовое серверное окружение не даёт ничего. Соответственно, первое, что делает проверяющий скрипт, — сверяет класс устройства из медиасписка с тем, что заявлено в user-agent, разрешении экрана и точке ввода. Расхождение здесь стоит дороже, чем любая экзотика в графическом отпечатке.
Группы выдают физическую сборку
Групповые идентификаторы — самая недооценённая часть сигнала. На реальном ноутбуке камера и встроенный микрофон входят в одну группу, а подключённая гарнитура образует свою. На телефоне обе камеры и микрофон объединены аппаратом. Если профиль заявляет три устройства, но у каждого своя отдельная группа, конфигурация выглядит как набор случайно собранных виртуальных драйверов, а не как цельный аппарат.
Наличие гарнитур и внешних камер добавляет разброс
Живая аудитория подключает наушники, внешние микрофоны, мониторы со встроенными динамиками, веб-камеры. Часть людей сидит с подключённой гарнитурой прямо сейчас, часть — нет. Это создаёт естественный разброс по числу устройств, которого у синтетического парка не бывает, если наборы розданы по шаблону.
Названия после разрешения — отдельный слой
Если сайт всё-таки получает доступ к медиа, в названиях всплывает следующий уровень детализации, включая наименования виртуальных драйверов. Появление в списке устройств, характерных для сред виртуализации и программных камер, — прямое указание на автоматизированное окружение. Механика та же, что с признаками автоматизации в объекте навигатора, разобранными в материале про навигатор и признаки Selenium.
Таблица: типовые наборы устройств по классам машин
| Класс машины | Типичный набор | Как выглядит в глазах антифрода |
|---|---|---|
| Смартфон | две камеры, микрофон, группы объединены аппаратом | нормальный мобильный посетитель |
| Ноутбук | камера, микрофон, один-два выхода звука | самый массовый и безопасный профиль |
| Настольный компьютер | микрофон и выход есть, камеры может не быть | нормально, но требует согласованности с прочим |
| Ноутбук с гарнитурой | две группы устройств, четыре и более элементов | живой человек в моменте, редкий и правдоподобный |
| Серверная виртуалка | пустой список | яркая аномалия, узкая группа |
| Виртуалка с программными драйверами | виртуальная камера и виртуальный микрофон | прямой маркер автоматизации |
Последние две строки — две стороны одной ошибки. Обнулить список нельзя, потому что ноль устройств почти не встречается у людей. Но и наполнить его чем попало нельзя: программные драйверы, которые обычно ставят в серверных образах, читаются в названиях как визитная карточка автоматизации. Нужен третий путь — правдоподобный набор, соответствующий заявленному аппарату.
Как антифрод работает с медиасписком
- Снятие набора. Скрипт запрашивает перечень и сворачивает его в компактную сигнатуру: сколько устройств каждого типа, сколько различных групп, заполнены ли идентификаторы.
- Проверка на пустоту. Пустой список — отдельный флаг, который сам по себе резко сужает круг возможных объяснений визита.
- Сверка с классом устройства. Мобильный user-agent обязан приходить с мобильным набором, настольный — с настольным. Это самая дешёвая и самая результативная проверка.
- Анализ групп. Соотношение числа устройств и числа групп проверяется на физическую осмысленность.
- Кластеризация по парку. Если тысячи визитов дают две-три сигнатуры, это признак парка, собранного по шаблону, а не живой аудитории.
- Проверка стабильности. У одного и того же профиля набор не должен произвольно меняться между визитами: люди не подключают и не отключают камеру при каждом заходе на сайт.
Почему обнуление — худший вариант
Соблазн понятен: если список выдаёт сервер, пусть список будет пустым. Проблема в статистике. Устройства ввода есть практически у всего, с чего люди выходят в сеть: телефоны, планшеты, ноутбуки несут камеру и микрофон конструктивно. Доля живых посетителей с полностью пустым медиасписком мала, и она состоит преимущественно из редких настольных сборок и нестандартных конфигураций. Помещая туда весь свой парк, вы не растворяетесь в толпе, а строите собственную толпу, целиком состоящую из ботов. Логика ровно та же, что с отключением графических API и с попытками спрятаться за полным отсутствием сигнала в любом другом параметре.
Почему одинаковый набор — второй худший вариант
Второй типовой сценарий: инструмент подставляет всем профилям один и тот же аккуратный набор — камера, микрофон, выход. Набор правдоподобный, претензий к нему по отдельности нет. Но когда его отдают тысячи визитов с одинаковыми групповыми идентификаторами, он превращается в идеальный ключ кластеризации. Здесь работает то же правило, что и в остальных отпечатках: опасна не сама величина, а её нулевой разброс по парку. Подробнее логику кластеризации по совпадениям разбирали в материале про изоляцию профилей при мультиаккаунтинге.
Таблица: живая аудитория против парка профилей
| Признак | Живая аудитория | Парк без маскировки |
|---|---|---|
| Число устройств | от нуля до пяти и более, с перекосом в два-три | ноль у всех или одно значение у всех |
| Число групп | одна-две, иногда три | совпадает у всех профилей |
| Соотношение типов | меняется в зависимости от аппарата | жёсткий шаблон |
| Групповые идентификаторы | уникальны для машины | идентичны по всему парку |
| Согласованность с user-agent | полная | настольный набор при мобильном профиле |
| Изменения между визитами | редкие, связаны с гарнитурой | набор плавает при каждом старте |
Как маскировать медиасписок правильно
Набор под заявленное устройство
Отправная точка — не список устройств, а легенда профиля. Сначала решается, каким аппаратом профиль притворяется, и только потом под этот аппарат собирается медианабор. Мобильный профиль — две камеры и микрофон, объединённые одной группой. Ноутбук — камера, микрофон, выход. Настольная машина — микрофон и выход, камера опционально. Набор обязан читаться как описание конкретного аппарата, а не как случайная выборка.
Разброс по парку в форме реальной популяции
Дальше наборы распределяются по профилям так, чтобы статистика парка напоминала живую аудиторию: преобладают массовые конфигурации, заметная доля мобильных, меньшая часть — с подключённой гарнитурой и дополнительными выходами, единицы — нестандартные сборки. Важна именно форма распределения, а не максимальное разнообразие: парк, где все наборы уникальны и все экзотичны, так же неправдоподобен, как парк клонов.
Уникальные и стабильные групповые идентификаторы
Групповые ключи должны быть разными у разных профилей и неизменными у одного профиля. Это тот случай, когда небрежность особенно дорого стоит: человекочитаемая часть набора может выглядеть безупречно, а совпадающий групповой идентификатор склеит весь парк в один кластер. Проверять нужно именно эти поля, а не только количество устройств.
Согласованность со всей связкой
Медиасписок обязан рассказывать ту же историю, что user-agent, разрешение экрана, плотность пикселей, наличие сенсорного ввода и аппаратный отпечаток. Мобильный профиль с двумя камерами, но без сенсорного ввода и с настольным разрешением — противоречие, которое ловится одним сопоставлением. Согласованность всегда важнее изощрённости отдельного параметра.
Умеренная динамика во времени
Живой человек изредка подключает наушники, и набор устройств у него меняется. Это можно воспроизводить, но осторожно: изменения должны быть редкими, логичными и касаться небольшой доли профилей. Если набор меняется при каждом запуске, поведение выдаёт генератор, а не человека, — та же ошибка, что с плавающим графическим адаптером.
Чек-лист проверки за десять минут
- Снимите медиасписок с трёх-четырёх профилей и сравните: число устройств, число групп, типы.
- Убедитесь, что список не пустой ни у одного профиля из парка.
- Проверьте групповые идентификаторы на совпадение между профилями — они обязаны различаться.
- Сверьте класс набора с user-agent: мобильный профиль не должен отдавать настольную конфигурацию.
- Проверьте осмысленность группировки: устройства одного аппарата должны быть в одной группе.
- Повторите замер через сутки: у того же профиля набор обязан остаться прежним.
- Посчитайте, сколько уникальных сигнатур приходится на весь парк. Одна-две — маскировки нет.
Разбор кейса: ноль устройств на весь парк
Проект в региональной коммерческой тематике работал на приличном наборе инструментов: антидетект с закрытой графикой, резидентские адреса, аккуратное поведение, прогретые профили. Первый месяц дал движение вверх, затем рост остановился, и по внутренней аналитике стало видно, что часть визитов перестала влиять на картину: они приходили, вели себя нормально, но вес их явно падал.
Полный дамп окружения показал, что медиасписок пуст у всех профилей без исключения. Виртуальные машины разворачивались в дата-центре без звуковой подсистемы и без каких-либо видеоустройств, а инструмент этот параметр не трогал вовсе — просто потому, что в его настройках такого раздела не было. Получилась крайне заметная картина: сотни «разных людей», у каждого из которых ноль камер, ноль микрофонов и ноль выходов звука. При этом значительная часть профилей заявляла мобильные устройства, у которых камера есть конструктивно всегда.
Чинили в три приёма. Сначала добавили в окружение подстановку правдоподобных наборов под легенду каждого профиля, с уникальными групповыми идентификаторами. Затем раздали конфигурации по парку с перекосом в сторону массовых вариантов и небольшой долей профилей с гарнитурой. Наконец, внесли сверку медиасписка с user-agent в предстартовую проверку, чтобы профиль с противоречием просто не запускался. После этого падение веса визитов прекратилось, а динамика восстановилась за несколько недель. Вывод, который стоит запомнить: отсутствие данных — это тоже данные, и иногда самые громкие.
Частые ошибки
- Оставлять пустой список. Ноль устройств — редкое состояние у людей и обычное у серверов, поэтому оно выделяет, а не прячет.
- Подставлять всем один и тот же набор. Правдоподобная конфигурация с нулевым разбросом по парку становится идеальным ключом кластеризации.
- Забывать про групповые идентификаторы. Совпадающие групповые ключи склеивают профили даже при разном числе устройств.
- Игнорировать класс устройства. Настольный медианабор при мобильном user-agent ловится одним сопоставлением.
- Оставлять виртуальные драйверы. Программные камеры и микрофоны из серверных образов читаются в названиях как маркер автоматизации.
Частые вопросы
Правда ли, что список отдаётся без разрешения на камеру? Да. Без разрешения скрыты названия и идентификаторы устройств, но количество, типы и групповая структура доступны любой странице. Этого достаточно, чтобы определить класс машины и склеить профили между собой.
Не безопаснее ли просто заблокировать метод? Нет. Отсутствие стандартного интерфейса в современном браузере — ещё более заметная аномалия, чем пустой ответ. Скрипт видит не «нет устройств», а «браузер, которого не бывает», и это моментально переводит визит в подозрительные.
Сколько устройств считается нормой? Точного числа нет, и гнаться за ним не нужно. Ориентир такой: мобильный профиль — три элемента в одной группе, ноутбук — три-четыре в одной-двух группах. Важнее не количество, а внутренняя логика набора и его соответствие заявленному аппарату.
Решают ли задачу реальные устройства? Решают полностью: у физического телефона медиасписок настоящий, согласованный с аппаратом и естественно различающийся между экземплярами. Это ещё один аргумент за гибридную схему, где ядро объёма идёт с живого железа, а эмуляция добирает остальное. Подробности — в материале про фермы реальных устройств.
Вывод
Перечень медиаустройств — дешёвый для сайта и крайне информативный сигнал: без всяких разрешений он сообщает, сколько у машины камер, микрофонов и аудиовыходов и как они сгруппированы физически, а после выдачи доступа добавляет названия, в которых видны виртуальные драйверы серверных образов. Живая аудитория даёт по этому параметру широкий естественный разброс, потому что телефоны, ноутбуки, гарнитуры и внешние камеры складываются в десятки осмысленных комбинаций, а парк профилей чаще всего отдаёт либо пустой список, либо один шаблонный набор с одинаковыми групповыми идентификаторами — и то и другое склеивается в кластер простейшим запросом. Правильная работа строится от легенды профиля: под заявленный аппарат собирается осмысленный набор устройств, групповые ключи делаются уникальными и стабильными, конфигурации распределяются по парку в форме реальной популяции, а согласованность с user-agent, разрешением экрана и сенсорным вводом проверяется до старта, а не после потери позиций. И главное — не пытаться решить задачу обнулением: ноль камер и ноль микрофонов на сотне визитов говорит о происхождении трафика больше, чем любой самый подробный отпечаток.
Больше о поведенческом продвижении и других услугах — на главной странице ProfSEO24.
Закажите накрутку ПФ в ProfSEO24
Выводим сайты в ТОП-1 Яндекса за счёт поведенческих факторов на базе ИИ — без риска фильтров. Более 300 сайтов в ТОП-1, первые сдвиги по позициям за 3 дня. Рассчитаем стоимость под вашу нишу и регион.
Заказать накрутку ПФ Написать в TelegramКомментарии
Станислав Горюнов
Снял дамп с парка — пусто у всех до единого. Причём половина профилей заявляет телефоны, у которых камера вообще неотключаемая деталь корпуса. Стыдно, но полезно.
Admin
Это самая распространённая находка при первом дампе. Начинайте не с подмены, а с сортировки: разложите профили по легендам, и под каждую легенду соберите один осмысленный набор. Мобильные закрывайте в первую очередь — там противоречие самое грубое и ловится дешевле всего.
Вероника Мазур
Групповые идентификаторы — это открытие. Я думала, без разрешения вообще ничего не отдаётся, кроме количества. А оказывается, физическая сборка машины видна.
grey_node
Подставил всем профилям одинаковый набор камера плюс микрофон плюс выход. Читаю статью и понимаю, что сделал себе идеальный ключ для склейки. Иду переделывать.
Admin
Шаг в правильную сторону всё равно был сделан: пустой список хуже одинакового. Теперь добавьте два слоя — разные групповые идентификаторы на профиль и разные конфигурации по парку. Причём не поровну: массовых вариантов должно быть много, редких мало. Форма распределения важнее самого факта разнообразия.
Богдан Тищенко
Про виртуальные драйверы отдельное спасибо. В серверных образах их ставят автоматом, и название такого устройства читается как подпись под явкой с повинной.
Эльвира Насырова
Вопрос: а стоит ли имитировать подключение гарнитуры, чтобы набор иногда менялся? Или это лишний риск?
Admin
Имитировать можно, но не всем и не часто. Держите долю таких профилей небольшой и меняйте набор редко, между сессиями, а не внутри одной. Если набор устройств пляшет при каждом старте, вы получаете обратный эффект: вместо живости — признак генерации на лету. Базовая стабильность важнее красивой динамики.
Леонид Чумак
Мысль про то, что отсутствие данных — тоже данные, надо повесить над рабочим столом. Половина ошибок в этой сфере от веры, что молчание безопасно.
Диана Ковтун
Заметила, что у настоящего ноутбука камера и встроенный микрофон в одной группе, а гарнитура в своей. У моих профилей все устройства были в разных группах — то есть набор случайных драйверов, а не аппарат.
Матвей Рогачёв
А если заблокировать сам метод, чтобы он бросал ошибку? Сайт ничего не получит.
Admin
Получит, и очень многое. Скрипт увидит не отсутствие устройств, а браузер, в котором сломан стандартный интерфейс. Таких браузеров в природе не бывает, поэтому визит уходит в подозрительные мгновенно. Любая попытка спрятаться через поломку окружения хуже, чем честный правдоподобный ответ.
Пётр Валиулин
Проверка медиасписка на старте профиля — отличная идея. Добавил в свой запускатор: если класс набора не совпал с user-agent, профиль не поднимается. Поймал сразу четыре кривые связки.
Снежана Буркова
Интересно, что параметр читается вообще без взаимодействия с пользователем. Человек даже не поймёт, что у него спросили про камеру.
mobile_stack
Работаю на реальных телефонах, и тут проблемы нет вообще: набор настоящий, группы настоящие, разброс сам собой. Но на объёме дорого, поэтому часть трафика всё равно эмуляция, и вот её надо чинить.
Кирилл Овчинников
Сколько уникальных сигнатур должно быть на парк из ста профилей? Сто разных — это же тоже неестественно, судя по логике статьи.
Admin
Верно подмечено. Сигнатура набора — вещь массовая: миллионы людей сидят с одинаковой по структуре конфигурацией, и это нормально. Уникальность создают групповые идентификаторы, а не форма набора. То есть структур должно быть немного и они должны повторяться, а вот групповые ключи обязаны различаться у каждого профиля.
Ярослав Тимченко
Связка с сенсорным вводом и разрешением экрана — то, что я упускал. Две камеры при настольном разрешении и без тачскрина, конечно, ерунда. Пошёл сводить параметры между собой.
Милана Стрельцова
Обращалась в ProfSEO24 с проектом, который буксовал полгода. Понравилось, что сначала разобрали техническую часть и показали, где именно у профилей расходятся параметры, а уже потом говорили про объёмы и сроки. Без обещаний чудес, зато по делу.