Funkcja łączy się z serwerem GG, loguje się na nim, pobiera opis dla podanego numeru i kończy połączenie. W przypadku powodzenia całości operacji funkcja zwraca opis. W przypadku niepowodzenia funkcja zwróci wartość "(bool) false" i w zmiennej podanej jako ostatni, czwaty argument umieści komunikat o błędzie jaki zaistniał.
Szczegóły parametrów do przekazania jak i wyniku działania funkcji znajdują się w jej komentarzu.
Funkcja wymaga zdefiniowania stałych wartości używanych w protokole GaduGadu. Nie są one umieszczone w funkcji, by uniknąć komunikatu o błędzie ponownego deklarowania stałych w przypadku, gdy funkcja zostanie wywołana wielokrotnie w jednym skrypcie.
Dwie uwagi końcowe:
- ilość znaków jaka jest wycinana ze zwracanego opisu (ostatnia linijka funkcji) jest dobrana eksperymentalnie i jak narazie nie znalazłem innego lepszego) rozwiązania na pozbycie się znaków znajdujących się na początku zwracanego przez serwer wyniku.
- Funkcja nie jest przystosowana do odbioru wielu statusów w jednym połączeniu. By ją do tego przystosować należy odpowiednio zmienić wywołanie funkcji (np. przekazać tablicę z numerami, a nie wartość INT i w linii 126 zmienić format pakietu zgodnie ze specyfikacją dostępną na stronie projektu EKG ( http://dev.null.pl/ekg/docs/protocol.html#ch1.11 )
(Kod wydzielony z tematu http://forum.php.pl/index.php?showtopic=21023)
<?php /* Skrypt napisany w oparciu o klasę www2gg (http://gg.wha.la/) * i opis protokołu GaduGadu z projektu EKG (http://dev.null.pl/ekg/docs/protocol.html) * Kod można dowolnie wykorzystać pod warunkiem pozostawienia niniejszego koment rza * Kod jest udostępniony na zasadach OpenSource. * * @author: Krzysztof Andrzej Błachut vel Bakus <bakus@idn.net.pl> * @copyright: 2004-2005 by Krzysztof Andrzej Błachut vel Bakus * @package: OpisGG * @version: 1.0 */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ function oblicz_hash ($haslo, $klucz) { $x0=0; $x1=0; $y0=0; $y1=0; $z=0; $tmp=0; $y0 = ($klucz << 16) >> 16; $y1 = $klucz >> 16 ; for ($i=0; $i<strlen($haslo); $i++) { $x0 = ($x0 & 0xFF00) | ord($haslo[$i]); $x1 &= 0xFFFF; $y0 ^= $x0; $y1 ^= $x1; $y0 += $x0; $y1 += $x1; $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8; $y0 ^= $x0; $y1 ^= $x1; $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8; $y0 -= $x0; $y1 -= $x1; $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8; $y0 ^= $x0; $y1 ^= $x1; $z = $y0 & 0x1F; $y0 &= 0xFFFF; $y1 &= 0xFFFF; if ($z <= 16) { $tmp= ($y1 << $z) | ($y0 >> (16-$z)); $y0 = ($y1 >> (16-$z)) | ($y0 << $z); $y1 = $tmp; }else{ $tmp= $y0 << ($z-16); $y0 = ($y0 >> (32-$z)) | ( (($y1 << $z) >> $z) << ($z-16) ); $y1 = ($y1 >> (32-$z)) | $tmp; } $y0 &= 0xFFFF; $y1 &= 0xFFFF; } $hash = http://www.php.net/hexdec(http://www.php.net/sprintf(\"%04x%04x\", $y1, $y0)); http://www.php.net/settype($hash, 'integer'); return $hash; } /* Funkcja pobiera z serwera GaduGadu opis dla podanego numeru. * * @param int Numer GG \"bramki\" * @param string Hasło GG \"bramki\" * @param int Numer GG, którego opis funkcja ma pobrać * @param var Zmienna w której umieszczony będzie ewentualny komunikat błęd * @return mixed Zawiera Opis numeru GG, lub false w przypadku błędu */ function get_gg_status($numer_gg, $haslo_gg, $szukany_numer, &$error) { // Ustawianie stałych na potrzeby protokołu http://www.php.net/define(\"GG_LOGIN60\", 0x0015); http://www.php.net/define(\"GG_STATUS_AVAIL\", 0x0002); http://www.php.net/define(\"GG_LOGIN_OK\", 0x0003); http://www.php.net/define(\"GG_NOTIFY\", 0x0010); http://www.php.net/define(\"GG_USER_NORMAL\", 0x0003); $fp = http://www.php.net/fsockopen( \"appmsg.gadu-gadu.pl\", 80, $errno, $errmsg, 3 ); if (!$fp) { $error = \"BRAK POLACZENA Z APPMSG.GADU-GADU.PL, MOZE BYC PRZECIAZONY: \" . $errno . \" - \" . $errstr . \"n\"; return false; }else{ $get = \"GET /appsvc/appmsg.asp?fmnumber=<$numer_gg> HTTP/1.0rn\"; $get.= \"Host: appmsg.gadu-gadu.plrn\"; $get.= \"User-Agent: Mozilla/4.7 [en] (Win98; I)rn\"; $get.= \"Pragma: no-cachernrn\"; http://www.php.net/fputs($fp, $get); http://www.php.net/fgets($fp, 128); http://www.php.net/fgets($fp, 128); $buf = http://www.php.net/fgets($fp, 128); http://www.php.net/preg_match(\"/s([d.]{8,16}):([d]{1,5})s/\", $buf, $adres); $host = $adres[1]; $port = $adres[2]; http://www.php.net/fclose($fp); } // Ustanawianie połączenia z serwerem GG $fp = http://www.php.net/fsockopen($host, $port, $errno, $errstr, 10); if (!$fp) { $error = \"PROBLEM Z POLACZENIEM: $errno - $errstrnn\"; return false; } if (!$data = http://www.php.net/fread($fp, 12)) { $error = \"Polaczenie nieoczekiwanie zamknietenn\"; return false; } // Pobieranie danych z serwera - odbiór klucza do wygenerowania hasha hasła $tab = http://www.php.net/unpack(\"Vtyp/Vrozmiar/Vklucz\", $data); // obliczanie hasha hasła $hash = oblicz_hash($haslo_gg, $tab['klucz']); $data = http://www.php.net/pack(\"VVVVVVvVvVvCCa\".strlen(\"\"), GG_LOGIN60, 0x20 + strlen(\"\"), $numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , \"\"); // wysłanie hasha hasła http://www.php.net/fwrite($fp, $data); if (!$data1 = http://www.php.net/fread($fp, 8)) { $error = \"Nie rozpoznany bladn\"; return false; } $tab = http://www.php.net/unpack(\"Vlogin_status/Vrozmiar\", $data1); if($tab['login_status'] != GG_LOGIN_OK) { $error = \"Nie prawidłowe hasło...nn\"; return false; } // Wysłanie listy kontaktów z jednym numerem $data = http://www.php.net/pack (\"VVVC\",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL); if(!http://www.php.net/fwrite($fp,$data)) { $error = \"Blad wysylania listy kontaktownn\"; return false; } // Odebranie pakietu ze specyfikacją następnego pakietu $data = http://www.php.net/fread($fp, 8); $tab = http://www.php.net/unpack(\"Vtyp/Vrozmiar\", $data); // Pobranie pakietu opisu $data = http://www.php.net/fread($fp, $tab['rozmiar']); // Zamknięcie połączenia z serwerem http://www.php.net/fclose($fp); $tablica = http://www.php.net/unpack(\"Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*\", $data); return $tablica[1]; } ?>
<?php http://www.php.net/print get_gg_status(\"2358764\", \"zxcdews\", \"1234567\", $error); ?>
Jeszcze zapytanie: czy da się wyciągnąć obrazek numeru, który ma włączoną opcję "Tylko dla znajomych"? Jeśli tak, to jak?
numer, który używa ta funkcja musi być wpisany do listy konaktów numeru który sprawdzasz.
@Bakus:
1. Czemu dwa razy definiujesz stałe?
2. Ładniej byłoby to w klase ująć
pozdrawiam
Twoja funkcja to jest swietna sprawa ale ma jeden mankament. W momencie jej wywolania rozlacza mi sie GG. Korzystam dokladnie z Tlena i w momencie kiedy ktos wchodzi na strone to automatycznie staje sie niedostepny.. Jest jakas rada na to?
HeHe... zarejestruj nowy numer GG
Jezeli serwer GG zostanie poproszony o autoryzacje nowej sesji na ten sam numer, to wszystkie otworzone sesje zostana zakonczone i zostanie nawiazane polaczenie z ostatnia sesja o jaka zostal poproszony... dlatego wlasnie Cie rozlacza...
Witam. Jestem tu nowy.
Chciałbym się dowiedzieć, czy można troszkę rozszerzyć funkcje o rozpoznawanie statusu (dostępny, niedostępny, zaraz wracam), np. funkcja zwraca wartość:
0 przy niedostępnym
1 przy dostępnym
2 przy zaraz wracam
http://gg.wha.la/ - tutaj masz dostepna klase do obslugi gg i tam ta funkcja o ktora prosisz jest.
---
Rozpoznawanie statusu w bardzo prosty sposob znalezione na http://www.strefaphp.net/artykul1.html
<?php $plik = http://www.php.net/fopen ("http://www.gadu-gadu.pl/users/status.asp?id=numer_gg&styl=2", "r"); $status = http://www.php.net/fgets($plik, 2); switch ($status) { case 1: http://www.php.net/echo '<IMG src="niedostepny.jpg">'; break; case 2: http://www.php.net/echo '<IMG src="dostepny.jpg">'; break; case 3: http://www.php.net/echo '<IMG src="wracam.jpg">'; break; default: // w razie błędu pokaże się obrazek error.jpg http://www.php.net/echo '<IMG src="error.jpg">'; break; } http://www.php.net/fclose($plik); ?>
Rozumiem, ze paczka do sprawdzania statusu jednej osoby, to:
<? $data = http://www.php.net/pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL); ?>
Niestety nie znalazłem odpowiedzi na to pytanie. Mniewam, iż wieloktorne wysłanie zapytań o status w czasie 1 połączenia nie spowoduje błędu i będzie dobrym obejściem tego problemu, jednak to tylko przypuszczenie.
wywala mi taki błąd z tego skryptu:
Warning: unpack(): Type C: not enough input, need 1, have 0 in c:\usr\krasnal\www\statusgg\ggstatus.php on line 134
czy ktoś mi pomoże będę wdzięczny gg 5377455
Tez mialem ten problem (moze w zwiazku z wejsciem GG 7?) i klecac troche od bakusa i bramki z http://gg.wha.la/ stworzylem, cos co dziala tak samo jak skrypt Bakusa.. Do sciagniecia razem z klasa do obslugi gg z ww adresu http://home.wi.ps.pl/~mawalkowiak/gg.rar.
Jak skorzystac:
<?php $gg = new GaduEx(); $opis = $gg->getOpis($twoj_gg,$twoje_haslo,$szukany_nr); ?>
troche odswieze temat.
skrypt obecnie nie dziala :/
zwraca cos takiego:
Odswiezam i mowie ze dziala. teraz przetestowalem
Witam...
Wiem że jestem cienki ale nie moge poradzić sobje z pobieraniem większej ilości opisów gg, możecie mi powiedzieć jak należy zmodyfikować tę klasę żeby pobrała w jednej sesji wszystkie opisy numerów gg które jej przekaże w tablicy. Jeszcze raz sorry za prośbe o gotowca ale jakoś to mi nie wychodzi.
Pozdrawiam,
eLeM
<?php $numery = http://www.php.net/array( '2222', '3333', '4444' ); foreach( $numery as $numer ) { http://www.php.net/echo 'Numer: '.$numer.', Opis: '.get_gg_status("2358764", "zxcdews", $numer, $error).'<br />'; } ?>
Nie próbowałem rozwiązać pobierania wielu podpisów. Moja rada: eksperymentuj
<?php $szukany_numer = http://www.php.net/array(12345, 23456, 34567, 45678); foreach($szukany_numer as $hehe) { $data = http://www.php.net/pack ("VVVC",GG_NOTIFY, 5, $hehe, GG_USER_NORMAL); } ?>
A co to da? $data jest nadpisywana więc wezmie ostatni numer ;P
skrypt nie działa - pokazuje mi się taki błąd - "PROBLEM Z POLACZENIEM: 111 - Connection refused"
bim2 to może tak:
<?php $wyniki_dzialania = http://www.php.net/array(); $szukany_numer = http://www.php.net/array(12345, 23456, 34567, 45678); foreach($szukany_numer as $hehe) { http://www.php.net/array_push($wyniki_dzialania, http://www.php.net/array($szukany_numer => http://www.php.net/pack("VVVC",GG_NOTIFY, 5, $hehe, GG_USER_NORMAL))); } ?>
No tak sie teraz da Tylko nie testowalem tego i nie wiem czy zadziala Napisz coś więcej czy działa
@bim2 teraz musi działać... dla każdego numeru tworzona jest tablica numerek => opis, dzięki czemu mozna ponownie wykorzystać tablicę $szukany_numer w mnuiej wiecej taki sposób:
<?php foreach($szukany_numer as $numer) { http://www.php.net/echo $numer.' ma opis '.$wyniki_dzialania[$numer].'<br />'; } ?>
Ja rozumiem tlyko ja nie umiem wyciagac pisu i nieorumiem jak on dziala (ten skrypt) Wiec jesli do wyciagniecia opisu wystarczy 1 unpack to OK, powinno dzialać
@bim2:
Witam
Mam problem ze skryptem
Jeśli podany do skryptu nr GG nie ma ustawionego opisu to dostaje błąd:
Warning: unpack() [function.unpack]: Type C: not enough input, need 1, have 0 in c:\usr\apache\httpd\html\gg\statusgg.php on line 133
Jeśli opis jest ustawiony to wszystko działa pięknie
Czy ktoś wie jak to obejść ?
Pozdrawiam
Wiem że to głupie ale daj @ przed unpack (@unpack()) I powinno zadziałac Ale to jest najprostrze wyjście z sytuacji i może jest baredzije profesjonalne
mi wyswietla
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/bastek/public_html/gg_test.php on line 102
102 linijka:
$hash = oblicz_hash($haslo_gg, $tab['klucz']);
:|
co masz linię wyżej?
a to może:
<?php $hash = oblicz_hash($haslo_gg, $tab["klucz"]); ?>
to nie to ^^ przeciez niewyswietla ze jest blad w zapisie
nic sam niedopisywalem - wszystko mam tak jak podane w tym poscie
Nie wiem czy zauważyliście ale kod z listingu z pierwszym poście, posypał się całkiem (pewnie podczas jakiegoś upgrade forum), są w nim pododawane błędne sleshe.
<?php /* Skrypt napisany w oparciu o klasę www2gg (http://gg.wha.la/) * i opis protokołu GaduGadu z projektu EKG (http://dev.null.pl/ekg/docs/protocol.html) * Kod można dowolnie wykorzystać pod warunkiem pozostawienia niniejszego koment
arza * Kod jest udostępniony na zasadach OpenSource. * * @author: Krzysztof Andrzej Błachut vel Bakus <bakus@idn.net.pl> * @copyright: 2004-2005 by Krzysztof Andrzej Błachut vel Bakus * @package: OpisGG * @version: 1.0 */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ function oblicz_hash ($haslo, $klucz) { $x0=0; $x1=0; $y0=0; $y1=0; $z=0; $tmp=0; $y0 = ($klucz << 16) >> 16; $y1 = $klucz >> 16 ; for ($i=0; $i<strlen($haslo); $i++) { $x0 = ($x0 & 0xFF00) | ord($haslo[$i]); $x1 &= 0xFFFF; $y0 ^= $x0; $y1 ^= $x1; $y0 += $x0; $y1 += $x1; $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8; $y0 ^= $x0; $y1 ^= $x1; $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8; $y0 -= $x0; $y1 -= $x1; $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8; $y0 ^= $x0; $y1 ^= $x1; $z = $y0 & 0x1F; $y0 &= 0xFFFF; $y1 &= 0xFFFF; if ($z <= 16) { $tmp= ($y1 << $z) | ($y0 >> (16-$z)); $y0 = ($y1 >> (16-$z)) | ($y0 << $z); $y1 = $tmp; }else{ $tmp= $y0 << ($z-16); $y0 = ($y0 >> (32-$z)) | ( (($y1 << $z) >> $z) << ($z-16) ); $y1 = ($y1 >> (32-$z)) | $tmp; } $y0 &= 0xFFFF; $y1 &= 0xFFFF; } $hash = http://www.php.net/hexdec(http://www.php.net/sprintf("%04x%04x", $y1, $y0)); http://www.php.net/settype($hash, 'integer'); return $hash; } /* Funkcja pobiera z serwera GaduGadu opis dla podanego numeru. * * @param int Numer GG "bramki" * @param string Hasło GG "bramki" * @param int Numer GG, którego opis funkcja ma pobrać * @param var Zmienna w której umieszczony będzie ewentualny komunikat błędu * @return mixed Zawiera Opis numeru GG, lub false w przypadku błędu */ function get_gg_status($numer_gg, $haslo_gg, $szukany_numer, &$error) { // Ustawianie stałych na potrzeby protokołu http://www.php.net/define("GG_LOGIN60", 0x0015); http://www.php.net/define("GG_STATUS_AVAIL", 0x0002); http://www.php.net/define("GG_LOGIN_OK", 0x0003); http://www.php.net/define("GG_NOTIFY", 0x0010); http://www.php.net/define("GG_USER_NORMAL", 0x0003); $fp = http://www.php.net/fsockopen( "appmsg.gadu-gadu.pl", 80, $errno, $errmsg, 3 ); if (!$fp) { $error = "BRAK POLACZENA Z APPMSG.GADU-GADU.PL, MOZE BYC PRZECIAZONY: " . $errno . " - " . $errstr . "n"; return false; }else{ $get = "GET /appsvc/appmsg.asp?fmnumber=<$numer_gg> HTTP/1.0rn"; $get.= "Host: appmsg.gadu-gadu.plrn"; $get.= "User-Agent: Mozilla/4.7 [en] (Win98; I)rn"; $get.= "Pragma: no-cachernrn"; http://www.php.net/fputs($fp, $get); http://www.php.net/fgets($fp, 128); http://www.php.net/fgets($fp, 128); $buf = http://www.php.net/fgets($fp, 128); http://www.php.net/preg_match("/s([d.]{8,16}):([d]{1,5})s/", $buf, $adres); $host = $adres[1]; $port = $adres[2]; http://www.php.net/fclose($fp); } // Ustanawianie połączenia z serwerem GG $fp = http://www.php.net/fsockopen($host, $port, $errno, $errstr, 10); if (!$fp) { $error = "PROBLEM Z POLACZENIEM: $errno - $errstrnn"; return false; } if (!$data = http://www.php.net/fread($fp, 12)) { $error = "Polaczenie nieoczekiwanie zamknietenn"; return false; } // Pobieranie danych z serwera - odbiór klucza do wygenerowania hasha hasła $tab = http://www.php.net/unpack("Vtyp/Vrozmiar/Vklucz", $data); // obliczanie hasha hasła $hash = oblicz_hash($haslo_gg, $tab['klucz']); $data = http://www.php.net/pack("VVVVVVvVvVvCCa".http://www.php.net/strlen(""), GG_LOGIN60, 0x20 + http://www.php.net/strlen(""), $numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , ""); // wysłanie hasha hasła http://www.php.net/fwrite($fp, $data); if (!$data1 = http://www.php.net/fread($fp, 8)) { $error = "Nie rozpoznany bladn"; return false; } $tab = http://www.php.net/unpack("Vlogin_status/Vrozmiar", $data1); if($tab['login_status'] != GG_LOGIN_OK) { $error = "Nie prawidłowe hasło...nn"; return false; } // Wysłanie listy kontaktów z jednym numerem $data = http://www.php.net/pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL); if(!http://www.php.net/fwrite($fp,$data)) { $error = "Blad wysylania listy kontaktownn"; return false; } // Odebranie pakietu ze specyfikacją następnego pakietu $data = http://www.php.net/fread($fp, 8); $tab = http://www.php.net/unpack("Vtyp/Vrozmiar", $data); // Pobranie pakietu opisu $data = http://www.php.net/fread($fp, $tab['rozmiar']); // Zamknięcie połączenia z serwerem http://www.php.net/fclose($fp); $tablica = http://www.php.net/unpack("Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*", $data); return $tablica[1]; } ?>
użyłem tego skryptu, ale nie działa. może jakieś sugestie?
Żeby skrypt działał poprawnie, trzeba włączyć dyrektywę allow_url_fopen. Niestety, nie można tego zrobić poprzez php_ini() i trzeba ustawić to w pliku konfiguracyjnym php.ini lub httpd.conf. Jeśli korzystacie z jakiegoś darmowego konta, to nici - trzeba pogadać z adminem.
Oczywiście, może to być jeden z powodów. Żeby w ogóle sprawdzić, czy na tym polega problem, można wywołać funkcję phpinfo() i sprawdzić wartość allow_url_fopen, ewentualnie skorzystać z ini_get()
PS. Dotyczy to z pewnością http://www.strefaphp.net/artykul1.html sposobu przy pobieraniu statusu i używaniu własnych grafik. Nie wiem co z tym na początku tematu - czy tam też jest ten sam problem czy nie; nie testowałem
działało działało i przestało
Fatal error: Maximum execution time of 60 seconds exceeded in ... on line
w tej lini:
<?php $data = http://www.php.net/fread($fp, 8); ?>
Nigdy nie byłem dobry z wyrażeń ale preg z linii 80 wygląda tak:
<?php http://www.php.net/preg_match("/s([d.]{8,16}):([d]{1,5})s/", $buf, $adres); ?>
a jak mi pisze ze
Niestety poniższy kod nie zwraca mi żadnej wartości, nie wyświetla też żadnych błędów
<?php /* Skrypt napisany w oparciu o klasę www2gg (http://gg.wha.la/) * i opis protokołu GaduGadu z projektu EKG (http://dev.null.pl/ekg/docs/protocol.html) * Kod można dowolnie wykorzystać pod warunkiem pozostawienia niniejszego koment
arza * Kod jest udostępniony na zasadach OpenSource. * * @author: Krzysztof Andrzej Błachut vel Bakus <bakus@idn.net.pl> * @copyright: 2004-2005 by Krzysztof Andrzej Błachut vel Bakus * @package: OpisGG * @version: 1.0 */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ function oblicz_hash ($haslo, $klucz) { $x0=0; $x1=0; $y0=0; $y1=0; $z=0; $tmp=0; $y0 = ($klucz << 16) >> 16; $y1 = $klucz >> 16 ; for ($i=0; $i<strlen($haslo); $i++) { $x0 = ($x0 & 0xFF00) | ord($haslo[$i]); $x1 &= 0xFFFF; $y0 ^= $x0; $y1 ^= $x1; $y0 += $x0; $y1 += $x1; $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8; $y0 ^= $x0; $y1 ^= $x1; $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8; $y0 -= $x0; $y1 -= $x1; $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8; $y0 ^= $x0; $y1 ^= $x1; $z = $y0 & 0x1F; $y0 &= 0xFFFF; $y1 &= 0xFFFF; if ($z <= 16) { $tmp= ($y1 << $z) | ($y0 >> (16-$z)); $y0 = ($y1 >> (16-$z)) | ($y0 << $z); $y1 = $tmp; }else{ $tmp= $y0 << ($z-16); $y0 = ($y0 >> (32-$z)) | ( (($y1 << $z) >> $z) << ($z-16) ); $y1 = ($y1 >> (32-$z)) | $tmp; } $y0 &= 0xFFFF; $y1 &= 0xFFFF; } $hash = http://www.php.net/hexdec(http://www.php.net/sprintf("%04x%04x", $y1, $y0)); http://www.php.net/settype($hash, 'integer'); return $hash; } /* Funkcja pobiera z serwera GaduGadu opis dla podanego numeru. * * @param int Numer GG "bramki" * @param string Hasło GG "bramki" * @param int Numer GG, którego opis funkcja ma pobrać * @param var Zmienna w której umieszczony będzie ewentualny komunikat błędu * @return mixed Zawiera Opis numeru GG, lub false w przypadku błędu */ function get_gg_status($numer_gg, $haslo_gg, $szukany_numer, &$error) { // Ustawianie stałych na potrzeby protokołu http://www.php.net/define("GG_LOGIN60", 0x0015); http://www.php.net/define("GG_STATUS_AVAIL", 0x0002); http://www.php.net/define("GG_LOGIN_OK", 0x0003); http://www.php.net/define("GG_NOTIFY", 0x0010); http://www.php.net/define("GG_USER_NORMAL", 0x0003); $fp = http://www.php.net/fsockopen( "appmsg.gadu-gadu.pl", 80, $errno, $errmsg, 3 ); if (!$fp) { $error = "BRAK POLACZENA Z APPMSG.GADU-GADU.PL, MOZE BYC PRZECIAZONY: " . $errno . " - " . $errstr . "n"; return false; }else{ $get = "GET /appsvc/appmsg.asp?fmnumber=<$numer_gg> HTTP/1.0rn"; $get.= "Host: appmsg.gadu-gadu.plrn"; $get.= "User-Agent: Mozilla/4.7 [en] (Win98; I)rn"; $get.= "Pragma: no-cachernrn"; http://www.php.net/fputs($fp, $get); http://www.php.net/fgets($fp, 128); http://www.php.net/fgets($fp, 128); $buf = http://www.php.net/fgets($fp, 128); http://www.php.net/preg_match("/s([d.]{8,16}):([d]{1,5})s/", $buf, $adres); $host = $adres[1]; $port = $adres[2]; http://www.php.net/fclose($fp); } // Ustanawianie połączenia z serwerem GG $fp = http://www.php.net/fsockopen($host, $port, $errno, $errstr, 10); if (!$fp) { $error = "PROBLEM Z POLACZENIEM: $errno - $errstrnn"; return false; } if (!$data = http://www.php.net/fread($fp, 12)) { $error = "Polaczenie nieoczekiwanie zamknietenn"; return false; } // Pobieranie danych z serwera - odbiór klucza do wygenerowania hasha hasła $tab = http://www.php.net/unpack("Vtyp/Vrozmiar/Vklucz", $data); // obliczanie hasha hasła $hash = oblicz_hash($haslo_gg, $tab['klucz']); $data = http://www.php.net/pack("VVVVVVvVvVvCCa".http://www.php.net/strlen(""), GG_LOGIN60, 0x20 + http://www.php.net/strlen(""), $numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , ""); // wysłanie hasha hasła http://www.php.net/fwrite($fp, $data); if (!$data1 = http://www.php.net/fread($fp, 8)) { $error = "Nie rozpoznany bladn"; return false; } $tab = http://www.php.net/unpack("Vlogin_status/Vrozmiar", $data1); if($tab['login_status'] != GG_LOGIN_OK) { $error = "Nie prawidłowe hasło...nn"; return false; } // Wysłanie listy kontaktów z jednym numerem $data = http://www.php.net/pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL); if(!http://www.php.net/fwrite($fp,$data)) { $error = "Blad wysylania listy kontaktownn"; return false; } // Odebranie pakietu ze specyfikacją następnego pakietu $data = http://www.php.net/fread($fp, 8); $tab = http://www.php.net/unpack("Vtyp/Vrozmiar", $data); // Pobranie pakietu opisu $data = http://www.php.net/fread($fp, $tab['rozmiar']); // Zamknięcie połączenia z serwerem http://www.php.net/fclose($fp); $tablica = http://www.php.net/unpack("Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*", $data); return $tablica[1]; } http://www.php.net/echo 'Opis: '.get_gg_status("xxx", "xxx", "4437900", $error).'<br />'; ?>
jesli ni pokazuje ci opisu sprobuj recznie wklepac numer serwera z ktorym ma sie laczyc. Umnie to zadzialalo mam jedynie klopot z kodowaniem polskich znaków
U mnie pomogło:
<?php http://www.php.net/preg_match(\"/s([d.]{8,16}):([d]{1,5})s/\", $buf, $adres); ?>
mam problem z wyświetlaniem polskich znaków, każdy jest wyświetlany jako znak zapytania w rombie (albo coś w tym stylu). może rozwiązał ktoś już ten problem?
a jak zrobic zeby pobrac pare opisow
bo jak tak zrobie pare razy z roznymi nr gg do sprawdenia to skrypt mysli albo nie pokazuje :/
echo ''.get_gg_status("***", "**", "**", $error).'<br>';
echo ''.get_gg_status("***", "**", "**", $error).'<br>';
echo ''.get_gg_status("***", "**", "**", $error).'<br>';
Witam,
troszkę zmodyfikowałem źródło na takie które działa, o to co wyszło:
Dobry, akurat czegoś takiego potrzebuje, ale wywala mi:
Witam Panowie,
Wybaczcie proszę offtopic, ale potrzebuję aktualnej (działającej) wersji tego skryptu. Prosiłbym o podesłanie
Pozdrawiam.
Jak mogłeś zauważyć ostatnia wiadomość w temacie miała miejsce 11 lat temu i dotyczyła problemów z funkcjonowaniem przedstawionego rozwiązania.
Obawiam się, że przez te 16 lat od kiedy pierwotny kod powstał, mogło mieć miejsce wiele zmian w funkcjonowaniu GG i jego protokołu - zwłaszcza, że po drodze zmienił się nie tylko komunikator ale i jego właściciel
Z tego co na szybko poszukałem, to biblioteka libgadu jest aktualizowana, więc w niej możesz szukać pomocy
https://github.com/wojtekka/libgadu
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)