# post daten übertragen / einloggen



## Y05h1 (11. Oktober 2005)

Hallo!

Ich will ein Programm schreiben das sich auf einer Webseite einloggt.
Habe auch schon die Suchfunktion benutzt, aber ich bin leider immer nur auf code schnipsel oder sonstiges gestoßen, womit ich nichts anfangen kann...
Kann mir jemand ausführlich erklären wie sich so etwas machen lässt oder hat wer ein Tutorial?
Soll auch keine große sache sein. Nur das einlggen eben...

Y05h1


----------



## schnuffie (12. Oktober 2005)

Um sowas tun zu können, solltest Du den Grobaufbau dieser Seite kennen.

1. Du erstellst eine URLConnection zu dieser Seite.

2. Du liest deren Inhalt.

3. Du separierst den Absende-URL aus dem Gesamttext.

4. Du rufst den Absende-URL mit z.B. Username und Passwort auf.

Beispiel:


```
<form name="XYZ" method="POST" action="http://www.webnobis.com">
Name: <input type="text" name="user"><br>
Passwort: <input type="password" name="password">
</form>
```
 

```
//...
URLConnection con = (new URL("http://entwickler.webnobis.com")).openConnection();
con.setDoInput(true);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String s;
while (in.ready()) {
s = in.readLine();
if (...) { //Action-Parameter erkennen
	//URL extrahieren
	break;
}
else {
	s = null;
}
}
in.close();
 
//nun aufrufen:
HttpURLConnection httpCon = (HttpURLConnection)(new URL(myURL)).openConnection();
httpCon.setDoOutput(true);
httpCon.setRequestMethod("POST");
PrintStream out = new PrintStream(con.getOutputStream());
out.print("user=mueller&password=mueller123");
out.close();
httpCon.setDoInput(true);
in = new BufferedReader(new InputStreamReader(httpCon.getInputStream()));
while (in.ready()) {
s = in.readLine();
//nun kannst Du "weiterwurschteln"
}
```


----------



## Thomas Darimont (12. Oktober 2005)

Hallo!

 Ich denke hiermit gehts einfacher:
http://jakarta.apache.org/commons/httpclient/

 Gruß Tom


----------



## Y05h1 (13. Oktober 2005)

Danke für die Hilfe...
Hat mir sehr geholfen. Das eigentliche Problem ist zwar noch nicht wirklich beseitigt, da keine cookies gesetzt werden, aber das ist ja ein anderes Problem und es ist mir auch so eine große Hilfe.

DANKE!

Y05h1


----------



## Frankylo (26. September 2006)

Hallo, 

was genau müsste ich tun, wenn mein php-Formular einen sogenannten Submut-Button unterhält und die Daten nicht über die URL weitergeleitet werden. 
Alles auslesen ect klappt soweit nur das mit dem Submit-Button nicht.


----------



## MeinerEiner_80 (26. September 2006)

Moin!
Wenn du auf den Button klickst, werden deine eingegeben Daten ( und möglicherweise auch ein paar versteckte und der Name oder der Wert des Buttons) an die Webseite geschickt. 
Wenn du das Beispiel oben nimmst, reicht es vielleicht, einfach den Namen und Wert des Buttons an den String anzuhängen:

```
out.print("user=mueller&password=mueller123&name=buttonName&value=buttonValue");
```
Einfach mal im Quelltext nachschauen...
Kann auch sein, dass bei dir Cookies gesetzt werden.
Am einfachsten ist es sicherlich, mal ein Tool zu nutzen, welches den HTTP-Traffic auf deinem PC aufzeichnet (bspw.Ethereal ), so dass du genau weist, was passiert. Und das programmierst du einfach nach.

*grüssle*
MeinerEiner


----------



## Anime-Otaku (26. September 2006)

Ethereal gibt es nicht mehr...es heißt jetzt wireshark.

