# Browser "emulieren"



## Thammi (16. Jan 2006)

Hi,
ich versuche mit einem Java-Programm auf die Funktionalität einer Website zuzugreifen. Leider scheint der Server etwas dagegen zu haben, dass ich das tue, denn immer wenn ich eine bestimmte Seite aufrufe bekomme ich nur eine leere Seite (eher gesagt eine die mich weiterleiten soll) raus. Andere Seiten habe ich schon ordentlich runterladen (auch vom gleichen Server) und wenn ich die URL ausgeben lasse und in einen Browser eingebe kommt das erwartete Resultat.

Ich vermute, dass das an der (fehlenden?) Browser-Kennung liegt. Wie kann ich eine Browser-Kennung (und evtl. auch anderes dieser Art) wie von einem echten Browser senden? Zur Zeit rufe ich die Seite über einen Stream ab, dem ich eine URL übergebe (hab den Code leider grad nicht da).

Schon mal danke im Vorraus!


----------



## AlArenal (16. Jan 2006)

Du hast dir deine Lösung doch schon selbst gegegben. Wenn die Seite, mit der du Probleme hast, eine Weiterleitung ist, dann saugst du gewissermaßen an der falschen Stelle. Die Weiterleitung kann entweder über den HTTP-Header implementiert sein (REDIRECT), oder über Javascript. Serverseitig kann es z.B. auch über mod_redirect (apache) gemacht werden, aber davon bekäme der Client gar nichts mit.

Schau also was der Server liefert und überleg dir, wie du daraus die benötigte Infos (Ziel der Weiterleitung) herausbekommst.


----------



## Bleiglanz (16. Jan 2006)

hmm

wenn der Server keinen 30x schickt (also einen HTTP Redirect), sondern eine HTML Datei, die das dämliche

<meta redirect mit 0 Sekunden>

im <head> verwendet, dann hast du keine Chance: du müsstest die Antwort parsen und daraus die richtige URL extrahieren (anderes gehts in dem Fall nicht)


----------



## Thammi (16. Jan 2006)

Hi,
leider war das nicht wirklich meine Frage. Mir geht es darum mich als Mozilla oder IE auszugeben, nicht darum einer Weiterleitung zu folgen (die führt nämlich zum Login, echte Browser bekommen eine andere Seite zu sehen).


----------



## Lim_Dul (16. Jan 2006)

Einfach als Header mitsenden: Useragent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.12) Gecko/20050919 Firefox/1.0.7


----------



## AlArenal (16. Jan 2006)

Thammi hat gesagt.:
			
		

> Hi,
> leider war das nicht wirklich meine Frage. Mir geht es darum mich als Mozilla oder IE auszugeben, nicht darum einer Weiterleitung zu folgen (die führt nämlich zum Login, echte Browser bekommen eine andere Seite zu sehen).



Nein, aber deine Frage implizierte die *Vermutung* dass es evtl. eine Abfrage des verwendeten Browsers gibt. Auf Basis von Vermutungen kann man aber nicht programmieren und nebenbei ist diese Abfrage foobar, weil man derartige Angaben faken kann ohne Ende. Im Opera kannste beispielsweise einfach auswählen als was sich der Browser ausgeben soll.. Wenn ein Web-Entwickler sich darauf verlässt, ist er verlassen


----------



## Thammi (17. Jan 2006)

Danke für die Antworten, aber ich bekomms immer noch nicht ganz hin :-(
Wie knann ich denn diesen Header senden? Ich nehme mal an, dass ich meine (bestimmt sehr uneffektive ...) Funktion zum abrufen einer Website anders machen soll, aber wie?


```
String getWebPage( String urlStr ) throws IOException
{
	busyFrame.setVisible( true );
	
	URL url = new URL( urlStr );
	
	Reader is = new InputStreamReader( url.openStream() );
	BufferedReader in = new BufferedReader( is );
	
	String s="";
	String t;
	while( (t = in.readLine()) != null ) s += t;
	
	busyFrame.setVisible( false );
	
	return s;
}
```

PS:


> Nein, aber deine Frage implizierte die *Vermutung* dass es evtl. eine Abfrage des verwendeten Browsers gibt. Auf Basis von Vermutungen kann man aber nicht programmieren und nebenbei ist diese Abfrage foobar, weil man derartige Angaben faken kann ohne Ende. Im Opera kannste beispielsweise einfach auswählen als was sich der Browser ausgeben soll.. Wenn ein Web-Entwickler sich darauf verlässt, ist er verlassen



Bin selber Webentwickler und benutze auch den Opera, aber ich bin ja bei dem Programm auf der andren Seite. Und wie will ich meine Vermutung bestätigen wenn ich es nicht ausprobiere ;-)


----------



## AlArenal (17. Jan 2006)

Schau dir m al HttpClient aus den Jakarta Commons an. Da kannste auch per Einzeiler eigene Header mitschicken.


----------



## Thammi (17. Jan 2006)

Hi nochmal ...
Jakarta sieht schon sehr gut aus, aber ich bekomme immer noch den gleichen User-Agent an die Seiten geliefert (hab ne kleine Testseite gemacht, der User-Agent ist auf "Jakarta Commons-HttpClient/3.0" gesetzt). Mit folgendem Code versuche ich es zur Zeit:


```
String getWebPage( String url ) throws IOException
{
	String str = null;
	
	busyFrame.setVisible( true );
	
	// Create an instance of HttpClient.
	HttpClient client = new HttpClient();
	
	// Create a method instance.
	GetMethod method = new GetMethod(url);
	// method.addRequestHeader( new Header( "useragent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.12) Gecko/20050919 Firefox/1.0.7" ) );
	method.setRequestHeader( new Header( "Useragent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.12) Gecko/20050919 Firefox/1.0.7" ) );
	Header[] headers = method.getRequestHeaders();
	for( int n = 0; n < headers.length; n++ )
		System.out.println( headers[n].getName() );
	
	// Provide custom retry handler is necessary
	method.getParams().setParameter( HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler( 3, false ) );
	
	try {
		// Execute the method.
		int statusCode = client.executeMethod( method );
		
		if (statusCode != HttpStatus.SC_OK) {
			System.err.println( "Method failed: " + method.getStatusLine() );
		}
		
		// Read the response body.
		byte[] responseBody = method.getResponseBody();
		
		str = new String( responseBody );
	
	} catch (HttpException e) {
		System.err.println("Fatal protocol violation: " + e.getMessage());
		e.printStackTrace();
	} catch (IOException e) {
		System.err.println("Fatal transport error: " + e.getMessage());
		e.printStackTrace();
	} finally {
		// Release the connection.
		method.releaseConnection();
	}
	
	busyFrame.setVisible( false );
	
	return str;
}
```

Ich habe auch auch schon mit "getRequestHeaders()" geschaut ob standardmässig ein Header für den User-Agent drinn ist, aber es scheint nur dieser eine Header, den ich eingesetzt habe, vorhanden zu sein.

Bitte helft mir!


----------



## AlArenal (17. Jan 2006)

Du kannst die RequestHeader auch setzen...


----------



## Slava (18. Jan 2006)

die angeförderte seite kann cocki oder session benutzen und ich weiss nicht ob die bibliotheken, dass du benutzt diese möglichkeit bieten.


----------

