Как правильно подсчитать время, проведённое пользователем в онлайне (VK API)?

Достаточно длительное время не могу додумать/догнать как правильно реализовать алгоритм подсчёта времени, проведённого пользователем в онлайне.
Спрашивал разработчиков некоторых сервисов, у которых есть функционал отслеживания онлайна, но мне отвечали как-то фрагментарно, либо односложно, что не позволяло окончательно понять алгоритм и написать его в коде. Понятно, что надо подсчитывать кол-во изменений last_seen (последнего времени посещения/отправки запроса на онлайн) пользователя, что будет являться одной секундой онлайна, но или за какой-то фиксированный интервал (сомнительно), или за тот период, пока online=1 и не станет 0, или как-то по-другому.
Из ответов тех разработчиков и раздумий, вывел несколько возможных вариантов алгоритма:
1. Подсчитываем кол-во изменений last_seen до тех пор, пока online=1 и не станет 0. Например, запросы в 10:00:00; 10:00:05; 10:00:10 дают 3 секунды пользователя в онлайне, дальше оффлайн.
2. Подсчитать время между первым изменением last_seen и последним, пока online=1. Например, пользователь вошёл в 10:00:00, а вышел/перестал менять last_seen в 10:00:25 – даёт, что пробыл в сети 25 секунд.
3. Подсчитать last_seen за фиксированное время (например, 1 мин.), а потом просто суммировать эти изменения/секунды. Например, в сети с 10:00:00, сделал что-то в 10:00:07, ещё сделал в 10:00:59 = 3 секунды. Во второй минуте ещё 5 действий и дальше оффлайн. Получаем, что пробыл 3 + 5 = 8 секунд.

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

UPD. Судя по ответам, меня не совсем правильно поняли. Я думаю над алгоритмом подсчёта времени онлайна пользователей не своего сайта/проекта, а пользователей ВК, используя VK API. Соответствующие параметры из API ответа ВКонтакте я выше и привёл: online, last_seen и т.д.. Они возвращаются при запросе users.get при fields=online,last_seen. Время онлайна умеют подсчитывать такие сервисы: vkonline.info, приложение Время в сети и др. Я хочу понять, как, за какой промежуток и каким алгоритмом они подсчитывают эти минуты и секунды пока человек находится в сети.
  • Вопрос задан
  • 1786 просмотров
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Отсылаем начало активности на сервер:
1. Вкладка стала активной
2. Скролл страницы/мышь/тач/клава/сеть

Отсылаем завершение активности на сервер:
1. При уводе мыши с viewport'а
2. При потере фокуса вкладки
3. При закрытии вкладки
4. По средне-двойному таймауту исключительно только для этого клиента! (у всех - он свой и разный!).

Средне-двойной таймаут вычисляется так: средний неактивный промежуток для этой он-лайн сессии (НЕ ОБЫЧНОЙ СЕРВЕРНОЙ СЕССИИ, А ВЫЧИСЛЯЕМОЙ ПО АКТИВНОСТИ/НЕАКТИВНОСТИ!) умножаем на 2 и уменьшаем общее время активности на это значение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
sergiks
@sergiks Куратор тега ВКонтакте
♬♬
Ответ зависит от алгоритма, частоты ваших проверок и обновлений параметра last_seen на стороне ВКонтакте.

Наверное, стоит на своём аккаунте провести ряд экспериментов, чтобы выяснить:
  1. как обновляется время last_seen (с какой точностью), если:
    • в моб. приложении проявлять активность - прокручивать, листать
    • в моб. приложении проявлять активность - ставить лайки
    • в моб. приложении не проявлять активность, но держать открытым на виду
    • в моб. приложении не проявлять активность, держать в фоне
    • те же 4 пункта, но на сайте ВК.
    • если серверное standalone приложение от имени пользователя выполнит запрос к API
    • если iFrame приложение от имени пользователя по таймауту выполнит запрос к АПИ, при этом сам пользователь никаких действий, даже движений мышкой, не предпримет – обновит ли это last_seen?

  2. как обновится время last_seen, если моб. приложение закрыть. И сразу же открыть снова, но ничего не делать в нём.


Это поможет сделать выводы:
  1. как часто имеет смысл проверять для одного юзера параметр last_seen: раз в 15 минут, в 10, в 5, каждую минуту?
  2. и только тогда – как интерпретировать полученые данные – ваш исходный вопрос.
Ответ написан
@PiloTeZ
...
Простой вариант, достаточно точный для большинства проектов
После каждого запроса к серверу, записываем время посещения. Если в течении 10 минут запрос к серверу повторился, вычитаем текущее время минус последнее и прибавляем к суммарному времени проведенному на сайте.
Если в течении 10 минут следующего запроса так и не последовало, значит пользователь вышел из сессии.
Ответ написан
Комментировать
@JoyceGraham
Самый простой алгоритм отсылать со стороны клиента пинг на сервер.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы