Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Algorytmy, klasy, funkcje _ Pobieranie opisu z GaduGadu

Napisany przez: Bakus 3.10.2004, 00:26:42

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)

  1. <?php
  2. /* Skrypt napisany w oparciu o klasę www2gg (http://gg.wha.la/)
  3.  * i opis protokołu GaduGadu z projektu EKG (http://dev.null.pl/ekg/docs/protocol.html)
  4.  * Kod można dowolnie wykorzystać pod warunkiem pozostawienia niniejszego koment
  5. rza
  6.  * Kod jest udostępniony na zasadach OpenSource.
  7.  *
  8.  * @author: Krzysztof Andrzej Błachut vel Bakus <bakus@idn.net.pl>
  9.  * @copyright: 2004-2005 by Krzysztof Andrzej Błachut vel Bakus
  10.  * @package: OpisGG
  11.  * @version: 1.0
  12.  */
  13.  
  14. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  15.  
  16. function oblicz_hash ($haslo, $klucz)
  17. {
  18. $x0=0; $x1=0; $y0=0; $y1=0; $z=0; $tmp=0;
  19. $y0 = ($klucz << 16) >> 16; $y1 = $klucz >> 16 ;
  20. for ($i=0; $i<strlen($haslo); $i++)
  21. {
  22. $x0 = ($x0 & 0xFF00) | ord($haslo[$i]); $x1 &= 0xFFFF;
  23. $y0 ^= $x0; $y1 ^= $x1;
  24. $y0 += $x0; $y1 += $x1;
  25. $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
  26. $y0 ^= $x0; $y1 ^= $x1;
  27. $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
  28. $y0 -= $x0; $y1 -= $x1;
  29. $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
  30. $y0 ^= $x0; $y1 ^= $x1;
  31. $z = $y0 & 0x1F;
  32. $y0 &= 0xFFFF; $y1 &= 0xFFFF;
  33. if ($z <= 16)
  34. {
  35. $tmp= ($y1 << $z) | ($y0 >> (16-$z));
  36. $y0 = ($y1 >> (16-$z)) | ($y0 << $z);
  37. $y1 = $tmp;
  38. }else{
  39. $tmp= $y0 << ($z-16);
  40. $y0 = ($y0 >> (32-$z)) | ( (($y1 << $z) >> $z) << ($z-16) );
  41. $y1 = ($y1 >> (32-$z)) | $tmp;
  42. }
  43. $y0 &= 0xFFFF; $y1 &= 0xFFFF;
  44. }
  45. $hash = http://www.php.net/hexdec(http://www.php.net/sprintf(&#092;"%04x%04x\", $y1, $y0));
  46. http://www.php.net/settype($hash, 'integer');
  47. return $hash;
  48. }
  49.  
  50. /* Funkcja pobiera z serwera GaduGadu opis dla podanego numeru.
  51.  *
  52.  * @param int Numer GG \"bramki\"
  53.  * @param string Hasło GG \"bramki\"
  54.  * @param int Numer GG, którego opis funkcja ma pobrać
  55.  * @param var Zmienna w której umieszczony będzie ewentualny komunikat błęd
  56.  
  57.  * @return mixed Zawiera Opis numeru GG, lub false w przypadku błędu
  58.  */
  59. function get_gg_status($numer_gg, $haslo_gg, $szukany_numer, &$error)
  60. {
  61. // Ustawianie stałych na potrzeby protokołu
  62. http://www.php.net/define(&#092;"GG_LOGIN60\", 0x0015);
  63. http://www.php.net/define(&#092;"GG_STATUS_AVAIL\",  0x0002);
  64. http://www.php.net/define(&#092;"GG_LOGIN_OK\", 0x0003);
  65. http://www.php.net/define(&#092;"GG_NOTIFY\",  0x0010);
  66. http://www.php.net/define(&#092;"GG_USER_NORMAL\", 0x0003);
  67.  
  68. $fp = http://www.php.net/fsockopen( &#092;"appmsg.gadu-gadu.pl\", 80, $errno, $errmsg, 3 );
  69. if (!$fp)
  70. {
  71. $error = &#092;"BRAK POLACZENA Z APPMSG.GADU-GADU.PL, MOZE BYC PRZECIAZONY: \" . $errno . \" - \" . $errstr . \"n\";
  72. return false;
  73. }else{
  74. $get = &#092;"GET /appsvc/appmsg.asp?fmnumber=<$numer_gg> HTTP/1.0rn\";
  75. $get.= &#092;"Host: appmsg.gadu-gadu.plrn\";
  76. $get.= &#092;"User-Agent: Mozilla/4.7 [en] (Win98; I)rn\";
  77. $get.= &#092;"Pragma: no-cachernrn\";
  78. http://www.php.net/fputs($fp, $get);
  79. http://www.php.net/fgets($fp, 128);
  80. http://www.php.net/fgets($fp, 128);
  81. $buf = http://www.php.net/fgets($fp, 128);
  82. http://www.php.net/preg_match(&#092;"/s([d.]{8,16}):([d]{1,5})s/\", $buf, $adres);
  83. $host = $adres[1];
  84. $port = $adres[2];
  85. http://www.php.net/fclose($fp);
  86. }
  87.  
  88. // Ustanawianie połączenia z serwerem GG
  89. $fp = http://www.php.net/fsockopen($host, $port, $errno, $errstr, 10);
  90. if (!$fp)
  91. {
  92. $error = &#092;"PROBLEM Z POLACZENIEM: $errno - $errstrnn\";
  93. return false;
  94. }
  95. if (!$data = http://www.php.net/fread($fp, 12))
  96. {
  97. $error = &#092;"Polaczenie nieoczekiwanie zamknietenn\";
  98. return false;
  99. }
  100.  
  101. // Pobieranie danych z serwera - odbiór klucza do wygenerowania hasha hasła
  102. $tab = http://www.php.net/unpack(&#092;"Vtyp/Vrozmiar/Vklucz\", $data);
  103. // obliczanie hasha hasła
  104. $hash = oblicz_hash($haslo_gg, $tab['klucz']);
  105. $data = http://www.php.net/pack(&#092;"VVVVVVvVvVvCCa\".strlen(\"\"), GG_LOGIN60, 0x20 + strlen(\"\"),
  106. $numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , &#092;"\");
  107. // wysłanie hasha hasła
  108. http://www.php.net/fwrite($fp, $data);
  109. if (!$data1 = http://www.php.net/fread($fp, 8))
  110. {
  111. $error = &#092;"Nie rozpoznany bladn\";
  112. return false;
  113. }
  114. $tab = http://www.php.net/unpack(&#092;"Vlogin_status/Vrozmiar\", $data1);
  115. if($tab['login_status'] != GG_LOGIN_OK)
  116. {
  117. $error = &#092;"Nie prawidłowe hasło...nn\";
  118. return false;
  119. }
  120.  
  121. // Wysłanie listy kontaktów z jednym numerem
  122. $data = http://www.php.net/pack (&#092;"VVVC\",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
  123. if(!http://www.php.net/fwrite($fp,$data))
  124. {
  125. $error = &#092;"Blad wysylania listy kontaktownn\";
  126. return false;
  127. }
  128. // Odebranie pakietu ze specyfikacją następnego pakietu
  129. $data = http://www.php.net/fread($fp, 8);
  130. $tab = http://www.php.net/unpack(&#092;"Vtyp/Vrozmiar\", $data);
  131. // Pobranie pakietu opisu
  132. $data = http://www.php.net/fread($fp, $tab['rozmiar']);
  133. // Zamknięcie połączenia z serwerem
  134. http://www.php.net/fclose($fp);
  135. $tablica = http://www.php.net/unpack(&#092;"Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*\", $data);
  136. return $tablica[1];
  137. }
  138. ?>


UpDated (07.10.2004 01:07):
Zmieniłem "return substr($status_kontaktu, 15);" na nieco bardziej zaawansowany i skuteczny sposób wycinania niechcianych znaków...
Dzięki temu opisy nie są ucinane i nie zawierają śmieci...

UpDated (08.02.2005 14:45):
Coraz częściej dostaje PW o sposób użycia, więc...
Sposób użycia - wyświetlenie opisu numeru 1234567 (nasz numer to 2358764, a haslo to: zxcdews):
  1. <?php
  2. http://www.php.net/print get_gg_status(&#092;"2358764\", \"zxcdews\", \"1234567\", $error);
  3. ?>


UpDated (10.02.2005 04:31):
Status wyświetlany jest bez żadnych krzaków - zmianie uległ sposób wyciągania opisu z pakietu odbieranego z serwera...

UpDated (10.02.2005 05:16):
Zoptymalizowałem wyciąganie opisu z pakietu do 1 polecenia unpack...

Napisany przez: Tlenex 11.02.2005, 22:35:09

Jeszcze zapytanie: czy da się wyciągnąć obrazek numeru, który ma włączoną opcję "Tylko dla znajomych"? Jeśli tak, to jak?

Napisany przez: aleksander 12.02.2005, 00:14:11

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ąć smile.gif

pozdrawiam

Napisany przez: Chewolf 12.02.2005, 16:34:19

Cytat(aleksander @ 2005-02-12 00:14:11)
1. Czemu dwa razy definiujesz stałe?

To chyba jest jakiś przypadek... pomyłka. Wystarczy jak się raz zdefiniuje ... ale moge się mylić tongue.gif Wszystko jest możliwe.

Napisany przez: ikioloak 6.05.2005, 01:30:17

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?

Napisany przez: Bakus 6.05.2005, 01:35:51

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...

Napisany przez: xantio 11.11.2005, 16:46:23

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

Napisany przez: ikioloak 11.11.2005, 18:04:40

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

  1. <?php
  2.  
  3. $plik = http://www.php.net/fopen ("http://www.gadu-gadu.pl/users/status.asp?id=numer_gg&styl=2", "r"); 
  4. $status = http://www.php.net/fgets($plik, 2); 
  5. switch ($status) 
  6. { 
  7.  case 1: 
  8. http://www.php.net/echo '<IMG src="niedostepny.jpg">'; 
  9. break; 
  10.  case 2: 
  11. http://www.php.net/echo '<IMG src="dostepny.jpg">'; 
  12. break; 
  13.  case 3: 
  14. http://www.php.net/echo '<IMG src="wracam.jpg">'; 
  15. break; 
  16.  default: 
  17. // w razie błędu pokaże się obrazek error.jpg 
  18. http://www.php.net/echo '<IMG src="error.jpg">'; 
  19. break; 
  20. } 
  21. http://www.php.net/fclose($plik); 
  22.  
  23. ?>

Napisany przez: artee 13.11.2005, 00:21:49

Rozumiem, ze paczka do sprawdzania statusu jednej osoby, to:

  1. <?
  2. $data = http://www.php.net/pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
  3. ?>


A jak sie to ma do pobrania kilku numerow? Trzeba powtarzac wysylanie takiej paczki, czy mozna to zrobic za jednym razem?

Napisany przez: Bakus 15.11.2005, 02:46:50

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.

Napisany przez: dariusz_w 16.11.2005, 09:45:11

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

Napisany przez: ikioloak 16.11.2005, 15:57:44

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:

  1. <?php
  2.  
  3. $gg = new GaduEx();
  4. $opis = $gg->getOpis($twoj_gg,$twoje_haslo,$szukany_nr);
  5.  
  6. ?>

Napisany przez: GrayHat 12.03.2006, 23:41:29

troche odswieze temat.
skrypt obecnie nie dziala :/
zwraca cos takiego:

Cytat
Warning: unpack() [function.unpack]: Type V: not enough input, need 4, have 0 in /srv/www/htdocs/web792/html/blog/gg/gg.php on line 18

Warning: fread() [function.fread]: Length parameter must be greater than 0 in /srv/www/htdocs/web792/html/blog/gg/gg.php on line 20

Napisany przez: bim2 24.04.2006, 17:29:58

Odswiezam i mowie ze dziala. teraz przetestowalem

Napisany przez: elem84 19.06.2006, 18:39:56

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

Napisany przez: Balon 21.06.2006, 17:31:07

  1. <?php
  2. $numery = http://www.php.net/array( '2222', '3333', '4444' );
  3. foreach( $numery as $numer )
  4. {
  5. http://www.php.net/echo 'Numer: '.$numer.', Opis: '.get_gg_status("2358764", "zxcdews", $numer, $error).'<br />';
  6. }
  7. ?>

,.....

Napisany przez: bim2 21.06.2006, 17:36:55

Cytat(elem84 @ 19.06.2006, 17:39 ) *
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

W jednej sesji tongue.gif czyli nie ze zapętlisz skrypt. Tak sie raczej nie da ^^ Pytaj bakusa o to

Napisany przez: Bakus 26.06.2006, 10:53:35

Nie próbowałem rozwiązać pobierania wielu podpisów. Moja rada: eksperymentuj smile.gif

Napisany przez: Athlan 26.06.2006, 11:35:07

  1. <?php
  2. $szukany_numer = http://www.php.net/array(12345, 23456, 34567, 45678);
  3. foreach($szukany_numer as $hehe)
  4. {
  5. $data = http://www.php.net/pack ("VVVC",GG_NOTIFY, 5, $hehe, GG_USER_NORMAL);
  6. }
  7. ?>


tak ?

Napisany przez: bim2 29.06.2006, 15:53:06

A co to da? $data jest nadpisywana więc wezmie ostatni numer ;P

Napisany przez: Plikownik 9.07.2006, 12:12:59

skrypt nie działa - pokazuje mi się taki błąd - "PROBLEM Z POLACZENIEM: 111 - Connection refused"

Napisany przez: Athlan 12.07.2006, 08:24:35

bim2 to może tak:

  1. <?php
  2. $wyniki_dzialania = http://www.php.net/array();
  3. $szukany_numer = http://www.php.net/array(12345, 23456, 34567, 45678);
  4. foreach($szukany_numer as $hehe)
  5. {
  6. 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)));
  7. }
  8. ?>


