|
|
|
|
|
|
Всякое |
Программное определение статуса ICQ через сервисы icq.com
Если пользователь онлайн, то мы получим от сервера примерно такой ответ: HTTP/1.1 302 Found Date: Tue, 14 Jul 2009 16:00:01 GMT Server: Apache Location: /0/online1.gif Connection: close Content-Type: text/html; charset=iso-8859-1 Если пользователь оффлайн, то такой: HTTP/1.1 302 Found Date: Tue, 14 Jul 2009 15:56:51 GMT Server: Apache Location: /0/online0.gif Connection: close Content-Type: text/html; charset=iso-8859-1 А если пользователь отключил возможность определения статуса, ответ будет следующим: HTTP/1.1 302 Found Date: Tue, 14 Jul 2009 15:51:22 GMT Server: Apache Location: /0/online2.gif Connection: close Content-Type: text/html; charset=iso-8859-1 Код ответа 302 означает перенаправление на другой ресурс сети (в данном случае одна из статичных картинок указанных в заголовке Location). Как видно, только эта строка и определяет статус пользователя ICQ. Всё зависит от цифры в названии изображения: 0, 1 или 2. Ошибочный же запрос с неправильным номером пользователя приведёт нас к такому ответу: HTTP/1.1 404 Not Found Date: Tue, 14 Jul 2009 16:02:09 GMT Server: Apache Connection: close Content-Type: text/html; charset=iso-8859-1 Осталось написать короткую функцию, которая выдаст нам статус пользователя обработав ответы сервера status.icq.com: function icqstatus_get_status($icq) { $status = -1; // Соединяемся с сервером ICQ if($fp = @fsockopen ("status.icq.com", 80, &$errno, &$errstr, 30)) { // Отправляем ему HEAD-запрос на изображение со статусом fputs($fp, "HEAD /online.gif?icq=$icq HTTP/1.0\n\n"); $out = ''; while(!feof($fp)) { // Читаем построчно ответ сервера $out .= $line = fgets($fp, 1024); // Ищем строчку перенаправления с номером изображения и выделяем его номер if(eregi('^Location: /0/online([012])', $line, $regs)) { // Если перенаправление обнаружено, то прерываем обработку ответа сервера $status = $regs[1]; break; } } // Закрываем соединение fclose($fp); } // Анализируем полученный номер изображения. switch($status) { case 0: return 'Пользователь оффлайн'; case 1: return 'Пользователь онлайн'; // Эту строчку можно перенести в секцию default - все равно статус пользователя не определить. case 2: return 'Пользователь отключил сервис'; default: return 'Пользователя не существует или сервис недоступен'; } } Указанный алгоритм реализован в сервисе статуса ICQ моего сайта. |
|
Direqtor Home Page by ASIADATA. |
|
Отправить комментарий