Apache liefert mit Axis (und vielleicht auch anderen) ein kleines Java Tool mit, womit man Nachrichten durchschleifen kann. Der Pfad zur Klasse lautet org.apache.axis.utils.tcpmon  (ja die Klasse ist wirklich kleingeschrieben)


----------



## Frankylo (26. September 2006)

Hallo, 

erstmal Danke, für die schnelle und kompentente Hilfe.
Aber kann es nicht sein, das das Formular alles serverseitig abfertigt?
Beispiel bei einem login-Formular oder so.

Habe mir auch Ethereal runtergeladen, kann aber auch da nur den Aufruf der Seite erkennen, sonst nichts. 

Habe das genannte Formular mal hochgeladen
http://frankylo.fr.funpic.de/formular.php

Da soll eigentlich nur das Formular mal abgeschickt werden, egal ob was bei Name eingetragen ist oder nicht.
Wenn man mit Firefox auf SENDEN klickt kommt eine Meldung "Hat geklappt"  und mir wird gleichzeitig eine email zugeschickt.

Dies wollte ich nun mit php bewerkstelligen, mein Code sieht wie folgt aus.


```
public static void main( String args[] ) {
 
 
URL url = new URL("http://frankylo.fr.funpic.de/formular.php");
				try{
HttpURLConnection connection=(HttpURLConnection) url.openConnection();;
	
		connection.setDoInput(true);
	        connection.setDoOutput(true);
		connection.setUseCaches(false);
		connection.setRequestProperty( "User-Agent", "Mozilla" );
					connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
						// connection.setRequestProperty( "Authorization", "Test" );
					        connection.setRequestMethod("POST");
					  	connection.connect();
						
						 // Nun alles rausschicken
					    printout = new DataOutputStream (connection.getOutputStream ());
 
          printout("Name=test");
					   
					    printout.flush ();
					    printout.close ();
					    
					    	}
					    	    input.close ();
		   
						}
			catch( IOException e ){
							System.out.println(e);
						}}}
```


Das Formular wird so zumindest nicht abgeschickt.
Wo ist hier der Denkfehler?

Danke


----------



## MeinerEiner_80 (26. September 2006)

Moin!
Natürlich wird php serverseitig abgefertig ( im gegensatz wie beispielsweise Java Script). In deinem Fall wird so wie du gesagt hast, wohl eine Email aufgrund der Formulardaten versendet. Das Formular muss natürlich an den Server geschickt werden, damit es verarbeitet werden kann.

Dieser String wird an den Server gesendet :
name=meinname&senden=true&abschicken=senden

Erkennt man zum einen aus dem Quelltext, zum anderen, wenn man Ethereal oder HTTPLoook nutzt, um den HTTP Verkehr zu sniffen.
Das heißt, Schnuffies beispiel ein wenig abgewandelt, und es klappt ohne probleme:

```
URL url = new URL("http://frankylo.fr.funpic.de/formular.php");
            HttpURLConnection httpCon = (HttpURLConnection)(url).openConnection();
            httpCon.setDoOutput(true);
            httpCon.setRequestMethod("POST");
            PrintStream out = new PrintStream(httpCon.getOutputStream());
            out.print("name=derNamezuSenden&senden=true&abschicken=senden");
            out.close();
              
            BufferedReader in = new BufferedReader(new InputStreamReader(httpCon.getInputStream()));
            while (in.ready()) {
                String s = in.readLine();
                
                   

            }
        }
            catch( Exception e ){
                e.printStackTrace();
      }}}
```

*grüssle*
MeinerEiner


----------



## Frankylo (26. September 2006)

Oje, vielen Dank.
Da sieht man den Wald vor lauter Bäume nicht. Hab mich so auf das inputfeld "submit" konzentriert, das nur noch das wichtig war.
Super schnelle Hilfe danke.

Wie man sieht, bin ich noch ein absoluter Anfänger was java.net angeht und sicher auch bei anderen Dingen.
Schlimm, wenn man an solchen Dingen scheitert.

Wollte mir ein Script schreiben, das sich in eine Community einloggt und dort einige Seiten durchscannt. 

Die nächste Hürde wären die Cookies, diese 
lese ich ja über
String cookie = con.getHeaderField("Set-Cookie");

Vielleicht könnt ihr mit noch einen kleinen tipp gebe, wie ich das mit mehreren Cookies manage, die ggf über JavaScript gesetzt werden.
Eine einfache Schleife mit einem cookie[] hätte zur Folge,d. immer derselbe wert gesetzt wird.


Mein jetziger Code wird später erst in mehrere Methoden gesplittet und sieht wie folgt aus:

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

	BufferedReader bin = null;
	DataOutputStream    printout;
	DataInputStream     input;
        String Data ="login1=1&email=XXX&pass=XXX"; 
        URL url = new URL("http://www.bestimmteSeite.de/login.php");
        String cookie="";


        HttpURLConnection httpCon = (HttpURLConnection)(url).openConnection();
 httpCon.setRequestProperty("Cookie",cookie); // Vor InputStream bzw getHeader 
        httpCon.setDoOutput(true);
        httpCon.setRequestMethod("POST");

        //Daten ausgeben
        PrintStream out = new PrintStream(httpCon.getOutputStream());
        out.print(Data);
        out.close();

        cookie = httpCon.getHeaderField("Set-Cookie");
        int index = cookie.indexOf(";"); 
        if(index >= 0) cookie = cookie.substring(0, index);

        BufferedReader in = new BufferedReader(new InputStreamReader(httpCon.getInputStream()));
        while (in.ready()) {
            String s = in.readLine();
        System.out.println(s); 
        }
    System.out.println(cookie);
}}


----------



## MeinerEiner_80 (27. September 2006)

Moin!


			
				Frankylo hat gesagt.:
			
		

> Mein jetziger Code wird später erst in mehrere Methoden gesplittet und sieht wie folgt aus:


Wenn du damit auch meinst, dass du die Reihenfolge der Codestücke änderst, da man ja schlecht einen Cookie setzen kann, bevor man ihn erhalten hat, sieht das ganze ja ganz gut aus.
Bin nun kein html oder javascript experte, aber in html sind die cookies doch alle normalerweise durch ein";" getrennt. Also musst du sie doch garnicht separat speichern, sondern einfach nur das ganze "Set-Cookie" Feld. Und dies sendest du dann auch wieder als ganzes mit setRequestProperty("Cookie",cookie);
Javascript setzt meines Wissens mittels "document.cookie = 'name=wert;'; " Cookies. Falls das passiert, musst du das Document halt danach scannen und an die restlichen Cookies dranhängen.

Hoffe mal das hilft weiter, da ich nicht so genau verstanden habe, worum es dir eigentlich geht.

*grüssle*
MeinerEiner


----------



## Thomas Darimont (27. September 2006)

Hallo!

ich verstehe echt nicht weshalb ihr euch so derb einen Abbrechen müsst...
Mit http://jakarta.apache.org/commons/httpclient/ ist das alles sooooo pups einfach ;-)

Gruß Tom


----------



## MeinerEiner_80 (27. September 2006)

Thomas Darimont hat gesagt.:


> Hallo!
> 
> ich verstehe echt nicht weshalb ihr euch so derb einen Abbrechen müsst...
> Mit http://jakarta.apache.org/commons/httpclient/ ist das alles sooooo pups einfach ;-)
> ...



Hab den Client noch nie genutzt, aber ich persönlich finde es aber auch ohne diese framework "pups einfach"  und hatte bis jetzt noch keine Probleme. Ausserdem lern ich selber viel mehr, wenn ich es auch selbst mache..

*grüssle*
MeinerEiner


----------



## Frankylo (27. September 2006)

