Сделай Сам. Шпионаж За Посетителями

Задача Иногда у владельцев сервисов, менеджеров проектов и SEO-специалистов возникает желание подсмотреть за пользователем, как он нажимает кнопки и о что ударяется лбом.

Бывает, что такое желание подглядывать позволяет выявить проблемы интерфейса, которые могут косвенно повлиять на эффективность сервиса и даже на прибыль.

Я знаю несколько способов решения этой проблемы:

  1. набрать группу испытуемых для юзабилити-тестирования;
  2. интегрировать на сайт сторонний сервис, фиксирующий действия пользователей;
  3. напишите свое решение.

Группа тестирования Это вполне себе вариант, который тем не менее требует решения ряда вопросов:
  1. требуется тщательно подбирать состав команды тестирования, чтобы в нее входило как можно больше пользователей разных возрастных групп (разумеется, из целевой аудитории), разной квалификации и опыта использования.

    При этом имеет значение и размер команды — большее количество позволит получить больше данных для анализа, но и будет стоить дороже;

  2. необходимо оборудовать место для проведения исследований.

    Как минимум офисное помещение, компьютерное оборудование, средства аудио- и видеозаписи;

  3. необходимо отвлекать сотрудников от основного процесса или привлекать дополнительных для организации процесса и анализа результатов.

Даже успешное решение вышеперечисленных вопросов не гарантирует более или менее надежного результата, а затраты на организацию процесса уже пугают. Кроме того, есть риск потерять крайние случаи, которые не так уж и редки при использовании в бою.

Возможно, не в этот раз.

Сторонняя служба аналитики Большинство сервисов предлагают тепловые карты кликов и состояний прокрутки, что позволяет более или менее достоверно определить, что пользователи видели на сайте и на что обратили внимание.

Некоторые предлагают анализ форм, регистрацию ключей, а также отслеживание распределения и копирования, что также может помочь отслеживать сложные шаблоны взаимодействия человека и машины.

Навскидку нашел пару сервисов:

  1. Вебвизор от Яндекса;
  2. ХотДжар.

При отсутствии экономически обоснованной цели берем ВебВизор.

Сервис обещал запомнить и воспроизвести для нас всю сессию пользователя, т.е.

повторить поведение пользователя на ресурсе от начала до конца.

Первоначальное интегрирование тривиально; вам просто нужно добавить код на страницы.

Стоит сразу отметить, что запросы, заведомо разрушительные для состояния сессии (т. е.

все, кроме GET), игнорируются.

Есть две версии.

Принцип их работы примерно одинаковый.

Сначала мы получаем параметры аутентификации пользователя и передаем их на сервер, который загружает текущую страницу и сохраняет ее.

На стороне клиента он собирает действия пользователя: движения мыши, клики, ввод данных и т.д. Реализованный код транслирует действия на сервер с меткой времени (дельта от начала или дата/время, я не выяснил).

Позже вы сможете перейти на страницу пользовательских сессий в сервисе Яндекс.

Метрики и воспроизвести действия пользователя.

Вроде бы все хорошо, но есть ряд проблем.

Версия первая:

  1. неправильно преобразует события кликов в сложный настраиваемый интерфейс.

    В конкретном случае нажатие на значок «крестик» модального окна не закрывает это модальное окно;

  2. любые действия, приводящие к AJAX-запросам, за исключением GET, нарушаются и поведение интерфейса воспроизводится некорректно, что опять же не дает понимания того, что увидел пользователь;
  3. случайным образом теряет действия пользователя.

Вторая версия находится в стадии бета-тестирования и содержит те же недостатки, плюс иногда, как и приличная бета-версия, вообще не работает. До HotJar не дошли руки.

Если у вас есть опыт интеграции со SPA, поделитесь, но у меня подозрение, что и там будут такие же страдания.

Пытаюсь собрать свое решение И тогда мы постепенно приближаемся к моменту «о, дай мне попробовать!» Что необходимо реализовать:

  1. получение начального состояния страницы.

    Не терять пользовательский контекст (у разных пользователей страница может существенно отличаться);

  2. отслеживание размера оконного объекта;
  3. Отслеживание прокрутки элементов страницы, в том числе самого документа;
  4. регистрация активности пользователей.

    Контролируйте движения мыши, клики и ввод данных в поля формы;

  5. компактный протокол обмена серверами.

Сбор аналитики следует рассматривать для двух вариантов качества сетевого соединения – для низкоскоростного нестабильного канала и для более благоприятных случаев.



