# Website-Login via Java



## Tarken (26. Okt 2009)

Hi,

ich habe folgendes Problem:
Ich arbeite gerade an einem Java-Programm mit dem ich gerne Daten von einer Website lesen würde, doch dazu muss ich mich erstmal einloggen...
Da ich leider keine Ahnung von Html habe und Google mir auch nicht so recht weiterhelfen konnte versuch ich es mal hier.
Soweit ich das bis jetzt verstanden habe ist folgender Teil des Seitenquelltextes für den Loggin verantwortlich:
   <div class="title">Login</div>

    <form action="/?r=3TiRnN;a=login" method="POST" id="login">

        <table class="def">
            <tr>
                <th>Name</th>
                <td><input name="login" type="text" size="9" maxlength="14" value="" class="field"/></td>

            </tr>
            <tr>
                <th>Password</th>
                <td><input name="pass" type="password" size="9" maxlength="32" class="field"/></td>
            </tr>
        </table>

        <input type="submit" name="submit" value="Login" class="button"/>

    </form>

Was muss ich jetzt machen damit ich mich über mein Programm einloggen kann?
Wäre echt toll wenn mir jemand helfen könnte!

mfg
Tarken


----------



## JanHH (26. Okt 2009)

Wenn ich es richtig verstanden hab und Dein Programm sich automatisch einloggen soll, musst Du den POST-Request, den dieses HTML-Formular auslöst, per Hand nachbauen. Vielleicht gibt es da auch irgendwelche Frameworks für.

Frage mich allerdings, wie Du das Resultat des Requests, also die neue Seite, die dann kommt, analysieren willst, wenn Du keine Ahnung von HTML hast.. viel Spaß .


----------



## Tarken (26. Okt 2009)

Hi JanHH,

genau es geht darum diesen POST-Request nachzu bauen, hab dazu auch schon einiges gefunden nur sind bis jetzt alle meine Versuche einen funktionierenden Code auf die Beine zu stellen gescheitert. Hatte daher gehofft jemand könnte mir sagen wie ich hier ansetzen muss.

Das analysieren ist relativ einfach ;-) Quelltext streamen und dann die Daten die ich brauch rausfiltern, dass ist nicht das Problem^^.


----------



## byte (26. Okt 2009)

Guck Dir mal HTMLUnit an.


----------



## JanHH (26. Okt 2009)

Hm das mit dem Post ist doch simpel.. einen Socket öffnen, mit dem Server verbinden, und den entsprechenden Code per String senden.

Einstieg wäre evtl. erstmal einen eigenen simpel-HTTP-Server zu bauen, der in der Lage ist, einfache GET-Requests zu beantworten. Mit diesem dann eine Seite ausliefern die das Formular enthält, und wenn man dann auf submit klickt, wird an den Server ja der Post-Request gesendet, und dann kannst Du das, was da kommt, einfach 1:1 übernehmen.

Frage mich allerdings, ob wir hier gerade Beihilfe zu irgendeiner halbkriminellen Aktivität leisten..


----------



## byte (26. Okt 2009)

... oder einfach HTMLUnit benutzen. 



> HtmlUnit is a "GUI-Less browser for Java programs". It models HTML documents and provides an API that allows you to invoke pages, fill out forms, click links, etc... just like you do in your "normal" browser.


----------



## Tarken (26. Okt 2009)

Finds schon mal Klasse hier halbkriminelle Aktivitäten unterstellt zu kriegen... ganz großes Tennis.

Zum Thema:
Ich hab inzwischen den Haken an der Sache gefunden. Die Website legt Cookies an und wenn ich die nicht irgendwie zulasse/behandle passiert nichts.

Also ist mein eigentliches Problem die Cookie Behandlung... ergo wie lass ich das zu? oder so...

HTMLUtil muss ich mich erstmal richtig einlesen ob mir das was bringt.

mfg
der "halbkriminelle" Tarken


----------



## JanHH (27. Okt 2009)

Na dann musst Du auch noch eine Nachbildung einer Cookie-Verwaltung programmieren. Würde mal googlen ob es da irgendwelche vorgefertigten Frameworks dazu gibt, um einen HTML-Client samt Cookies nachzubauen. Wird ja doch recht aufwändig.

Und wegen des "halbkriminells" zu schmollen find ich albern ^^ immer logger bleiben.


----------



## Marcel_Handball (27. Okt 2009)

Moin,

Ich habe über die letzten Wochen angefangen ein "Hilfsprogramm" für Browsergames zu schreiben, das zu festgelegten Zeiten bestimmte Befehle absetzen kann. 
Dabei hab ich alles was zum HTTP-Handling notwendig war selber implementiert, da mir die Libaries wie HTTPUnit zu viel Ballast enthalten.
Das ganze habe ich über HttpUrlConnection realisiert.

Denk daran, dass du neben der Cookie Verwaltung, wahrscheinlich noch einen Redirect-Handler (z.B. beim Login) brauchst, der aus den Headern der Antworten die "Location" ausliest.


----------



## manuche (4. Aug 2010)

Hallo,

ich habe ähnliches vor! Und zwar würde ich mich gern auf der Playstation Network-Seite von Sony einloggen und virtuell ein paar Seiten ansteuern... Benutzer Informationen sollen dann durch einen HTML-Parser ausgelesen werden!
Leider gibt es von Sony kein öffentliches Framework, weshalb ich auf diese Methoden zurückgreifen möchte...
Ich scheitere allerdings bei den Cookies und Redirects in Verwendung mit HttpURLConnection. Die Beispiele habe ich hier aus dem Forum allerdings ist das Verständnis schlechter als erwartet.

@Marcell_Handball: Kannst du evtl ein paar Code-Snippets schicken oder posten?


----------



## eskimo328 (4. Aug 2010)

habe in den letzten Tagen selbst so eine Funktionalität gebraucht, die mittlerweile produktiv im Einsatz ist. also folgendes.

1. Login (als Antwort bekommt man eine Session im header):

```
/* Link zur LoginSeite */
		URL url = new URL("http://www.website.de/Login");
		HttpURLConnection con = (HttpURLConnection) url.openConnection();
		
		/* Parameter per POST senden */
		con.setRequestMethod("POST"); /* die Zeile brauchst nicht unbedingt */
		con.setDoOutput(true);
		
		/* login/pass ist der name des entsprechenden input fields aus der html seite, 
		 * username/ passwort sind deine login-date */
		OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
		writer.write("login=username&");
		writer.write("pass=passwort");
		writer.flush();
		writer.close();
		
		/* Asugabe der HTML Antwort Page */
		BufferedReader reader = new BufferedReader(
				new InputStreamReader(con.getInputStream()));
		String line = null;
		while((line = reader.readLine()) != null) {
			System.out.println(line);
		}
		
		/* SESSION auslesen (diese Session musst du nun in den folgenden aufrufen mitgeben, 
		 * dann bist du eingeloggt. ) */
		List<String> cookies = con.getHeaderFields().get("Set-Cookie");
		System.out.println(cookies);
		con.disconnect();
```

2. die nächste Seite aufrufen und die SESSION im header wieder mitgeben

```
url = new URL("http://www.website.de/irgendeinePage");
		con = (HttpURLConnection) url.openConnection();
		
		/* nun die SESSION wieder mitgeben */
		String c = cookies.toString().replace("[", "").replaceAll("]", "");
		con.setRequestProperty("Cookie", c);
		
		/* nun evtl. wieder wie vorhin POST Parameter schreiben */
		/* und die HTML Page per con.getInputStream() auslesen */
```


----------



## manuche (4. Aug 2010)

Ich nehme an, dass du mit den Namen der InputFields die entsprechenden IDs meinst?! Leider funktioniert das nocht nicht so ganz... Also entweder da passt was mit den Cookies nicht oder aber der Login funktioniert noch nicht astrein! Hier die Seite die ich mir vorgenommen hab:

Seite

```
<html>
<head>
<link rel="SHORTCUT ICON" href="/favicon.ico" /> 
  <title>Login</title>

  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />

<style type="text/css">
*{
	margin:0;
	padding:0;
	}

body{
	background:#f1f3f5;
	text-align:center;
	font-family:Helvetica,Arial,Osaka;
	font-size:12px;
	color:#82848b;
	}
	
a{
	color:#82848b;
	text-decoration:none;
	}
	
.hidden{
	display:none;
	margin:0;
	padding:0;
	}
	
#container{
	width:350px;
	margin:0 auto;
	text-align:left;
	position:relative;
	}
	
.loginBox{
	width:350px;
	margin:0 auto;
	text-align:left;
	background:url(/pc/images/regcam/exLoginBoxBg.gif) repeat-y;
	margin-top:10px;
	position:relative;
}
	
.loginBox h1{
	width:350px;
	height:85px;
	background:url(/pc/images/regcam/exLoginHeader.gif) no-repeat;
}

h1#qriocityLogo{
	background:url(/pc/images/regcam/exLoginHeaderQriocity.gif) no-repeat;
}
	
.loginBox p{
	background:#E7F2FC;
	margin:0 25px;
	padding:0px 20px 0 20px;
	clear:both;
	}
	
.loginBox label{
	font-weight:bold;
	display:block;
	float:left;
	width:100px;
	}
	
.loginBox label small{
	display:block;
	}
	
.loginBox input{
	font-size:12px;
	display:block;
	float:left;
	width:150px;
	margin:0;
	}		
	
.loginBox .btnBox{
	text-align:center;
	padding-bottom:0px;
	background-image:url(/pc/images/regcam/exLoginInnerFooter.gif);
	background-repeat: no-repeat;
	background-position: bottom left;
	}
	
	
.loginBox small.boxBtm{
	margin:0;	
	padding: 20px 25px 35px 25px;
	background:url(/pc/images/regcam/exLoginFooter.gif) no-repeat bottom left;
	display:block; 
	text-align:center;
	}

.loginBox ul{
	margin:0;	
	padding: 10px 0px 0px 90px;	
	}
	
.loginBox li{
	list-style-type:none;
	margin:0;
	padding:0;
	}
	
.loginBox li a{	
	background:url(/pc/images/regcam/btn.gif) no-repeat 0 -19px;
	padding: 5px 0 0px 20px;	
	margin:0;
	display:block;
}

.loginBox li a:hover{	
	background-position:0 0;
	}

	
a.button1, a.round_button1 {
	background-repeat:no-repeat;
	color: #7A7D84;
	font-weight: bold;
	font-size: 12px;
	vertical-align: middle;
	cursor: hand;
	margin-right:5px;
}


a.round_button1 {
	background:transparent url(/pc/images/regcam/button_bg_tile.gif) repeat-x scroll 0 -33px;
	border:1px solid #CCCCCC;
	border-top:none;
	padding:3px 10px;
}


a.round_button1:hover{
	background-position:0 -4px;
	border:1px solid #ABB7D6;
	border-top:none;
}



.errorWrap{
clear: both; font-size: 14px; font-weight: bold; text-align:center;background:#E7F2FC;	margin:0 25px;
}

.errorWrap p, .errorWrap h3  {
	font-size:12px;
	padding:0px 20px;
	clear:both;
	}

</style>


<script language="JavaScript" type="text/javascript">
<!--
function setFocus() {
if (document.getElementById('loginName').value == '') 
	{
		document.getElementById('loginName').focus(); 
	}
	else document.getElementById('password').focus();
}
//-->
</script>  
</head>
<body onLoad="setFocus()">
<div id="container" style="text-align:center;">
		<form method="post" action=			"/external/login.action"
	 id="mainform" name="mainform" class="loginBox">
					
                <h1 ><span class="hidden">PlayStation&reg;Network</span></h1>
                <div class="errorWrap errorMessages">
	
			<!-- Pulled in 103  possible error messages -->
	
			
					
		 </div>
                <p style="padding-top:10px;">
                    <label id="selLabelSignInWithHint">Anmelde-ID <small>(E-Mail-Adresse)</small></label>
									<input class="textField" id="loginName" name="loginName"/>
                    <br style="clear:both;" /><br style="clear:both;" />
                </p>
                
                <p>
                    <label id="selLabelPassword">Passwort: </label>
                    <input class="textField" id="password"  name="password" type="password"/> 
                    <br style="clear:both;" /><br style="clear:both;" />
                </p>    
                
                <p class="btnBox">
																 <a class="round_button1" id="loginButton" href="javascript:document.getElementById('mainform').submit();">Anmelden</a>
																	<a class="round_button1" id="cancelButton" href="javascript:window.location='../../login.gvm';" onclick="window.location='../../login.gvm'">Abbrechen</a>
								                    <br style="clear:both;" /><br style="clear:both;" />
                </p>               
													<ul>
						<li><a id="selLinkStartRegFlow" href="../../accounts/register/beginNewAccountRegistrationFlow.action" target="_blank">Ich möchte ein neues Konto erstellen.</a></li>
						<li><a id="selLinkForgotPassFlow" href="../../accounts/reset/beginPasswordResetFlow.action?target=login" target="_blank">Passwort vergessen</a></li>
					</ul>
								<small class="boxBtm" id="selLabelLegalNotice">Wenn du deine PlayStation®Network-Anmeldedaten für diese Website verwendest, gibst du dem Betreiber der Website grundlegende Informationen zu deinem PSN-Konto preis. PSN übernimmt keine Verantwortung für diese Website. Weitere Informationen findest du in der <a href="http://www.scei.co.jp/ps3-eula/" target="blank">PSN-Datenschutzerklärung</a>.</small>                
                <input type="submit" style="position:absolute; left:-9000px; top: -90000px;" /> 
        </form>
</div>
</body>
</html>
```


