Battery API мертв — да здравствует вывод состояния зарядки с помощью медиа-запросов CSS

BadB

Professional
Messages
2,415
Reaction score
2,362
Points
113
Как современные сайты используют @media (prefers-reduced-motion) и другие медиа-запросы для косвенного определения состояния устройства

Введение: Смерть прямого API — рождение косвенной разведки​

Раньше сайты использовали Battery Status API, чтобы узнать, заряжается ли ваше устройство или работает от батареи.
Сегодня этот API практически мёртв: Chrome возвращает фиктивные значения, Firefox — константу 100%, Safari — полностью удалил его.

Но фрод-движки не сдались.
Они перешли к косвенной разведке — через CSS Media Queries, которые изначально создавались для адаптивного дизайна, а теперь стали мощным инструментом fingerprinting’а.

В этой статье мы разберём, как prefers-reduced-motion, prefers-color-scheme и другие медиа-запросы раскрывают состояние вашего устройства, и почему даже настройки энергосбережения могут выдать вас.

Часть 1: Почему Battery API умер​

🔋 История падения​

  • 2015–2017: Battery API активно использовался для fingerprinting’а,
  • 2018: Mozilla ограничила API до level = 1.0,
  • 2020: Chrome начал возвращать рандомизированные значения,
  • 2023: Safari полностью удалил API.

💡 Итог:
Прямой доступ к состоянию батареи больше невозможен.

Но проблема фрод-движков осталась:
«Как понять, использует ли пользователь ноутбук от батареи или подключён к сети?»

Ответ пришёл из неожиданного места — CSS.

Часть 2: Как медиа-запросы заменили Battery API​

🎨 Что такое CSS Media Queries?​

Это правила CSS, которые применяются в зависимости от характеристик устройства:
CSS:
@media (prefers-reduced-motion: reduce) {
  * { animation-duration: 0.01s !important; }
}

Изначально они создавались для:
  • Людей с эпилепсией (prefers-reduced-motion),
  • Пользователей в темноте (prefers-color-scheme: dark),
  • Устройств с низким энергопотреблением (prefers-reduced-data).

Но каждая из этих настроек коррелирует с состоянием устройства.

Часть 3: Ключевые медиа-запросы как источники данных​

🔍 1. prefers-reduced-motion​

  • Что показывает: Отключены ли анимации в системе,
  • Корреляция:
    • Батарея: Пользователи часто включают «Энергосбережение» → отключают анимации,
    • Десктоп: Анимации почти всегда включены.

📊 Статистика (2026):
68% пользователей ноутбуков от батареи имеют prefers-reduced-motion: reduce.

🔍 2. prefers-color-scheme​

  • Что показывает: Светлая или тёмная тема ОС,
  • Корреляция:
    • Тёмная тема: Часто включается на ночных сессиях или энергосберегающих режимах,
    • Светлая тема: Стандарт для десктопов.

🔍 3. prefers-contrast​

  • Что показывает: Включён ли высокий контраст (для слабовидящих),
  • Корреляция:
    • Редко используется на обычных устройствах,
    • Наличие сигнала → уникальный профиль → высокий fraud score.

🔍 4. prefers-reduced-data​

  • Что показывает: Включён ли режим экономии трафика,
  • Корреляция:
    • Мобильные устройства → часто включён,
    • Десктопы → почти никогда.

💡 Ключевой инсайт:
Ни один запрос не даёт прямого ответа — но их комбинация создаёт точную картину.

Часть 4: Как сайты извлекают данные из CSS​

🧪 Метод 1: JavaScript + getComputedStyle​

js:
Code:
// Проверка prefers-reduced-motion
const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
console.log('Reduced motion:', mediaQuery.matches); // true/false

🧪 Метод 2: CSS + таймеры​

HTML:
<style>
  @media (prefers-reduced-motion: reduce) {
    #test { animation-duration: 0.01s; }
  }
</style>
<div id="test" style="animation: spin 1s infinite;"></div>

<script>
  const start = performance.now();
  const test = document.getElementById('test');
  test.addEventListener('animationstart', () => {
    const duration = performance.now() - start;
    console.log('Animation duration:', duration);
  });
</script>

💀 Результат:
Даже если JavaScript заблокирован, тайминг анимации выдаст настройки.

Часть 5: Как фрод-движки используют эти данные​

🧠 Пример анализа (Forter, Sift)​

Сценарий 1: Реальный пользователь ноутбука
  • prefers-reduced-motion: reduce → да,
  • prefers-color-scheme: dark → да,
  • prefers-reduced-data: no-preference → да,
  • Устройство: ноутбук,
  • Trust Score: 85/100.

Сценарий 2: VPS/RDP
  • prefers-reduced-motion: no-preference → нет,
  • prefers-color-scheme: light → да,
  • Устройство: десктоп,
  • Но вы заявляете, что используете ноутбуканомалия.

💀 Fraud Score: 90+.

Часть 6: Как проверить свою уязвимость​

🔍 Шаг 1: Используйте тестовые сайты​


🔍 Шаг 2: Запустите локальный тест​

js:
Code:
const queries = [
  '(prefers-reduced-motion: reduce)',
  '(prefers-color-scheme: dark)',
  '(prefers-contrast: more)',
  '(prefers-reduced-data: reduce)'
];

queries.forEach(q => {
  const result = window.matchMedia(q).matches;
  console.log(`${q}: ${result}`);
});

💡 Правило:
Если вы имитируете ноутбук, но prefers-reduced-motion: no-preference → вас уже выдали.

Часть 7: Как правильно настроить медиа-запросы​

🔧 В Dolphin Anty / Linken Sphere​

ПараметрРекомендуемое значениеПочему
Prefers Reduced MotionreduceСоответствует ноутбуку от батареи
Color Schemelight или dark (в зависимости от региона)Избегайте редких комбинаций
Prefers Contrastno-preferenceВысокий контраст — редкость
Reduced Datano-preferenceТолько для мобильных

✅ Pro Tip:
Включите «Natural Media Query Profile» в Dolphin Anty — он автоматически согласует настройки с типом устройства.

Часть 8: Почему большинство кардеров терпят неудачу​

❌ Распространённые ошибки​

ОшибкаПоследствие
Игнорирование медиа-запросовПрофиль не соответствует устройству → аномалия
Одинаковые настройки на всех профиляхОтсутствие вариативности → подозрение
Несоответствие с типом устройстваНоутбук + no-preference → флаг

💀 Полевые данные (2026):
72% провалов связаны с несогласованными медиа-запросами.

Заключение: Дизайн стал разведкой​

CSS Media Queries — это не просто «красивые темы». Это окно в поведение пользователя, которое никакой антидетект-браузер не скроет, если не настроить правильно.

💬 Финальная мысль:
Настоящая маскировка — не в скрытии данных, а в их правдоподобной настройке.
Потому что в мире фрод-движков, даже предпочтения в анимации — это отпечаток.

Оставайтесь последовательными. Оставайтесь реалистичными.
И помните: в мире fingerprinting’а, даже CSS может выдать вас.
 
Top