Начальное состояние

Исходное состояние можно получить двумя способами:
  1. возьмите HTML и стили из события window.load. Это создаст нагрузку на сеть, поэтому при плохом качестве сети придется отказаться от этого варианта;
  2. запросить страницу на стороне сервера.

    Пользовательский контекст должен быть передан.

    Вы можете украсть файл cookie неявно или попросить явно передать URL-адрес и параметры авторизации при инициализации библиотеки.

В обоих случаях необходимо отключить все скрипты с сохраненной страницы, так как реакцию интерфейса на действия пользователя мы будем производить самостоятельно, используя записи действий пользователя.

Остается вопрос со стилями и статическими данными.

В целом их можно оставить как есть, но возможны спецэффекты, если статика изменится в момент между получением исходного состояния и моментом просмотра записанной активности.

Когда страница загружается, мы сохраняем текущие размеры объекта окна.



Отслеживание событий

Вам необходимо отслеживать все события поддерева DOM независимо от использования stopImmediatePropagation()/stopPropagation().

Для этого мы будем использовать addEventListener() с параметром useCapture=true. Для отслеживания изменений в структуре и атрибутах документа можно использовать механизм MutationObserver. Для регистрации обработчиков в параметрах инициализации мы будем использовать DOM Node, по умолчанию — document. Вам также необходимо следить за положением прокрутки окна document.scroll и изменением размера window.resize. Чтобы идентифицировать объект события, мы создадим селектор CSS.

Протокол обмена

Из-за отсутствия практических данных для обмена будем использовать формат JSON. Для борьбы с блокировщиками рекламы и прочего следует использовать GET-запросы и возвращать небольшое изображение, например, в формате GIF. Например, URL-адрес /path/to/api/[строка JSON].

gif. Стоит помнить, что URL-адрес не резиновый, имеет ограничение в 2000 символов.

Достаточно небольшое значение с учетом отправки информации об изменении структуры документа, поэтому следует сразу побеспокоиться о сжатии данных, например, с помощью алгоритма GZIP, реализация которого существует. Для передачи сжатых данных вам придется дополнительно закодировать их в BASE64. Также нужно будет предусмотреть перенос по частям, но для проверки концепции на данном этапе это будет ненужно.



Нижняя граница

Исходный код прототипа клиентской библиотеки Здесь .

Для экспериментов был выбран реальный проект:

  1. адаптивная верстка (HTML5, CSS3);
  2. Вяз.

    Виджеты (формы регистрации/авторизации, многошаговые формы создания пользовательского контента) и профиля пользователя (SPA);

  3. Встроенные карты Google.
Интеграция не вызвала никаких проблем, визуально не наблюдалось падения производительности браузера.

Созданный трафик оказался не таким большим, как ожидалось.

С учетом ограничений сохранения раз в 10 секунд или, исходя из накопления, 100 событий, объем данных не превышал 4 килобайт. Степень сжатия сильно варьируется от единиц до десятков, но для достаточно больших объемов (десятки килобайт) лежит в районе десятков, что логично, т.к.

данные текстовые и имеется много повторяющихся подстрок.

Нижняя граница Прототип показал свою жизнеспособность.

Чтобы было совсем понятно, необходимо реализовать плеер и серверную часть, где ожидается ряд проблем:

  1. получение исходного состояния, борьба с дублированием данных.

    Возможно, вам придется кэшировать связанные данные.

    Есть подозрение, что вам придется использовать headless-браузер для первоначального воспроизведения активности пользователя с целью определения статических элементов;

  2. Поддержка кроссбраузерного плеера.

    Зоопарк и интерверсионное разнообразие никто не отменял.

Стоит не забывать об особенностях при изменении атрибутов.

Например, атрибут style нельзя просто взять через коллекцию атрибутов (Element.attributes), придется использовать свойство HTMLElement.style.cssText. Количество таких нюансов на данный момент оценить невозможно.

Если вы используете headless-браузер с предварительным воспроизведением активности пользователя, то вам следует рассмотреть вариант записи видео.

В этом случае отпадает необходимость в плеере, но увеличивается необходимое количество вычислительных ресурсов и размер получаемого хранилища данных, что не всегда может быть рациональным.

Теги: #вебвизор #Яндекс #аналитика #браузеры #dom #elm #JavaScript #JavaScript #HTML #Веб-аналитика #Интернет-маркетинг

Вместе с данным постом часто просматривают: