Мне очень помогло! Думаю вам тоже будет полезно! [sit]Бывает необходимо добавить на сайт отображение текущего сетевого статуса контактов различных сервисов обмена сообщениями. Чаще всего это можно встретить на сайтах-визитках или для отображения доступности оператора онлайн-поддержки. Можно использовать для этого официальные сервисы или неофициальные, которые, как правило, предоставляют больше возможностей по оформлению, разные темы с картинками. Но что делать, если у нас оригинальный сайт и дефолтные изображения не вписываются в его стиль? Придётся либо изобретать свой велосипед, который вряд ли будет лучше существующих, либо позаимствовать идеи из уже готовых решений и приспособить под наши нужды. Мы пойдём вторым путём.

Для начала определим наши задачи:
— по возможности использовать официальные сервисы определения статуса
— в случае их отсутствия можно прибегнуть к посторонним
— способ должен быть как можно проще, без излишков (всегда можно будет его потом расширить)
— чтобы прорисовка страницы не висла на время запроса, сделаем буфер

Рассмотрим 4 основных способа на примере ICQ, Jabber, Skype и MRA. Остальные можно сделать аналогично.

Проверка будет осуществляться при помощи php. Создадим файл «status.php» и добавим его выполнение в планировщик каждые 5 минут. Статус будет сохраняться в отдельный файл.

В моём случае для каждого протокола свой файл, например «icq.s». Т.к. у меня сохраняется не только текст статуса, но и картинка, то записывается часть html-кода в две строки. Чтобы потом на странице сайта не выдирать по абзацам, я решил просто вставлять нужный кусок в определённом месте страницы:

<? include('icq.s'); ?>

Можно будет записывать сколь угодно большие и сложные конструкции.[/sit]

                        
Статус ICQ

Будем использовать официальный сервис проверки статуса. В нём тоже есть свои минусы, работает странно. Например, статус «Away» он отдаёт только тогда, когда у контакта стоит статус «Invisible». В остальных случаях, кроме оффлайна, контакт всегда отображается «Online». Поэтому, если Вы поставите статус «Away» в клиенте, он всё равно будет показываться как «Online». Но это не повод отказываться, будем использовать официальный сервис, как и было заявлено в задачах.

Не забудьте в клиенте разрешить отображение статуса на сайтах. Есть много способов определения статуса, но используют они один и тот же адрес для проверки:

http://status.icq.com/online.gif?icq=ТУТ_ВАШ_UIN

В зависимости от текущего статуса ICQ адрес отдаваемой картинки будет принимать значения:

http://status.icq.com/0/online0.gif - Away
http://status.icq.com/0/online1.gif - Online и все остальные
http://status.icq.com/0/online2.gif - Offline

В зависимости от цифры в имени картинки и будет определяться статус. Мы будем получать заголовок «Location» из ответа сервера и захватывать оттуда эту цифру. А уже потом с помощью switch зададим, что будет отдаваться как статус. Конструкция такая:
[code]
try {
$a = @get_headers('http://status.icq.com/online.gif?icq=ТУТ_ВАШ_UIN');
foreach($a as $Header) { if (is_int(strpos($Header, 'Location'))) { $Status = substr($Header, -5, 1); } }
switch ($Status){
case '0': $icqstatus = '<img src="icq-away.png" alt=""/>'; break;
case '1': $icqstatus = '<img src="icq-online.png" alt=""/>'; break;
case '2': $icqstatus = '<img src="icq-offline.png" alt=""/>'; break;
default: $icqstatus = '<img src="icq-offline.png" alt=""/>'; break;
}
} catch (Exception $e){}
[/code]
Переменная «icqstatus» хранит текущий статус. Если сервис не будет работать, то отдаётся статус «Offline». Теперь запишем это статус в файл-буфер:
[code]
$f=fopen('/home/mysite/icq.s','w');
fwrite($f,$icqstatus);
fclose($f);
[/code]
Обратите внимание, что нужно указать полный путь к файлу на сервере.
Как я уже писал выше, для отображения статуса в нужном месте страницы вставляем:
[code]
<? include('icq.s'); ?>
[/code]

UPD: изменения на сайте ICQ
Теперь вместо трёх вариантов остались только «онлайн» или «оффлайн». Изменим код следующим образом:

Посмотреть рабочий вариант


Статус Skype

Здесь есть официальный сервис проверки статуса Skype. В отличие от ICQ у нас есть шикарная возможность получить ответ в виде текста статуса. Используем для этого такую ссылку:

http://mystatus.skype.com/ВАШ_НИК.txt

Не забудьте в клиенте разрешить отображение статуса на сайтах. В зависимости от текущего статуса Skype мы получим следующие значения:

Online
Away
Do Not Disturb
Offline

Нам всего-то и остаётся как получить содержимое текстового файла без каких-либо дополнительных телодвижений, он уже кошерный и ничего лишнего не содержит.
[code]
try {
$a = @file_get_contents("http://mystatus.skype.com/ВАШ_НИК.txt");
switch($a) {
case 'Online': $skypestatus = '<img src="skype-online.png" alt=""/>'; break;
case 'Away': case 'Do Not Disturb': $skypestatus = '<img src="skype-away.png" alt=""/>'; break;
case 'Offline': $skypestatus = '<img src="skype-offline.png" alt=""/>'; break;
default: $skypestatus = '<img src="skype-offline.png" alt=""/>'; break;
}
} catch (Exception $e){}
[/code]
И по традиции запишем полученный статус из переменной «skypestatus» в файл:
[code]
$f=fopen('/home/mysite/skype.s','w');
fwrite($f,$skypestatus);
fclose($f);
[/code]
В нужном месте сайта выведем:
[code]
<? include('skype.s'); ?>
[/code]


