Odczyt opisu profilu GG w PHP

0

Witajcie,
Od kilku dni próbuję napisać skrypt, który odczyta na stronie WWW opis (nie status) profilu GG.
Znalazłem api.gadu-gadu.pl, ale za jego pomocą mogę odczytać jedynie status (dostępny/niedostępny/etc) oraz podstawowe informacje o profilu (nazwa/miejscowość/wiek/etc), jednak nigdzie nie mogę znaleźć sposobu jak pobrać aktualnie ustawiony opis.

Próbował ktoś z Was coś takiego zrobić? Będę wdzięczny za wszelką pomoc :)

0

Coś mi przyszło do głowy. Ją wczesne aplikacje mobilnego GG w javie, które można dość łatwo zdekompilować. Problem w tym, że za nic nie mam pojęcia jak z tego wyciągnąć mechanizm pozyskiwania opisów. Zerknąłby ktoś z Was na to?

0

Od tak opisów nie sprawdzisz. Musisz stworzyć clienta który wykona logowanie i prześle do serwera listę interesujących Cię kontaktów, a w odpowiedzi otrzymasz m.in. ich opisy, o ile są publiczne.

http://libgadu.net/protocol/#ch1.5

0

Ś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(&#092;"%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(&#092;"GG_LOGIN60\",		0x0015);
		define(&#092;"GG_STATUS_AVAIL\",   0x0002);
		define(&#092;"GG_LOGIN_OK\",		0x0003);
		define(&#092;"GG_NOTIFY\",		 0x0010);
		define(&#092;"GG_USER_NORMAL\",	0x0003);

		$fp = fsockopen( &#092;"appmsg.gadu-gadu.pl\", 80, $errno, $errmsg, 3 );
		if (!$fp)
		{
			$error = &#092;"BRAK POLACZENA Z APPMSG.GADU-GADU.PL, MOZE BYC PRZECIAZONY: \" . $errno . \" - \" . $errstr . \"n\";
			return false;
		}else{
			$get = &#092;"GET /appsvc/appmsg.asp?fmnumber=<$numer_gg> HTTP/1.0rn\";
			$get.= &#092;"Host: appmsg.gadu-gadu.plrn\";
			$get.= &#092;"User-Agent: Mozilla/4.7 [en] (Win98; I)rn\";
			$get.= &#092;"Pragma: no-cachernrn\";
			fputs($fp, $get);
			fgets($fp, 128);
			fgets($fp, 128);
			$buf = fgets($fp, 128);
			preg_match(&#092;"/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 = &#092;"PROBLEM Z POLACZENIEM: $errno - $errstrnn\";
			return false;
		}
		if (!$data = fread($fp, 12))
		{
			$error = &#092;"Polaczenie nieoczekiwanie zamknietenn\";
			return false;
		}

		// Pobieranie danych z serwera - odbiór klucza do wygenerowania hasha hasła
		$tab = unpack(&#092;"Vtyp/Vrozmiar/Vklucz\", $data);
		// obliczanie hasha hasła
		$hash = oblicz_hash($haslo_gg, $tab['klucz']);
		$data = pack(&#092;"VVVVVVvVvVvCCa\".strlen(\"\"), GG_LOGIN60, 0x20 + strlen(\"\"),
		$numer_gg, $hash, GG_STATUS_AVAIL, 0x20, 0, 0, 0, 0, 0, 0x14, 0xbe , &#092;"\");
		// wysłanie hasha hasła
		fwrite($fp, $data);
		if (!$data1 = fread($fp, 8))
		{
			$error = &#092;"Nie rozpoznany bladn\";
			return false;
		}
		$tab = unpack(&#092;"Vlogin_status/Vrozmiar\", $data1);
		if($tab['login_status'] != GG_LOGIN_OK)
		{
			$error = &#092;"Nie prawidłowe hasło...nn\";
			return false;
		}

		// Wysłanie listy kontaktów z jednym numerem
		$data = pack (&#092;"VVVC\",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
		if(!fwrite($fp,$data))
		{
			$error = &#092;"Blad wysylania listy kontaktownn\";
			return false;
		}
		// Odebranie pakietu ze specyfikacją następnego pakietu
		$data = fread($fp, 8);
		$tab = unpack(&#092;"Vtyp/Vrozmiar\", $data);
		// Pobranie pakietu opisu
		$data = fread($fp, $tab['rozmiar']);
		// Zamknięcie połączenia z serwerem
		fclose($fp);
		$tablica = unpack(&#092;"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?

0
sebxx4 napisał(a):

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.

Najprawdopodobniej tak. GG zmieniało format protokołów i starsze wersje klientów przestawały działać.

0

Udało mi się (chyba) zalogować używając tego skryptu, ale na tym moje osiągnięcia się kończą.
Przerobiłem lekko ten skrypt:

<html>
<head>
<meta charset="utf-8" />
<meta name="Author" content="Admin" />
<meta name="Robots" content="ALL" />
<title></title>
</head>
<body>
<?php
    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;
    }
	 $numer_gg = mój_numer;
	 $haslo_gg = "moje_hasło";
	 $szukany_numer = numer_sprawdzany;

        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("91.214.237.16", 8074, $errno, $errstr, 3);
        if (!$fp)
        {
            echo "PROBLEM Z POLACZENIEM: ".$errno - $errstr."\n\n";
        }
        if (!$data = fread($fp, 12))
        {
            echo "Polaczenie nieoczekiwanie zamkniete\n\n";
        }
        $tab = unpack("Vtyp/Vrozmiar/Vklucz", $data);
        $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 , "");
        fwrite($fp, $data);
        if (!$data1 = fread($fp, 8))
        {
            echo "Nie rozpoznany blad\n";
        }
        $tab = unpack("Vlogin_status/Vrozmiar", $data1);
        if($tab['login_status'] != GG_LOGIN_OK)
        {
            echo "Nie prawidłowe hasło...\n\n";
        }
        $data = pack ("VVVC",GG_NOTIFY, 5, $szukany_numer, GG_USER_NORMAL);
        if(!fwrite($fp,$data))
        {
            echo "Blad wysylania listy kontaktow\n\n";
        }
        $data = fread($fp, 8);
        $tab = unpack("Vtyp/Vrozmiar", $data);
        $data = fread($fp, 8192);
        fclose($fp);
        $tablica = @unpack("Iuin/Cstatus/Iremoteip/Sremoteport/Cversion/Cimagesize/Cunknown/Cdescription_size/a*", $data);
        echo $tablica[1];
?>
</body>
</html>

Ładuje się dość długo, nie wyświetla mi nic, ale co ciekawe zmienia mi status GG na dostępny (jestem jednocześnie zalogowany w aplikacji), usuwa mi opis i dodaje mi do kontaktów numer, który jest sprawdzany. Więc "coś" działa, ale w tym miejscu chciałbym prosić Was o pomoc.

1

Zobacz wiresharkiem co się powinno wysyłać i odbierać

0

Kurde, szczerze mówiąc nic mi to nie mówi.
Wracając jeszcze do tego zamieszczonego kodu: zauważyłem, że jestem w stanie za jego pomocą zmienić sobie status na GG, opis, a nawet dodać sobie kogoś do kontaktów, więc chyba za dużo w tym protokole się nie zmieniło, ale jakoś nie mogę ogarnąć tej odpowiedzi z serwera.

0

No to mówię - sprawdź pakiety normalnego clienta gg i znajdź ten, od którego dostajesz odpowiedź z opisami.

0

Stare GG w ogóle nie wyświetla opisów, a nowe chyba ma je zaszyfrowane.
Dziwne, bo w większości są to jakieś bezsensowne ciągi znaków, ale trafiłem na jeden czy dwa GG_NOTIFY_REPLY80 i w odpowiedzi był fragment opisu.

Może prościej byłoby zdekompilować apke na telefon i tam szukać mechanizmu?

0

W międzyczasie namierzyłem jeszcze jedną potencjalną możliwość. Możnaby otwierać stronę w przeglądarce przy użyciu linku:
https://www.gg.pl/#profile/numer_użytkownika

Otwiera się strona zawierająca profil z widocznym od razu opisem, o ile został on ustawiony oraz o ile jestem zalogowany w przeglądarce na swoje konto. Problem mam jedynie z wykonaniem połączenia z PHP (serwer lokalny, wamp). Pomożecie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1