# Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?)



## greece57 (19. Apr 2012)

Hallo @ all 

Ich versuche gerade ein Programm zu schreiben mit dem ich mich automatisch auf einer Seite einlogge und dort alle x Minuten eine Hand voll Daten auslese.

Es hat auch schon alles ganz gut Funktioniert, allerdings komme ich mit der Cookieverwaltung nicht wirklich klar:

Hier mein Code mit dem ich mich einlogge: (Problem schildere ich unten)

```
InternetConnection {
    
    private List<String> cookies;

//... 
public String Login(String adress, String user, String pw, int WELT) throws MalformedURLException, IOException
    {
        URL url = new URL(adress);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        
        
        
        /* Parameter per POST senden */
        con.setRequestMethod("POST");
        con.setDoOutput(true);
        
        /* einloggen */
        OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
        writer.write("server=Welt" + WELT + "&USR=" + user + "&pass=" + pw +"&gfxaktive=1");
        writer.flush();
        writer.close();
        
        /* Asugabe der HTML Antwort Page */
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String line = null;
        String s = "";
        
        while((line = reader.readLine()) != null) {
            s += line + "\n";
        }
        
        /* cookies auslesen */
        cookies = con.getHeaderFields().get("Set-Cookie");
        con.disconnect();
        
        return s;
    }
```


später habe ich dann den zurückgegebenen Quelltext ausgewertet (und mir den Link zu dem ich will aufgeschrieben) und will per GET-request auf die nächte Seite kommen:


```
public String getHTMLStringMitCookies(String aktAdress, String nextAdress) {
	try {
	    // Create a URL for the desired page
	    URL url = new URL(aktAdress);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();;
        
            /* nun die Cookies wieder mitgeben */
            String c = cookies.toString().replace("[", "").replaceAll("]", "");
            //con.setRequestProperty("Cookie", c);
            con.setRequestMethod("GET");
            con.setDoOutput(true);
            String user_c = c.substring(c.indexOf("user")+7, c.indexOf(";", c.indexOf(";",c.indexOf(";")+1)+1));
            String kapisave = c.substring(c.indexOf("kapisave")+9, c.indexOf(";",c.indexOf(";")+1)+1);
            String phpsessid = c.substring(c.indexOf("PHPSESSID")+10, c.indexOf(";", 1));
            con.setRequestProperty("Cookie", "PHPSESSID=" + phpsessid + "; user_c="+ user_c + "; kapisave=" + kapisave");

            
            OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
            writer.write(nextAdress);
            writer.flush();
            writer.close();
            
            
	    BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
	    String str;
	    String s = "";

	    while ((str = in.readLine()) != null) {
		s += (str + "\n");

            }
	    in.close();
            

	    return s;
	} catch (MalformedURLException e) {
            System.out.println(e.getMessage());
	} catch (IOException e) {
            System.out.println(e.getMessage());
	}
        return null;
    }
```



So nun zu meinem Problem:
Jedesmal (außer 2 mal ) schickt er mir den HTMLCode der Startseite zurück und nicht den der Seite wo ich hin will

Ich hab mir mal für meinen Firefox das "Live Header HTTP" addon geladen und er gibt mir zurück dass die Seite die ich haben will folgende Cookies immer mitsendet:
"Cookie: PHPSESSID=bc7dl7l3v1o9lav1lrb745b6n1; user_c=2241529; kapisave=2241529; __utma=1.13709108.1334841759.1334841759.1334841759.1; __utmb=1.1.10.1334841759; __utmc=1; __utmz=1.1334841759.1.1.utmcsr=kapiland.de|utmccn=(referral)|utmcmd=referral|utmcct=/"

Diesen Cookie kann ich ja auch zu 75% nachbaun allerdings habe ich keine Ahnung wo ich den dieses "__utma...." zeug her kriege.
Ich hab zwar herrausgefunden dass der irgendwie über googleanalytics herkommt aber wo ich den für mich auslesen kann verstehe ich leider nicht :/

Weiß jmd wo ich den finde, ob ich das irgendwie umgehen kann oder ob mein Fehler vl ganz wo anders liegt? 

Wär euch für jede Hilfe oder Idee dankbar!
Danke schonmal im vorraus,
Niko


----------



## maki (19. Apr 2012)

