Программное определение статуса 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 моего сайта.

Теги

ICQ

Добавить комментарий

Ограниченный HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
CAPTCHA
А не робот ли вы случайно?
5 + 10 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.