Эмуляция устройства: сенсорные события, метрики экрана и мобильная идентичность
Как BotBrowser обеспечивает согласованные сигналы устройства для мобильных, планшетных и десктопных идентичностей на основе профилей, снятых с реальных устройств.
Введение
Браузер раскрывает десятки сигналов о устройстве, на котором он запущен: размеры экрана, device pixel ratio, поддержка сенсора, память устройства, характеристики GPU, режимы ввода и т.д. Эти сигналы вместе формируют полное описание физического оборудования. У Pixel 7 есть определённые размеры экрана, конкретный DPR, число сенсорных точек, GPU и объём памяти. Когда сигналы согласованы, браузер выглядит как реальное устройство; когда нет — рассогласования заметны.
BotBrowser загружает профили устройств, снятые с реального железа. Когда мобильный профиль загружается на настольной машине, все сигналы устройства согласованно обновляются, потому что они берутся из одного источника. Нет смешения, нет ручной настройки по отдельным свойствам и нет риска конфликтующих сигналов.
Влияние на приватность: почему сигналы устройства важны
Эмуляция устройства важна не только для вида мобильного или десктопного браузера.
Системы трекинга используют сигналы устройства как часть отпечатка. Комбинация разрешения экрана, DPR, поддержки сенсора, navigator.deviceMemory, WebGL renderer и числа ядер CPU формирует отпечаток на уровне устройства, который может сохраняться между сессиями. Управление этими сигналами критично для поддержания согласованной идентичности браузера и для исследования того, как системы трекинга используют характеристики устройства.
E‑commerce и контент‑платформы адаптируют опыт в зависимости от обнаруженного устройства. Мобильные пользователи могут видеть иные цены, макеты и контент. Исследователям приватности нужна точная эмуляция устройства для надёжного анализа таких практик.
В управлении множеством аккаунтов разнообразие устройств тоже важно. Если все идентичности демонстрируют один и тот же модель устройства и точные размеры экрана, это выглядит подозрительно. Использование нескольких профилей устройств и чередование мобильных и десктопных, разных экранов и DPR создаёт естественную вариативность.
Технический фон
Сигналы устройства в браузере
Браузер раскрывает характеристики устройства через несколько API:
Размеры экрана: screen.width, screen.height, screen.availWidth, screen.availHeight сообщают физические размеры. window.innerWidth и window.innerHeight — viewport. window.outerWidth и window.outerHeight включают chrome браузера.
Device Pixel Ratio: window.devicePixelRatio сообщает соотношение CSS‑пикселей к физическим. Десктоп‑мониторы обычно 1.0 или 1.25; мобильные устройства 2.0–3.5 и выше; Retina‑MacBook — 2.0.
Поддержка сенсора: navigator.maxTouchPoints — макс. число одновременных точек (0 на десктопе, 5–10 на мобильных). Наличие ontouchstart на window указывает на поддержку. CSS media queries (pointer: coarse) и (hover: none) разделяют сенсорный ввод и ввод указателем.
Память устройства: navigator.deviceMemory сообщает приблизительный объём ГБ. Мобильные: 4–8 GB, десктопы: 8–16 GB.
Аппаратная параллельность: navigator.hardwareConcurrency — число доступных ядер CPU. Мобильные: 4–8; десктопы: 4–16+.
Информация о соединении: navigator.connection предоставляет тип сети, effectiveType, пропускную способность и RTT. Мобильные часто сообщают другие сетевые характеристики.
GPU: строка renderer WebGL идентифицирует GPU. Мобильные GPU (Adreno, Mali, PowerVR, Apple GPU) сильно отличаются от десктопных (NVIDIA, AMD, Intel).
Требования согласованности сигналов
Сигналы должны быть внутренне согласованы. Если браузер сообщает maxTouchPoints: 10, но при этом (pointer: fine) и (hover: hover), это противоречие; если ширина экрана 412px при 16 GB памяти и NVIDIA GPU — смешение мобильных и десктопных характеристик, что указывает на фальсификацию.
Распространённые методы и их ограничения
Эмуляция устройств через Chrome DevTools
Chrome DevTools Protocol предоставляет Emulation.setDeviceMetricsOverride для установки размеров viewport, DPR и поддержки сенсора. Playwright и Puppeteer оборачивают эту возможность в свои API эмуляции устройств.
Ограничения:
- Не изменяет
navigator.platformили другие данные User‑Agent без явной установки - Строка renderer WebGL по‑прежнему сообщает десктопный GPU
navigator.deviceMemoryиnavigator.hardwareConcurrencyостаются десктопными- Эмуляция сенсора поверхностна, не на уровне движка
- Доступность шрифтов остаётся десктопной
- Media‑queries могут не полностью соответствовать эмулируемому устройству
Ручное переопределение свойств
Свойства можно переопределить инъекцией JavaScript:
Object.defineProperty(navigator, 'maxTouchPoints', { get: () => 10 });
Object.defineProperty(navigator, 'deviceMemory', { get: () => 4 });
Это меняет значения, видимые в JavaScript, но не поведение браузера. CSS media queries, рендер‑пайплайн и HTTP‑хедеры не затрагиваются такими переопределениями.
Только viewport
Установка мобильного размера viewport (например, 412x915) через фреймворк автоматизации меняет layout, но не остальные сигналы. Браузер по‑прежнему будет сообщать десктопные размеры экрана, десктопный DPR, 0 сенсорных точек и десктопные строки GPU.
Подход BotBrowser
Профили BotBrowser получены с реального железа, поэтому все сигналы исходят из единого источника. Независимо от системы, на которой они загружены, сигналы применяются на уровне движка, что гарантирует внутреннюю согласованность.
Идентичность устройства на основе профиля
Каждый профиль содержит снимок характеристик устройства:
- Размеры экрана (width, height, availWidth, availHeight)
- Device pixel ratio
- Поддержка сенсора (maxTouchPoints, поддержка сенсорных событий)
- Память устройства
- Аппаратная параллельность
- Строки vendor и renderer GPU
- Свойства
navigator, специфичные для платформы - Размеры chrome окна (для вычисления outer)
Эти сигналы применяются как единое целое, а не по отдельности, что исключает риск конфликтов.
Поддержка сенсора на уровне движка
При загрузке мобильного профиля поддержка сенсора включается в движке Chromium, а не через JavaScript‑инъекции:
navigator.maxTouchPointsвернёт реальное значение устройстваontouchstartбудет нативно доступен на объекте window- CSS media queries
(pointer: coarse)и(hover: none)будут корректно вычислены в движке стилей - Конструкция событий сенсора и их свойства поведут себя как на реальном устройстве
- API
InputDeviceCapabilitiesкорректно отразит сенсорные возможности
Профили desktop, mobile и tablet
BotBrowser поддерживает профили для всех категорий устройств:
Десктоп‑профили: большие экраны (1920x1080, 2560x1440), DPR 1.0–2.0, 0 сенсорных точек, тонкий указатель, десктопный GPU, 8–16 GB памяти.
Мобильные профили: маленькие экраны (412x915, 390x844), DPR 2.0–3.5, поддержка сенсора 5–10 точек, грубый указатель, мобильные GPU, 4–8 GB памяти.
Планшетные профили: средние экраны (1024x1366, 820x1180), DPR 2.0, поддержка сенсора и иногда тонкий указатель, мобильный или интегрированный GPU.
Конфигурация окна и экрана
BotBrowser предоставляет детальный контроль над окнами и экраном через флаги CLI:
# Использовать размеры профиля (по умолчанию в headless)
--bot-config-window=profile
--bot-config-screen=profile
# Указать размеры
--bot-config-window=1920x1080
--bot-config-screen=2560x1440
# Полный JSON для кастомизации
--bot-config-window='{"innerWidth":1920,"innerHeight":1080,"devicePixelRatio":2}'
Конфигурация и использование
Мобильный профиль
chrome --bot-profile="/profiles/pixel7-chrome-130.enc" \
--user-data-dir="$(mktemp -d)"
Интеграция с Playwright
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/profiles/pixel7-chrome-130.enc',
],
headless: true,
});
// Важно: не задавать viewport — позволить профилю управлять им
const context = await browser.newContext();
const page = await context.newPage();
const metrics = await page.evaluate(() => ({
screenWidth: screen.width,
screenHeight: screen.height,
innerWidth: window.innerWidth,
innerHeight: window.innerHeight,
dpr: devicePixelRatio,
touchPoints: navigator.maxTouchPoints,
touchStart: 'ontouchstart' in window,
pointer: matchMedia('(pointer: coarse)').matches ? 'coarse' : 'fine',
hover: matchMedia('(hover: none)').matches ? 'none' : 'hover',
memory: navigator.deviceMemory,
cores: navigator.hardwareConcurrency,
}));
console.log('Device metrics:', metrics);
await browser.close();
})();
Puppeteer с десктоп‑профилем
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/profiles/win11-desktop-1080p.enc',
],
headless: true,
defaultViewport: null, // Пусть профиль управляет viewport
});
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();
Настроить только размер окна
# Переопределить только размер окна, сохранив остальные сигналы профиля
chrome --bot-profile="/profiles/win11-chrome-130.enc" \
--bot-config-window=1440x900 \
--bot-config-screen=1920x1080
Верификация
Проверьте эмуляцию, проверив полный набор сигналов устройства:
const page = await context.newPage();
await page.goto('https://example.com');
const deviceCheck = await page.evaluate(() => ({
// Экран
screen: {
width: screen.width,
height: screen.height,
availWidth: screen.availWidth,
availHeight: screen.availHeight,
},
// Окно
window: {
innerWidth: window.innerWidth,
innerHeight: window.innerHeight,
outerWidth: window.outerWidth,
outerHeight: window.outerHeight,
dpr: window.devicePixelRatio,
},
// Сенсор
touch: {
maxTouchPoints: navigator.maxTouchPoints,
ontouchstart: 'ontouchstart' in window,
pointerCoarse: matchMedia('(pointer: coarse)').matches,
hoverNone: matchMedia('(hover: none)').matches,
},
// Аппарат
hardware: {
deviceMemory: navigator.deviceMemory,
hardwareConcurrency: navigator.hardwareConcurrency,
},
}));
console.log('Device verification:', JSON.stringify(deviceCheck, null, 2));
Лучшие практики
- В Playwright и Puppeteer всегда используйте
defaultViewport: null. Позвольте профилю контролировать размеры viewport. Параметры фреймворка переопределят значения профиля и нарушат согласованность. - Выбирайте профиль, подходящий задаче. Для общей автоматизации используйте распространённые модели устройств; для мобильных тестов — популярные мобильные профили.
- Не смешивайте ручные переопределения с профилями. Пусть профиль контролирует полную идентичность. Ручные переопределения (например, установка пользовательского viewport поверх мобильного профиля) могут привести к несоответствиям.
- Проверяйте все категории сигналов. Проверяйте экран, сенсор, аппарат и сигналы GPU в совокупности, а не по отдельности.
- Используйте
--bot-config-windowи--bot-config-screenдля контролируемых overwrite. При необходимости конкретных размеров настраивайте эти флаги и сохраняйте согласованность остальных сигналов. - Сопоставляйте профиль с кейсом. Для e‑commerce тестов используйте профили потребительских телефонов; для корпоративных — десктоп‑профили с типичными мониторами.
Частые вопросы
Генерирует ли BotBrowser реальные сенсорные события?
Да. BotBrowser включает поддержку сенсора на уровне движка, поэтому maxTouchPoints, ontouchstart и media queries сообщают верные значения. Для генерации последовательностей сенсорных действий (tap, swipe, pinch) используйте API ввода фреймворка (например, page.touchscreen.tap() в Playwright).
Что произойдёт, если я задам viewport в Playwright при использовании мобильного профиля?
Установка viewport через Playwright или Puppeteer перезапишет размеры окна профиля, что может привести к рассогласованию между innerWidth/innerHeight (определяемыми фреймворком) и screen.width/screen.height (определяемыми профилем). Используйте defaultViewport: null, чтобы избежать этого.
Могу ли я настроить размер экрана, сохранив остальные сигналы?
Да. Используйте --bot-config-window и --bot-config-screen для переопределения размеров отображения при сохранении остальных сигналов профиля.
Как devicePixelRatio влияет на скриншоты?
Реальный размер в пикселях скриншота — width * devicePixelRatio × height * devicePixelRatio. Например, мобильный viewport шириной 412px с DPR 2.625 даст скриншот примерно 1081 пиксель в ширину.
Поддерживают ли планшетные профили сенсор?
Да. Планшетные профили обычно включают поддержку сенсора (maxTouchPoints: 10) и соответствующие DPR/размеры.
Могу ли я использовать разные профили устройств в одном браузере?
Характеристики устройства устанавливаются на уровне инстанса браузера через профиль. Контексты внутри одного браузера наследуют сигналы устройства. Для разных идентичностей запускайте отдельные инстансы браузера с разными профилями.
Какие строки GPU сообщают мобильные профили?
Мобильные профили сообщают GPU исходного устройства, например "Adreno (TM) 730", "Mali-G710" или "Apple GPU".
Резюме
Эмуляция устройства BotBrowser применяет профили, снятые с реального железа, чтобы предоставить полную и согласованную идентичность устройства: экран, поддержка сенсора, GPU и память происходят из одного источника, устраняя необходимость фрагментированных ручных настроек.
Сопутствующие материалы: Android Emulation, Screen and Window Fingerprinting, Cross-Platform Profiles.
title: "Эмуляция устройств: сенсорные события, метрики экрана и мобильная идентификация" description: "Как BotBrowser обеспечивает полную эмуляцию устройств через конфигурацию на основе профилей для мобильных, планшетных и десктопных идентификаций." date: "2026-01-28" locale: ru category: platform tags: ["device", "emulation", "touch", "mobile", "platform"] published: true
Обзор
BotBrowser загружает полные профили устройств, захваченные с реального оборудования. При загрузке мобильного профиля все сигналы устройства обновляются согласованно: сенсорные API, размеры экрана, соотношение пикселей устройства, память и тип соединения.
Что контролирует BotBrowser
Сенсорные возможности. Мобильные профили включают navigator.maxTouchPoints, ontouchstart и CSS media queries (pointer: coarse) и (hover: none) на уровне движка.
Экран и viewport. Профили содержат точные значения screen.width, screen.height и devicePixelRatio от реальных устройств.
Память устройства и соединение. Значения navigator.deviceMemory и navigator.connection соответствуют классу исходного устройства.
Десктопные, мобильные и планшетные профили
Десктопные профили сообщают ноль точек касания, точный указатель и большие экраны. Мобильные профили представляют поддержку касаний, грубый указатель и экраны мобильного размера. Профили планшетов занимают промежуточное положение.
Интеграция с Playwright
const { chromium } = require('playwright-core');
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/profiles/pixel7-chrome-122.enc',
],
headless: true,
defaultViewport: null, // Профиль управляет viewport
});
const page = await (await browser.newContext()).newPage();
const metrics = await page.evaluate(() => ({
screenWidth: window.screen.width,
screenHeight: window.screen.height,
dpr: window.devicePixelRatio,
touchPoints: navigator.maxTouchPoints,
}));
console.log('Device metrics:', metrics);
Ключевые моменты
- Профили устройств захвачены с реального оборудования для полной согласованности
- Поддержка касаний контролируется на уровне движка, а не через полифиллы JavaScript
- Используйте
defaultViewport: nullв Playwright/Puppeteer, чтобы профиль управлял свойствами дисплея - Все сигналы остаются внутренне согласованными, поскольку получены с одного исходного устройства
Начало работы
- Скачайте BotBrowser с GitHub
- Выберите профиль устройства из репозитория профилей
- Запустите с
--bot-profileи проверьте метрики устройства