php - icq online.txt

(5 KB) Pobierz
Umieszczone na serwerze AOL/Mirablis oprogramowanie pozwala wy�wietli� nasz status (offline,online) na stronie WWW, jednak nie pozwala na wykorzystanie w�asnego tekstu/ grafiki - mo�emy wybiera� jedynie z kilku predefiniowanych zestaw�w. Z pomoc� PHP mo�emy jednak obej�� te ograniczenie i wykorzysta� dowolny tekst/ grafik�.
 
Ja co prawda jestem wielbicielem charakterystycznego "kwiatka", jednak z tego co s�ysza�em, wielu webmaster�w chcia�oby mie� mo�liwo�� zastosowania w�asnej grafiki. Przyjrzyjmy si� wi�c bli�ej naszemu problemowi. 
<img SRC="http://wwp.icq.com/scripts/online.dll?icq=XXXXXX&img=5"> 

To jest kod, jaki nale�y umie�ci� na stronie (oczywi�cie zamiast XXXXXX trzeba poda� sw�j numer UIN a cyferka 5 odpowiada za styl wy�wietlanego obrazka - te� mo�na wybra� co� innego). Jak wida� kod jest do�� prosty, jednak zmodyfikowa� zbytnio go si� nie da :(. Z pozoru problem jest nie do rozwi�zania - kod potrafi wy�wietli� jedynie obrazek z predefiniowanego zestawu i tyle - usu�my go wi�c, lub lepiej skomentujmy z poziomu php, bowiem przyda nam si� adres tego skryptu. 
<? //<img SRC="http://wwp.icq.com/scripts/online.dll?icq=XXXXXX&img=5"> ?> 

Zapewne co dociekliwsi/ bardziej zdesperowani u�ytkownicy spr�buj� wpisa� podany w kodzie obrazka adres w pasek adresowy swej przegl�darki. Niestety, taka pr�ba nie przybli�y nas do niczego - w oknie browsera zn�w pojawi si� "niechciany" obrazek prezentuj�cy nasz status. C� wi�c robi�? Zagl�damy do manuala PHP i... Eureka! Co� jest - dzia� Socket functions wydaje si� opisywa� funkcje nam przydatne. Spr�bujmy wi�c skorzysta� z funkcji fsockopen() (205890 to m�j UIN): 
<? //<img SRC="http://wwp.icq.com/scripts/online.dll?icq=205890&img=5">
error_reporting(0);
$fp = fsockopen ("wwp.icq.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "echo disabled(2)";
break;
}
else {
fputs ($fp, "GET /scripts/online.dll?icq=205890&img=5 HTTP/1.0\n\n");
while (!feof($fp)) {
$wynik = fgets ($fp,128);
echo $wynik;
}
fclose ($fp);
}
?> 

I co si� dzieje? Na ekranie wy�wietli� si� ci�g dziwnych znaczk�w w stylu: 
HTTP/1.0 200 OK Content-type: image/gif GIF89a (���tR ��# % �w` �40 � �t��Wb���� 

C� to jest? Ano mo�na si� domy�li�, i� jest to obrazek (image/gif) wy�wietlany jako nasz aktualny status. I w tym momencie jeste�my ju� w domu - jak si� zaraz przekonamy ka�dy obrazek b�dzie przedstawiony jako odmienny ci�g znak�w - wystarczy wi�c przy pomocy instrukcji if lub switch sprawdzi� warto�� zmiennej $wynik i wy�wietli� odpowiedni obrazek/ tekst. Najpierw sprawd�my jednak jak wygl�da zwracany przez nasz skrypt ci�g znak�w w zale�no�ci od statusu naszego ICQ:
Offline (nie po��czony): 
HTTP/1.0 200 OK Content-type: image/gif GIF89a (���tR ��# % �w` �40 � �t��Wb���� 

Online (po��czony): 
HTTP/1.0 200 OK Content-type: image/gif GIF89a ( ���tR ��# % �7@ �40 � U�t�"WB���" 

Istnieje jeszcze status Disabled (wy��czony???), jednak tutaj znajomo�� szczeg��w nie jest nam potrzebna - za pewnik mo�na przyj��, �e gdy aktualny status nie jest statusem Offline ani Online to jest to Disabled (co, w naszym przypadku, b�dzie r�wnie dobrze mog�o oznacza�, �e nasz skrypt nie m�g� po��czy� si� z serwerem ICQ). 
A wi�c przed nami stoi kolejne zadanie: musimy rozpozna�, kt�ry ci�g znak�w otrzymujemy. W PHP jest to do�� proste - istnieje sporo funkcji, kt�re mo�na tutaj wykrozysta�. My skorzystamy z eregi(); 
$online = eregi ("�7@", $wynik);
 
$offline = eregi ("�w`", $wynik); 

Co robi �w kod? Funkcja eregi wyszukuje w podanym ci�gu (tutaj $wynik - czyli odpowiedzi z serwera icq) podanego ci�gu (tutaj "�7@" dla on a "�w`" dla offline) - je�li go znajdzie zwraca prawd� ("1"). Problemem nie b�dzie wi�c wy�wietlenie odpowiedniego napisu/ obrazka w zale�no�ci od tego, czy jeste�my on czy offline: 
if ($online==1)
{echo "online";}
elseif ($offline==1)
{echo "offline";}

 
if ($online==0&&$offline==0||!$online&&!$offline)
{echo "disabled";}


I co, ju� koniec? Tak :). Ca�y skrypt wygl�da wi�c tak: 
<?
error_reporting(0);
/*wy��czamy wy�wietlanie b��d�w*/
$fp = fsockopen ("wwp.icq.com", 80, &$errno, &$errstr, 30);
/*otwieramy po��czenie z serwerem icq*/
if (!$fp) {
echo "disabled(2)";
break;
} 
/*je�li co� p�jdzie nie tak wy�wietlamy disabled i ko�czymy dzia�anie skryptu*/
else {
fputs ($fp, "GET /scripts/online.dll?icq=XXXXXX&img=5 HTTP/1.0\n\n");
/* dostajemy si� do w�a�ciwego skrypciora na serwerze icq*/
while (!feof($fp)) 
{
 
if (!$wynik = &fgets ($fp, 128))
{echo "disabled(1)";
break;
}
/* pobieramy ci�g znak�w, je�li co� jest nie tak wy�wietlamy disabled izatrzymujemy skrypt, je�li wszystko jest ok... */
else
{
$online = eregi ("�7@", $wynik);
$offline = eregi ("�w`", $wynik);
}
if ($online==1)
{echo "online";}
elseif ($offline==1)
{echo "offline";}
} 
fclose ($fp);
/* sprawdzamy nasz status i wy�wietlamy odpowiedni napis*/
}
if ($online==0&&$offline==0||!$online&&!$offline)
{echo "disabled";}
/* je�li nie ma nas online ani offline wy�wietlamy disabled*/
?> 

Oczywi�cie, jest to wersja maxymalnie uproszczona - zamiast tekst�w w stylu "online" mo�emy wy�wietla� obrazek (<img src=\"obrazek.gif\">) lub cokolwiek innego. Je�li zamierzamy intensywnie (tj. na wielu stronach) korzysta� z tego skryptu, warto by by�o ca�o�� zdefiniowa� jako funkcj� do kt�rej przekazujemy jeden parametr - nr. UIN. Ale z tym, mam nadziej�, ju� sobie poradzicie :). 
Zgłoś jeśli naruszono regulamin