#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 + Multi-Zitat Zitieren
#2 22. Juni 2010 AW: Auf Homepage einloggen Wie ist denn der Link zur Seite so kann ich dir schlecht helfen. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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! + Multi-Zitat Zitieren
#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){} + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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! + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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!!! + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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". + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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! + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren