httpclient kann sich nicht auf asp.net Seite anmelden

Status
Nicht offen für weitere Antworten.

mwflipper

Neues Mitglied
Hallo,
ich versuche seit Wochen, mit per HttpClient auf der Seite geocaching.com anzumelden. Die Seite läuft auf einem Asp.net Server und erwartet neben den LoginDaten auch immer einen ViewState. Leider erscheint als Antwort auf meinen Loginversuch zwar der Statuscode "200 OK", aber im Body ist zu erkennen, dass mein Login fehlgeschlagen ist. Ich vermute, dass es mit dem Viewstate zu tun hat. Meine Frage deshalb: Wie kann ich in Java (httpclient) einen Asp.net-Viewstate parsen, editieren und zurücksenden. Mit folgendem Code habe ich den Login versucht. Der angegebene Benutzer ist ein real existierender, d.h der Code kann zum Testen so verwendet werden.
[HIGHLIGHT="Java"]package httpclient;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpVersion;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.lexer.Lexer;
import org.htmlparser.tags.Div;
import org.htmlparser.tags.InputTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

import sun.misc.BASE64Decoder;

public class Test {
static final String hostURI = "http://www.geocaching.com";


public static void main(String[] args) {
int status;

String proxyHost = null;
int proxyPort = 8080;
String userName = "cacheuser";
String userPassword = "cacheclient";
String viewStateValue = "";
String LOGON_SITE = "http://www.geocaching.com/login/default.aspx";

HttpClient client = new HttpClient();
HostConfiguration hostConfig = new HostConfiguration();
if (null != proxyHost) {
hostConfig.setProxy(proxyHost, proxyPort);
}
hostConfig.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
client.setHostConfiguration(hostConfig);

client.getParams().setParameter("http.socket.timeout", new Integer(10000));

client.getParams().setParameter("http.protocol.content-charset", "UTF-8");

client.getParams().setBooleanParameter("http.protocol.single-cookie-header", true);

client.getParams().setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)");

client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
GetMethod getMethodInfoPage = new GetMethod(LOGON_SITE);

System.out.println("\n" + "About to make call for getMethodInfoPage connection attempt");
try {
status = client.executeMethod(getMethodInfoPage);

Parser parser = null;
try {

parser = new Parser(new Lexer(getMethodInfoPage.getResponseBodyAsString()));
InputTag node = (InputTag) parser.parse(new HasAttributeFilter("name", "__VIEWSTATE")).elementAt(0);
viewStateValue += node.getAttribute("value");
BASE64Decoder decoder = new BASE64Decoder();

String decodedViewstate = new String(decoder.decodeBuffer(viewStateValue));

System.err.println("Encoded viewstate :" + decodedViewstate);
System.out.println("End of getting Initial Page"); // there may not be a HEAD tag

} catch (IOException ex2) {
ex2.printStackTrace();
} catch (ParserException ex2) {
ex2.printStackTrace();
}
Cookie[] cookies = client.getState().getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies;
System.out.println("Cookie: " + cookie.getName() + ", Value: " + cookie.getValue()
+ ", IsPersistent?: " + cookie.isPersistent() + ", Expiry Date: " + cookie.getExpiryDate()
+ ", Comment: " + cookie.getComment());
}
getMethodInfoPage.releaseConnection();
} catch (IOException ex) {
ex.printStackTrace();
}

// ******************** now preparing to do POST **********************

NameValuePair[] logindata = new NameValuePair[4];

logindata[0] = new NameValuePair("myUsername", userName);
logindata[1] = new NameValuePair("myPassword", userPassword);
logindata[2] = new NameValuePair("__VIEWSTATE", viewStateValue);
logindata[3] = new NameValuePair("cookie", "on");

PostMethod postMethodLoginPage = new PostMethod(LOGON_SITE);

postMethodLoginPage.addRequestHeader("Connection", "Keep-Alive");

client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);