----------



## ARadauer (4. Aug 2010)

ich benutz für solche sachen immer selenium ;-)


----------



## eskimo328 (4. Aug 2010)

poste doch mal den Link zur Login Website


----------



## manuche (4. Aug 2010)

@eskimo328: über dem HTML-Code ist ein Link!

*edit: Also meine Vermutung ist, dass es einfach an dem Login-Button liegt... Allerdings gibt mir Selenium auch keine gute Auskunft darüber wie man es provozieren könnte, dass ein Knopfdruck simuliert wird!


----------



## Otzelot (11. Aug 2010)

Ich hätte da auch ein sehr ähnliches Problem deswegen nutze ich einfach mal diesen Thread weiter.

Ich würde gerne eine Fahrplanauskunft von vrr.de per Java anfragen und auslesen. Mein Problem ist auf der Startseite funktioniert es nicht wirklich mit dem OutputStreamWriter ....warum? Leider keine Ahnung. Auf der Seite zur Fahrplanauskunft funktioniert es auch nicht, allerdings besitzt man dort bereits eine SessionID die man wahrscheinlich mitsenden sollte und damit komm ich direkt zu meinem zweiten Problem. Wie kann ich erst den Quellcode auslesen, dann nach der SessionID suchen und diese abspeichern dann per OutputStream die Daten + SessionID schicken und anschließend die Seite lesen wo ich dann weitergeleitet werden sollte? Das größte Problem ist da bis jetzt , dass ich erst ein InputStream öffne um die SessionID zu lesen und diesen dann schließe und dann einen OutputStream öffen das führt aber zu:
java.net.ProtocolException: Cannot write output after reading input.


----------



## eskimo328 (11. Aug 2010)

Du musst erst eine Seite aufrufen, indem du ein neues URLConnection Object erzeugst. Bei einem POST öffnest dann einen Outputstream und schreibst die entsprechenden Parameter, z.B. um dic hauf einer Seite einzuloggen. Danach liest du die SessionID aus dem Header aus und evtl. noch den InputStream (Antwort HTML-Page). Dann kannst alles wieder schließen.

Nun erzeugst du eine neues URLConneciton Object und setzt die SessionID per 
	
	
	
	





```
con.setRequestProperty("Cookie", sessionID);
```
. Nun kannst du wieder auf den Outputstream schreibe (falls notwendig und den InputStream auslesen)


----------



## Otzelot (11. Aug 2010)

Leider klappt es immer noch nicht wirklich :-(.

Hiermal ein paar Stücke:

```
String data = URLEncoder.encode("place_origin", "UTF-8")  + "=" + URLEncoder.encode("Duisburg", "UTF-8");
data += "&" + URLEncoder.encode("name_origin", "UTF-8") + "=" + URLEncoder.encode("HBF", "UTF-8");

.....

			URL url = new URL("http://vrr.de/de/fahrplanauskunft/");
			HttpURLConnection con = (HttpURLConnection)url.openConnection();
			con.setDoOutput(true);
			con.setRequestMethod("POST");


			OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
			writer.write(data);
			writer.flush();
			writer.close();

......

Dann kommt eine Methode für die JSESSIONID

....

Auskunft(id);


....
Auskunft(String SessionID){
		    URL url = new URL("http://vrr.de/de/fahrplanauskunft/index.html;jsessionid=" + sessionID);
		    System.out.println("http://vrr.de/de/fahrplanauskunft/index.html;jsessionid=" + sessionID);
			URLConnection con = url.openConnection();
			BufferedReader is = new BufferedReader (new InputStreamReader(con.getInputStream()));
			String templine1,line1;
			line1= "";
			while((templine1 = is.readLine())!= null)
				line1 += templine1 + "\r";

			System.out.println(line1);
```

Bei Auskunft wird mir immer wieder die "Startseite" der Fahrplanauskunft ausgegeben, obwohl ich die jsessionid hintendranhänge. Gibt es vllt einen Fehler bei der Überträgung der Parameter? Mit setRequestPriority(); hat es leider auch nicht funktioniert.


----------



## Otzelot (11. Aug 2010)

Leider hab ich es immer noch nicht hinbekommen.
Wenn keiner weiß wie ich weiter komme, weiß vielleicht jemand wie ich herausbekomme ob was an der post methode nicht stimmt bzw ob die weiterleitung nicht funktioniert? Ich muss irgendwie die fehlerquelle finden können.


----------



## x0x0xo2 (14. Sep 2011)

Ich verstehe nicht ganz wie man die session bei der 2. Verbindung dann mitsenden soll...kann mir das jemand sagen?


----------



## Rahmspinat (15. Sep 2011)

Wie die vorredner schon sagten.

Einfach HTML-Unit nutzen oder falls dich kein offenes Browser-Fenster stört Silenium.

Oder kann man bei Selenium auch das Fenster verstecken?


----------



## BlackViruZ (15. Sep 2011)

woah ein archäologe


----------



## JohannisderKaeufer (15. Sep 2011)

manuche hat gesagt.:


> Hallo,
> 
> ich habe ähnliches vor! Und zwar würde ich mich gern auf der Playstation Network-Seite von Sony einloggen und virtuell ein paar Seiten ansteuern... Benutzer Informationen sollen dann durch einen HTML-Parser ausgelesen werden!




Und im April und Mai diesen Jahres bekommt man das zu lesen

heise online - Sony-Kundendaten im Internet aufgetaucht

:autsch:


----------

