Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> 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

Posty w temacie
- Bakus   Pobieranie opisu z GaduGadu   3.10.2004, 00:26:42
- - Tlenex   Jeszcze zapytanie: czy da się wyciągnąć obrazek nu...   11.02.2005, 22:35:09
- - aleksander   numer, który używa ta funkcja musi być wpisany do ...   12.02.2005, 00:14:11
- - Chewolf   Cytat(aleksander @ 2005-02-12 00:14:11)1. Cze...   12.02.2005, 16:34:19
- - ikioloak   Twoja funkcja to jest swietna sprawa ale ma jeden ...   6.05.2005, 01:30:17
- - Bakus   HeHe... zarejestruj nowy numer GG Jezeli serwer GG...   6.05.2005, 01:35:51
- - xantio   Witam. Jestem tu nowy. Chciałbym się dowiedzieć, c...   11.11.2005, 16:46:23
- - ikioloak   http://gg.wha.la/ - tutaj masz dostepna klase do o...   11.11.2005, 18:04:40
- - artee   Rozumiem, ze paczka do sprawdzania statusu jednej ...   13.11.2005, 00:21:49
- - Bakus   Niestety nie znalazłem odpowiedzi na to pytanie. M...   15.11.2005, 02:46:50
- - dariusz_w   wywala mi taki błąd z tego skryptu: Warning: unpa...   16.11.2005, 09:45:11
- - ikioloak   Tez mialem ten problem (moze w zwiazku z wejsciem ...   16.11.2005, 15:57:44
- - GrayHat   troche odswieze temat. skrypt obecnie nie dziala :...   12.03.2006, 23:41:29
- - bim2   Odswiezam i mowie ze dziala. teraz przetestowalem   24.04.2006, 17:29:58
- - elem84   Witam... Wiem że jestem cienki ale nie moge porad...   19.06.2006, 18:39:56
|- - bim2   Cytat(elem84 @ 19.06.2006, 17:39 ) Witam....   21.06.2006, 17:36:55
- - Balon   [PHP] pobierz, plaintext <?php$numery = array...   21.06.2006, 17:31:07
- - Bakus   Nie próbowałem rozwiązać pobierania wielu podpisów...   26.06.2006, 10:53:35
- - Athlan   [PHP] pobierz, plaintext <?php$szukany_numer = ...   26.06.2006, 11:35:07
- - bim2   A co to da? $data jest nadpisywana więc wezmi...   29.06.2006, 15:53:06
- - Plikownik   skrypt nie działa - pokazuje mi się taki błąd - ...   9.07.2006, 12:12:59
- - Athlan   bim2 to może tak: [PHP] pobierz, plaintext <?p...   12.07.2006, 08:24:35
- - bim2   No tak sie teraz da Tylko nie testowalem tego i n...   13.07.2006, 07:53:32
- - Athlan   @bim2 teraz musi działać... dla każdego numeru two...   14.07.2006, 18:24:56
- - bim2   Ja rozumiem tlyko ja nie umiem wyciagac pisu i nie...   18.07.2006, 08:45:07
- - Athlan   @bim2: CytatFunkcja łączy się z se...   18.07.2006, 08:56:30
- - DooBLER   Witam Mam problem ze skryptem Jeśli podany do skr...   13.09.2006, 19:55:00
- - bim2   Wiem że to głupie ale daj @ przed unpack (@unpack(...   14.09.2006, 18:48:55
- - DooBLER   Cytat(bim2 @ 14.09.2006, 19:48:55 ) W...   15.09.2006, 19:21:17
- - bastek8989   mi wyswietla Parse error: syntax error, unexpecte...   20.12.2006, 16:13:35
- - kossa   co masz linię wyżej? a to może: [PHP] pobierz, ...   20.12.2006, 16:16:58
- - bastek8989   to nie to ^^ przeciez niewyswietla ze jest blad w ...   20.12.2006, 16:50:58
- - Sabistik   Nie wiem czy zauważyliście ale kod z listingu z pi...   20.12.2006, 16:56:52
- - ali3n   [PHP] pobierz, plaintext <?php/* Skrypt napisan...   24.12.2006, 05:35:29
- - sagittariuspl   użyłem tego skryptu, ale nie działa. może jakieś s...   3.01.2007, 20:01:04
- - Raynold   Żeby skrypt działał poprawnie, trze...   9.01.2007, 05:18:22
- - krl_b   działało działało i przestało Fatal error: Max...   12.03.2007, 00:25:03
- - suda   Nigdy nie byłem dobry z wyrażeń ale preg z linii 8...   27.03.2007, 11:25:56
- - mathewoosh   a jak mi pisze ze CytatNie rozpoznany blad wszyst...   12.04.2007, 08:02:10
- - soon   Niestety poniższy kod nie zwraca mi żadnej wartośc...   18.07.2007, 17:16:33
- - mekeke2   jesli ni pokazuje ci opisu sprobuj recznie wklepac...   3.01.2008, 14:15:49
- - Trojan   U mnie pomogło: Cytat(suda @ 27.03.2007, 1...   17.01.2008, 00:18:28
- - anty   mam problem z wyświetlaniem polskich znaków, każdy...   11.03.2008, 18:51:20
- - icetab   a jak zrobic zeby pobrac pare opisow bo jak tak zr...   24.05.2008, 21:26:41
- - chez   Witam, troszkę zmodyfikowałem źródło na takie któr...   6.06.2008, 12:00:21
- - dadexix   Dobry, akurat czegoś takiego potrzebuje, ale wywal...   15.04.2009, 21:35:08
- - sebxx4   Witam Panowie, Wybaczcie proszę offtopic, ale potr...   8.03.2020, 11:29:49
- - Bakus   Jak mogłeś zauważyć ostatnia wiadomość w temacie m...   9.03.2020, 17:38:16


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 - 03:02