postMethodLoginPage.setRequestBody(logindata);
String content = null;
try {
status = client.executeMethod(postMethodLoginPage);
content = postMethodLoginPage.getResponseBodyAsString();
writeFile(content);
postMethodLoginPage.releaseConnection();
} catch (IOException ex1) {
ex1.printStackTrace();
}
Cookie[] cookies = client.getState().getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies;
System.out.println("Cookie: " + cookie.getName() + ", Value: " + cookie.getValue() + ", IsPersistent?: "
+ cookie.isPersistent() + ", Expiry Date: " + cookie.getExpiryDate() + ", Comment: "
+ cookie.getComment());
}
try {
Parser parser = new Parser(new Lexer(content));
NodeList loginPanelList = parser.parse(new HasAttributeFilter("id", "LoginPanel"));
if (loginPanelList.size() > 0) {
Div node = (Div) loginPanelList.elementAt(0);
if (null != node) {
System.err.println("login failed");
}
} else {
System.out.println("login ends successfully");
}
} catch (ParserException e) {
e.printStackTrace();
}
}

public static void writeFile(String content) {

File testHtml = new File("test.html");
if (null == content) {
if (testHtml.exists()) {
testHtml.delete();
}
}
try {
FileWriter fw = new FileWriter(testHtml);
fw.append(content);
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}[/HIGHLIGHT]
 
Zuletzt bearbeitet von einem Moderator:

snady

Neues Mitglied
Hey!

Ich hatte mich auch gerade mit dem Thema beschäftigt und bin über deinen Beitrag gestolpert. Geändert wurde einerseits die Reihenfolge der Parameter, sowie der letzte Parameter von "cookie"//"on" auf "Button1"//"Login". Alle weiteren Änderungen im Code waren notwendig weil ich vermutlich eine andere Version der Apache Bibliotheken nutze.

Java:
package org.foo.geocaching;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
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.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.lexer.Lexer;
import org.htmlparser.tags.Div;
import org.htmlparser.tags.InputTag;
import org.htmlparser.util.NodeList;

import sun.misc.BASE64Decoder;

public class GCConnection {

	private static final String LOGON_SITE = "http://www.geocaching.com/login/default.aspx";
	
	private String viewStateValue = "";    
	private DefaultHttpClient client;
    
	private String username;
	private String password;

	public GCConnection(String username, String password) throws Exception {
		if(username == null || password == null || username.equals("") || password.equals("")){
			throw new Exception("Please specify a non empty username and password to create a Connection to geocaching.com");
		}
		this.username = username;
		this.password = password;
	}

	public boolean login() throws Exception, IOException {
		client = new DefaultHttpClient();
        
		client.getCookieStore().clear();        
        client.getParams().setParameter("http.protocol.content-charset", "UTF-8");        
        client.getParams().setBooleanParameter("http.protocol.single-cookie-header", true); 
        client.getParams().setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)");
        
        // Phase 1: Get the Logon Website/Form and extract the viewstate.
        HttpGet httpget = new HttpGet(LOGON_SITE);        
		Parser parser = null; 
		HttpResponse response = client.execute(httpget);
	    HttpEntity entity = response.getEntity();
	    String res = getResponseBodyAsString(entity);
	    entity.consumeContent();
	    
	    parser = new Parser(new Lexer(res));
	    InputTag node = (InputTag) parser.parse(new HasAttributeFilter("name", "__VIEWSTATE")).elementAt(0);
	    viewStateValue += node.getAttribute("value");
		BASE64Decoder decoder = new BASE64Decoder();
		 
        // Phase 2: Post the Login data 
        List <NameValuePair> nvps = new ArrayList <NameValuePair>();        
        nvps.add(new BasicNameValuePair("__VIEWSTATE", viewStateValue));
        nvps.add(new BasicNameValuePair("myUsername", username));
        nvps.add(new BasicNameValuePair("myPassword", password));
        nvps.add(new BasicNameValuePair("Button1", "Login"));
        
        HttpPost httpost = new HttpPost(LOGON_SITE);
        
        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
        httpost.setHeader("Connection", "Keep-Alive");
         
        response = client.execute(httpost);
        entity = response.getEntity();

    	String content = getResponseBodyAsString(entity);
        entity.consumeContent();
        parser = new Parser(new Lexer(content));
        NodeList loginPanelList = parser.parse(new HasAttributeFilter("id", "LoginPanel"));
        if (loginPanelList.size() > 0) {
            Div div = (Div) loginPanelList.elementAt(0);
            if (null != div) {
                return false;
            }
        } else {
        	return true;
        }
        return false;
	}
	
	public static String getResponseBodyAsString(HttpEntity entity) throws IllegalStateException, IOException{
    	InputStream in = entity.getContent();
    	long len = entity.getContentLength();
    	if(len > 0){
			byte [] buffer = new byte [(int) entity.getContentLength()];
			int i = in.read();
			int j = 0;
			while(true){
				if(i != -1){
					buffer[j] = (byte) i;
					i = in.read();
					j++;
				} else {
					break;
				}			
			}
			String s = new String(buffer);
			return s;
    	} else {
    		return "";
    	}
    }

	/**
	 * 
	 * @return Returns a List of caches by their URL at geocaching.com. Use entries from this List to query
	 * geocaching.com on certain caches.
	 */
	public List<String> getCacheList() {
		
		
		return null;
	}

	public String getCache(String url) throws ClientProtocolException, IOException {
		HttpGet httpget = new HttpGet(url);
		HttpResponse response = client.execute(httpget);
		HttpEntity entity = response.getEntity();

		String data = getResponseBodyAsString(entity);
		entity.consumeContent();

		return data;
	}
	
	public void finalize(){
		client.getConnectionManager().shutdown();
	}
	

	
}

