Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> Pobieranie opisu z GaduGadu, Funkcja, PHP 4 i 5
Bakus
post
Post #1


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Tlenex
post
Post #2





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 6.02.2005

Ostrzeżenie: (0%)
-----


Jeszcze zapytanie: czy da się wyciągnąć obrazek numeru, który ma włączoną opcję "Tylko dla znajomych"? Jeśli tak, to jak?
Go to the top of the page
+Quote Post
aleksander
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

Ostrzeżenie: (0%)
-----


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ąć (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

pozdrawiam
Go to the top of the page
+Quote Post
Chewolf
post
Post #4





Grupa: Zarejestrowani
Postów: 335
Pomógł: 0
Dołączył: 15.11.2003

Ostrzeżenie: (0%)
-----


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ć (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Wszystko jest możliwe.
Go to the top of the page
+Quote Post
ikioloak
post
Post #5





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Bakus
post
Post #6


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
xantio
post
Post #7





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 11.11.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
ikioloak
post
Post #8





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

Ostrzeżenie: (0%)
-----


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


Ten post edytował ikioloak 12.11.2005, 15:05:49
Go to the top of the page
+Quote Post
artee
post
Post #9





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 13.11.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Bakus
post
Post #10


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
dariusz_w
post
Post #11





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 16.11.2005
Skąd: Żary

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
ikioloak
post
Post #12





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
GrayHat
post
Post #13





Grupa: Zarejestrowani
Postów: 566
Pomógł: 18
Dołączył: 23.08.2003
Skąd: Łomża

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
bim2
post
Post #14





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Odswiezam i mowie ze dziala. teraz przetestowalem
Go to the top of the page
+Quote Post
elem84
post
Post #15





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 25.07.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Balon
post
Post #16





Grupa: Zarejestrowani
Postów: 422
Pomógł: 0
Dołączył: 14.12.2005
Skąd: Wałbrzych

Ostrzeżenie: (0%)
-----


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

,.....
Go to the top of the page
+Quote Post
bim2
post
Post #17





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) czyli nie ze zapętlisz skrypt. Tak sie raczej nie da ^^ Pytaj bakusa o to
Go to the top of the page
+Quote Post
Bakus
post
Post #18


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

Ostrzeżenie: (0%)
-----


Nie próbowałem rozwiązać pobierania wielu podpisów. Moja rada: eksperymentuj (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Athlan
post
Post #19





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

Ostrzeżenie: (0%)
-----


  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 ?

Ten post edytował Athlan 26.06.2006, 11:37:10
Go to the top of the page
+Quote Post
bim2
post
Post #20





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


A co to da? $data jest nadpisywana więc wezmie ostatni numer ;P
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 02:48