Klar, die meisten Sachen sind mit Java pupseinfach hinzubieten, gerade weil  Sun umfangreiche Packages/Classen mitliefert die einem das meiste abnehmen.
Bin ein Programmieranfänger, der erst wenige Wochen immer mal wieder sich mit verschiedenen Bereichen auseinandergesetzt hat.
java.net war nun mal ein praxisziel um überhaupt mal was zu machen, was für mich ein wenig sinn ergibt. Die Dokumentation sollte man gewiss lesen können, sonst braucht man gar nicht weitermachen und genau hier haperte es ein wenig.
Verbunden mit grundlegenden http-kenntnissen.
Beim httpclient von jakarta war ich der Meinung, d. es mit tomcat und co zutun hätte und wusste anfänglich gar nicht, wie ich sowas nutzen kann.
Ich hoffe sehr, d. ich in 4-8 Wochen genug Übung habe, um hier ein wenig selbstständiger zu arbeiten.
Auch hier vielen Dank, dass MeinerEiner_80 kompetent geantwortet hat und nicht nur auf die Manuals gezeigt hat.


Thx

Frank


----------



## Thomas Darimont (27. September 2006)

Hallo!

So kann man sich ganz einfach an unserem Forum anmelden.

```
/**
 * 
 */
package de.tutorials;

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;

/**
 * @author Thomas.Darimont
 * 
 */
public class CommonsHttpClientExample {

    /**
     * @param args
     * @throws IOException
     * @throws HttpException
     */
    public static void main(String[] args) throws Exception {

        HttpClient client = new HttpClient();
        client.getHostConfiguration().setHost("www.tutorials.de", 80, "http");
        client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);

        PostMethod postMethod = new PostMethod("/forum/login.php?do=login");
        postMethod.addParameter("vb_login_username", "XYZ");
        postMethod.addParameter("vb_login_password", "ABC");
        postMethod.addParameter("do", "login");
        postMethod.addParameter("s", "XXXXXXXXXXX");
        postMethod.addParameter("vb_login_md5password", "");
        postMethod.addParameter("vb_login_md5password_utf", "");

        client.executeMethod(postMethod);

        System.out.println(postMethod.getResponseBodyAsString());
    }
}
```

Da ist doch schon mal viel leichter verständlich als die Fummelei über eine HttpURLConnection... ;-)

Gruß Tom


----------



## mkoeni1 (24. Oktober 2006)

Hallo Leute,

mal eine andere Frage, ich habe die Klassen in meiner NetBeans IDE umgesetzt, kann mir aber nichts dazu vorstellen. Was kann ich mit so einem HttpClient alles anfangen ?

Was bringt mir zb. die Java Klasse CommonsHttpClientExample ? Außer dass ich in meinem Output-Fenster den gesamten Inhalt ausgegeben bekomme.


Viele Grüße
Matze


----------



## Joetempes (30. November 2006)

@Thomas Darimont

Super Beispiel, funktioniert bestens ! Danke!


----------



## Inskin (3. Mai 2007)

Thomas Darimont hat gesagt.:


> Hallo!
> 
> So kann man sich ganz einfach an unserem Forum anmelden.
> 
> ...



Hallo,

ich habe versucht deinen Code für eine andere Seite anzupassen, komme aber nicht wirklich weiter. Die form sieht so aus:

```
<form action="" method="post">
<table>
<tr>
<td align="center">
Benutzername:<br>
<input type="Text" name="userid" value="" style="width=110px;"><br>
Passwort:<br>
<input type="Password" name="passwort" value="" style="width=110px;"><br>
<input type="hidden" name="autologin" value="false"> <br><br>
<input type="Submit" name="checkid" value="Login" style="width=110px;"><br><br>
</td>
</tr>
</table>

</form>
```

Den java code habe ich so angepasst:


```
...
PostMethod postMethod = new PostMethod("");

		postMethod.addParameter("userid", "XYZ");

		postMethod.addParameter("passwort", "ABC");

		client.executeMethod(postMethod);

		System.out.println(postMethod.getResponseBodyAsString());
```

Es wird aber nicht der Quelltext ausgegeben, als wäre ich eingeloggt. Lediglich der Username wird als value in die form eingetragen:

```
<form action="" method="post">
<table>
<tr>
<td align="center">
Benutzername:<br>
<input type="Text" name="userid" value="Inskin" style="width=110px;"><br>
Passwort:<br>
<input type="Password" name="passwort" value="" style="width=110px;"><br>
<input type="hidden" name="autologin" value="false"> <br><br>
<input type="Submit" name="checkid" value="Login" style="width=110px;"><br><br>
</td>
</tr>
</table>
</form>
```

Kann mir hier jemand weiterhelfen?


----------



## nex_m (22. März 2008)

Hallo..wollte diesen HTTPClient mal ausprobieren, aber ich bekomme es nicht hin die benötigten Klassen einzubinden.
In welches Verzeichniss müssen die Klassen, damit ich diese dann in meinem Code benutzen kann?

Hoffe mir kann jemand weiterhelfen!


----------



## MeinerEiner_80 (22. März 2008)

Moin!


nex_m hat gesagt.:


> In welches Verzeichniss müssen die Klassen, damit ich diese dann in meinem Code benutzen kann?


In den Klassenpfad! Wenn du später ein jar Archiv hast, kannst du diesem im Manifest setzen. Oder du kannst(auch wenn du kein Archiv hast) , diesen explizit als Argument übergeben. 
Wenn du keine Ahnung hast, wovon ich eben geredet habe, mache dich  bitte ein wenig mit den Java Grundlagen vertraut. Insbesondere, was den Klassenpfad angeht... Google und Forumssuche helfen dabei..

*grüssle*
MeinerEiner


----------



## nex_m (24. März 2008)

@MeinerEiner
Ich schätze mich schon so ein, dass ich ein bisschen Ahnung habe 
Naja..hatten benötigte Klassen gefehlt und ich hatte diese einfach nicht gefunden. Mittlerweile ist das kein Problem mehr.

Aber es läuft immer noch nicht, bzw. trägt die Werte nicht ein. Hab mich jetzt am HTTPClient versucht und hab's zusätzlich wie den obigen Posts beschrieben probiert.

Hab dazu folgendes Fomular benutzt (test.php):

```
<form action="next.php" method="post">
	<input type="text" name="test">
	<input type="submit" name="anlegen" value="anlegen">
</form>
```

Und mein Java-Code sieht so aus:

```
try {
	URL url = new URL("http://MEINEURL.de/test.php");
	HttpURLConnection connection = (HttpURLConnection)url.openConnection();
	connection.setDoInput(true);
	connection.setDoOutput(true);
	connection.setRequestMethod("POST");
	connection.connect();

	PrintStream out = new PrintStream(connection.getOutputStream());
	out.print("test=Hallo&anlegen=anlegen");
	out.close();
		  	
        BufferedInputStream in = new BufferedInputStream(connection.getInputStream());
	int character;
	while((character = in.read()) != -1){
		System.out.print((char) character);
	}			
}
catch (MalformedURLException e) {
	System.err.println(e);
} 
catch (IOException e) {
	System.err.println(e);
}
```

Oder mit HTTPClient:

```
HttpClient client = new HttpClient();
		
client.getHostConfiguration().setHost("www.MEINEURL.de", 80, "http");
		
		client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
PostMethod post = new PostMethod("/test.php");
		
post.addParameter("test", "Hallo");
client.executeMethod(post);
        
System.out.println(post.getResponseBodyAsString());
```

Was mache ich falsch? Hoffe mir kann jemand weiterhelfen!


----------



## HichamId (4. September 2008)

Hallo Tom!
Danke deines Codes konnte ich automatisch auf die Seite"www.Tutorials.de"  Anmelden und die Seite mit meine spezifischen Daten ohne manuellen Anmelden auf Android darstellen. 

Ich will das gleiche mit Xing-Seite erreichen, aber leider bekomme ich das nicht hin. 

---------------------------  Html-Code: Loing für Xing ---------------------------------
<form id="login-form" action="https://www.xing.com/app/user" method="post" name="loginform">
<input type="hidden" name="op" value="login" />
<input type="hidden" name="dest" value="/app/user?op=home" />

<label id="username-label" for="username">Benutzername / E-Mail-Adresse</label>
<input id="username" type="text" name="login_user_name" value="" maxlength="80" tabindex="201" />

<label id="password-label" for="password">Passwort</label>
<input id="password" type="password" name="login_password" value="" maxlength="25" tabindex="202" />
---------------------------  Html-Code: Loing für Xing ---------------------------------

Ich habe folgenden Parameter an postMethod angehängt:

Postmethod postMethod = new PostMethod("/app/user?");
postMethod.addParameter("username","xxxxxxxxx");
postMethod.addParameter("password","xxxxxxxx");
postMethod.addParameter("op","login");
client.executeMethod(postMethod);

WebView view = new WebView();
view.getSettings().setJavaScriptEnabled(true);
view.loadData(postMethod.getResponseBodyAsString(),"text/html","utf-8");
this.setContentView(view);

liegt an Cookies oder habe ich die falsche parameters zu postMethod angehängt?

Ich würde mich seh freuen für jede Hilfe.

Gruß + Danke 
HichamID


----------



## nype (8. Februar 2009)

bastle auch gerade an dem HTTPClient herum und musste fest stellen das das beispiel von tom bei mir nicht funktioniert...

und meine eigenes programm schaut so aus und geht auch ned:

Sourcecode der login seite:



> nbsp; <b>Einloggen:</b><br>
> <input type=hidden name=name value=AndyLogin>
> <input type=hidden name=action value=dologin>
> &nbsp; Benutzername:<br>
> ...





> try
> {
> 
> HttpClient client = new HttpClient();
> ...




was mach ich falsch?


----------



## Thomas Darimont (16. Juni 2011)

Hallo,

hier auf speziellen Wunsch ein Beispiel für Post Login mit Commons Http Client in Version 4.1.1:

```
package de.tutorials;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

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

		
		
		
		HttpPost request = new HttpPost("http://www.tutorials.de/login.php?do=login");
		
		new PostParams()
				.add("do","login")
				.add("securitytoken","xxx") //Wird zuvor in Seite generiert
				.add("s", "")
				.add("vb_login_md5password", "yyy") //MD5 hash des Passworts
				.add("vb_login_md5password_utf","yyy") //MD5 hash des Passworts als UTF (sollte in der Regel mit vb_login_md5password übereinstimmen 
				.add("vb_login_password", "")
				.add("vb_login_password_hint", "Kennwort") //ja das steht da wirklich...
				.add("vb_login_username", "DEIN USERNAME")
		.to(request);

		HttpClient httpClient = new DefaultHttpClient();
		HttpResponse response = httpClient.execute(request);

		HttpEntity responseEntity = response.getEntity();
		String responseBody = EntityUtils.toString(responseEntity);
		System.out.println(responseBody);

	}

	static class PostParams {

		LinkedHashMap<String, String> values = new LinkedHashMap<String, String>();

		public PostParams add(String name, String value) {
			values.put(name, value);
			return this;
		}

		public void to(HttpPost request) {
			List<NameValuePair> params = new ArrayList<NameValuePair>();

			for (String name : values.keySet()) {
				params.add(new BasicNameValuePair(name, values.get(name)));
			}

			try {
				request.setEntity(new UrlEncodedFormEntity(params,HTTP.ISO_8859_1)); //application/x-www-form-urlencoded
			} catch (UnsupportedEncodingException ex) {
				ex.printStackTrace();
			}
		}
	}
}
```

Gruß Tom


----------

