(function() {
// Настройки
var metrikaId = '56454598'; // ID счётчика Яндекс.Метрики
var sendInterval = 30; // Временной шаг отправки событий в секундах
var sessionTimeout = 30 * 60; // Таймаут сессии в секундах (30 минут)
var inactivityTime = 15; // Время бездействия в секундах для паузы таймера
var localStorageKey = 'activeTimeTracker'; // Ключ для localStorage
var sessionTimeKey = 'sessionActiveTime'; // Ключ для времени активности в рамках одной сессии
var activeTime = 0; // Активное время на сайте
var sessionActiveTime = 0; // Активное время в рамках текущей сессии
var isActive = false; // Изначально пользователь считается неактивным
var timer; // Таймер отсчёта активного времени
var inactivityTimer; // Таймер бездействия
function resetInactivityTimer() {
clearTimeout(inactivityTimer);
inactivityTimer = setTimeout(function() {
isActive = false;
clearInterval(timer);
console.log('Пользователь неактивен более ' + inactivityTime + ' секунд.');
// Сброс сессионного таймера после таймаута сессии
if (sessionActiveTime >= sessionTimeout) {
sessionActiveTime = 0;
console.log('Сессия завершена из-за неактивности. Сессионное время сброшено.');
}
}, inactivityTime * 1000);
}
function sendActiveTimeToMetrika(activeTime, suffix) {
suffix = suffix || ''; // Установка значения по умолчанию для suffix
if (window['yaCounter' + metrikaId] && typeof window['yaCounter' + metrikaId].reachGoal === 'function') {
window['yaCounter' + metrikaId].reachGoal(activeTime + 'makosec' + suffix);
console.log('Событие ' + activeTime + 'makosec' + suffix + ' отправлено в Яндекс.Метрику.');
} else {
console.log('Счётчик Яндекс.Метрики не инициализирован или не доступен.');
}
}
function startActiveTimer() {
isActive = true;
clearInterval(timer);
timer = setInterval(function() {
activeTime++;
sessionActiveTime++;
localStorage.setItem(localStorageKey, activeTime.toString());
sessionStorage.setItem(sessionTimeKey, sessionActiveTime.toString());
if (activeTime % sendInterval === 0) {
sendActiveTimeToMetrika(activeTime, 'user'); // Изменено на 'user'
}
if (sessionActiveTime % sendInterval === 0) {
sendActiveTimeToMetrika(sessionActiveTime, 'visit');
}
}, 1000);
console.log('Таймер активности запущен.');
}
function init() {
// Инициализация активного времени из localStorage и sessionStorage
var storedTime = parseInt(localStorage.getItem(localStorageKey), 10);
var storedSessionTime = parseInt(sessionStorage.getItem(sessionTimeKey), 10);
activeTime = isNaN(storedTime) ? 0 : storedTime;
sessionActiveTime = isNaN(storedSessionTime) ? 0 : storedSessionTime;
// Слушатели событий для отслеживания активности пользователя
['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove', 'touchmove',
'keydown', 'keypress', 'keyup', 'scroll', 'change', 'select', 'submit',
'focusin', 'focusout'].forEach(function(event) {
document.addEventListener(event, function() {
if (!isActive) {
startActiveTimer();
}
resetInactivityTimer();
}, false);
});
// Запуск таймера активности
startActiveTimer();
console.log('Скрипт отслеживания активного времени инициализирован.');
}
// Инициализация скрипта после полной загрузки DOM.
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init(); // DOM уже загружен
}
})();
Яндекс.Метрика сама по себе не умеет составлять события по длительности визита пользователя на сайте, такой цели нет в дефолтных наборах. Метрика умеет считать время на сайте, но не умеет создавать по нему цели.Метрика умеет создавать такую цель с первого дня своего существования, и добавлять ее в Директ, и даже настраивать алгоритмы Директа с CPA по этой цели.
А еще Директ умеет отсеивать аудиторию по этому параметру и находить похожую по нему же. Для этого мы настроили в Метрике составной Сегмент, который выделяет аудиторию "Больше 15 минут + больше 7 страниц + заказ от 4000р." и добавили этот сегмент в Директ, а для всех кто ниже этих значений, уменьшили стоимость клика на 40%.
Метрика в базовом виде считает проведённое время за 1 визит. А нам бывает интересно считать именно время на посетителя, особенно в нишах, где принятие решения происходит долго, например, в недвижке. И дополнительный скрипт позволяет платить не за каждый 15-минутный визит, а именно за людей, которые в сумме проведут 15 минут на сайте.
Ну и оборотная сторона. Есть пользователи, которые любят часто и долго сидеть на сайте, не решаясь сделать выбор. При базовой цели Метрики мы будем платить за каждый такой визит. А в дополнительном скрипте (который мы назвали "макосеки") мы прописываем, чтобы учитывался только первый визит больше N-ного времени, а дальше повторно цель не срабатывала.
такой цели нет в дефолтных наборах
Код живой, периодически что-то меняем в нем, дорабатываем под разные проекты и задачи
Частично сами) Подсмотрели идею на одном проекте, а потом доработали под свои задачи