Średnio wiem jak się do tego zabrać :/
Znalazłem na innym forum coś takiego:
<?php
/* Skrypt napisany w oparciu o klasę www2gg (http://gg.wha.la/)
* i opis protokołu GaduGadu z projektu EKG (http://dev.null.pl/ekg/docs/protocol.html)
* Kod można dowolnie wykorzystać pod warunkiem pozostawienia niniejszego koment
rza
* Kod jest udostępniony na zasadach OpenSource.
*
* @author: Krzysztof Andrzej Błachut vel Bakus <[email protected]>
* @copyright: 2004-2005 by Krzysztof Andrzej Błachut vel Bakus
* @package: OpisGG
* @version: 1.0
*/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function oblicz_hash ($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;
}
/* Funkcja pobiera z serwera GaduGadu opis dla podanego numeru.
*
* @param int Numer GG \"bramki\"
* @param string Hasło GG \"bramki\"
* @param int Numer GG, którego opis funkcja ma pobrać
* @param var Zmienna w której umieszczony będzie ewentualny komunikat błęd
* @return mixed Zawiera Opis numeru GG, lub false w przypadku błędu
*/
function get_gg_status($numer_gg, $haslo_gg, $szukany_numer, &$error)
{
// Ustawianie stałych na potrzeby protokołu
define(\"GG_LOGIN60\", 0x0015);
define(\"GG_STATUS_AVAIL\", 0x0002);
define(\"GG_LOGIN_OK\", 0x0003);
define(\"GG_NOTIFY\", 0x0010);
define(\"GG_USER_NORMAL\", 0x0003);
$fp = fsockopen( \"appmsg.gadu-gadu.pl\", 80, $errno, $errmsg, 3 );
if (!$fp)
{
$error = \"BRAK POLACZENA Z APPMSG.GADU-GADU.PL, MOZE BYC PRZECIAZONY: \" . $errno . \" - \" . $errstr . \"n\";
return false;
}else{
$get = \"GET /appsvc/appmsg.asp?fmnumber=<$numer_gg> HTTP/1.0rn\";
$get.= \"Host: appmsg.gadu-gadu.plrn\";
$get.= \"User-Agent: Mozilla/4.7 [en] (Win98; I)rn\";
$get.= \"Pragma: no-cachernrn\";
fputs($fp, $get);
fgets($fp, 128);
fgets($fp, 128);
$buf = fgets($fp, 128);
preg_match(\"/s([d.]{8,16}):([d]{1,5})s/\", $buf, $adres);
$host = $adres[1];
$port = $adres[2];
fclose($fp);
}
// Ustanawianie połączenia z serwerem GG
$fp = fsockopen($host, $port, $errno, $errstr, 10);
if (!$fp)
{
$error = \"PROBLEM Z POLACZENIEM: $errno - $errstrnn\";
return false;
}
if (!$data = fread($fp, 12))
{
$error = \"Polaczenie nieoczekiwanie zamknietenn\";
return false;
}
// Pobieranie danych z serwera - odbiór klucza do wygenerowania hasha hasła
$tab = unpack(\"Vtyp/Vrozmiar/Vklucz\", $data);
// obliczanie hasha hasła
$hash = oblicz_hash($haslo_gg, $tab['klucz']);
$data = pack(\"VVVVVVvVvVvCCa\".strlen(\"\"), GG_LOGIN60, 0x20 + strlen(\"\"),
$numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , \"\");
// wysłanie hasha hasła
fwrite($fp, $data);
if (!$data1 = fread($fp, 8))
{
$error = \"Nie rozpoznany bladn\";
return false;
}
$tab = unpack(\"Vlogin_status/Vrozmiar\", $data1);
if($tab['login_status'] != GG_LOGIN_OK)
{
$error = \"Nie prawidłowe hasło...nn\";
return false;
}
// Wysłanie listy kontaktów z jednym numerem
$data = pack (\"VVVC\",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
if(!fwrite($fp,$data))
{
$error = \"Blad wysylania listy kontaktownn\";
return false;
}
// Odebranie pakietu ze specyfikacją następnego pakietu
$data = fread($fp, 8);
$tab = unpack(\"Vtyp/Vrozmiar\", $data);
// Pobranie pakietu opisu
$data = fread($fp, $tab['rozmiar']);
// Zamknięcie połączenia z serwerem
fclose($fp);
$tablica = unpack(\"Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*\", $data);
return $tablica[1];
}
?>
Coś jest z tym kodem nie tak. W zasadzie od jego publikacji minęło 16 lat, być może w samym GG coś uległo zmianie. Mógłbyś na to rzucić okiem?