Viel Erfolg
snady
 

sparrow

Top Contributor
Ich habe damals den kompletten Dialog mit der Webseite selber geschrieben, also nur Klassen der Standard-Bibliothek verwendet. Das geht eigentlich ganz gut.
Also Request selber zusammen gestellt, über eine URLConnection rüber geschickt und die Antwort dann geparst und verarbeitet.
Steht allerdings in keinem Verhältnis zu den nur 15 Euro pro Jahr für eine Premiummitgliedschaft, und damit gibts PocketQueries ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D HTTP Apache-HttpClient/UNAVAILABLE (java 1.4) Netzwerkprogrammierung 18
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
G apache httpClient Problem. Netzwerkprogrammierung 5
B HttpClient Netzwerkprogrammierung 2
M Apache HTTPClient Server log ausgeben ?! Netzwerkprogrammierung 3
N HTTP Apache 4.2.1 HttpClient 302 nach Login und auf den weiteren Seiten. Netzwerkprogrammierung 5
R Apache HttpClient File Download? Netzwerkprogrammierung 3
M HTTP HTTPClient Authentication - Quickr Server Netzwerkprogrammierung 8
H Java 1.4 HTTPClient Content von PutMethod Netzwerkprogrammierung 4
M need org.apache.commons.httpclient.* Netzwerkprogrammierung 8
K Login via apache httpclient Netzwerkprogrammierung 4
P HttpClient - Daten einer Website "unvollständig" Netzwerkprogrammierung 5
M Dateiupload mittels HttpClient Netzwerkprogrammierung 3
F FileUpload mit commons HttpClient Netzwerkprogrammierung 17
T HTTP Apache Commons HttpClient Bibliothek Netzwerkprogrammierung 2
H HTTP Login mit POSTMethod und httpClient Netzwerkprogrammierung 5
lordcarlos HTTP Apache HttpClient, post und login. Netzwerkprogrammierung 2
B HTTP Probleme mit HttpClient? Netzwerkprogrammierung 2
H Bilder mit HttpClient hochladen Netzwerkprogrammierung 3
T Apache HttpClient & Default Headers Netzwerkprogrammierung 9
T apache HTTPClient einloggen Netzwerkprogrammierung 2
T HttpClient - Senden via Post Netzwerkprogrammierung 12
Q HTTPS mit Apache HttpClient Netzwerkprogrammierung 4
M Seltsame Fehlermeldung (httpclient) Netzwerkprogrammierung 6
A Jakarta Commons HTTPClient: Mehrere Requests gleichzeitig Netzwerkprogrammierung 2
E HttpClient und return Problem Netzwerkprogrammierung 6
K Bad Request nach Form Login in Jakarta HttpClient Netzwerkprogrammierung 4
J Jakarta HTTPClient Netzwerkprogrammierung 5
D Problem beim holen einer PHP-Seite via HttpClient Netzwerkprogrammierung 19
C HTTPS mit Apache HTTPClient Netzwerkprogrammierung 1
M org.apache.commons.httpclient.HttpClient Netzwerkprogrammierung 3
S mit HttpClient Seiteninhalt lesen Netzwerkprogrammierung 8
P jakarta.HttpClient: Port bei GetMethod angeben Netzwerkprogrammierung 3
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
X Socket [Anfänger] BufferedReader.readLine() lässt sich Zeit Netzwerkprogrammierung 1
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
I Swing hängt sich auf bei Verbindung zum Server Netzwerkprogrammierung 3
B udp erkennen um welches objekt es sich handelt / max size Netzwerkprogrammierung 5
H RMI Stubs and Skeletons lassen sich nicht erstellen Netzwerkprogrammierung 4
H Socket Client server,verbindung läst sich nicht abbauen&code optimierung Netzwerkprogrammierung 3
P Warum lässt sich mein Server und mein Client einfach nicht schließen?!?! Netzwerkprogrammierung 16
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
& RMI Server beendet sich selbst Netzwerkprogrammierung 6
A RMI: Wieviele Clients können sich gleichzeitig anmelden? Netzwerkprogrammierung 34
N Wer kennt sich aus mit ssh (ganymed ssh lib) Netzwerkprogrammierung 2
D Server schliesst sich automatisch mit Client Netzwerkprogrammierung 3
G Vector aktualisiert sich nicht? Netzwerkprogrammierung 6
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
D DynDNS-Adresse ändert sich während Server pollt Netzwerkprogrammierung 2
JavaDevOp Socket Status von UDP-Port prüfen (PortUnreachableException funktioniert nicht?) Netzwerkprogrammierung 32
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
B Multicast-Nachrichten-Empfang funktioniert nicht Netzwerkprogrammierung 5
M JAX-WS unter Java 17 plötzlich nicht mehr möglich Netzwerkprogrammierung 5
S BufferedStream funktioniert nicht immer Netzwerkprogrammierung 7
T OutputStream kommt nicht an Netzwerkprogrammierung 18
G UDP Packet empfangen funktioniert nicht. Netzwerkprogrammierung 16
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
S .jar läuft local, aber nicht remote (SSH/Terminal) Netzwerkprogrammierung 10
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
J SSL haut nicht hin Netzwerkprogrammierung 3
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
J Wechsel auf Jdk13 , sfpt funktionier nicht mehr Netzwerkprogrammierung 2
Dann07 Proxy funktioniert nicht so wie gewünscht! Netzwerkprogrammierung 18
B RESTful API weiß nicht weiter Netzwerkprogrammierung 2
L Kann VM nicht ueber Host Name finden Netzwerkprogrammierung 0
V Ich finde den Fehler nicht... Netzwerkprogrammierung 2
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
S Socket Webserver mit SSLSocket geht nicht Netzwerkprogrammierung 1
P RMI stub wird nicht gefunden Netzwerkprogrammierung 8
N Test Servlet funktioniert nicht Netzwerkprogrammierung 11
M com.google.gson wird nicht erkannt Netzwerkprogrammierung 2
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D FTP ListNames() funktinoniert nicht richtig Netzwerkprogrammierung 2
Thallius JDBC getConnection kommt nicht zurück Netzwerkprogrammierung 1
KingSquizzi3 Website parsen mit Hilfe von jsoup funktioniert nicht Netzwerkprogrammierung 3
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
F Reader/ Writer werden nicht geschlossen Netzwerkprogrammierung 2
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
R Socket bei server.accept(); gehts nicht weiter Netzwerkprogrammierung 2
K Server liest Daten nicht Netzwerkprogrammierung 6
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
G Mail senden funktioniert nicht mit SSL Netzwerkprogrammierung 7
L IText mit Servlets, funktioniert nicht Netzwerkprogrammierung 0
E Gruppenchat: Über HTTPS oder nicht? Netzwerkprogrammierung 5
P nanoHttp upload.html page lädt nicht Netzwerkprogrammierung 4
M Byte Array kommt nicht an Netzwerkprogrammierung 0
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben