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

  • Themenstarter Themenstarter greece57
  • Beginndatum Beginndatum
G

greece57

Gast
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)
Java:
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:

Java:
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
 
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 😉
 
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
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
Date: Thu, 19 Apr 2012 12:41:23 GMT
Server: lighttpd/1.4.28
----------------------------------------------------------
http://www.google-analytics.com/__u...tmccn=(direct)|utmcmd=(none);&aip=1&utmu=qhQ~

GET /__utm.gif?utmwv=5.2.8&utms=1&utmn=1797480150&utmhn=kapiland.de&utmcs=ISO-8859-1&utmsr=1280x800&utmvp=1280x661&utmsc=24-bit&utmul=de-de&utmje=1&utmfl=11.2%20r202&utmdt=Kapilands&utmhid=1625454870&utmr=-&utmp=%2F&utmac=UA-19753332-1&utmcc=__utma%3D1.384734605.1334839282.1334839282.1334839282.1%3B%2B__utmz%3D1.1334839282.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmu=qhQ~ HTTP/1.1
Host: Google Analytics Official Website - Web Analytics & Reporting ? Google Analytics
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: Kapilands

HTTP/1.1 200 OK
Date: Wed, 18 Apr 2012 15:26:48 GMT
Content-Length: 35
X-Content-Type-Options: nosniff
Pragma: no-cache
Expires: Wed, 19 Apr 2000 11:43:00 GMT
Last-Modified: Wed, 21 Jan 2004 19:51:30 GMT
Content-Type: image/gif
Cache-Control: private, no-cache, no-cache=Set-Cookie, proxy-revalidate
Age: 76478
Server: GFE/2.0
----------------------------------------------------------


2.
Kapilands

POST /serverwahl.php4 HTTP/1.1
Host: kapiland.de
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: Kapilands
Cookie: __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)
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
server=Welt6&USR=greece57&pass=******&gfxaktive=1
HTTP/1.1 302 Found
Location: Kapiland (Welt6)
Content-Type: text/html
Content-Length: 0
Date: Thu, 19 Apr 2012 13:45:05 GMT
Server: lighttpd/1.4.28
----------------------------------------------------------
Kapiland (Welt6)

GET /logw.php4?USR=greece57&pass=d879e72767f20908f0e923fb970a69bb&gfxaktive=1&code8e= HTTP/1.1
Host: s6.kapilands.eu
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: Kapilands
Cookie: PHPSESSID=bc7dl7l3v1o9lav1lrb745b6n1; user_c=2241529; kapisave=2241529; __utma=1.13709108.1334841759.1334841759.1334841759.1; __utmb=1.6.10.1334841759; __utmc=1; __utmz=1.1334841759.1.1.utmcsr=kapiland.de|utmccn=(referral)|utmcmd=referral|utmcct=/

HTTP/1.1 302 Found
Location: Kapiland (Welt6)
Content-Type: text/html
Content-Length: 0
Date: Thu, 19 Apr 2012 13:45:10 GMT
Server: lighttpd/1.4.28
----------------------------------------------------------
 
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
 
@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 :/
 
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 ...
 
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 😉
 
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:
Java:
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 :/
}
 
-.-'
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
 
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

ContentTyp: application/x-www-form-urlencoded; charset=UTF-8
ContentLength: 50

ResponseStatusLine: Login form get: HTTP/1.1 302 Found

ResponseEntitiyContent:

BUILD SUCCESSFUL (total time: 5 seconds)


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:

Java:
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
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: Kapilands
Cookie: __utma=1.1362555259.1334841753.1334852048.1334916231.3; __utmc=1; __utmz=1.1334841753.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=1.3.10.1334916231
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
server=Welt6&USR=greece57&pass=*******&gfxaktive=1

HTTP/1.1 302 Found
Location: Kapiland (Welt6)
Content-Type: text/html
Content-Length: 0
Date: Fri, 20 Apr 2012 10:23:54 GMT
Server: lighttpd/1.4.28
 
So habe es gelöst in dem ich noch ne get anfrage hinterher geschickt hab 😀

Java:
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);
 
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
 
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^^
 
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🙂
Java:
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
 
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? 🙁
 
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.
 
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?
 
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 😀
 

Zurück
Oben