Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie opisu z GaduGadu
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Bakus
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 Skrypty do generowania sygnaturek, na grafikach)

  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 = hexdec(sprintf(&#092;"%04x%04x\", $y1, $y0));
  46. 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. define(&#092;"GG_LOGIN60\", 0x0015);
  63. define(&#092;"GG_STATUS_AVAIL\",  0x0002);
  64. define(&#092;"GG_LOGIN_OK\", 0x0003);
  65. define(&#092;"GG_NOTIFY\",  0x0010);
  66. define(&#092;"GG_USER_NORMAL\", 0x0003);
  67.  
  68. $fp = 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. fputs($fp, $get);
  79. fgets($fp, 128);
  80. fgets($fp, 128);
  81. $buf = fgets($fp, 128);
  82. preg_match(&#092;"/s([d.]{8,16}):([d]{1,5})s/\", $buf, $adres);
  83. $host = $adres[1];
  84. $port = $adres[2];
  85. fclose($fp);
  86. }
  87.  
  88. // Ustanawianie połączenia z serwerem GG
  89. $fp = 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 = 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 = unpack(&#092;"Vtyp/Vrozmiar/Vklucz\", $data);
  103. // obliczanie hasha hasła
  104. $hash = oblicz_hash($haslo_gg, $tab['klucz']);
  105. $data = 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. fwrite($fp, $data);
  109. if (!$data1 = fread($fp, 8))
  110. {
  111. $error = &#092;"Nie rozpoznany bladn\";
  112. return false;
  113. }
  114. $tab = 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 = pack (&#092;"VVVC\",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
  123. if(!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 = fread($fp, 8);
  130. $tab = unpack(&#092;"Vtyp/Vrozmiar\", $data);
  131. // Pobranie pakietu opisu
  132. $data = fread($fp, $tab['rozmiar']);
  133. // Zamknięcie połączenia z serwerem
  134. fclose($fp);
  135. $tablica = 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. 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...
Tlenex
Jeszcze zapytanie: czy da się wyciągnąć obrazek numeru, który ma włączoną opcję "Tylko dla znajomych"? Jeśli tak, to jak?
aleksander
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
Chewolf
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.
ikioloak
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?
Bakus
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...
xantio
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
ikioloak
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 = fopen ("http://www.gadu-gadu.pl/users/status.asp?id=numer_gg&styl=2", "r"); 
  4. $status = fgets($plik, 2); 
  5. switch ($status) 
  6. { 
  7.  case 1: 
  8. echo '<IMG src="niedostepny.jpg">'; 
  9. break; 
  10.  case 2: 
  11. echo '<IMG src="dostepny.jpg">'; 
  12. break; 
  13.  case 3: 
  14. echo '<IMG src="wracam.jpg">'; 
  15. break; 
  16.  default: 
  17. // w razie błędu pokaże się obrazek error.jpg 
  18. echo '<IMG src="error.jpg">'; 
  19. break; 
  20. } 
  21. fclose($plik); 
  22.  
  23. ?>
artee
Rozumiem, ze paczka do sprawdzania statusu jednej osoby, to:

  1. <?
  2. $data = 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?
Bakus
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.
dariusz_w
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
ikioloak
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 Tutaj.
Jak skorzystac:
  1. <?php
  2.  
  3. $gg = new GaduEx();
  4. $opis = $gg->getOpis($twoj_gg,$twoje_haslo,$szukany_nr);
  5.  
  6. ?>
GrayHat
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
bim2
Odswiezam i mowie ze dziala. teraz przetestowalem
elem84
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
Balon
  1. <?php
  2. $numery = array( '2222', '3333', '4444' );
  3. foreach( $numery as $numer )
  4. {
  5. echo 'Numer: '.$numer.', Opis: '.get_gg_status("2358764", "zxcdews", $numer, $error).'<br />';
  6. }
  7. ?>

,.....
bim2
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
Bakus
Nie próbowałem rozwiązać pobierania wielu podpisów. Moja rada: eksperymentuj smile.gif
Athlan
  1. <?php
  2. $szukany_numer = array(12345, 23456, 34567, 45678);
  3. foreach($szukany_numer as $hehe)
  4. {
  5. $data = pack ("VVVC",GG_NOTIFY, 5, $hehe, GG_USER_NORMAL);
  6. }
  7. ?>


tak ?
bim2
A co to da? $data jest nadpisywana więc wezmie ostatni numer ;P
Plikownik
skrypt nie działa - pokazuje mi się taki błąd - "PROBLEM Z POLACZENIEM: 111 - Connection refused"
Athlan
bim2 to może tak:

  1. <?php
  2. $wyniki_dzialania = array();
  3. $szukany_numer = array(12345, 23456, 34567, 45678);
  4. foreach($szukany_numer as $hehe)
  5. {
  6. array_push($wyniki_dzialania, array($szukany_numer => 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
bim2
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
Athlan
@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. echo $numer.' ma opis '.$wyniki_dzialania[$numer].'<br />';
  5. }
  6. ?>


wylistuje nam cały wynik smile.gif

pozdro smile.gif
bim2
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
Athlan
@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.
DooBLER
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
bim2
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
DooBLER
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
bastek8989
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']);

:|
kossa
co masz linię wyżej?

a to może:

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


Łukasz
bastek8989
to nie to ^^ przeciez niewyswietla ze jest blad w zapisie

nic sam niedopisywalem - wszystko mam tak jak podane w tym poscie
Sabistik
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.
ali3n
  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 = hexdec(sprintf("%04x%04x", $y1, $y0));
  45. 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. define("GG_LOGIN60", 0x0015);
  61. define("GG_STATUS_AVAIL",  0x0002);
  62. define("GG_LOGIN_OK", 0x0003);
  63. define("GG_NOTIFY",  0x0010);
  64. define("GG_USER_NORMAL", 0x0003);
  65.  
  66. $fp = 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. fputs($fp, $get);
  77. fgets($fp, 128);
  78. fgets($fp, 128);
  79. $buf = fgets($fp, 128);
  80. preg_match("/s([d.]{8,16}):([d]{1,5})s/", $buf, $adres);
  81. $host = $adres[1];
  82. $port = $adres[2];
  83. fclose($fp);
  84. }
  85.  
  86. // Ustanawianie połączenia z serwerem GG
  87. $fp = fsockopen($host, $port, $errno, $errstr, 10);
  88. if (!$fp)
  89. {
  90. $error = "PROBLEM Z POLACZENIEM: $errno - $errstrnn";
  91. return false;
  92. }
  93. if (!$data = 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 = unpack("Vtyp/Vrozmiar/Vklucz", $data);
  101. // obliczanie hasha hasła
  102. $hash = oblicz_hash($haslo_gg, $tab['klucz']);
  103. $data = pack("VVVVVVvVvVvCCa".strlen(""), GG_LOGIN60, 0x20 + strlen(""),
  104. $numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , "");
  105. // wysłanie hasha hasła
  106. fwrite($fp, $data);
  107. if (!$data1 = fread($fp, 8))
  108. {
  109. $error = "Nie rozpoznany bladn";
  110. return false;
  111. }
  112. $tab = 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 = pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
  121. if(!fwrite($fp,$data))
  122. {
  123. $error = "Blad wysylania listy kontaktownn";
  124. return false;
  125. }
  126. // Odebranie pakietu ze specyfikacją następnego pakietu
  127. $data = fread($fp, 8);
  128. $tab = unpack("Vtyp/Vrozmiar", $data);
  129. // Pobranie pakietu opisu
  130. $data = fread($fp, $tab['rozmiar']);
  131. // Zamknięcie połączenia z serwerem
  132. fclose($fp);
  133. $tablica = 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
sagittariuspl
użyłem tego skryptu, ale nie działa. może jakieś sugestie?
Raynold
Ż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ą tego 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
krl_b
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 = 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ć?
suda
Nigdy nie byłem dobry z wyrażeń ale preg z linii 80 wygląda tak:
  1. <?php
  2. 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
mathewoosh
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..
soon
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 = hexdec(sprintf("%04x%04x", $y1, $y0));
  45. 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. define("GG_LOGIN60", 0x0015);
  61. define("GG_STATUS_AVAIL",  0x0002);
  62. define("GG_LOGIN_OK", 0x0003);
  63. define("GG_NOTIFY",  0x0010);
  64. define("GG_USER_NORMAL", 0x0003);
  65.  
  66. $fp = 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. fputs($fp, $get);
  77. fgets($fp, 128);
  78. fgets($fp, 128);
  79. $buf = fgets($fp, 128);
  80. preg_match("/s([d.]{8,16}):([d]{1,5})s/", $buf, $adres);
  81. $host = $adres[1];
  82. $port = $adres[2];
  83. fclose($fp);
  84. }
  85.  
  86. // Ustanawianie połączenia z serwerem GG
  87. $fp = fsockopen($host, $port, $errno, $errstr, 10);
  88. if (!$fp)
  89. {
  90. $error = "PROBLEM Z POLACZENIEM: $errno - $errstrnn";
  91. return false;
  92. }
  93. if (!$data = 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 = unpack("Vtyp/Vrozmiar/Vklucz", $data);
  101. // obliczanie hasha hasła
  102. $hash = oblicz_hash($haslo_gg, $tab['klucz']);
  103. $data = pack("VVVVVVvVvVvCCa".strlen(""), GG_LOGIN60, 0x20 + strlen(""),
  104. $numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , "");
  105. // wysłanie hasha hasła
  106. fwrite($fp, $data);
  107. if (!$data1 = fread($fp, 8))
  108. {
  109. $error = "Nie rozpoznany bladn";
  110. return false;
  111. }
  112. $tab = 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 = pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
  121. if(!fwrite($fp,$data))
  122. {
  123. $error = "Blad wysylania listy kontaktownn";
  124. return false;
  125. }
  126. // Odebranie pakietu ze specyfikacją następnego pakietu
  127. $data = fread($fp, 8);
  128. $tab = unpack("Vtyp/Vrozmiar", $data);
  129. // Pobranie pakietu opisu
  130. $data = fread($fp, $tab['rozmiar']);
  131. // Zamknięcie połączenia z serwerem
  132. fclose($fp);
  133. $tablica = unpack("Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*", $data);
  134. return $tablica[1];
  135. }
  136.  
  137. echo 'Opis: '.get_gg_status("xxx", "xxx", "4437900", $error).'<br />';
  138. ?>
mekeke2
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
Trojan
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. 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
anty
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
icetab
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>';
chez
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
dadexix
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:))
sebxx4
Witam Panowie,
Wybaczcie proszę offtopic, ale potrzebuję aktualnej (działającej) wersji tego skryptu. Prosiłbym o podesłanie smile.gif

Pozdrawiam.
Bakus
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.