Vk api время когда пользователь был онлайн

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.

Sanchez_1885

Пользователь

Янв 29, 2022 1 0 1

Всем привет!
Подскажите, пожалуйста, как решить следующую задачу: необходимо проверить онлайн ли пользователь вк и вывести соответствующее сообщение. Пробовал так:
id = 123456
vseti= session.method(“users.get”,)
a = f» “
И дальше нужно условие, что-то вроде:
If a ==0:
print(”Пользователь онлайн»)
То есть нужно обратиться к параметру online и добавить условие, что, если он равен 0, то пользователь не онлайн, а если 1 — онлайн.
Подскажите, что не правильно и как можно решить эту задачу?
Спасибо!

Источник: itfy.org

Как правильно подсчитать время, проведённое пользователем в онлайне (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, приложение Время в сети и др. Я хочу понять, как, за какой промежуток и каким алгоритмом они подсчитывают эти минуты и секунды пока человек находится в сети.

  • Вопрос задан более трёх лет назад
  • 1620 просмотров

Комментировать
Решения вопроса 1
https://sitecoder.blogspot.com

Отсылаем начало активности на сервер:
1. Вкладка стала активной
2. Скролл страницы/мышь/тач/клава/сеть

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

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

Ответ написан более трёх лет назад
Нравится 1 4 комментария

Dyaminigo

Интересная формула «средне-двойного таймаута», но при её тестировании получил не совсем те результаты, какие, например, показывали множество сервисов отслеживания онлайна.

Еще по теме:  Как расшифровывается vk немецкий танк

К примеру, человек проявил активность в 10:00:02, 10:00:07, 10:00:45 через браузер или приложение, а далее либо нажал ссылку «выйти», либо приложение отправило запрос на account.setOffline, покинув онлайн. Исходя из примера, получается, что «общее время активности» 3 секунды, а неактивности/простоя 43.
Делаем вычисления с помощью Вашей формулы:
43 / 2 = 21.5 – среднее время неактивности
21.5 * 2 = 43
3 (общее время активности) — 43 = -40

Вряд ли отрицательное время онлайна – это то, что нужно. Да и те сервисы, исходя из моего примера, показывают то 3, то 43 секунды общей активности. Возможно, что я неправильно понял Вашу формулу и ответ, в таком случае прошу объяснить на примере. Также уточните, пожалуйста, как Вы пришли к этой формуле или где нашли её, а то ранее такой не видел.
Я уже начинаю склоняться к правильности первого варианта алгоритма, описанного в вопросе. Просто подсчитывать кол-во изменений last_seen за то время, пока online=1 и с одного и того же клиента. Но терзают сомнения, что второй может быть вернее.

Даниил, Может, не совсем внятно пояснил, но вот попробую на вашем примере.

Дано: 10:00:02, 10:00:07, 10:00:45 + «выход».
(Значит это сессия. Всё вместе — это одно посещение.)

Интервал активности попадает внутрь СЕРВЕРНОЙ сессии.
Значит ищем разницу между крайними отметками времени: 45-02 = 43 секунды.

Главное не путать: сессию посещения и серверную сессию.

Теперь, используем мой подход:
Вычисляем средне-двойной тайм-аут на первом интервале: его там не могло быть, поэтому, он равен нулю: 0*2=0.
При отсутствии тайм-аута (для 1-го временного интервала), используем сравнение с интервалом последней активности: [7-2]
(43-0-5)=38 > [7-2] => Да.
Значит это следующий временной интервал.

Доп.пояснение:
Если бы следующая активность была бы в 10:00:12, то это было бы продолжение всё ещё 1-го временного интервала, а не начала нового (как в нашем случае).

1. Считаем время (продолжительность) первой завершившейся активности: 7-2 = 5 секунд.
2. Далее — неактивность: 43-5 = 38 секунд.
3. И нажатие «выход»: 0 секунд (но реально, будет около 1-2 секунд, т.к. увод мышки для закрытия окна как правило ещё делается).

Итого:
10:00:02(старт) — 5 секунд (активность) — 38 (неактивность) — 10:00:45 (стоп, и начало новой активности)
1-ая сессия: 10:00:02 — 10:00:07 (интервал: 5 секунд)
Разрыв простоя: 10:00:07-10:00:45 (интервал: 38 секунд)
2-ая сессия: 10:00:45 — . (интервал: неопределён)

Dyaminigo

xmoonlight, спасибо Вам большое за столь подробное объяснение. Это достаточно интересный алгоритм. Я обязательно протестирую его на собственных (реальных) данных активности и отпишу, если появятся какие-то доп. вопросы. Не могу обещать, что это получится сделать завтра, но тогда уже в январе.
С наступающим!

Даниил, С удовольствием помогу и отвечу на ваши вопросы.
И, Вас, тоже, с наступающим!
Ответы на вопрос 3

Ответ зависит от алгоритма, частоты ваших проверок и обновлений параметра last_seen на стороне ВКонтакте.

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

    Ответ написан более трёх лет назад
    Нравится 1 3 комментария

    Dyaminigo

    last_seen изменяется сразу, как только пользователь проявит глобальную активность в веб-версии сайта, либо сделает какое-то действие в приложении, которое автоматически (на сервере) пометит его как онлайн, либо же само приложение отправит запрос на account.setOnline.

    • Моб. приложение
    • С включённым режимом «онлайн»
      Приложение помечает пользователя как находящегося в сети по определённому разработчиком таймауту (например раз в полторы минуты), изменяя тем самым last_seen, либо при переходе по разделам прилы (профиль, друзья, сообщения и т.д.) — это поведение определяет разработчик.
      Автоматическое обновление last_seen/онлайна происходит только при совершении некоторых действий: отправка/редактирование/удаление сообщений, запрос более старых сообщений, чем уже загруженные в приложение, публикация поста на стену, скроллинг ленты новостей или её обновление. Во всех этих случаях онлайн обновляется на сервере, а не из клиента.
    • С включённым режимом «оффлайн» (такая функциональность есть в неофициальных клиентах)
      В данном режиме приложение не отправляет запрос на пометку пользователя как онлайн, да и большинство методов (например запрос списка друзей, получение списка аудио/видео и др.) сами по себе не вызывают автоматическое изменения last_seen. Но при определённых действиях (см. их выше, где я писал действия, вызывающие автоматический онлайн) last_seen изменяется и человек появляется в сети, однако приложение на это реагирует, отправляя запрос на оффлайн, что меняет last_seen в обоих случаях.
    • В фоне обновление онлайна не происходит. Только тогда, когда приложение открыто, ну и в зависимости от включённого режима.

    В общем и целом, онлайн вызывает только специальный для этого метод и только некоторые другие, но большинство нет. В браузере можно загрузить страницу и хоть до конца жизни держать её открытой, матать мышкой, но last_seen останется прежним, пока, например, нам не захочется репостнуть какую-то запись, либо перейти на другую страницу. Никаких задержек изменения last_seen нет. Он обновляется только тогда, когда совершается какое-то действие, ну или по таймауту в клиентах, если разработчиком так задумано, чтобы держать профиль в сети.
    Те сервисы, которые отслеживают онлайн, проверяют last_seen один или несколько раз в секунду. ВК позволяет отправлять 3 запроса в секунду, так что это хороший вариант, чтобы мгновенно отслеживать изменение времени активности профиля.
    Возвращаясь к вопросу правильного подсчёта общего времени онлайна пользователя, пока online=1 (не закончился пятиминутный таймаут ВК) или не был вызван метод перехода в оффлайн.
    Мне хотелось бы формировать информацию об онлайне также, как те самые сервисы, например:
    Заходил в 10:00:00, пробыл 35 секунд (ПК);
    Заходил в 10:15:05, пробыл 4 минуты и 36 секунд (Android)
    .
    Онлайн с 10:05:00 до 10:05:44 (ПК)
    Онлайн с 10:44:55 до 10:53:02 (iPhone)

    Очень подробная и ценная информация – может, лучше дополните ею свой вопрос? Часть текста можно спрятать под тег spoiler

    один или несколько раз в секунду

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

    1. фактический (пользователь просто закрыл вкладку или усыпил ноутбук или отрубился интернет);
    2. с точки зрения ВК – last_seen , как я понял, останется по последнему действию. А как быстро online сменится на offline?
    3. в вашем сервисе – какой момент в идеале считать окончанием онлайна?

    Dyaminigo

    Очень подробная и ценная информация – может, лучше дополните ею свой вопрос?

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

    в минуту, может быть?

    Нет, именно в секунду, потому что такие сервисы должны фиксировать любое проявление активности пользователя = изменение last_seen.

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

    Информацию об онлайне пользователей проще всего получать, вызывая метод users.get с fields=online,last_seen. А в user_ids можно указать до 1000 айдишников нужных нам людей. Да и есть execute, в котором способом выше можно за один запрос получить инфу о 25К пользователей. Так что за один запрос можно получить состояние онлайна большого кол-ва профилей, не напрягаясь, что и делают сервисы отслеживания.

    Еще по теме:  Как сделать ВК меньше масштаб на ПК

    Также отвечаю на вопросы.
    1 и 2: если не было преднамеренно сделано что-то, для перехода в оффлайн (вызова спец. метода API, нажатия ссылки «выйти» в веб-версии сайта), то действует пятиминутный таймаут онлайна ВК, который отсчитывается от последней активности (last_seen). В это же время вызов users.get?fields=online,last_seen покажет, что last_seen, например, был две минуты назад, но online=1, который станет оффлайном через 3 минуты по таймауту. Отсюда наше любимое: висел в онлайне, а потом «заходил 5 минут назад».
    3: мы каждую секунду отслеживаем изменение last_seen. В случае обновления, записываем/суммируем его с предыдущими изменениями в этой сессии. Пока человек в онлайне (API отдаёт online=1), а когда перешёл в оффлайн, тогда считаем, что эта сессия закончена. К тому же, одновременно надо следить за клиентом, с которого человек проявляет активность.

    Если он неожиданно сменился (вся информация есть в API-ответе), то онлайн-сессия с предыдущего клиента считается прерванной/завершённой и начинаем следить за новой активностью и этим новым клиентом. Так делаем до бесконечности, формируя каждый раз те самые строчки информации: заходил в 10:00:00, пробыл 4 сек (ПК); заходил в 10:04:55, пробыл 7 минут (iPhone).
    Заметил за собой, что стал часто упоминать именно первый вариант алгоритма (из вопроса), который, наверное, всё же является верным для подсчёта времени по примеру выше. Но тогда почему некоторые сервисы отдают предпочтение второму варианту (от..до) и делают ли они это также, как я описал в вопросе? Или как-то по-другому? Непонятно.
    И да, спасибо Вам, что задаёте настолько точные вопросы, которые очень помогают структурировать как свои знания по этой теме, так и формировать некоторое понимание.

    Источник: qna.habr.com

    Узнать когда пользователь онлайн и оффлайн

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

    Re: Узнать когда пользователь онлайн и оффлайн

    Сообщение ukhov » 18 янв 2011, 18:13

    не до конца понял, что ты хочешь.
    когда пользователь онлайн и оффлайн — можно узнать только если он вошёл в приложение. по-мойму, вконтакте не даёт возможности узнать статус пользователя (online/offline), когда он не в приложении.

    Re: Узнать когда пользователь онлайн и оффлайн

    Сообщение amwfilwj » 18 янв 2011, 18:22

    Жаль) Мне как раз именно это и нужно было.

    Re: Узнать когда пользователь онлайн и оффлайн

    Сообщение AdultBiz » 18 янв 2011, 18:29

    CREATE TABLE `session` ( `id_session` tinytext NOT NULL, `putdate` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’, `user` tinytext NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
    0 ) < $query = «UPDATE session SET putdate = NOW(), user = ‘».$user.»‘ WHERE id_session = ‘».$id_session.»‘»; mysql_query($query); >else < // Иначе, если такого номера нет — посетитель только что // вошёл — помещаем в таблицу нового посетителя $query = «INSERT INTO session VALUES(‘».$id_session.»‘, NOW(), ‘».$user.»‘)»; mysql_query($query); >> // Будем считать, что пользователи, которые отсутствовали // в течении 20 минут — покинули ресурс — удаляем их // id_session из базы данных $query = «DELETE FROM session WHERE putdate

    Источник: flapps.ru

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...