Как стать автором
Обновить

Простой способ отслеживать активность пользователей Mail.Ru Агента

Время на прочтение3 мин
Количество просмотров41K
Доброго времени суток, уважаемые хабрапользователи.

Не думаю, что этот пост потянет на сколь-нибудь серьёзный «срыв покровов», но, тем не менее, он может помочь кому-то, столкнувшемуся с моей проблемой. Итак, дана задача. Необходимо отследить, как часто тот или иной пользователь портала mail.ru входит в агент.

Немного истории

Когда-то давно я решил эту проблему единственным доступным мне на тот момент способом. Была написана маленькая программка (назвать утилитой язык не повернётся) на Delphi, которая постоянно мониторила заголовки открытых окон. Собственно, для корректного функционирования программы необходимо было, чтобы в списке окон присутствовало окошко диалога с пользователем. Программа следила за ним, и предпринимала некоторые действия, когда пропадал заголовок «Василий Пупкин — Отключён», и появлялся «Василий Пупкин — Онлайн».

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

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

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

Итак, задача остаётся прежней.

Подготовка

Для начала, подумаем, где так или иначе «палится» статус пользователя. Облазив сайт mail.ru, и мельком ознакомившись со спецификацией протокола «mrim», я пришёл к следующим вариантам:

1) Собственно, статус в mail.ru агенте.
2) Статус в web-агенте, выводящемся на страницах почты и «Моего мира».
3) Статус на странице «Моего мира».

Пункт 1 отбрасывается по причине необходимости воскурения мануалов по протоколу mrim. Придётся слишком долго разбираться с тем, как войти под неким аккаунтом, сделать поиск по адресу, и получить статус. К тому же, от пользователя потребуется создание некоей учётной записи, от имени которой это будет делаться. По последней же причине отбрасывается пункт 2, плюс, необходимость разбираться в устройстве веб-агента. А вот пункт 3 меня серьёзно заинтересовал, с ним можно разобраться поподробнее.

Как известно, адрес странички пользователя с адресом «address@mail.ru» формируется как «my.mail.ru/mail/address». Заходим на страницу, и видим около имени пользователя зелёный или красный значок "@", показывающий, собственно, присутствует в агенте искомый человек или нет.

image

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

Однако, вернёмся в свой аккаунт, и посмотрим внимательнее, что представляет из себя этот значок. Точнее, присмотримся к его атрибуту «style».

image

Зайдя по ссылке «status.mail.ru?address@mail.ru» можно увидеть тот самый значок размером 13х13 в формате GIF, который не зависит от авторизации, и точно показывает, в онлайне человек или нет. Итак, цель определена, начнём работать.

Собственно, кодинг

Для работы я выбрал PHP с подключённой библиотекой GDLib.

function check_status($mail) 
{

$image = imagecreatefromgif("http://status.mail.ru/?".$mail); // Здесь всё понятно, взяли картинку. Теперь посмотрим, что на ней изображено

$x=10; // Выбираем координаты точки, цвет которой будем брать.
$y=10; // В принципе, на картинке много точек, но мне приглянулась именно эта.

$rgb = imagecolorsforindex($image,imagecolorat($image, $x, $y)); // Получаем RGB цвета выбранной точки.

$color = dechex($rgb[red]).dechex($rgb[green]).dechex($rgb[blue]); // И переводим его из RGB в HEX для удобства.

if ($color == 'd3f0dc') return 'online'; // А здесь у нас три варианта, выведенных опытным путём.
if ($color == 'f8dddd') return 'offline'; 
if ($color == 'd8e9d8') return 'away'; // Три - потому, что у значка может быть три варианта исполнения, соответственно "В сети", "Не в сети" и "В сети, но отошёл". В варианте "Отошёл" посреди зелёного значка появляется белое пятно, которое нужно принимать во внимание. 

}


Вот, собственно, и всё. На вход функции подаётся e-mail адрес искомого пользователя, а на выходе получаем статус в текстовом варианте. При желании можно заставить функцию выдавать true/false, в зависимости от ситуации.

Конечно, решение элементарнейшее. Но, тем не менее, без лишних затрат мы получили искомый результат. Полученную функцию можно применять крайне широко. Например, поставить задачу на Cron, и записывать результаты в базу данных для дальнейшей обработки, или наваять на JavaScript небольшой виджет, который будет отслеживать появление интересующих людей в сети, и информировать об этом alert'ом.
Теги:
Хабы:
+6
Комментарии10

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн