Время для прочтения: 1 мин. 37 сек.

Два способа получения статуса ICQ номера

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

Способ первый

Основан на сравнении размера статусной картинки с эталонным числом. Пример:


<?php
// 0 - офлайн, 1 - онлайн, 2 - не определен
function getIcqStatus($uin) {

    // Загрузить картинку статуса и посчитать ее длину
    $url = "http://status.icq.com/online.gif?icq={$uin}&img=1";
    $len = strlen(file_get_contents($url));

    // В зависимости от размера вернуть нужный результат
    if ($len == 475) {
        return 1;
    } elseif ($len == 446) {
        return 0;
    } elseif ($len == 188) {
        return 2;
    } else {
        return 2;
    }
}

echo getIcqStatus('296160098');
?>

Директива allow_url_fopen в PHP.INI должна быть включена

Способ второй

Основан на парсинге заголовка ответа сервера при запросе статусной картинки. Пример:


<?php
// 0 - офлайн, 1 - онлайн, 2 - не определен
function getIcqStatus($uin) {

    $answer = "";
    $request = "";

    // Делаем HEAD-запрос на получение статусной картинки
    $fp = @fsockopen("status.icq.com", 80, $errno, $errstr, 30);
    if (!$fp) {
        return 2;
    } else {
        $request .= "HEAD /online.gif?icq={$uin}&img=5 HTTP/1.1\r\n";
        $request .= "Host: status.icq.com\r\n";
        $request .= "Connection: Close\r\n\r\n";

        fwrite($fp, $request);

        while (!feof($fp)) {
            $answer .= fgets($fp, 128);
        }
        fclose($fp);

        // Смотрим, куда нас перенаправит сервер в заголовке Location (302)
        // возможные варианты: /5/online0.gif, /5/online1.gif, /5/online2.gif
        preg_match("|online([0-9]{1})\.gif|", $answer, $matches);
        return (isset($matches[1]) && !empty($matches[1])) ? $matches[1] : 2;
    }
}

echo getIcqStatus('296160098');
?>

Для достижения поставленной задачи во втором примере мы используем регулярные выражения в php.

Для вставки кода используйте HTML-теги
<pre><code class="php">ваш код</code></pre>

  • 21323123

    вот хорошая статья, если была бы полная. как получить запрос понятно. какой код ответа *если «1» то загрузить картинку онлайн, если «0,2,3» то загрузить картинку оффлайн

    • В комментах написано всё, смотрите внимательнее!