i potem opisy są zwranace w tablicy: numerek => opisik smile.gif

masz problem ;p

Napisany przez: bim2 13.07.2006, 07:53:32

No tak sie teraz da winksmiley.jpg Tylko nie testowalem tego i nie wiem czy zadziala winksmiley.jpg Napisz coś więcej czy działa smile.gif

Napisany przez: Athlan 14.07.2006, 18:24:56

@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:

  1. <?php
  2. foreach($szukany_numer as $numer)
  3. {
  4. http://www.php.net/echo $numer.' ma opis '.$wyniki_dzialania[$numer].'<br />';
  5. }
  6. ?>


wylistuje nam cały wynik smile.gif

pozdro smile.gif

Napisany przez: bim2 18.07.2006, 08:45:07

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ć biggrin.gif

Napisany przez: Athlan 18.07.2006, 08:56:30

@bim2:

Cytat
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.

Napisany przez: DooBLER 13.09.2006, 19:55:00

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

Napisany przez: bim2 14.09.2006, 18:48:55

Wiem że to głupie ale daj @ przed unpack (@unpack()) I powinno zadziałac haha.gif Ale to jest najprostrze wyjście z sytuacji i może jest baredzije profesjonalne

Napisany przez: DooBLER 15.09.2006, 19:21:17

