Jak wydobyc ciasteczko wysylane do mnie?

0

Witam

Mam następujący problem, pisze program który loguje się do pewnej przegladarkowej gry (adres mozna wydlubac z IP lub screenow). Jego zadaniem będzie pobieranie aktualnych informacji po zalogowaniu.

Mam następujący problem wysyłam dane potrzebne do zalogowania się i potrzebuje zdobyć ciasteczko z sessionId. Całe połączenie obserwowałem w Wireshark i tutaj pare zrzutów ekranu

W pierwszym zrzucie wysyłam informacje z loginem i haslem do strony.
user image

W chwili gdy w kodzie pojawia sie linia InputStream in = conn.getInputStream();
Wireshark pokazuje otrzymany pakiet

user image

<font size="2">Jak widac ciasteczko z sessionId jest wysylane w tym pakiecie do mnie, czyli nie musze pobierac samemu ciasteczek ze strony.
Tu niestety pojawia sie problem, nie wiem jak wydlubac to ciasteczko.</span>

Poniżej Kod do wglądu jak to zrobiłem.

	public void pobierzStrone(String strona, String stronaRef,Boolean print){
		
		CookieManager manager = new CookieManager();
		manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
		CookieHandler.setDefault(manager);

		try {
			String parametry = URLEncoder.encode("username", "UTF-8")+"="+URLEncoder.encode(login, "UTF-8")+
	        	"&"+URLEncoder.encode("password", "UTF-8")+"="+URLEncoder.encode(pass, "UTF-8")+"&"+URLEncoder.encode("submitForm", "UTF-8")+
	        		"="+URLEncoder.encode("Login", "UTF-8");
			System.out.println(parametry);
			
			URL url = new URL(strona);
			
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.setDoInput(true);

            //conn.setAllowUserInteraction(false);
            //conn.setDefaultUseCaches(true);
            conn.setInstanceFollowRedirects(true);
            
            conn.setRequestProperty("Host","www.tutaj_strona.pl");
            conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.0; pl; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11");
            conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
            conn.setRequestProperty("Accept-Language","pl,en-us;q=0.7,en;q=0.3");
            conn.setRequestProperty("Accept-Encoding","gzip,deflate");        
            conn.setRequestProperty("Accept-Charset","ISO-8859-2,utf-8;q=0.7,*;q=0.7");
            conn.setRequestProperty("Keep-Alive","300");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Refferer", stronaRef);
			
            conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Content-length", parametry.length() + "");
            
            conn.connect();

            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "UTF8");
            wr.write(parametry);
            wr.flush();
            wr.close();

            //System.out.println(getCookies(strona));  //nie ma tam sessionId
            //System.out.println(getCookies(stronaRef)); //nie ma tam sessionId
            
            InputStream in = conn.getInputStream(); // w tym momencie dostaje drugi pakiet z sessionId
                // to co nizej zwraca mi jedynie kod zrodlowy strony :(
/*            InputStreamReader isr = new InputStreamReader(in);
*    		BufferedReader br = new BufferedReader(isr);
*    		String linia;
*            while ((linia=br.readLine())!=null) if (print) System.out.println(linia);
*/
            conn.disconnect();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

Dziękuję za wszelka pomoc, pozdrawiam

0

Ja bym zrobił to tak :

conn.getHeaderField("Set-cookie");

0
kamykadze napisał(a)

Ja bym zrobił to tak :

conn.getHeaderField("Set-cookie");

Dzięki, ale tego próbowałem na początku próba pobrania ciasteczka tą komendą nic nie daje. Co prawda pobiera jakieś ciasteczko, mniejwiecej takie
"Set-Cookie: __uvpg=1248082253.72; Domain=tutajDomena; expires=Tue, 21-Jul-2009 09:30:53 GMT; Max-Age=86400; Path=/\r\n"
Ale próba uzycia go do dalszej kominikacji nie przynosi pozotywnych skutków :/

W chwili otworzenia InputStream ciasteczko jest wysyłane do mnie( to jest to z sessionId), więc problem w tym jak je wydobyć z tego pakietu.

0

Jak chcesz go użyć, wpisujesz je w nagłówek "Cookie" żądania.
"Set-cookie" jest nagłówkiem odpowiedzi.

Druga rzecz, z dokumentacji metody "getHeaderField":

If called on a connection that sets the same header multiple times with possibly different values, only the last value is returned. 

Może będziesz zmuszony użyć metody : getHeaderFields.
Zwróci mapę nagłówków.

0

Tak używałem już tego ciasteczka do dalszej komunikacji używając opcji
conn.setRequestProperty("Cookie","__uvpg=1248082253.72; Domain=tutajDomena; expires=Tue, 21-Jul-2009 09:30:53 GMT; Max-Age=86400; Path=/");
Zeby to było takie proste to bym nie zawracał nikomu tutaj głowy....

Ponizej zamieszczam metodę której uzywałem do pobrania ciasteczka.

	public String getCookies(String adres){
		String wynik="";
		
		try {
			URL url = new URL(adres);
			URLConnection conn = url.openConnection();

			for (int i = 0;; i++){
				String headerName = conn.getHeaderFieldKey(i);
				String headerValue = conn.getHeaderField(i);
				
				if (headerName ==null & headerValue == null) break;
				if (headerName == null) {  }
				else {
					if (headerName.equals("Set-Cookie")){
						wynik = headerValue.replace(".me nelg ame.pl", "men elg ame.pl").trim();//celowy blad
					}
					if (headerName.equals("Expires")){
						wynik += "; expires=" +headerValue.trim();
					}
				}
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return wynik;		
	}

Ale ani dzieki tej metodzie, ani dzieki kodowi zamieszczonemu ponizej nie udało mi sie uzyskac ciasteczka z SessionId, które jest na obrazku nr2 w pierwszym poście.

            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "UTF8");
            wr.write(parametry);
            wr.flush();
            wr.close();

//******System.out.println(conn.getHeaderFields());
//******System.out.println(getCookies(strona));

            InputStream in = conn.getInputStream();
           
//******System.out.println(conn.getHeaderFields());
//******System.out.println(getCookies(strona));

user image

1 wysyłam pakiet z loginem i hasłem
2 otrzymuje pakiet z ciasteczkami(w tym sessionId) nie wiem jak go zlapac :( Ciekawe jest to że pakiet nazywa sie Moved Temporarily
3. Pod numerem 3 jest to odpowiedz na próbę pobrania ciasteczka przy użyciu metody zamiesczonej powyżej

Ciasteczko uzyskane dzieki getHeaderField / getHeaderFields nie nadaje sie do niczego próbowałem już uzywać go w metodzie Get (conn.setRequestMethod("GET");) i nie jest to odpowiednie ciasteczko

Czy może mieć to związek z tym że ten program może sobie nie radzić z przekierowaniami ?
W końcu pakiet który ma poprawne ciasteczno nazywa się " HTTP 1.0/302 Moved Temporarily".

Dziękuje za wszelkie próby pomocy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.