[Перевод] Обнаружение бездействующих пользователей с помощью API Idle Detection

Статья, перевод которой мы сегодня публикуем, посвящена новому API Idle Detection. Этот API уведомляет разработчиков при бездействии пользователя, указывая на то, что пользователь не работает с клавиатурой, мышью, экраном. API сообщает об активации хранителя экрана, о блокировке экрана, о переходе пользователя на другой экран. Разработчик при этом может настроить пороговые уровни показателей активности пользователя, достижение которых вызывает срабатывание API.

em-qsjct1bozp24cggetezzy4oc.jpeg

Рекомендованные способы использования API Idle Detection


Вот примеры проектов, в которых может быть использован новый API:

  • Приложения-чаты или сайты социальных сетей могут использовать этот API для того чтобы сообщать пользователям о том, доступны ли в настоящее время те, с кем они общаются.
  • Общедоступные приложения, работающие на информационных стендах, например — в музеях, могут воспользоваться этим API для перехода на «домашний» экран в ситуации, когда с информационным стендом никто не работает.
  • Приложения, которые выполняют ресурсоёмкие вычисления, например — выводящие некие диаграммы, могут ограничить вычисления в то время, когда пользователь не взаимодействует с устройством.


Текущий ход работ


Использование API Idle Detection


▍Включение через флаги Chrome


Для того чтобы поэкспериментировать с API Idle Detection, обойдясь при этом без токена Origin Trial, нужно включить флаг #experimental-web-platform-features в chrome://flags.

▍Включение поддержки во время действия программы Origin Trial


API Idle Detection доступен в Chrome 84 по схеме Origin Trial. Ожидается, что эта фаза завершится с выходом Chrome 87.

Программа Origin Trial позволяет разработчикам пользоваться новыми возможностями Chrome и делиться с веб-сообществом отзывами об удобстве, практичности и эффективности этих возможностей. Здесь можно найти подробности об этой программе. Подписаться на участие в программе можно на странице регистрации.

▍Регистрация в программе Origin Trial


  1. Запросите токен для интересующей вас возможности.
  2. Добавьте токен на страницы экспериментального проекта. Существует 2 способа это сделать:
    • Добавьте -тег origin-trial в заголовок каждой страницы. Например, это может выглядеть так: .
    • Если у вас есть доступ к настройкам сервера — может добавить токен с использованием HTTP-заголовка Origin-Trial. В результате в заголовке ответа должно появиться нечто, подобное следующему: Origin-Trial: TOKEN_GOES_HERE.


▍Проверка возможности использования API


Для проверки поддержки API Idle Detection можете воспользоваться следующим кодом:

if ('IdleDetector' in window) {
  // API Idle Detector поддерживается
}


Концепции, лежащие в основе API Idle Detection


API исходит из предположения о наличии некоего уровня взаимодействия между пользователем, пользовательским агентом (речь идёт о браузере) и операционной системой используемого устройства. Это взаимодействие оценивается с точки зрения двух показателей:

  • Состояние пользователя: active или idle. Соответствующее значение зависит от того, взаимодействовал ли пользователь с браузером в течение некоего периода времени.
  • Состояние экрана: locked или unlocked. Это значение зависит от имеющихся в системе средств блокировки экрана (вроде хранителя экрана), которые не дают пользователю взаимодействовать с браузером.


Различение состояний active и idle требует использования эвристических алгоритмов, которые могут различаться для разных пользователей, браузеров, операционных систем. Кроме того, в работе API должно применяться некое рационально обусловленное пороговое значение (мы поговорим об этом ниже, в разделе, посвящённом безопасности и разрешениям).

Модель намеренно не стремится к формальному различению видов взаимодействия пользователя с конкретным содержимым (то есть, с веб-страницей, использующей этот API, открытой во вкладке), с браузером в целом, с операционной системой. За это отвечает браузер.

Использование API Idle Detection


Первый шаг при работе с API Idle Detection заключается в проверке того, имеется ли у страницы разрешение notifications. Если такого разрешения нет — его нужно запросить у пользователя.

// Проверка наличия разрешения notifications.
const hasPermission = await navigator.permissions.query({name: 'notifications'});
if (hasPermission.state !== 'granted') {
  // Сначала нужно запросить разрешение.
  return console.log('Notifications permission not granted.');
}


Второй шаг заключается в создании экземпляра IdleDetector. Минимальное значение параметра threshold, задающего пороговое значение времени бездействия пользователя, равняется 60000 мс (1 минута). Запустить систему обнаружения бездействия пользователя можно, вызвав метод start() объекта IdleDetector. Этот метод принимает объект с параметрами, в котором содержится значение threshold в миллисекундах и необязательное значение signal (объект AbortSignal), позволяющее отключить наблюдение за активностью пользователя.

