Siemka, w oparciu o http://libgadu.net/protocol/ chciałem napisać własną blibliotekę gg , ale coś nie trybi, nie chce się zalogować. Kod:
<?php
class GG {
const P_LOGIN80 = 0x0031;
const P_HEADER_L = 8; // DLUGOSC HEADERA PAKIETU
const GG_VERSION = 'Gadu-Gadu Client build 10.0.0.10450';
function __construct($NUMER, $HASLO) {
// ZAPISUJEMY NUMER I HASLO
$this->NUMER = $NUMER;
$this->HASLO = $HASLO;
// POBIERANIE ADRESU I PORTU SERWERA GG
$odpowiedz = file_get_contents('http://appmsg.gadu-gadu.pl/appsvc/appmsg.asp?fmnumber='.$this->NUMER.'&version=8.0.0.7669');
preg_match('/\s([^\s]*?):(.*?)\s/', $odpowiedz, $wynik);
$this->ADRES = $wynik[1];
$this->PORT = $wynik[2];
}
private function PobierzPakiet() {
$odpowiedz = fread($this->POLACZENIE, self::P_HEADER_L);
$wynik_headera = unpack('Vtyp/Vrozmiar', $odpowiedz);
$wynik_docelowy = fread($this->POLACZENIE, $wynik_headera['rozmiar']);
return $wynik_docelowy;
}
private function WyslijPakiet($id, $pakiet) {
$DlugoscPakietu = strlen($pakiet);
$OstatecznyPakiet = pack('VVa'.$DlugoscPakietu, $id, $DlugoscPakietu, $pakiet);
fwrite($this->POLACZENIE, $OstatecznyPakiet);
}
function ZakodujHaslo2($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;
}
public function Loguj() {
// LACZYMY SIE Z SERWEREM GG
$this->POLACZENIE = fsockopen($this->ADRES, $this->PORT);
stream_set_timeout($this->POLACZENIE, 5);
$odpowiedz = $this->PobierzPakiet();
$ziarno = unpack('Vziarno', $odpowiedz);
$ZakodowaneHaslo = $this->ZakodujHaslo2($this->HASLO, $ziarno['ziarno']);
$pakiet = pack('Va2ca64VVVVvVvccVa23V',
$this->NUMER,
'pl',
0x01,
$ZakodowaneHaslo,
0x0002,
0,
0x00000007,
0,
0,
0,
0,
100,
0x64,
0x23,
'Gadu-Gadu Client build 10.0.0.10450',
0
);
$this->WyslijPakiet(self::P_LOGIN80, $pakiet);
$wiad = 'czesc';
$this->WyslijPakiet(0x002d, pack('VVVVVa'.strlen($wiad).'cc', 895868, time(), 0x0008, 20, 20+strlen($wiad), $wiad, 0, 0));
sleep(4);
}
}
Pomoże ktoś bardziej ogarnięty?