Cytat(bim2 @ 14.09.2006, 19:48:55 ) *
Wiem że to głupie ale daj @ przed unpack (@unpack()) I powinno zadziałac haha.gif Ale to jest najprostrze wyjście z sytuacji i może jest baredzije profesjonalne


Hehe tak zrobiłem już wczesniej, ale pomyślałem, że nie zaszkodzi zapytać "tęgie głowy" o jakieś bardziej profesionalne rozwiązanie tego problemu.

Myślałem żeby wyciągnąć status przed opisem i wtedy (o ile status rozdziela np "dostepny" != "dostępny z opisem") dać tylko if czy ma rozpakowywać opis czy nie.

Ale jeszcze mam za małego skill'a na zabawe z tymi pakieami aarambo.gif

Pozdrawiam

Napisany przez: bastek8989 20.12.2006, 16:13:35

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']);

:|

Napisany przez: kossa 20.12.2006, 16:16:58

co masz linię wyżej?

a to może:

  1. <?php
  2. $hash = oblicz_hash($haslo_gg, $tab["klucz"]);
  3. ?>


Łukasz

Napisany przez: bastek8989 20.12.2006, 16:50:58

to nie to ^^ przeciez niewyswietla ze jest blad w zapisie

nic sam niedopisywalem - wszystko mam tak jak podane w tym poscie