URL, URLConenction etc. sind eher für Low Level Zeugs geeignet, denke du wärst mit dem Apache HttpClient besser dran: HttpComponents HttpClient Overview

Achtung: Version 3 unterscheidet sich sehr stark von Version 4 falls du Beispiele von anderen Seiten liest.


----------



## greece57 (19. Apr 2012)

maki hat gesagt.:


> URL, URLConenction etc. sind eher für Low Level Zeugs geeignet, denke du wärst mit dem Apache HttpClient besser dran: HttpComponents HttpClient Overview
> 
> Achtung: Version 3 unterscheidet sich sehr stark von Version 4 falls du Beispiele von anderen Seiten liest.



Erstmal danke! 
Werds wohl am ende damit lösen allerdings wärs halt auch schön wenn mir jmd erklären könnte woran es hier liegt  Also falls noch jmd eine Idee hat bitte nicht scheuen zu posten


----------



## greece57 (19. Apr 2012)

kleines Update:

Wenn ich einen aus dem HTTP Live Header tool ausgelesenen Cookie hinten dran hänge 
(z.B.: __utma=1.1362555259.1334841753.1334841753.1334841753.1; __utmb=1.2.10.1334841753; __utmc=1; __utmz=1.1334841753.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
funktioniert das ganze für 2-3 min :/

Hier noch das was ich auslese falls es jmd hilft:

1.:


> Kapilands
> 
> GET / HTTP/1.1
> Host: kapiland.de
> ...




2.


> Kapilands
> 
> POST /serverwahl.php4 HTTP/1.1
> Host: kapiland.de
> ...


----------



## irgendjemand (19. Apr 2012)

diese ganzen "_UT-irgendwas" cookies sind von google-anayltics ... die kannst du getrost ignorieren ...

ansonsten wirst du hier mit URLConnection so nicht weit kommen ... würde hier auch zu nem framework wie apache commons raten


----------



## greece57 (19. Apr 2012)

@irgendjmd:

Dh mein Fehler liegt nicht an den Google Analytics Cookies?
Aber wie kann es dann sein dass ich wenn ich sie mitschicke die richtige seite rausbekomme (wenn sie aktuell rauskopiert wurden) und wenn nicht ich immer auf der startseite lande?

warum werde ich nicht weit kommen? :/

Ja ich werds wohl darüber machen, trotzdem danke!  Ich würd halt trotzdem gern wissen wieso der ansatz falsch is :/


----------



## irgendjemand (19. Apr 2012)

du solltest dir vielleicht mal mit WireShark ansehen was genau dein browser sendet und was genau dein programm sendet ... ich denke nicht das es an den google-analytics-cookies liegt ...


----------



## maki (19. Apr 2012)

greece57 hat gesagt.:


> würd halt trotzdem gern wissen wieso der ansatz falsch is :/


Wie gesagt, du nimmst einen Low-Level Weg, musst selber die Parameter per String-Gefrickel setzen/raussplitten, dich um Cookies kümmern, etc. pp.

Du kannst schon zum Ziel kommen, ist viel schwieriger und aufwändiger als wenn du eine Bibliothek nimmst du extra für sowas gemacht wurde.

Externe Bibliotheken zu verwenden ist etwas vollkommmen normales in Java.

Nebenbei, manche Seiten wollen schlicht nicht von etwas anderem als einem Browser ausgelesen werden


----------



## greece57 (19. Apr 2012)

ok ich habe mich jetzt für den apache entschieden 

Allerdings steig ich (nach 2-3 stunden einarbeiten -.-^^) irgendwie nicht dahinter wie ich einen POST request an eine Seite sende

Könnte jmd meinen Versuch sich anzuschaun und mir erklären wie ich zum ziel komme (Seitenquelltext in einem String)

Bisheriger (mikriger^^) Versuch:

```
public static void main(String[] args) throws Exception {

        DefaultHttpClient httpclient = new DefaultHttpClient();

        HttpResponse response;
        HttpEntity entity;

        HttpPost httpost = new HttpPost("http://www.kapiland.de/serverwahl.php4");
     
        httpost.addHeader("server", "Welt6");
        httpost.addHeader("USR", "greece57");
        httpost.addHeader("pass", "*****");
        httpost.addHeader("gfxaktive", "1");

        response = httpclient.execute(httpost);
        entity = response.getEntity();

        // Und was jetzt :/
}
```


----------



## irgendjemand (20. Apr 2012)

-.-'
mal ne erliche frage : woher habt ihr alle das mit "HTTP POST werden im header gesendet" ? *habe zur zeit noch so n fall*

lest euch doch zu sowas bitte mal das hier durch : Hypertext Transfer Protocol ? Wikipedia
dort ist genau erklärt wie HTTP POST aufgebaut ist ...

oder ums kurz zu machen : du sendest die daten falsch ... statt im HTTP HEADER müssen diese in den HTTP BODY


----------



## greece57 (20. Apr 2012)

Haha, ich schätze das liegt daran, dass man eben die "Live Headers" immer ausließt und deswegen denkt man muss Headers hinzufügen ;D

So ich habe das ganze jetzt so abgeändert und eig stimmt alles mit den ausgelesen Headers überein aber es funktioniert nicht 

Ich les meine entity die ich mitschicke vorher aus (hab ich jetzt hier rausgelassen aus dem Code) und sie stimmt überein:



> run:
> 
> Ausgabe:
> Content: server=Welt6&USR=greece57&pass=******&gfxaktive=1
> ...




Wenn ich das ganze an "www.kapiland.de" schicke kriege ich als ResponseEntitiyContent den Quelltext von Kapilands und wenn ichs an die serverwahlseite schicke kriege ich nix -.-

Ich verzweifel langsam woran liegt das? :/

Hier Code + Live Headers bei normalem einloggen:


```
public static void main(String []args)
{
   HttpPost httpost = new HttpPost("http://kapiland.de/serverwahl.php4");

   List <NameValuePair> nvps = new ArrayList <NameValuePair>();
   nvps.add(new BasicNameValuePair("server", "Welt6"));
   nvps.add(new BasicNameValuePair("USR", "greece57"));
   nvps.add(new BasicNameValuePair("pass", "*******"));
   nvps.add(new BasicNameValuePair("gfxaktive", "1"));
         
          
   httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

   HttpResponse response = httpclient.execute(httpost);
   HttpEntity entity = response.getEntity();


   reader = new BufferedReader(new InputStreamReader(entity.getContent()));
        
   line = null;
   s = "";
        
   while((line = reader.readLine()) != null) {
       s += line + "\n";
   }
        
   System.out.println(s);
        
}
```


Die Headers sehen so aus:



> Kapilands
> 
> POST /serverwahl.php4 HTTP/1.1
> Host: kapiland.de
> ...


----------



## greece57 (20. Apr 2012)

So habe es gelöst in dem ich noch ne get anfrage hinterher geschickt hab 


```
public static void main(String[] args) throws Exception {

        DefaultHttpClient httpclient = new DefaultHttpClient();

        HttpResponse response;
        HttpEntity entity;
        
        HttpPost httpost = new HttpPost("http://kapiland.de/serverwahl.php4");
        
        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        nvps.add(new BasicNameValuePair("server", "Welt6"));
        nvps.add(new BasicNameValuePair("USR", "greece57"));
        nvps.add(new BasicNameValuePair("pass", "******"));
        nvps.add(new BasicNameValuePair("gfxaktive", "1"));
         
        httpost.setHeader("POST", "/serverwahl.php4");
         
        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); //Content-Type: application/x-www-form-urlencoded
        
        entity = new UrlEncodedFormEntity(nvps, HTTP.UTF_8);
        
        response = httpclient.execute(httpost);
        entity = response.getEntity();
        
        String loc = response.getFirstHeader("Location").getValue();
        System.out.println(loc);
        
        if (entity != null) {
            entity.consumeContent();
        }        
        
        HttpGet hg = new HttpGet(loc);                
        
        HttpResponse response2 = httpclient.execute(hg);
        
        entity = response2.getEntity();

        System.out.println("Login form get: " + response2.getStatusLine());        
           
        reader = new BufferedReader(
                new InputStreamReader(entity.getContent()));
        
        line = null;
        s = "";
        
        
        while((line = reader.readLine()) != null) {
            s += line + "\n";
        }
        
        System.out.println(s);
```


----------



## irgendjemand (20. Apr 2012)

hmm ... erstens sendest du es immer noch falsch da zwischen HTTP HEADER und HTTP BODY eine LEERZEILE ist ... und zweitens : HTTP 302 : MOVED ... ergo erwartet der server natürlich das du den dort übergebenen link requestest ...


wie ich sagte : nutze wireshark um zu sehen was dein browser sendet ... aber das hast du ja offenbar nicht getan


----------



## greece57 (23. Apr 2012)

So wochenende vorbei, weiter gehts mit der Verzweiflung:
Ich hab grad Wireshark installiert, dort muss ich mir doch dann nur die HTTP Packete anschaun, oder?
Aber die sind genau gleich mit den LiveHeaders die mir das Firefox plugin rausgespuckt hat :/

Und wie meintest du das mit dem Leerzeichen zw Header und Body? :/ Es funktioniert doch jetzt, glaubst du wirklich dass da nochwas falsch ist?

Weil ich krieg jetzt das problem wieder da wo ich letztes mal (am anfang des Threads) war :/ Nämlich, dass sobald ich einen weiteren Link uebergebe, er mir den Quellcode der Startseite ausgibt ://

Woran kann das liegen, wenn die Cookieverwaltung sogar von dem Client übernommen wird? 

Ich verzweifel echt langsam^^


----------



## greece57 (23. Apr 2012)

Vielleichts liegts ja an meiner weiteren Vorgehensweise:

Ich erstelle eine neue getanfrage mit einem Link den ich aus dem HTML Dokument der aktuellen Seite ausgelesen habe als Parameter (z.B.: (Pseudocode

```
String Stadt = getStadtAusQuellcode(alterQuellcode); // z.B.: Stadt = main.php4?page=stadtuebersicht&UIN=06b8a006a86f9e3099160316204999e5
HttpGet hg = new HttpGet("/" + Stadt);
client.execute(hg);

//... entity auslesen -> Quellcode der Startseite -.-
```

Mache ich hier vl einen Fehler? Ich benutze den clienten aus dem Login


----------



## greece57 (24. Apr 2012)

Hat keiner irgend eine Idee :/
Also meine weiteren Gedanken:
Ich habe jetzt die Anmeldung per Hand und die Automatische Anmeldung per Wireshark aufgezeichnet und mir ist aufgefallen dass mir der Server wenn ich eine getanfrage sende um auf die nächste Seite zu kommen folgendes zurückgibt:


> "HTTP/1.1 302 Found\\r\\n"


per hand gibt er mir zurück


> "HTTP/1.1 200 Ok\\r\\n"



Ich habe nachgeschaut und laut msdn.microsoft.com heißt ein 302 found soviel wie


> "Wenn kein Authentifizierungscookie vorhanden ist, wird die Anforderung zur Abfrage von Anmeldeinformationen auf eine Anmeldeseite umgeleitet."



Heißt dass nicht mit anderen Worten dass mir ein Cookie fehlt?  Liegt es vielleicht doch an den GoogleAnalyticCookies? -.- :/

Hat den keiner ne Idee mehr?


----------



## maki (24. Apr 2012)

302 war ursprünglich mal für einen temp.  clientseitigen Redirect gedacht, wird aber in der Praxis nicht so genutzt, sondern schlicht als Redirect auf eine andere ressource.



> Heißt dass nicht mit anderen Worten dass mir ein Cookie fehlt?


Entweder ein Cookie, oder ein Parameter, usw., kann in einem Browser zB. von JavaScript gesetzt werden was bei dir ja nicht läuft.

Wie gesagt, manche Webseiten wollen von nix anderem als einem Browser ausgelesen werden.


----------



## greece57 (24. Apr 2012)

Iwie hab ich auch das gefühl das es wirklich nur über nen browser mögl ist -.-
Gibt es irgend einen java gesteuerten Browser der für mich die automatisierung übernehmen könnte? :/ Kann da jmd was empfehlen?


----------



## greece57 (24. Apr 2012)

Thema erledigt -.-
Fehler war billiger als gedacht... -.-
Ich such mir einen substring aus dem quelltext mit dem ich auf die nächste seite navigiere... schade nur dass ich dem substring EIN zeichen zu viel abgeschnitten hab -.-^^

Oh man naja jetzt gehts^^ Trotzallem danke für alles!!! Ohne euch hätte ich das projekt wohl zur seite gelegt  Und gelernt hab ich auch was


----------

