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 3.10.2004, 00:26:42
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...


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
Tlenex
post 11.02.2005, 22:35:09
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 12.02.2005, 00:14:11
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ąć smile.gif

pozdrawiam
Go to the top of the page
+Quote Post
Chewolf
post 12.02.2005, 16:34:19
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ć tongue.gif Wszystko jest możliwe.
Go to the top of the page
+Quote Post
ikioloak
post 6.05.2005, 01:30:17
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 6.05.2005, 01:35:51
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...


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
xantio
post 11.11.2005, 16:46:23
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 11.11.2005, 18:04:40
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 13.11.2005, 00:21:49
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 15.11.2005, 02:46:50
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.


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
dariusz_w
post 16.11.2005, 09:45:11
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 16.11.2005, 15:57:44
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 12.03.2006, 23:41:29
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


--------------------
*Note: No animals were killed durning the construction of this post.
Go to the top of the page
+Quote Post
bim2
post 24.04.2006, 17:29:58
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 19.06.2006, 18:39:56
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


--------------------
Grupa programistyczna (EvilTeam)
Hotele w Polsce TwojHotel.info
Go to the top of the page
+Quote Post
Balon
post 21.06.2006, 17:31:07
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. ?>

,.....


--------------------
Postura wielka i morda wredna, jestem Balon, kozak z osiedla !
bzdury.pl - Królestwo rozrywki
Go to the top of the page
+Quote Post
bim2
post 21.06.2006, 17:36:55
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 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 26.06.2006, 10:53:35
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 smile.gif


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
Athlan
post 26.06.2006, 11:35:07
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


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
bim2
post 29.06.2006, 15:53:06
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 12:10