Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Bramka Gadu-Gadu
Seth
post 27.10.2002, 16:55:17
Post #1





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


Nie wiem czy napisanie bramki Gadu-Gadu to znowuz taki trudny orzech do zgryzienia ale pomyslalem sobie, ze podziele sie moim doswiadczeniami w pisaniu tego skryptu. Skrypt bedzie nam sluzyl TYLKO do wysylania wiadomosci do uzytkownikow GG.

Protokol GG oparty jest na TCP/IP co ulatwia nam prace.
Aby polaczyc sie z serwerem GG nalezy uzyc funkcji fsockopen()
Kod
$fp = fsockopen( "appmsg.gadu-gadu.pl", 80, $errno, $errmsg, 3 );

pierwsza wartosc to nazwa hosta GG. Nastepna to nr. portu, kolejne dwie to stringi z bledami jezeli takowe sie pojawia, a ostatnia to liczba w sekundach timeoutu (opis funkcji fsocopen() znajduje sie tu).
Teraz musimy podszyc sie pod przegladarke i wyslac odpowiednie dane protokolem HTTP.
Kod
$get = "GET /appsvc/appmsg.asp?fmnumber=$UIN&version=$VERSION&fmt=$FORMAT&lastmsg=$MSG HTTP/1.0rn";

$get .= "Host: appmsg.gadu-gadu.plrn";

$get .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)rn";

$get .= "Pragma: no-cachern";



fputs($fp, $get);

$UIN - numer clienta
$VERSION - wersja clienta
$FORMAT - jest to wartosc oznaczajaca czy wiadomosc systemowa bedzie przesylana czystym textem ($FORMAT='') czy w HTMLu ($FORMAT != '') ja osobiscie nie uzywam formatu HTML i nie wiem jak go uzywac, wiec nie bede sie tym zagadnieniem zajmowal.
$MSG - numer ostatniej wiadomosci systemowej (zostawiamy pusta wartosc)

Serwer odpowie na to:
Cytat
HTTP/1.0 200 OK
...
0 217.17.41.84:8074 217.17.41.84

ostatni wiersz w kodzie pobieramy funkcja fgets()
Kod
$buf = fgets( $fp, 128 );

Uprzednio pomijajac pozostale linie.
Wiersz ten mowi nam o tym czy zawarta jest wiadomosc systemowa (0), nr. hosta wraz z portem pod jaki musimy sie podlaczyc, a ostatnia wartosc to sam IP hosta. Nas interesuje tylko IP hosta wraz z portem. Przyczym port 8074 nie jest jedynym do ktorego mozna sie podlaczyc. Wrazie bledu przy podlaczaniu sie do hosta mozna skorzystac z portu 443.
Teraz musimy wydobyc IP i port ze stringu. Nie bede tu podawal metody bo chyba kazdy wie jak to zrobic a sposobow jest wiele poczawszy od substr() (tongue.gif), explode() itp...
Przed lub po wydobyciu IP i portu mozemy (NIE MUSIMY) zamknac socket:
Kod
fclose($fp);

Teraz czas przyszedl na polaczenie sie z wlasciwym hostem umozliwiajacym nam wkoncu komunikacje w GG.
Kod
$fp = fsockopen( "217.17.41.85", 8074, $errno, $errmsg, 3 );