try {
  const controller = new AbortController();
  const signal = controller.signal;

  const idleDetector = new IdleDetector();
  idleDetector.addEventListener('change', () => {
    const userState = idleDetector.userState;
    const screenState = idleDetector.screenState;
    console.log(`Idle change: ${userState}, ${screenState}.`);
  });
  
  await idleDetector.start({
    threshold: 60000,
    signal,
  });
  console.log('IdleDetector is active.');
} catch (err) {
  // Обработка ошибок инициализации, вроде отсутствия разрешения,
  // выполнения за пределами фрейма верхнего уровня и других.
  console.error(err.name, err.message);
}


Отключить обнаружение неактивности пользователя можно, вызвав метод abort () объекта AbortController.

controller.abort();
console.log('IdleDetector is stopped.');


Пример


Увидеть API Idle Detection в действии можно, взглянув на демонстрационный пример Ephemeral Canvas. Здесь пользователь может нарисовать что-нибудь на странице. Страница очищается после того, как не было зафиксировано активности пользователя в течение 60 секунд. Такое приложение, например, могло бы быть запущено на терминале в универмаге. Оно могло бы быть предназначено для того, чтобы чем-то занять детей, позволив им порисовать на экране всякие закорючки.

2e7fc55416d57d8e4ace155e77c94c0d.png


Демонстрация использования API Idle Detection

Полифилл


Некоторые компоненты API Idle Detection могут быть заменены полифиллами и библиотеками для обнаружения бездействия пользователя, вроде idle.ts, но эти подходы ограничены рамками веб-проектов, которые их реализуют. Например, подобная библиотека, используемая в веб-приложении, нуждается в выполнении затратных операций по наблюдению за событиями ввода или по отслеживанию изменения видимости страницы. Возможности библиотек сильно ограничены ещё и тем, что они не в состоянии узнать о том, когда пользователь ничего не делает за пределами страниц, использующих эти библиотеки. Например — тогда, когда пользователь находится на другой вкладке браузера, или тогда, когда он попросту вышел из своей учётной записи на компьютере.

Безопасность и разрешения


Команда разработчиков Chrome спроектировала и реализовала API Idle Detection, ориентируясь на базовые принципы, определённые в этом документе. Сюда входят принципы, дающие пользователю возможность управлять возможностями браузеров, а также принципы, обеспечивающие прозрачность и эргономичность технологий. Возможность использования данного API контролируется разрешением notifications. Приложение, для того чтобы оно могло бы пользоваться этим API, должно выполняться в контексте безопасности верхнего уровня. Мы использовали именно это разрешение из-за того, что оно соответствует известным нам нуждам пользователей, но мы готовы, в будущем, это расширить. Если это не соответствует вашему сценарию использования данного API — ждём ваших отзывов.

Конфиденциальность и средства, позволяющие пользователю управлять API Idle Detection


Мы всегда стремимся к тому, чтобы не позволить злоумышленникам пользоваться возможностями новых API в их целях. Например, веб-сайты, с виду независимые, могут контролироваться одним лицом, получая сведения о бездействии пользователя и сопоставляя собранные данные для идентификации уникальных пользователей на разных сайтах. Для того чтобы помешать подобным атакам, API Idle Detection ограничивает детализацию событий, связанных с обнаружением бездействия пользователя. Кроме того, на уровне пользовательского агента, данные, выдаваемые этим API, могут быть особым образом обработаны. Например, мы планируем сделать это в Chrome для того чтобы помешать выполнению соответствующих атак. Кроме того, в ходе анализа угроз мы решили ограничить возможность применения данного API с помощью разрешения notifications. Благодаря этому на пути злоумышленников возведены достаточно высокие барьеры, которые способны помешать им в использовании основных возможностей API. Речь идёт об отправке уведомлений и о выявлении бездействия пользователя.

Обратная связь


Команда разработчиков Chrome будет рада узнать о вашем опыте использования API Idle Detection.

▍Поделитесь с нами своими идеями об устройстве API


Есть ли в этом API что-то такое, что работает не так, как ожидается? Может, в нём не хватает чего-то такого, что нужно вам для реализации вашей идеи? Откройте новую задачу в трекере проекта или прокомментируйте существующую задачу.

▍Сообщите о проблеме с реализацией


Нашли ошибку в реализации Chrome? А может, оказалось, что реализация отличается от спецификации? Сделайте запись об ошибке на new.crbug.com. Постарайтесь включить как можно больше деталей в своё сообщение, добавьте в него простую инструкцию о том, как воспроизвести ошибку, и укажите, что проблема имеет отношение к Blink>Input. Для демонстрации ошибок очень хорошо подходит Glitch.

▍Поддержите нас


Планируете пользоваться API Idle Detection? Если так — расскажите об этом. Такие рассказы помогают команде разработчиков Chrome расставлять приоритеты. Эти рассказы показывают создателям других браузеров важность поддержки новых возможностей. Если хотите — поделитесь своими планами использования нового API здесь, или отправьте твит @ChromiumDev с тегом #idledetection и расскажите нам о том, где и как вы пользуетесь новым API Idle Detection.

Планируете ли вы пользоваться API Idle Detection?

guabcgmwuqoopx1ar80sjpz6keq.png

de0yl-6ppopvisr_a80b4yuhjj8.png

© Habrahabr.ru