[Java] Auf Homepage einloggen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Satoru, 22. Juni 2010 .

  1. 22. Juni 2010
    Auf Homepage einloggen

    Hi Leute,

    ich versuche gerade mit Java ein Programm zu schreiben, das sich selbstständig auf eine bestimmte Homepage einloggt und mit dann Einzelheiten aus der neuen Seite ausliest.
    Dazu habe ich mir auch schon HTMLUnit runter geladen, von dem ich gelesen habe, es sei geeignet.
    Das grundsätzliche habe ich schon verstanden, nämlich das man dieses "form" ausfüllt und dann sumbittet. Das ganze wird aber schwieriger wenn kein Button da ist, mit dem man submitten kann..
    Das einzige in dem Quelltext der Seite, was für den Submit gedacht ist lautet:

    <input type="submit" class="hiddenSubmit" />
    <a class="submit" href="javascript:;" onclick="Form.submit(this)" tabindex="3">Anmeldung</a>
    <div class="signUp">

    Und hierbei verstehe ich nicht, wie ich das submitten soll.. Ich habe schon versucht, die Login/Passwort Felder auszufüllen und dann einfach den Lick zu klicken, oder im Passwort-Feld noch '\n' eingegeben, um die Enter-Taste zu simulieren, aber bisher hat nichts so richtig geklappt. Dann habe ich es mit "Selenium" den Login-Vorgang aufgezeichnet, und der hatte dann als Submit folgendes stehen:

    selenium.click("//x:a[@onclick='Form.submit(this)']");

    Das blöde bei Selenium ist, dass es immer mit meinem realen Browser gestartet werden muss, und das kann ich nicht gebrauchen.. gibt es da nicht auch eine Möglichkeit für HTMLUnit?

    Habt ihr vielleicht eine Idee?

    Grüße,
    Satoru
     
  2. 22. Juni 2010
    AW: Auf Homepage einloggen

    Wie ist denn der Link zur Seite so kann ich dir schlecht helfen.
     
  3. 22. Juni 2010
    AW: Auf Homepage einloggen

    Das hier ist die Seite:

    https://eu.battle.net/login/login.xml?ref=http%3A%2F%2Feu.wowarmory.com%2Findex.xml&app=armory&cr=true
     
  4. 22. Juni 2010
    AW: Auf Homepage einloggen

    So wie ich das sehe musst du einfach ein POST absetzen
    Code:
    Host: eu.battle.net
    User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
    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
    Keep-Alive: 115
    Connection: keep-alive
    Referer: https://eu.battle.net/login/login.xml?ref=http%3A%2F%2Feu.wowarmory.com%2Findex.xml&app=armory&cr=true
    Cookie: JSESSIONID=1A1A72BB4F1BEF16E71EFEF685C1F2CC.blade08_01; __utma=134253166.2041345919.1277197389.1277197389.1277197389.1; __utmb=134253166.2.10.1277197389; __utmc=134253166; __utmz=134253166.1277197389.1.1.utmcsr%3Dgo.raidrush.ws%7Cutmccn%3D(referral)%7Cutmcmd%3Dreferral%7Cutmcct%3D%2F
    Proxy-Authorization: Basic bGVkYTEwMTE6cGE1NXcwckQ=
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 38
    Content:
    accountName=USERNAME&password=PASSWORT
    
    Dazu brauchtest du nit mal eine Externes Framework, sollte auch mit den normalen Out- und InputStreams zu lösen sein

    Such einfach mal nach [G]HTTP Post Request java[/G]
    mfg
     
  5. 22. Juni 2010
    AW: Auf Homepage einloggen

    nimm für den POST Befehl am Besten des Apache HTTP Framework.

    Wie gesagt, einfach per POST einloggen und dann die Antwort auswerten, musst aber auch auf die Cookies aufpassen!
     
  6. 22. Juni 2010
    AW: Auf Homepage einloggen

    Also ich hab mal ein bisschen rumgelesen, aber richtig Bescheid weis ich immer noch nicht. So wie es in dem Code unten steht müsste es eigendlich klappen, nur sagt er dazwischen was das er iwelche Cookies nicht annimmt:

    WARN [org.apache.commons.httpclient.HttpMethodBase] Cookie rejected: "$Version=0; BAC-tassadar=EU-135384-dvgN2HFt6ZfALf3DbgxpBVIVpGsA2Iva9lZ; $Path=/login; $Domain=battle.net". Domain attribute "battle.net" violates RFC 2109: domain must start with a dot

    Wie kann ich das mit den Cookies ändern, und am Ende überprüfen ob der Login geklappt hat?

    Code:
     
     try{
     HttpClient client = new HttpClient();
     PostMethod method = new PostMethod("https://eu.battle.net/login/login.xml?ref=http://eu.wowarmory.com/index.xml&app=armory&cr=true");
     NameValuePair[] data = {
     new NameValuePair( "accountName", "$$$$" ),
     new NameValuePair( "password", "$$$$" )
     };
     method.setRequestBody(data);
    
     client.executeMethod(method);
    
     InputStream in = method.getResponseBodyAsStream();
     method.releaseConnection();
     System.out.println(in);
     }
     catch(Exception e){}
    
     
  7. 22. Juni 2010
    AW: Auf Homepage einloggen

    Das Problem mit den Cookies ist in diesem Fall nicht deine Schuld sondern eher die von Blizzards Webserver. In RFC 2109 ist für die Cookies ein bestimmtes Format festgelegt worden, unter anderem, dass explizite Domainbeschränkungen mit einem Punkt beginnen müssen.

    Ich kenne den ApacheCommons HttpClient nicht näher, aber vllt. gibt es eine Möglichkeit auch nicht standardkonforme Cookies anzunehmen.

    Andernfalls würde ich einfach mit den Java-Bordmitteln arbeiten, denn Post-Requests sind auch damit nicht schwer. Den Cookie könntest du dann aus dem Response-Stream z.B. mit einer RegExp auslesen.
     
  8. 22. Juni 2010
    AW: Auf Homepage einloggen

    Du musst auch vorher definieren dass es eine HTTPS Verbindung ist!

    Weil sonst kriegste da auch Stress!
    Kannst dir ja den source von meinem web.de generator laden und gucken ob du da rausfischen kannst was dich angeht
     
  9. 23. Juni 2010
    AW: Auf Homepage einloggen

    Also ich glaub ihr müsst mir nochmal helfen, ich habe jetzt rumgesucht und dieses skript hier gefunden und für mein Zweck abgeändert. So wie ich das verstanden habe wird zuert

    -auf die geschütze Url zugegriffen
    -auf loginpage weitergeleitet
    -dort vio POST eingeloggt
    -und dann die ursprüngliche url ausgewertet

    das schein allerdings nicht wirklich zu klappen..
    was genau verursachen denn die

    //authpost.setRequestHeader(authget.getRequestHeader("Cookie"));
    //authpost.setRequestHeader(authget.getRequestHeader("Host"));
    //authpost.setRequestHeader(authget.getRequestHeader("User-Agent"));

    befehle? Wenn die nicht auskommentiert sind, bleibt das skript an der stelle hängen

    Code:
    //setzen der grschützen url
    
    String url = "http://eu.wowarmory.com/auctionhouse/index.xml#search";
    HttpClient client = new HttpClient();
    HostConfiguration hostconfig = new HostConfiguration();
    
    //cookie handling
    
    hostconfig.getParams().setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
    
    
    //auf geschützte url zugreifen und zur login-page redirected werden
    
     GetMethod authget = new GetMethod(url);
     try {
     client.executeMethod(authget);
     } catch (HttpException httpe) {
     // LOG.error(httpe.getMessage(), httpe);
     } catch (IOException ioe) {
     // LOG.error(ioe.getMessage(), ioe);
     }
     
     String responseBody = authget.getResponseBodyAsString();
     
    //Login Daten einstellen
    
     NameValuePair[] data = new NameValuePair[2];
     data[0] = new NameValuePair("accountName", "$$$$$$$");
     data[1] = new NameValuePair("password", "$$$$$$$");
    
    // einloggen
     
     PostMethod authpost = new PostMethod("https://eu.battle.net/login/login.xml?ref=http%3A%2F%2Feu.wowarmory.com%2Fauctionhouse%2Findex.xml&app=armory&cr=true#search");
     authpost.setRequestBody(data);
     
    //Diese 3 Request klappen irgendwie nich
     //authpost.setRequestHeader(authget.getRequestHeader("Cookie"));
     //authpost.setRequestHeader(authget.getRequestHeader("Host"));
     //authpost.setRequestHeader(authget.getRequestHeader("User-Agent"));
    
     
    //get-connection beenden
     authget.releaseConnection();
     
     try {
     client.executeMethod(authpost);
     } catch (HttpException httpe) {
     System.err.print("HttpException");
     System.err.println(httpe.getMessage());
     httpe.printStackTrace();
     } catch (IOException ioe) {
     System.err.print("IOException");
     System.err.println(ioe.getMessage());
     ioe.printStackTrace();
     }
    
     authget.setRequestHeader(authpost.getRequestHeader("Cookie"));
     authget.setRequestHeader(authpost.getRequestHeader("Host"));
     authget.setRequestHeader(authpost.getRequestHeader("User-Agent"));
    
     authpost.releaseConnection();
     
    //ergebnisse auswerten
    
     authget = new GetMethod(url);
     try {
     client.executeMethod(authget);
     } catch (HttpException httpe) {
     // LOG.error(httpe.getMessage(), httpe);
     } catch (IOException ioe) {
     // LOG.error(ioe.getMessage(), ioe);
     }
     responseBody = authget.getResponseBodyAsString();
     System.out.println(responseBody);
    
     authget.releaseConnection();
    
    
     }
     catch(Exception e){}
    
    Im Prinzip soll das Programm wenn es fertig ist, sich in meinen Wow Account anmelden, das Web-Auktionshaus von meinem Main-Char durchsuchen und analysieren und dann selbständig Dinge kaufen bzw verkaufen. Ist sowas denn prinzipiell machbar, oder zieht das einen unverhältnismäßig großen Aufwand hinter sich?
     
  10. 23. Juni 2010
    AW: Auf Homepage einloggen

    Also die Befehle konfigurieren deinen POST Befehl mit dem du dich ja einloggen willst!

    Also wenn du bei Schritt 2 "auf loginpage weitergeleitet" bist, kriegste einen Cookie mitgeliefert wenn du auf die nächste Seite geleitet wirst.
    Wenn du dich dann auf dieser Seite einloggen willst, per Post Befehl, musste da den Cookie mitschicken damit der Server weiß wer sich gerade anmelden will von den Cookies her!

    Und wie du den Post konfigurierst musste nochmal guckn, nimm dir doch meinen web.de generator als Beispiel, der loggt sich auch auf nen HTTPS Server ein und wertet diese Seite aus.
     
  11. 23. Juni 2010
    AW: Auf Homepage einloggen

    So, jetzt habe ich ein Teil von unix' Programm mal ein bisschen umgeschrieben, und glaube meinem Ziel etwas näher gekommen zu sein... Ich hab jetzt einfach mal Studivz genommen, weil das ja auch "https" ist und vom Prinzip her das gleiche sein sollte.
    Mir sind aber noch ein paar Befehl nicht ganz verständlich, zB
    // post.setRequestHeader("Referer","https://user.web.de/all.jsf?mc=hp@fm.produkte@freemail");
    Außerdem weis ich noch nicht wie ich nach dem Post-Befehl den Quelltext von der neuen Seite kriege, da brauch ich doch eine GetMethod, der ich dann die URL der neuen Seite übergeben muss, oder?


    Code:
    try{
     HttpClient client = new HttpClient();
     HostConfiguration hostconfig = new HostConfiguration();
     hostconfig.getParams().setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
    
     NameValuePair[] data = new NameValuePair[2];
     data[0] = new NameValuePair("accountName", "$$$$$");
     data[1] = new NameValuePair("password", "§§§§§");
    
     PostMethod post = new PostMethod("https://secure.studivz.net/Login");
     System.out.println("Mouse Clicked");
    
    // post.setRequestHeader("POST /all.jsf", "HTTP/1.1");
     post.setRequestHeader("POST https://secure.studivz.net/Login", "HTTP/1.1");
     post.setRequestHeader("Host", "secure.studivz.net");
     post.setRequestHeader("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.5");
     post.setRequestHeader("Accept"," text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
     post.setRequestHeader("Accept-Language"," de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
     post.setRequestHeader("Accept-Encoding", " gzip,deflate");
     post.setRequestHeader("Accept-Charset"," ISO-8859-1,utf-8;q=0.7,*;q=0.7");
     post.setRequestHeader("Keep-Alive", " 300");
     post.setRequestHeader("Connection", " keep-alive");
    // post.setRequestHeader("Referer","https://user.web.de/all.jsf?mc=hp@fm.produkte@freemail");
     post.setRequestHeader("Cookie", " NGCount=X0712311Ecvg017X; ");
    // post.setRequestHeader("Cookie", nssample);
     post.setRequestHeader("ns_cookietest", "true");
     post.setRequestHeader("ns_session", "true");
    // post.setRequestHeader("Cookie", sessionstring);
    
     // [end]
     System.out.println("*************************************************");
     System.out.println("*************************************************");
     post.setRequestBody(data);
     try {
     client.executeMethod(post);
     System.out.println("**************************************************//////////////////////////////**************");
     System.out.println("**************************************************//////////////////////////////**************");
    
     } catch (HttpException e) {
     System.out.println("HTTP Exception in client.executeMethod(post)");
     e.printStackTrace();
     } catch (IOException e) {
     System.out.println("IO Exception in client.executeMethod(post)");
     e.printStackTrace();
     }
    
     System.out.println("Post Send");
    // System.out.println(post.getStatusText());
    
     Header[] aHeader = post.getResponseHeaders();
     post.releaseConnection();
     String headers = ("");
     System.out.println("****************Post Header Response");
     System.out.println(post.getStatusCode() + " " + post.getStatusText());
     for (int l = 0; aHeader != null && l < aHeader.length; l++) {
     System.out.println(aHeader[l]);
     headers += aHeader[l];
     }
     System.out.println("****************Post Header Response Fertig!");
     }
     catch(Exception e){}
    
    als Post Header Response gibt der mir das hier aus:

    Code:
    ****************Post Header Response
    302 Found
    Date: Wed, 23 Jun 2010 14:57:41 GMT
    
    Content-Type: text/html; charset=utf-8
    
    Transfer-Encoding: chunked
    
    Connection: keep-alive
    
    Server: Apache
    
    Set-Cookie: PHPSESSID=f26f2121125ff67d48add78afd25df2cf606b664; path=/; domain=.studivz.net; HttpOnly
    
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    
    Pragma: no-cache
    
    Location: http://www.studivz.net
    
    Content-Encoding: gzip
    
    Vary: Accept-Encoding
    
    Frontend: lnxp-2536
    
    ****************Post Header Response Fertig!
    
     
  12. 24. Juni 2010
    AW: Auf Homepage einloggen

    damit setzt du deine herkunft.
    der server bekommt beim post gesagt, dass du von der Seite die im referer steht kommst

    klappt das login bei studivz?
     
  13. 24. Juni 2010
    AW: Auf Homepage einloggen

    Also ob es klappt bin ich mir noch nicht so sicher, ich bekomme auf jeden Fall
    302 Found als status code vom POST. Ich verstehe nur nicht, warum ich null als Antwort für System.out.println(post.getResponseBodyAsString()); bekomme. Ich muss doch irgendwie zugriff auf die neue Seite haben, in dem Fall ja meine Startseite bei Studivz, um die dann nach irgendwelchen Links zB zu durchsuchen.
     
  14. 24. Juni 2010
    AW: Auf Homepage einloggen

    Ich würd dir empfehlen, dich mit dem Addon Firebug fürn Firefox anzufreunden!

    Damit siehst du, was beim einloggen übern Browser passiert und kannst des dann in dein Programm einbauen!!!
    Des Teil hilft echt extrem!!!
     
  15. 24. Juni 2010
    AW: Auf Homepage einloggen

    302 Found heißt, dass es die Seite zwar gibt, die aber an einem anderen Ort (sprich andere URL) abrufbar ist. Der Server schickt bei einer "302 Found" Antwort keinen Body mit, sondern nur einen "Location"-Header. Den musst du auslesen und dann aufrufen.
     
  16. 24. Juni 2010
    AW: Auf Homepage einloggen

    Es macht in diesem Fall keine Sinn, dem Location-Header zu folgen, weil du dann vorher einfach einen sinnlosen Request gemacht hast. Stattdessen musst du einfach die richtige URL für den Login herausfinden.

    Du solltest wirklich, wie unix auch schon vorgeschlagen hat, dir einfach ansehen, was dein Browser für Requests verschickt, wenn du dich auf der Seite einloggst.

    Dazu kannst du entweder Wireshark benutzen oder ein Browser-Addon deiner Wahl. In Opera ist sowas sogar integriert
    Dann loggst du dich einfach auf der Seite ein und die Requests werden aufgezeichnet. Dann kennst du alle URLs und Post-Daten und kannst die Requests einfach mit deinem Programm verschicken.
     
  17. 24. Juni 2010
    AW: Auf Homepage einloggen

    Warum sollte es keinen Sinn machen?
    Es gibt Anwendungen, die beim Login einfach einen Cookie setzen und dann mittels 302 Found auf eine neue URL umleiten. Dabei wird das gesetzte Cookie mitgeschickt und die Anwendung weiß, dass man sich eingeloggt hat.
     
  18. 24. Juni 2010
    AW: Auf Homepage einloggen

    Okay, du hast Recht, es kommt halt immer auf den konkreten Fall an. Manchmal ist aber auch einfach nur der Request falsch, dass wollte ich eigentlich damit sagen.

    Wenn man sich sein StudiVz-Beispiel nochmal ansieht, kann es sogar sehr gut sein, dass er nur noch dem Location-Header folgen muss.
     
  19. 24. Juni 2010
    AW: Auf Homepage einloggen

    Super Leute, vielen Dank! Ich hab mir direkt dieses Firebug geholt und damit halt schön die ganzen Infos ausgelesen und den Post gemacht. Das einzige was noch fehlt ist der Cookie für den JSESSIONID= ..., da verstehe ich nicht ganz wo ich das "..." auslesen soll, damit ich den quasi selber zusammenbasteln kann. Ich hab den HeaderRequest für diesen Cookie einfach jetzt auskommentiert und es scheint trotzdem zu klappen

    Er sagt jetzt auch "302 Moved Temporarily". Dann hab ich einfach aus dem Header die neue URL ausgeschnitten und per GET ausgelesen. Nur nochmal zum verständnis: Wenn ich zB mein Passwort ändere, dann kommt "200 OK". Bedeutet das also nur, dass die Weiterleitung erfolgreich war oder?
     
  20. 24. Juni 2010
    AW: Auf Homepage einloggen

    Bei 200 OK wird einfach die Webseite ohne Fehler ausgeliefert.

    Das ist aber nicht damit zu verwechseln, ob das Passwort erfolgreich geändert wurde oder nicht. Um das zu testen solltest du auf der zurückgegebenen Seite nach bestimmten Wörtern suchen, bspw. "Änderung gespeichert".
     
  21. 24. Juni 2010
    AW: Auf Homepage einloggen

    Sorry, da habe ich mich etwas unklar ausgedrückt Ich meinte, wenn ich mein Passwort beim einloggen ändere, sodass ich mich mit einem falschen Passwort einlogge, dann klappt die Weiterleitung problemlos
     
  22. 24. Juni 2010
    AW: Auf Homepage einloggen

    Und hast du auf der Seite, auf die du weitergeleitet wurdest, schonmal geschaut ob so Wörter wie "Login erfolgreich" oder "Login fehlgeschlagen" auftauchen? Denn nur dann kannst du sicher sein, dass der Login funktioniert hat.
    Ich vermute, dass das Loginscript einfach ein Cookie setzt und dich weiterleitet, egal ob du ein richtiges PW angegeben hast oder nicht. Erst auf der nachfolgenden Seite siehst du dann, ob der Login erfolgreich war oder nicht.
     
  23. 24. Juni 2010
    AW: Auf Homepage einloggen

    Also mit ich habe das ganze ja wieder auf eu.battle.net umgestellt, wie es ja ursprünglich war. Und ich starte mit einer URL die auf einen passwort geschützen Bereich zugreift. Also kommt direkt die Login Seite, der ich den POST schicke. Un dann schau ich mir den Header von der Antwort an und lese die neue Seite aus, und dort finde ich dann die geschützen Inhalte, unter anderem Begriffe wie "Sie sind angemeldet als ...."
    Von daher müsste es doch eigntl geklappt haben, oder?
     
  24. 24. Juni 2010
    AW: Auf Homepage einloggen


    Und wenn du dich mit nem Falschen Pass einloggst kommt als Response, dass du eingeloggt bist mit deinem nick in der Antwort vom Server und so???

    Iwie schwer zu glauben ^^
    Plausibel wäre,
    falsches PW -> 200 OK -> Extra Page wo steht, bitte geben Sie ihr PW nochmal ein!
     
  25. 24. Juni 2010
    AW: Auf Homepage einloggen

    Also: Richtige LoginDaten -> 302 Moved Temporarily -> Im Header steht neue URL -> Dort steht ich bin eingeloggt

    Falsche LoginDaten -> 200 OK -> Es wird der Body übergeben, und dort steht meine LoginDaten sind falsch.

    In meinen Augen stimmt das alles, was meint ihr?
     
  26. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.