IP i port podalem w tej postaci, zeby zobrazowac jak to ma wygladac smile.gif
dodam jeszcze, czego nie powiedzialem wczesniej, ze po kazdym polaczeniu funkcja fsocopen() nalezy dodac kod zbezpieczajacy - obslugujacy blad wrazie gdyby nie mozna bylo sie polaczyc:
Kod
if( !$fp ){

  echo "blad";

}else{

...

dalsza czesc skryptu

...

Polaczywszy sie do hosta otrzymamy pakiet postaci:
Cytat
unsigned long typ
unsigned long rozmiar
unsigned long klucz

typ i rozmia nie bedzie nam potrzebny wiec pomijam jego opis.
Bedzie nam natomiast potrzebny klucz do stworzenia hasha hasla i przeslania go do hosta GG.
Do pobrania pakietu przeslanego od hosta po polaczeniu z nim uzyjemy funkcji unpack()
Kod
$data = fread($fp, 12);

if(!$data){

  echo "error";

}else{

  $hash_pack = unpack("Vtyp/Vrozmiar/Vklucz", $data);

  ...

Zmienna $hash_pack jest zmienna tablicowa, a jako, ze interesuje nas tylko klucz pobieramy z niej jego wartosc w nastepujacy sposob:
Kod
$key = $hash_pack['klucz'];

W opisie protokolu GG z ktorego korzystalem byl bledny algorytm uzywany do stworzenia hasha hasla, tak wiec po zmudnych poszukiwaniach natknalem sie na ten oto skrypt autorstwa Piotr Pawłowa:
Kod
function oblicz_hash_hasla($haslo, $klucz) {

    $temphi = 0;

    $templo = 1;

    for ($i = 0; $i < strlen($haslo); $i++) {

        $znak = ord($haslo[$i]);

        $templo *= $znak + 1;

        $temphi = ($temphi * ($znak + 1) + ($templo >> 16)) & 0xffff;

        $templo &= 0xffff;

    }

    $hashlo = $templo * ($klucz & 0x7fff);

    $hashhi = (($temphi * ($klucz & 0x7fff)) & 0xffff) + ($hashlo >> 16);

    $hashlo &= 0xffff;

    if ($klucz & 0x8000) {

        $hashlo += ($templo & 1) << 15;

        $hashhi += (($temphi & 1) << 15) + ($templo >> 1) + ($hashlo >> 16);

        $hashlo &= 0xffff;

    }

    $hashhi &= 0xffff;

    $hash = sprintf("%04x%04x", $hashhi, $hashlo);

    $hash = hexdec($hash);

    settype($hash, 'integer');



return $hash;

}

Do funkcji przesylamy haslo naszego konta bramki i klucz uzyskany wczesniej od hosta GG.
Teraz musimy wyslac pakiet do hosta:
Kod
fwrite($fp, pack("VVVVVVVv", 0x000c, 0x16, $gg_gate_uid, $hash, 0x0002, 0x0b, 0, 0));

$gg_gate_uid - nrume konta bramki
$hash - otrymany hash z funkcji oblicz_hash_hasla()
Teraz host zwroci nam odpowiedz na probe zalogowania w postaci
Cytat
unsigned long status_loginu
unsigned long rozmiar

Pobieramy go nastepujaco:
Kod
if( !$data = fread($fp, 8) ){

  echo "error";

}else{

...

dalsza czesc kodu

...

$data to interesujacy nas pakiet.
Teraz uzywajac funkcji unpack() pobieramy jego wartosc status_loginu
Kod
$pack = unpack("Vstatus_loginu/Vrozmiar", $data);

$status = $pack['status_loginu'];

Wartosci statusu mozemy zdefiniowac nastepujaco:
Kod
define("GG_LOGIN_OK", 0x0003);

define("GG_LOGIN_FAILED", 0x0009);

Nazwy mowia same za siebie smile.gif
Teraz jezeli zostalismy zalogowani(GG_LOGIN_OK) mozemy wyslac wiadomosc do uzytkownika GG.
Struktura pakietu z wiadomoscia do uzytkownika wyglada nastepujaco:
Cytat
unsigned long GG_SEND_MG
unsigned long rozmiar
unsigned long uid_odbiorcy
unsigned long seq
unsigned long classa_wiadomosci
unknown

unknow - niestety nie wiem co oznacza ta wartosc ale ustawiajac ja na 0(zero) mozna ja pominac w opisie winksmiley.jpg
GG_SEND_MSG ma wartosc:
Kod
define("GG_SEND_MSG", 0x000b);

rozmiar to dlugosc naszej wiadomosci. Uwaga wiadomosc nie moze byc wieksza niz 2000 znakow.
seq - numer sekwencji jest wykorzystywany przy potwierdzaniu dostarczenia lub zakolejkowaniu pakietu.
classa_wiadomosci - rodzaj wiadomosci, jeden z ponizszych:
Kod
define("GG_CLASS_QUEUED", 0x0001);

define("GG_CLASS_MSG", 0x0004); // wiadomosc w nowym oknie

define("GG_CLASS_CHAT", 0x0008); // wiadomosc jest czescia rozmowy

define("GG_CLASS_CTCP", 0x0010);

define("GG_CLASS_ACK", 0x0020);// bez potwierdzania wiadomosci


Kod wysylajacy pakiet jest nastepujacy:
Kod
mt_srand((double)microtime() * 1000000);

$seq = mt_rand();



$uin_odbiorcy = 'xxxx...'; // numer gg odbiorcy

$msg = ''; // wiadomosc do odbiorcy <= 2000 znakow



$data = pack("VVVVVa".strlen($msg)."C", GG_SEND_MSG, 0x0d + strlen($msg), $uin_odbiorcy,

        $seq, GG_CLASS_ACK, $msg, 0);



fwrite($fp, $data);

$msg - to oczywiscie wiadomosc dla odbiorcy
$uid_odbiorcy - nr gg odbiorcy

I oto wyslalismy wiadomosc do GG 8)

Na koniec pozostalo nam jeszcze wylogowanie sie:
Kod
define("GG_STATUS_NOT_AVAIL",0x0001);

define("GG_STATUS_AVAIL", 0x0002);



fwrite($fp, pack('VVV', GG_NEW_STATUS, 0x04, GG_STATUS_NOT_AVAIL););

fclose($fp);


Tak oto wyglada wysylanie wiadomosci do uzytkownikow GG. Z przykroscia musze powiedziec, ze strona z opisem protokolu GG ostatnio nie dziala ale jezeli sa to tylko chwilowe problemy warto na nia zajzec: www.dev.null.pl/ekg/docs/protocol.html

Opisany tu kod wymaga oczywiscie kilku zabiegow min. napisanie obslugi bledow, rozpisania wszystkiego na poszczegolne funkcje ew. napisania classy itp. Tak wiec jest to zarys skryptu bramki GG. Skrypt moze nie dzialac prawidlowo bo gdzies sie moglem rabnac (jestem tylko czlowiekem winksmiley.jpg), wiec zadawajcie pytania na forum.

PROSZE NIE PISAC ABYM PODAL CALY SKRYPT BRAMKI GDYZ WSZYSTKO ZOSTALO JUZ NAPISANE (TO CO MIALO BYC NAPISANE winksmiley.jpg ), WIEC NALEZY TYLKO WYTEZYC SZARE KOMORKI I WZIASC SIE DO PRACY winksmiley.jpg
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Kicok
post 14.03.2007, 16:33:38
Post #2





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Najprawdopodobniej jest to długość pakietu


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post

Posty w temacie
- Seth   Bramka Gadu-Gadu   27.10.2002, 16:55:17
- - em1X   eh a na http://gg.wha.la sa pelne zrodla   30.01.2003, 00:03:33
- - Seth   ehh ta bramka nie dziala dobrze... jezeli masz sta...   30.01.2003, 01:59:58
- - kwiateek   Cytatehh ta bramka nie dziala dobrze... jezeli mas...   30.01.2003, 12:18:49
- - Seth   tak   31.01.2003, 21:20:35
- - pm   bramka www2gg   6.03.2003, 15:38:43
- - It's_me   Jedno pytanie jak mozna skopiowac kod php ? co otw...   6.03.2003, 16:09:46
- - pm   http://gg.wha.la/jak.html   6.03.2003, 16:29:25
- - It's_me   pm: wlasnie tak ... argumenty sa podstawa zarzutow...   6.03.2003, 16:41:35
- - Seth   nie kopjowaem zadnego kodu, funkcje do hashowania ...   6.03.2003, 18:12:52
- - pm   acha...   6.03.2003, 19:17:38
- - Seth   A dlaczego niby konstrukcje packa mialy by byc inn...   6.03.2003, 19:30:15
- - pm   Zakonczymy temat w zgodzie:)   6.03.2003, 20:08:15
- - Seth   Pokoj przyjety Wiec na wstepie chce powiem, ze d...   6.03.2003, 22:04:56
- - 5z474n   dobra spece .... bramka zawsze cos ale sa lepsze r...   4.05.2003, 22:27:39
- - Seth   Ad.1 :arrow: Zalogowanie do servera: 0.2131559848...   5.05.2003, 17:05:58
- - 5z474n   wieeelkie dzieki ... oczywiscie ze na tej strone i...   5.05.2003, 18:20:46
- - 5z474n   gdzie jest zdefiniowany nr i haslo bramki chce z...   9.05.2003, 01:02:00
- - Seth   Cytat function gg_gate( $to='', $msg='', $fro...   9.05.2003, 12:57:52
- - 5z474n   hm.. troche inaczej to pzrerobilem ale cos skopale...   9.05.2003, 14:04:23
- - Seth   Zrob tak jak Ci podalem powinno byc wszystko OK. J...   9.05.2003, 14:09:54
- - 5z474n   nie moge :| <?php for( $i = 3; $i >=...   9.05.2003, 14:31:15
- - Seth   Tam gdzie masz: function logon( &$fp, $uin, $pass,...   9.05.2003, 14:36:41
- - 5z474n   no :!: teraz sie zgadza :mrgreen: niestety musze...   9.05.2003, 15:15:24
- - Seth   Wszystko ladnie pkienie ale ktos tu nie przestrzeg...   9.05.2003, 22:48:09
- - 5z474n   luzz... dobrze wysyla ze znnych kont :mrgreen: n...   10.05.2003, 00:48:27
- - Seth   system_msg( $mode ) to funkcja odczytajaca uprzedn...   10.05.2003, 10:41:02
- - Solitary   a co z pingiem?   25.10.2003, 23:23:45
- - Seth   Solitary: w tym skrypcie nie ma przewidzianych zad...   1.11.2003, 18:31:55
- - kubatron   dzięki Seth   1.11.2003, 19:50:06
- - spyx   Seth: nie zabardzo rozumiem skad moge wziasc key z...   3.11.2003, 15:19:18
- - Seth   W samej klasie do obslugi gg jest taka linia: ... ...   3.11.2003, 16:28:34
- - GrayHat   moze ktos zrobic pelny listing tego skryptu bo sie...   3.11.2003, 17:57:42
- - Seth   To nie jest temat opisujacy jak zainstalowac skryp...   3.11.2003, 18:08:46
- - kubatron   jakbyś wrócił się o jedną strone w stecz to byś zo...   3.11.2003, 18:36:45
- - macnow   a ja bym chciał zrobić wysyłanie seryjne, zeby np....   17.11.2003, 16:54:33
- - Seth   A ja aby moja pralka prasowala mi ubrania i zarabi...   17.11.2003, 17:47:31
- - Bakus   Seth - masz jak zwykle cudowne pomysły... Jak napi...   18.11.2003, 00:49:12
- - AZAZELLO   A ja mam odnośnie tych waszych bramek:) chyba nik...   24.11.2003, 09:38:10
- - GrayHat   hmm a jaka funkcja wywolujemy wyslanie wiadomosci?...   24.11.2003, 17:55:37
- - BzikOS   Cytathmm a jaka funkcja wywolujemy wyslanie wiadom...   24.11.2003, 18:27:38
- - Cr0n!x   a ja mam cos takiego i nie wysyla :/ KodDEBUG...   30.11.2003, 17:37:49
- - anAKiN`   http://anakin.scene.pl/www2gg/ jak ktos chce zrodl...   29.02.2004, 17:46:45
- - pm   Ja poprosze:)   5.04.2004, 20:28:25
- - Chewolf   Witajcie, Jest to bardzo ważna sprawa. Wi...   9.04.2004, 16:39:02
- - pm   >Witajcie, >Jest to bardzo ważna sprawa. Wię...   9.04.2004, 17:29:33
- - rubin   Login Failed   20.04.2004, 23:46:26
- - Xinn   Uwaga! Obecnie Gadu-Gadu działa tylko z najnowszą ...   21.04.2004, 15:18:22
- - pm   Jest nowa wersja na http://gg.wha.la/jak.html . ...   22.04.2004, 22:46:36
- - Bakus   wielkie podziękowania i pokłony wdzięczności... wr...   23.04.2004, 17:32:30
- - mls   W wersji 2.0.1 był też błąd w pakiecie GG_LOGIN. ...   24.04.2004, 22:12:06
- - mls   Hyhy, ale to już zostało poprawione, jak widzę   24.04.2004, 22:13:46
- - pm   > Dopiero gdy wprowadziłem te modyfikacje, wszy...   24.04.2004, 22:40:40
- - mls   Wiem, że nie błąd, ale gdy ściągałem wersję 2.0.1,...   26.04.2004, 13:00:50
- - Wave   Wie ktoś jak zrobić coś takiego jak na tej aukcji:...   30.08.2005, 17:55:24
- - Speedy   Cytat(Wave @ 2005-08-30 17:55:24)Wie ktoś jak...   30.08.2005, 18:36:52
- - Wave   Skrypt działał, sam testowałem na kilku kontach. P...   30.08.2005, 18:41:33
- - camelx   A nie wiecie może jak zrobić coś takiego jak jest ...   22.09.2005, 14:43:25
- - hwao   tu php nie polecam, aczkolwiek da sie to w nim zro...   22.09.2005, 19:05:53
- - vala   http://dev.null.pl/ekg/docs/protocol.html ?   22.09.2005, 19:27:07
- - camelx   tak jak napisał hwao znalazłem sobie bota (GGBot, ...   25.09.2005, 18:38:41
- - bivv   Jak zrobić aby można było wysłać wiadomość do kilk...   14.03.2006, 17:56:29
- - matid   Cytat(bivv @ 2006-03-14 17:56:29)Jak zrobić a...   15.03.2006, 07:00:40
- - hwao   Cytat(matid @ 2006-03-15 07:00:40)Cytat(bivv ...   15.03.2006, 07:09:44
- - ripek   Witam, gdzie mogę znaleźć działającą bramke www2g...   5.01.2007, 22:52:12
- - Speedy   CytatPróbował ktoś się zmierzyć z tematem bramki w...   6.01.2007, 01:18:24
- - ripek   Ponawiam pytanie o www2gg   6.01.2007, 10:25:55
- - Robuscracker   Nurtuje mnie jedna rzecz: Cytat(Seth @ 27.10....   11.03.2007, 16:13:31
- - Kicok   Najprawdopodobniej jest to długość pakietu   14.03.2007, 16:33:38


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: 19.05.2024 - 20:47