Yvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
0
03:58, 22 июля 2010

Статус-чекер для Mail.ru agent

Сидя на работе иногда мне хочется узнать кто из друзей сейчас онлайн в MailАгенте. Но подключаться к сети неохота, т.к. потом кто-нибудь увидев меня онлайн обязательно напишет "Привет", который я не могу оставить без ответа, дальше другие тоже активно подключатся к чату и работа надолго приостанавливается.

Все знают, что на странице профиля МойМир по адресу типа http://my.mail.ru/%domain%/%username% рядом с именем есть маленький рисунок, показывающий статус пользователя в агенте. Достается этот рисунок по адресу http://status.mail.ru?%email_of_user%. Что же, задача тривиальна, можно отправить HTTP-запрос на этот адрес и разобрать бинарные данные, предварительно просмотрев все возможные рисунки статусов например в HEX-редакторе.

Однако в кэше firefox (кстати попробуйте набрать about:cache) я заметил другой урл - http://status.mail.ru/batch.js?user1@mail.ru,user2@mail.ru,user3@mail.ru. Открыв его в браузере я увидел ответ наподобие этой:

MRIM.update('102101');

Немного поигравшись со списком емейлов, я выяснил, что каждая цифра является статусом для каждого емейла в списке соответственно. 0-оффлайн, 1-онлайн, 2-отошел. Хотя может есть и другие статусы.

В общем вот класс на php (нужен curl):

Mail.ru status checker
  1. class StatusChecker {
  2. const MRA_URL = 'http://status.mail.ru/batch.js';
  3.  
  4. public static function describe($statusCode) {
  5. switch ($statusCode) {
  6. case 0:
  7. return 'Оффлайн';
  8. case 1:
  9. return 'Онлайн';
  10. case 2:
  11. return 'Онлайн (отошел)';
  12. default:
  13. return 'Онлайн (?)';
  14. }
  15. }
  16.  
  17. public function checkStatus($emails) {
  18. if (!is_array($emails)) {
  19. $emails = array($emails);
  20. }
  21. if (empty($emails)) {
  22. return FALSE;
  23. }
  24. $ch = curl_init(self::MRA_URL . '?' . implode(',', $emails));
  25. curl_setopt($ch, CURLOPT_HEADER, 0);
  26. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  27. $ret = curl_exec($ch);
  28. preg_match('/^MRIM\.update\(\'(\d+)\'\);$/', $ret, $m);
  29. $result = FALSE;
  30. if (isset($m[1])) {
  31. $c = 0;
  32. foreach ($emails as $email) {
  33. $result[$email] = $m[1][$c++];
  34. }
  35. }
  36. curl_close($ch);
  37. return $result;
  38. }
  39. }

Небольшие пояснения - методу checkStatus можно передать массив проверяемых емейлов или один емейл, далее составляется URL, ставим нужные опции curl и делаем запрос, ответ парсится регекспом.

Теперь можно написать:

StatusChecker в деле :)
  1. $checker = new StatusChecker();
  2. // Загружаем $emails например из файла
  3. foreach ($checker->checkStatus($emails) AS $email => $code) {
  4. print $email . ': ' . StatusChecker::describe($code) . "\n";
  5. }

P.S.: можно было и через fopen (при включенном allow_url_fopen) не используя curl, но я как-то не подумал...

0
1672
3