Программное определение статуса ICQ через сервисы icq.com

Чтобы самым простым образом программно в PHP определить статус пользователя в ICQ, воспользуемся сервисом сайта www.icq.com, который отдаёт картинку со статусом. Сервис работает примерно так. При запросе адреса http://status.icq.com/online.gif?icq=HOMEP_ICQ сервер проверяет наличие пользователя в сети, его настройки безопасности и просто перенаправляет клиента на одну из трех картинок, приведённых в заголовке заметки.

Если пользователь онлайн, то мы получим от сервера примерно такой ответ:

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 моего сайта.

А существуют программы

А существуют программы которые бы мне показывали находится ли человек невидимым или он действительно в оффлайне?

Есть еще другой способ

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

А надо ли оно вообще?! Ну

А надо ли оно вообще?! Ну увидишь ты что человек онлайн, но если он не хочет тебе писать, то с этим уже ничего не поделаешь.

Яка мне разница

Если есть идея - я её реализую. А нужна ли она или нет - решать посетителю сайта. 10 просмотров статьи в день, значит нужна.

А как вам такое решение?

А как вам такое решение?
Причем для него не важно какая опция стоит в клиенте (показывать web статус/нет )

function icqstatus_get_status2() {
        // Создаем подключение
        if( $curl = curl_init() ){
                // Задаем ссылку
                curl_setopt($curl,CURLOPT_URL,'http://www.icq.com/people/Номер аси/');
                // Скачанные данные не выводить поток
                curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
                // Скачиваем
                $out = curl_exec($curl);
                // search
            $var = strpos( $out, "online.gif");
        if($var==FALSE)
                {
                        echo "Не в сети";
                }
                else
                {
                        echo "В сети";
                }
                // Закрываем соединение
                curl_close($curl);
        }
}
icqstatus_get_status2();

Разрабатываю систему отображения статусов авторов, для дружеского блога http://www.iad-aero.ru/contacts/, в планах написать класс который будет для большинства клиентов определять статусы...Как доделаю отпишусь..

Да никак.

Или получить шесть строк серверного заголовка в 150 байт или тащить каждый раз двадцатикилобайтную страницу. Что называется «Почуствуй разницу». Юзайте лучше код из статьи.

$var==FALSE

$var = strpos( $out, "online.gif");
if($var==FALSE)

Тут очень ламерская ошибка. Надо проверять так:
if($var===FALSE)

Хотя в данном случае она несущественна, когда-нибудь ошибётесь по крупному.

Не могу не поспорить с вами.

Не могу не поспорить с вами.
1) Из 6 провереных юзеров у 6, при использовании Вашего кода =), не отображается статус ни online ни offline, только "пользователь отключил сервис", да же при правильно настроеной политике безопасности. Может это конечно временный глюк связанный с переходом на icq7.
Так что, тут уж спорный момент, что лучше не всегда работающий код (сравните здесь количество тех у кого он работает с тем у кого нет http://shaman.asiadata.ru/service/icq-status ), или экономия трафика в 20 кб на стороне сервера, при широком канале...
2) Согласен по поводу $var===FALSE, просто писал в 2 ночи, потратив перед этим 2 часа на попытку разобратся почему Ваш код, не желает показывать статусы.

ОК, я гляну.

У меня тоже давно есть подозрения, что мой код не всегда показывает статус. Я гляну разницу. Просто у меня сейчас час ночи и я сам уже ничего не рублю. :)
Но таки выкачивание полной страницы не очень кошерный метод. :(

проблема не в Вашем коде была

Нет, проблема не в Вашем коде была, просто теперь он отображает только для тех у кого клиенты v.7.
Провели следственный эксперимент, в 3-м обновили Аськи до 7-ок, 3 оставили v6.5.
Результат: отображает только у тех у кого 7-ки.

Весело. :)

Я тут на своей ICQ Lite посмотрел. Какой бы статус не ставил (в безопасности галка показывать статус выставлена) всегда показывает серый цветочек. При этом на предложенной вами странице статус отображается нормально. И это официально предлагаемый icq.com код. Надо в ихний баг-репорт писать. Снаружи эта проблема неразрешима.

пугает эта строчка if($fp  =

пугает эта строчка
if($fp  = @fsockopen ("status.icq.com", 80, &$errno, &$errstr,  30)) {
Если ответа от сервера не будет продолжительное время, то страница будет висеть.. так как @fsockopen
не передаст управление коду дальше, пока не получит ответ или не выпадет по таймауту.
У меня из-за этого какраз и тормоза сильные.

Не пугайтесь

Ответил вам в другой заметке http://shaman.asiadata.ru/node/18?page=1#comment-590

Вот так еще проще помоему

CozaNostra: <img src="http://status.icq.com/online.gif?icq=466853689">

ну или чтобы понятнее

 ВАШЕ ИМЯ: <img src="http://status.icq.com/online.gif?icq=ВАШ_НОМЕР">

Об этом тут и тут.

Об этом тут и тут.