Weblogin

  • Antworten:7
DerKiLLa
  • Forum-Beiträge: 8

05.01.2011, 08:34:25 via Website

Hallo alle zusammen,
ich habe eine Frage zu einem Login auf einer Website.
Es geht um folgende Seite: http://www.readmore.de

Meine 2 Versuche funktionieren einfach nicht und ich sehe keine Grund

1URLConnection connection = new URL("http://www.readmore.de/index.php?cont=login").openConnection();
2connection.setDoOutput(true);
3String content =
4"email=" + URLEncoder.encode ("test@test.test) +
5"&password=" + URLEncoder.encode ("test") +
6"&cookie=" + URLEncoder.encode ("true") +
7"&login=" + URLEncoder.encode ("Anmelden");
8connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
9connection.setRequestProperty("Content-Length", "" + content.getBytes().length + "");
10
11OutputStream output = connection.getOutputStream();
12output.write(content.getBytes());
13InputStream stream = connection.getInputStream();
14connection.connect();
15output.close();

Das war mein erster Versuch, hat nicht geklappt.

Danach habe ich versucht HttpPost zu nutzen.
1DefaultHttpClient httpclient = new DefaultHttpClient();
2HttpPost httpost = new HttpPost("http://www.readmore.de/index.php?cont=login");
3httpost.setHeader("Content-Type","application/x-www-form-urlencoded");
4
5List <NameValuePair> nvps = new ArrayList <NameValuePair>(4);
6nvps.add(new BasicNameValuePair("email", "test@test.test));
7nvps.add(new BasicNameValuePair("password", "test"));
8nvps.add(new BasicNameValuePair("cookie", "true"));
9nvps.add(new BasicNameValuePair("login", "Anmelden"));
10httpost.setEntity(new UrlEncodedFormEntity(nvps));
11HttpResponse response = httpclient.execute(httpost);

Geht aber leider auch nicht.

Der HTTP-Header sieht folgendermaßen aus, wenn man sich mit Firefox einloggt:
http://www.readmore.de/index.php?cont=login

POST /index.php?cont=login HTTP/1.1
Host: http://www.readmore.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.readmore.de/index.php?cont=login
Cookie: xxx
Content-Type: application/x-www-form-urlencoded
Content-Length: 63
email=test%40test.test&password=test&cookie=true&login=Anmelden

Hoffentlich kann mir einer helfen, wenn es selbst jemand testen möchte, hier sind Zugangsdaten:
E-Mail: test@test.test
Password: test

Wenn ich übrigens per setRequestProperty im ersten Versuch ein Cookie übergeb, dass ich aus Firefox ausgelesen habe, dann funktioniert der Login, aber dass ist ja keine Lösung ;)

— geändert am 05.01.2011, 08:35:13

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

05.01.2011, 18:27:39 via Website

Ich vermute das die Session in den Cookies steckt. Ich hatte so einen ähnlichen Fall ebenfalls schon mal und habe das folgendermaßen gelöst. Ich kann Dir jetzt nicht den ganzen Code schicken deshalb nur ein paar Ansatzpunkte:

1.) Du rufst zuerst die Startseite von denen auf. Verwenden dazu zum Beispiel:

1BasicCookieStore cookieStore;
2 BasicHttpContext httpContext;
3 DefaultHttpClient httpClient;
4
5 cookieStore = new BasicCookieStore();
6 httpContext = new BasicHttpContext();
7 if (cookieStore != null && httpContext != null) {
8 httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
9 httpClient = new DefaultHttpClient();
10 if (httpClient != null) {
11 HttpGet httpActivity = new HttpGet("dieStartWebseite");
12 HttpResponse httpResponseActivity = httpClient.execute(httpActivity, httpContext);
13 int statusActivity = httpResponseActivity.getStatusLine().getStatusCode();
14 if (statusActivity == HttpStatus.SC_OK) {
15 HttpEntity httpEntityActivity = httpResponseActivity.getEntity();
16 if (httpEntityActivity != null) {
17 InputStream inputStreamActivity = httpEntityActivity.getContent();
18 ...

Wenn das erfolgreich war dann stecken deren Informationen alle im Cookiestore.

2.) Nun kannst Du den Login machen. Dazu verwendest Du einen ähnlichen Aufbau wie oben ab HttpGet und erweiterst nur den URL durch den voll ausgebauten Login Code wie aus Deinem Code.

Ich hatte mir an meiner Aufgabe ebenfalls die Zähne ausgebissen bis ich begriffen hatte das ich erst einen "unverfänglichen" Zugriff machen muss damit die Session im CookieStore liegt. Ab da konnte ich Rahmen der Session Gültigkeit durch die Webseite wandern.

Gruß
Harald

Antworten
DerKiLLa
  • Forum-Beiträge: 8

05.01.2011, 22:44:33 via Website

Danke für die Antwort, klingt echt gut, nur leider ändert es nix ...
Hab jetzt alles mögliche damit probiert, also auch deine Variablen zu halten und weiter zu nutzen, aber leider ohne Erfolg.

Nach dem ersten Aufruf der Startseite steht auch etwas in httpContext und cookieStore drin, aber es ändert nix ;|.

1try {
2 BasicCookieStore cookieStore;
3 BasicHttpContext httpContext;
4 DefaultHttpClient httpClient;
5 cookieStore = new BasicCookieStore();
6 httpContext = new BasicHttpContext();
7 httpClient = new DefaultHttpClient();
8
9 if (cookieStore != null && httpContext != null) {
10 httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
11 if (httpClient != null) {
12 HttpGet httpActivity = new HttpGet("http://www.readmore.de/index.php");
13 HttpResponse httpResponseActivity = httpClient.execute(httpActivity, httpContext);
14 int statusActivity = httpResponseActivity.getStatusLine().getStatusCode();
15 if (statusActivity == HttpStatus.SC_OK) {
16 HttpEntity httpEntityActivity = httpResponseActivity.getEntity();
17 if (httpEntityActivity != null) {
18 InputStream inputStreamActivity = httpEntityActivity.getContent();
19 try
20 {
21 HttpPost httpost = new HttpPost("http://www.readmore.de/index.php?cont=login");
22 httpResponseActivity = httpClient.execute(httpost, httpContext);
23 httpost.setHeader("Content-Type","application/x-www-form-urlencoded");
24 //httpost.setHeader("Content-length", "61");
25
26 List <NameValuePair> nvps = new ArrayList <NameValuePair>(4);
27 nvps.add(new BasicNameValuePair("email", email));
28 nvps.add(new BasicNameValuePair("password", password));
29 nvps.add(new BasicNameValuePair("cookie", "true"));
30 nvps.add(new BasicNameValuePair("login", "Anmelden"));
31 httpost.setEntity(new UrlEncodedFormEntity(nvps));
32
33 statusActivity = httpResponseActivity.getStatusLine().getStatusCode();
34 if (statusActivity == HttpStatus.SC_OK) {
35 httpEntityActivity = httpResponseActivity.getEntity();
36 if (httpEntityActivity != null) {
37 inputStreamActivity = httpEntityActivity.getContent();
38 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStreamActivity));
39 StringBuilder sb = new StringBuilder();
40 String line = null;
41
42 while ((line = reader.readLine()) != null) {
43 sb.append(line + "\n");
44 }
45 // write html to System.out for debug
46 inputStreamActivity.close();
47
48 int iSuche = 0;
49 iSuche = sb.indexOf("myrmcontainer");
50 myString = myString + "\nmyrmcontainer gefunden an Stelle " + iSuche + "\n";
51 myString = myString + "\n" + sb.toString().substring(iSuche);
52 }
53 }
54 } catch (IOException e) {
55
56 }
57 }
58 }
59 }
60 }
61
62 } catch (IOException e) {
63
64 }

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

06.01.2011, 07:48:49 via Website

Meines Erachtens ist der Post in falscher Reihenfolge. Du schickst ihn erst ab (execute) und dann baust Du die Parameter zusammen. Erzeuge bitte auch eigene Variablen für die Response etc.

Gruß
Harald

Antworten
DerKiLLa
  • Forum-Beiträge: 8

06.01.2011, 08:15:05 via Website

Ist natürlich richtig, hatte ich auch so probiert, keine Ahnung warum ich es am Ende nochmal nach oben kopiert habe ;)
Eigene Variablen hatte ich auch probiert, aber hatte nix verändert.

1HttpPost httpost = new HttpPost("http://www.readmore.de/index.php?cont=login");
2 httpost.setHeader("Content-Type","application/x-www-form-urlencoded");
3 //httpost.setHeader("Content-length", "61");
4
5 List <NameValuePair> nvps = new ArrayList <NameValuePair>(4);
6 nvps.add(new BasicNameValuePair("email", email));
7 nvps.add(new BasicNameValuePair("password", password));
8 nvps.add(new BasicNameValuePair("cookie", "true"));
9 nvps.add(new BasicNameValuePair("login", "Anmelden"));
10 httpost.setEntity(new UrlEncodedFormEntity(nvps));
11
12 HttpResponse httpPostResponse = httpClient.execute(httpost, httpContext);
13
14 int PostStatus = httpPostResponse.getStatusLine().getStatusCode();
15 if (PostStatus == HttpStatus.SC_OK) {
16 HttpEntity httpPostEntity = httpPostResponse.getEntity();
17 if (httpPostEntity != null) {
18 InputStream inputPostStream = httpPostEntity.getContent();
19 BufferedReader reader = new BufferedReader(new InputStreamReader(inputPostStream));
20 StringBuilder sb = new StringBuilder();
21 String line = null;
22
23 while ((line = reader.readLine()) != null) {
24 sb.append(line + "\n");
25 }
26 // write html to System.out for debug
27 inputStreamActivity.close();
28
29 int iSuche = 0;
30 iSuche = sb.indexOf("myrmcontainer");
31 myString = myString + "\nmyrmcontainer gefunden an Stelle " + iSuche + "\n";
32 myString = myString + "\n" + sb.toString().substring(iSuche);
33 }
34 }

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

06.01.2011, 08:32:39 via Website

Das wird jetzt zu try&error wie das halt manchmal so ist. Nimm spaßeshalber den "cont=login" runter als 5ten Parameter (nur ein Versuch, nicht das nachher der Post zwei '?' im URL hat ;-) und dann lass mal den setHeader ganz weg.

Ansonsten wüsste ich jetzt auch nicht weiter.

Was passiert denn wenn Du den URL per Hand zusammenbaust und abschickst (per GET)? Kommst Du rein?

Ist übrigens eine Seite ohne sichtbaren logout - oder habe ich den in dem ganzen Krims-Krams übersehen?

Gruß
Harald

Antworten
DerKiLLa
  • Forum-Beiträge: 8

06.01.2011, 09:09:09 via Website

Try&Error versuche ich ja auch schon die ganze Zeit mit wenig Erfolg ;)
cont=login hab ich getestet
ohne setheader auch

Mit der GET Methode meinst du, dass ich einfach eine GET Anfrage mache mit der Adresse "http://www.readmore.de/index.php?cont=login&email=test@test.test&password=test&cookie=true&login=Anmelden"?

Wenn ich das zumindest im Browser als Adresse eingebe, meldet er sich nicht an.

Der Logout ist im Profil hinterlegt.

Werde heute zusätzlich mal den Programmierer anschreiben, ob er noch eine Idee hat ...

Antworten
DerKiLLa
  • Forum-Beiträge: 8

06.01.2011, 11:04:20 via Website

Sorry für Doppelpost, aber es gibt ein wichtiges Update ;)

Ich hab den Login endlich hinbekommen ... Es lag wirklich an der Seite und wie mit einem Login umgegangen wird.
Man brauch nicht vorher ein GET für die Session, sondern nachher eine GET Anfrage, denn direkt nach dem POST ist man noch nich eingeloggt, sondern erst wenn man danach eine Seite lädt.

Eigentlich war mir das vorher schon öfter ma aufgefallen, hab aber net dran gedacht ...

Antworten