Статус Jabber

Это как раз тот случай, когда без использования сторонних сервисов нам не обойтись. Штатных способов определения сетевого статуса Jabber нет. Зато есть добрые люди. Правда и способ посложнее.

Сначала я использовал этот сервис http://web-apps.ru/jabber-presence/ и долгое время он работал отлично. Но недавно ушёл в офлайн на неделю и пришлось искать альтернативы, одной из которых был http://presence.jabberfr.org/. Его и будем использовать.

Идём на страницу французского сервиса, пишем свой JID и внизу выбираем «Your status (text)». Ещё чуть ниже появится сгенерированный адрес, по которому и будет определяться статус.

http://presence.jabberfr.org/ТУТ_ДЛИННЫЙ_ХЭШ_НАШЕГО_JID/text-en.txt

Теперь нам нужно добавить в ростер сервис presence.jabberfr.org. Он появится в списке контактов и будет иметь такой же статус, как у Вас. Чтобы включить отображение статуса по сгенерированной выше ссылке, отправим боту сообщение с текстом «visible» без кавычек.

В зависимости от текущего статуса Jabber мы имеем такие значения:

Available
Away
Not available
Do not disturb
Free for chat
Offline

При статусе «Invisible» будет показываться последний используемый статус перед скрытием.
Реализуем показ полученного статуса у нас на сайте. Также, как и в случае со Skype, получаем просто текстовый файл. В нём кроме статуса больше ничего не содержится.
[code]
try {
$a = @file_get_contents('http://presence.jabberfr.org/ТУТ_ДЛИННЫЙ_ХЭШ_НАШЕГО_JID/text-en.txt');
switch ($a){
case 'Available': case 'Free for chat': $jabberstatus = '<img src="jabber-online.png" alt=""/>'; break;
case 'Away': case 'Not available': case 'Do not disturb': $jabberstatus = '<img src="jabber-away.png" alt=""/>'; break;
case 'Offline': $jabberstatus = '<img src="jabber-offline.png" alt=""/>'; break;
default: $jabberstatus = '<img src="jabber-offline.png" alt=""/>'; break;
}
} catch (Exception $e){}
[/code]
В переменной «jabberstatus» содержится текущий статус. Запишем его в файл «jabber.s»:
[code]
$f=fopen('/home/mysite/jabber.s','w');
fwrite($f,$jabberstatus);
fclose($f);
[/code]
В нужном месте сайта выведем статус:
[code]
<? include('jabber.s'); ?>
[/code]

UPD: альтернативный вариант
Т.к. теперь французский сервис упал, решил, что лучше написать альтернативу, т.е. http://web-apps.ru/jabber-presence/. Наш отечественный товарищ. Какой-то один из них будет работать.

Посмотреть рабочий вариант


Статус MRA

Это Mail.ru Агент. Опять будем использовать официальный сервис проверки статуса Mail.ru Агента. Как и ICQ, нам предоставляют возможность отображать лишь картинку, без текста статуса:

http://status.mail.ru/?АДРЕС_ПОЧТЫ

Т.к. все изображения имеют один адрес и все одного размера, придётся придумать что-то другое. Можно узнать их вес, но это не лучший способ. Сделаем ход конём, то бишь просто будем определять md5-хэш изображения. Получаем также три разновидности статусов:

0318014f28082ac7f2806171029266ef - Online, Free for chat, Do not disturb
89d1bfcdbf238e7faa6aeb278c27b676 - Away
a46f044e175e9b1b28c8d9a9f66f4495 - Offline, Invisible

После определения хэша уже знакомой конструкцией задаём статус:
[code]
try {
$a = @md5(file_get_contents("http://status.mail.ru/?АДРЕС_ПОЧТЫ"));
switch($a) {
case '0318014f28082ac7f2806171029266ef': $mrastatus = '<img src="mra-online.png" alt=""/>'; break;
case '89d1bfcdbf238e7faa6aeb278c27b676': $mrastatus = '<img src="mra-away.png" alt=""/>'; break;
case 'a46f044e175e9b1b28c8d9a9f66f4495': $mrastatus = '<img src="mra-offline.png" alt=""/>'; break;
default: $mrastatus = '<img src="mra-offline.png" alt=""/>'; break;
}
} catch (Exception $e){}
[/code]
Записываем полученный статус MRA в файл:
[code]
$f=fopen('/home/mysite/mra.s','w');
fwrite($f,$mrastatus);
fclose($f);
[/code]
И в нужном месте выведем статус:
[code]
<? include('mra.s'); ?>
[/code]
3 10 0
0

Нет фото
• 13 май 2015, 11:53


PowerHelper, Видно что не по тебе понимать этот код! Я согласен с тобой! Ты прав!!!

0

Нет фото
• 12 май 2015, 10:38


Там где написано "аська" - номер аськи.
Впиши аську свою, поставь код, будет счастие. А то что ты там написал говнокод не вооруженным глазом.

0

Нет фото
• 11 май 2015, 22:20


ЛИКВИДАТОР, за что?

0

Нет фото
• 11 май 2015, 16:27


Код который вы писали совсем не то! На моём примере в месте картинок можно вставит всё угодно! А на вашем только иконка и надпись аська и всё!
[code]
$icqstatus = 'Здесь любой текст или что то другое';
[/code]
Думаю теперь понятно?

0

Нет фото
• 11 май 2015, 15:06


PowerHelper, плюс