Napisany przez: Sabistik 20.12.2006, 16:56:52

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.

Napisany przez: ali3n 24.12.2006, 05:35:29

  1. <?php
  2. /* Skrypt napisany w oparciu o klasę www2gg (http://gg.wha.la/)
  3.  * i opis protokołu GaduGadu z projektu EKG (http://dev.null.pl/ekg/docs/protocol.html)
  4.  * Kod można dowolnie wykorzystać pod warunkiem pozostawienia niniejszego koment
    arza
  5.  * Kod jest udostępniony na zasadach OpenSource.
  6.  *
  7.  * @author: Krzysztof Andrzej Błachut vel Bakus <bakus@idn.net.pl>
  8.  * @copyright: 2004-2005 by Krzysztof Andrzej Błachut vel Bakus
  9.  * @package: OpisGG
  10.  * @version: 1.0
  11.  */
  12.  
  13. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  14.  
  15. function oblicz_hash ($haslo, $klucz)
  16. {
  17. $x0=0; $x1=0; $y0=0; $y1=0; $z=0; $tmp=0;
  18. $y0 = ($klucz << 16) >> 16; $y1 = $klucz >> 16 ;
  19. for ($i=0; $i<strlen($haslo); $i++)
  20. {
  21. $x0 = ($x0 & 0xFF00) | ord($haslo[$i]); $x1 &= 0xFFFF;
  22. $y0 ^= $x0; $y1 ^= $x1;
  23. $y0 += $x0; $y1 += $x1;
  24. $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
  25. $y0 ^= $x0; $y1 ^= $x1;
  26. $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
  27. $y0 -= $x0; $y1 -= $x1;
  28. $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
  29. $y0 ^= $x0; $y1 ^= $x1;
  30. $z = $y0 & 0x1F;
  31. $y0 &= 0xFFFF; $y1 &= 0xFFFF;
  32. if ($z <= 16)
  33. {
  34. $tmp= ($y1 << $z) | ($y0 >> (16-$z));
  35. $y0 = ($y1 >> (16-$z)) | ($y0 << $z);
  36. $y1 = $tmp;
  37. }else{
  38. $tmp= $y0 << ($z-16);
  39. $y0 = ($y0 >> (32-$z)) | ( (($y1 << $z) >> $z) << ($z-16) );
  40. $y1 = ($y1 >> (32-$z)) | $tmp;
  41. }
  42. $y0 &= 0xFFFF; $y1 &= 0xFFFF;
  43. }
  44. $hash = http://www.php.net/hexdec(http://www.php.net/sprintf("%04x%04x", $y1, $y0));
  45. http://www.php.net/settype($hash, 'integer');
  46. return $hash;
  47. }
  48.  
  49. /* Funkcja pobiera z serwera GaduGadu opis dla podanego numeru.
  50.  *
  51.  * @param int Numer GG "bramki"
  52.  * @param string Hasło GG "bramki"
  53.  * @param int Numer GG, którego opis funkcja ma pobrać
  54.  * @param var Zmienna w której umieszczony będzie ewentualny komunikat błędu
  55.  * @return mixed Zawiera Opis numeru GG, lub false w przypadku błędu
  56.  */
  57. function get_gg_status($numer_gg, $haslo_gg, $szukany_numer, &$error)
  58. {
  59. // Ustawianie stałych na potrzeby protokołu
  60. http://www.php.net/define("GG_LOGIN60", 0x0015);
  61. http://www.php.net/define("GG_STATUS_AVAIL",  0x0002);
  62. http://www.php.net/define("GG_LOGIN_OK", 0x0003);
  63. http://www.php.net/define("GG_NOTIFY",  0x0010);
  64. http://www.php.net/define("GG_USER_NORMAL", 0x0003);
  65.  
  66. $fp = http://www.php.net/fsockopen( "appmsg.gadu-gadu.pl", 80, $errno, $errmsg, 3 );
  67. if (!$fp)
  68. {
  69. $error = "BRAK POLACZENA Z APPMSG.GADU-GADU.PL, MOZE BYC PRZECIAZONY: " . $errno . " - " . $errstr . "n";
  70. return false;
  71. }else{
  72. $get = "GET /appsvc/appmsg.asp?fmnumber=<$numer_gg> HTTP/1.0rn";
  73. $get.= "Host: appmsg.gadu-gadu.plrn";
  74. $get.= "User-Agent: Mozilla/4.7 [en] (Win98; I)rn";
  75. $get.= "Pragma: no-cachernrn";
  76. http://www.php.net/fputs($fp, $get);
  77. http://www.php.net/fgets($fp, 128);
  78. http://www.php.net/fgets($fp, 128);
  79. $buf = http://www.php.net/fgets($fp, 128);
  80. http://www.php.net/preg_match("/s([d.]{8,16}):([d]{1,5})s/", $buf, $adres);
  81. $host = $adres[1];
  82. $port = $adres[2];
  83. http://www.php.net/fclose($fp);
  84. }
  85.  
  86. // Ustanawianie połączenia z serwerem GG
  87. $fp = http://www.php.net/fsockopen($host, $port, $errno, $errstr, 10);
  88. if (!$fp)
  89. {
  90. $error = "PROBLEM Z POLACZENIEM: $errno - $errstrnn";
  91. return false;
  92. }
  93. if (!$data = http://www.php.net/fread($fp, 12))
  94. {
  95. $error = "Polaczenie nieoczekiwanie zamknietenn";
  96. return false;
  97. }
  98.  
  99. // Pobieranie danych z serwera - odbiór klucza do wygenerowania hasha hasła
  100. $tab = http://www.php.net/unpack("Vtyp/Vrozmiar/Vklucz", $data);
  101. // obliczanie hasha hasła
  102. $hash = oblicz_hash($haslo_gg, $tab['klucz']);
  103. $data = http://www.php.net/pack("VVVVVVvVvVvCCa".http://www.php.net/strlen(""), GG_LOGIN60, 0x20 + http://www.php.net/strlen(""),
  104. $numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , "");
  105. // wysłanie hasha hasła
  106. http://www.php.net/fwrite($fp, $data);
  107. if (!$data1 = http://www.php.net/fread($fp, 8))
  108. {
  109. $error = "Nie rozpoznany bladn";
  110. return false;
  111. }
  112. $tab = http://www.php.net/unpack("Vlogin_status/Vrozmiar", $data1);
  113. if($tab['login_status'] != GG_LOGIN_OK)
  114. {
  115. $error = "Nie prawidłowe hasło...nn";
  116. return false;
  117. }
  118.  
  119. // Wysłanie listy kontaktów z jednym numerem
  120. $data = http://www.php.net/pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
  121. if(!http://www.php.net/fwrite($fp,$data))
  122. {
  123. $error = "Blad wysylania listy kontaktownn";
  124. return false;
  125. }
  126. // Odebranie pakietu ze specyfikacją następnego pakietu
  127. $data = http://www.php.net/fread($fp, 8);
  128. $tab = http://www.php.net/unpack("Vtyp/Vrozmiar", $data);
  129. // Pobranie pakietu opisu
  130. $data = http://www.php.net/fread($fp, $tab['rozmiar']);
  131. // Zamknięcie połączenia z serwerem
  132. http://www.php.net/fclose($fp);
  133. $tablica = http://www.php.net/unpack("Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*", $data);
  134. return $tablica[1];
  135. }
  136. ?>

poprawiłem kod , ale nie sprawdzałem:P

Napisany przez: sagittariuspl 3.01.2007, 20:01:04

użyłem tego skryptu, ale nie działa. może jakieś sugestie?

Napisany przez: Raynold 9.01.2007, 05:18:22

Ż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 winksmiley.jpg

Napisany przez: krl_b 12.03.2007, 00:25:03

działało działało i przestało blink.gif
Fatal error: Maximum execution time of 60 seconds exceeded in ... on line
w tej lini:

  1. <?php
  2. $data = http://www.php.net/fread($fp, 8);
  3. ?>

potem znów zadziałało pare razy (na localhoście) i po uploadzie padło na hoście w internecie blinksmiley.gif
allow_url_fopen włączone na localu i w necie.

ktoś może coś poradzić?

Napisany przez: suda 27.03.2007, 11:25:56

Nigdy nie byłem dobry z wyrażeń ale preg z linii 80 wygląda tak:

  1. <?php
  2. http://www.php.net/preg_match("/s([d.]{8,16}):([d]{1,5})s/", $buf, $adres);
  3. ?>

a powinien wyglądać tak:
Kod
preg_match("/\s([\d.]{8,16}):([\d]{1,5})\s/", $buf, $adres);

ten highlighter forum przy PHP się coś kiełbasi i backslashe usuwa

Napisany przez: mathewoosh 12.04.2007, 08:02:10

a jak mi pisze ze

Cytat
Nie rozpoznany blad
questionmark.gif wszystkie dotychczasowe sprawy ujalem. na jednym serwerze wszystko chodzi ladnie i pieknie a na drugim niebardzo..

Napisany przez: soon 18.07.2007, 17:16:33

Niestety poniższy kod nie zwraca mi żadnej wartości, nie wyświetla też żadnych błędów

  1. <?php
  2. /* Skrypt napisany w oparciu o klasę www2gg (http://gg.wha.la/)
  3.  * i opis protokołu GaduGadu z projektu EKG (http://dev.null.pl/ekg/docs/protocol.html)
  4.  * Kod można dowolnie wykorzystać pod warunkiem pozostawienia niniejszego koment
    arza
  5.  * Kod jest udostępniony na zasadach OpenSource.
  6.  *
  7.  * @author: Krzysztof Andrzej Błachut vel Bakus <bakus@idn.net.pl>
  8.  * @copyright: 2004-2005 by Krzysztof Andrzej Błachut vel Bakus
  9.  * @package: OpisGG
  10.  * @version: 1.0
  11.  */
  12.  
  13. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  14.  
  15. function oblicz_hash ($haslo, $klucz)
  16. {
  17. $x0=0; $x1=0; $y0=0; $y1=0; $z=0; $tmp=0;
  18. $y0 = ($klucz << 16) >> 16; $y1 = $klucz >> 16 ;
  19. for ($i=0; $i<strlen($haslo); $i++)
  20. {
  21. $x0 = ($x0 & 0xFF00) | ord($haslo[$i]); $x1 &= 0xFFFF;
  22. $y0 ^= $x0; $y1 ^= $x1;
  23. $y0 += $x0; $y1 += $x1;
  24. $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
  25. $y0 ^= $x0; $y1 ^= $x1;
  26. $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
  27. $y0 -= $x0; $y1 -= $x1;
  28. $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
  29. $y0 ^= $x0; $y1 ^= $x1;
  30. $z = $y0 & 0x1F;
  31. $y0 &= 0xFFFF; $y1 &= 0xFFFF;
  32. if ($z <= 16)
  33. {
  34. $tmp= ($y1 << $z) | ($y0 >> (16-$z));
  35. $y0 = ($y1 >> (16-$z)) | ($y0 << $z);
  36. $y1 = $tmp;
  37. }else{
  38. $tmp= $y0 << ($z-16);
  39. $y0 = ($y0 >> (32-$z)) | ( (($y1 << $z) >> $z) << ($z-16) );
  40. $y1 = ($y1 >> (32-$z)) | $tmp;
  41. }
  42. $y0 &= 0xFFFF; $y1 &= 0xFFFF;
  43. }
  44. $hash = http://www.php.net/hexdec(http://www.php.net/sprintf("%04x%04x", $y1, $y0));
  45. http://www.php.net/settype($hash, 'integer');
  46. return $hash;
  47. }
  48.  
  49. /* Funkcja pobiera z serwera GaduGadu opis dla podanego numeru.
  50.  *
  51.  * @param int Numer GG "bramki"
  52.  * @param string Hasło GG "bramki"
  53.  * @param int Numer GG, którego opis funkcja ma pobrać
  54.  * @param var Zmienna w której umieszczony będzie ewentualny komunikat błędu
  55.  * @return mixed Zawiera Opis numeru GG, lub false w przypadku błędu
  56.  */
  57. function get_gg_status($numer_gg, $haslo_gg, $szukany_numer, &$error)
  58. {
  59. // Ustawianie stałych na potrzeby protokołu
  60. http://www.php.net/define("GG_LOGIN60", 0x0015);
  61. http://www.php.net/define("GG_STATUS_AVAIL",  0x0002);
  62. http://www.php.net/define("GG_LOGIN_OK", 0x0003);
  63. http://www.php.net/define("GG_NOTIFY",  0x0010);
  64. http://www.php.net/define("GG_USER_NORMAL", 0x0003);
  65.  
  66. $fp = http://www.php.net/fsockopen( "appmsg.gadu-gadu.pl", 80, $errno, $errmsg, 3 );
  67. if (!$fp)
  68. {
  69. $error = "BRAK POLACZENA Z APPMSG.GADU-GADU.PL, MOZE BYC PRZECIAZONY: " . $errno . " - " . $errstr . "n";
  70. return false;
  71. }else{
  72. $get = "GET /appsvc/appmsg.asp?fmnumber=<$numer_gg> HTTP/1.0rn";
  73. $get.= "Host: appmsg.gadu-gadu.plrn";
  74. $get.= "User-Agent: Mozilla/4.7 [en] (Win98; I)rn";
  75. $get.= "Pragma: no-cachernrn";
  76. http://www.php.net/fputs($fp, $get);
  77. http://www.php.net/fgets($fp, 128);
  78. http://www.php.net/fgets($fp, 128);
  79. $buf = http://www.php.net/fgets($fp, 128);
  80. http://www.php.net/preg_match("/s([d.]{8,16}):([d]{1,5})s/", $buf, $adres);
  81. $host = $adres[1];
  82. $port = $adres[2];
  83. http://www.php.net/fclose($fp);
  84. }
  85.  
  86. // Ustanawianie połączenia z serwerem GG
  87. $fp = http://www.php.net/fsockopen($host, $port, $errno, $errstr, 10);
  88. if (!$fp)
  89. {
  90. $error = "PROBLEM Z POLACZENIEM: $errno - $errstrnn";
  91. return false;
  92. }
  93. if (!$data = http://www.php.net/fread($fp, 12))
  94. {
  95. $error = "Polaczenie nieoczekiwanie zamknietenn";
  96. return false;
  97. }
  98.  
  99. // Pobieranie danych z serwera - odbiór klucza do wygenerowania hasha hasła
  100. $tab = http://www.php.net/unpack("Vtyp/Vrozmiar/Vklucz", $data);
  101. // obliczanie hasha hasła
  102. $hash = oblicz_hash($haslo_gg, $tab['klucz']);
  103. $data = http://www.php.net/pack("VVVVVVvVvVvCCa".http://www.php.net/strlen(""), GG_LOGIN60, 0x20 + http://www.php.net/strlen(""),
  104. $numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , "");
  105. // wysłanie hasha hasła
  106. http://www.php.net/fwrite($fp, $data);
  107. if (!$data1 = http://www.php.net/fread($fp, 8))
  108. {
  109. $error = "Nie rozpoznany bladn";
  110. return false;
  111. }
  112. $tab = http://www.php.net/unpack("Vlogin_status/Vrozmiar", $data1);
  113. if($tab['login_status'] != GG_LOGIN_OK)
  114. {
  115. $error = "Nie prawidłowe hasło...nn";
  116. return false;
  117. }
  118.  
  119. // Wysłanie listy kontaktów z jednym numerem
  120. $data = http://www.php.net/pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
  121. if(!http://www.php.net/fwrite($fp,$data))
  122. {
  123. $error = "Blad wysylania listy kontaktownn";
  124. return false;
  125. }
  126. // Odebranie pakietu ze specyfikacją następnego pakietu
  127. $data = http://www.php.net/fread($fp, 8);
  128. $tab = http://www.php.net/unpack("Vtyp/Vrozmiar", $data);
  129. // Pobranie pakietu opisu
  130. $data = http://www.php.net/fread($fp, $tab['rozmiar']);
  131. // Zamknięcie połączenia z serwerem
  132. http://www.php.net/fclose($fp);
  133. $tablica = http://www.php.net/unpack("Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*", $data);
  134. return $tablica[1];
  135. }
  136.  
  137. http://www.php.net/echo 'Opis: '.get_gg_status("xxx", "xxx", "4437900", $error).'<br />';
  138. ?>

Napisany przez: mekeke2 3.01.2008, 14:15:49

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

Napisany przez: Trojan 17.01.2008, 00:18:28

U mnie pomogło:

Cytat(suda @ 27.03.2007, 11:25:56 ) *
Nigdy nie byłem dobry z wyrażeń ale preg z linii 80 wygląda tak:
  1. <?php
  2. http://www.php.net/preg_match(&#092;"/s([d.]{8,16}):([d]{1,5})s/\", $buf, $adres);
  3. ?>

a powinien wyglądać tak:
Kod
preg_match("/\s([\d.]{8,16}):([\d]{1,5})\s/", $buf, $adres);

ten highlighter forum przy PHP się coś kiełbasi i backslashe usuwa

Napisany przez: anty 11.03.2008, 18:51:20

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? smile.gif

Napisany przez: icetab 24.05.2008, 21:26:41

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>';

Napisany przez: chez 6.06.2008, 12:00:21

Witam,
troszkę zmodyfikowałem źródło na takie które działa, o to co wyszło:

Kod
<?php
    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 = hexdec(sprintf("%04x%04x", $y1, $y0));
        settype($hash, 'integer');
        return $hash;
    }
    function get_gg_status($numer_gg, $haslo_gg, $szukany_numer, &$error)
    {
        define("GG_LOGIN60",        0x0015);
        define("GG_STATUS_AVAIL",   0x0002);
        define("GG_LOGIN_OK",        0x0003);
        define("GG_NOTIFY",         0x0010);
        define("GG_USER_NORMAL",    0x0003);
        $fp = fsockopen("91.197.13.24", 8074, $errno, $errstr, 10);
        if (!$fp)
        {
            $error = "PROBLEM Z POLACZENIEM: $errno - $errstr\n\n";
            return false;
        }
        if (!$data = fread($fp, 12))
        {
            $error = "Polaczenie nieoczekiwanie zamkniete\n\n";
            return false;
        }
        $tab = unpack("Vtyp/Vrozmiar/Vklucz", $data);
        $hash = oblicz_hash($haslo_gg, $tab['klucz']);
        $data = pack("VVVVVVvVvVvCCa".strlen(""), GG_LOGIN60, 0x20 + strlen(""),
        $numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , "");
        fwrite($fp, $data);
        if (!$data1 = fread($fp, 8))
        {
            $error = "Nie rozpoznany blad\n";
            return false;
        }
        $tab = unpack("Vlogin_status/Vrozmiar", $data1);
        if($tab['login_status'] != GG_LOGIN_OK)
        {
            $error = "Nie prawidłowe hasło...\n\n";
            return false;
        }
        $data = pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
        if(!fwrite($fp,$data))
        {
            $error = "Blad wysylania listy kontaktow\n\n";
            return false;
        }
        $data = fread($fp, 8);
        $tab = unpack("Vtyp/Vrozmiar", $data);
        $data = fread($fp, $tab['rozmiar']);
        fclose($fp);
        $tablica = @unpack("Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*", $data);
        return $tablica[1];
    }
    
    function getOpis($numerBramki, $hasloBramki, $numerSpr){
            $dostepny = '<img src="http://www.gadu-gadu.pl/users/status.asp?id='.$numerSpr.'&styl=3">';
        if (get_gg_status($numerBramki, $hasloBramki, $numerSpr, $error) == '')
        {
            $getOpis = '';
        } else {
            $getOpis = 'Z opisem: '.get_gg_status($numerBramki, $hasloBramki, $numerSpr, $error);
        }
            $opis = 'W tej chwili jestem: '.$dostepny.' <br /> '.$getOpis.'<br />';
            return $opis;
        }


?>



Sposób użycia:
Kod
echo getOpis('numer_bramki', 'haslo_bramki', 'nr_gg_do_sprawdzenia');



Źródło dostępne również pod adresem:
http://chez.ovh.org/opis.phps

Napisany przez: dadexix 15.04.2009, 21:35:08

Dobry, akurat czegoś takiego potrzebuje, ale wywala mi:

Cytat
Warning: fsockopen() [function.fsockopen]: unable to connect to 91.197.13.24:8074 (Connection timed out) in /home/a3880550/public_html/index.php on line 42

jak już wyczytałem, pewnie nie działa bo pozmieniali coś w gg... ale pytam - działa czy ja coś źle robie?

A jak nie działa, istnieje coś co działa?

Z góry, dzięki:))

Napisany przez: sebxx4 8.03.2020, 11:29:49

Witam Panowie,
Wybaczcie proszę offtopic, ale potrzebuję aktualnej (działającej) wersji tego skryptu. Prosiłbym o podesłanie smile.gif

Pozdrawiam.

Napisany przez: Bakus 9.03.2020, 17:38:16

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 wink.gif

Z tego co na szybko poszukałem, to biblioteka libgadu jest aktualizowana, więc w niej możesz szukać pomocy smile.gif
https://github.com/wojtekka/libgadu

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)