# getSource Methode wird als Bot erkannt



## FaxXer (1. Dez 2011)

Hallo,
ich habe eine Methode geschrieben, die mir den Source einer beliebigen Homepage zurückgeben soll. Diese Homepage hat mehrere unter Seiten, die ich mit einer Schleife auch auslese.

Nach ein paar Seiten bekomme ich nicht mehr den richtigen Quelltext der Seite, sondern den Quelltext einer Seite auf dem festgestellt wird, dass ich ein Bot bin und eine Captcha abfrage. 
Es ist mir klar, dass die betreiber dieser Seite das dann nicht wollen. Mir gehts es aber rein ums Prinzip, da ich ja mit dem Browser keine solche Bot-Erkennung bekomme. 

Wie kann ich also meine Methode menschlicher machen? Einen Timeout habe ich schon probiert, könnte sein, dass der nicht groß genug ist? In der Rückgabe, der Seite steht allerdings auch, dass es sein könnte, dass mein Browser keine Cookies unterstützt.


```
static LinkedList<String> getSource(String uri) throws MalformedURLException, IOException
	{
	String line = null;
	String userAgent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0";
	LinkedList<String> Source = new LinkedList<String>();
	
	URL url = new URL(uri);
	HttpURLConnection connection = (HttpURLConnection)url.openConnection();
	
	connection.setRequestMethod("GET");
	connection.addRequestProperty("User-Agent", userAgent);
	connection.setConnectTimeout(1000);
	HttpURLConnection.setFollowRedirects(false);
	
	connection.connect();
	
	BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
	
	while(((line = rd.readLine()) != null))
	{
       Source.add(line);
    }
	connection.disconnect();
    
	return Source;
	}
```


----------



## irgendjemand (2. Dez 2011)

wenn du vom "erfinder" dieses bot-schutzes schon den ach so tollen hinweis bekommst das dieser auf COOKIEs basiert ... dann brauchst du nur das COOKIE aus dem response auslesen und bei jedem neuen request wieder reinsetzen ... fertig ...


*ohne den entwickler selbst zu kennen oder schlecht zu stellen ... aber wenn man einem potentiellen angreifer auch noch sagt wie der schutz-mechanismus funktioniert ... dann hat man seine aufgabe ganz klar verfehlt*


----------



## moccajoghurt (2. Dez 2011)

Mit HtmlUnit könntest du solche Bot-Schutzmaßnahmen umgehen, weil es sich wie ein echter Browser verhält. Da spart man sich einiges an Arbeit, weil man die Cookies nicht "per Hand" behandeln muss.


----------



## FArt (2. Dez 2011)

Du solltest deinen Bot so aufbohren, dass er das Captcha ausfüllt ... *G*


----------



## Empire Phoenix (3. Dez 2011)

Rein theoretisch, kann es sein das der webserver einfach ide geschwindigkeit mitprotokoliert, und das captcha immer kommt wenn man zu schnell seiten aufruft? (Würde ich zumindest als ansatz benutzen)


----------



## FaxXer (3. Dez 2011)

Danke für eure Antworten schonmal, ich hab leider grad wenig Zweit werde aber alle Ansätze mal ausprobieren. 
Falls überhaupt nichts klappt, schreibe ich einfach mal den Entwickler der Seite an.. Denk nicht das der was gegen mein Vorhaben hatt.
Ja das Captcha ausfüllen wäre natürlich Super 
Gruß


----------



## irgendjemand (3. Dez 2011)

defacto : du bekommst eine meldung das du mit einem bot auf die page zugreifst ... und bekommst dann den hinweis das dein system möglicher weise keine cookies unterstüzt

also wäre der erste schritt den du machen müsstest : erstmal dein bot so bauen das er mit cookies umgehen kann ...

ich sags zwar nicht gern : schau dir mal apache http commons oder andere libs an

zweitens : captcha cracken

ist für mich ein leichtes da ich mich damit 2 jahre aus ein ander gesetzt habe und immer wieder festgestellt habe das es da draußen immer wen gibt der einen schritt besser ist als ich und meine captchas geknackt bekommt ...
und dabei habe ich schon so einige anti-captcha methoden ausprobiert und da gegen gesichert

es gibt immer wen der n stück schlauer ist als du und desshalb entweder dein anti-bot system knackt ... oder wie ich : der auf der anderen seite sitz und genau dies verhindert ...

ich kann dir noch alte codes und demo-seiten geben ... weis aber nicht ob diese noch alle funktionieren ...

am einfachsten sind diese : "klick mich" bilder ... einfach n muster erkennen ...
schwieriger werden dann schon die : "text eingeben" ... ist aber auch nicht so schwer ... musst nur das captcha durch gehen und alle dir bekannten zeichen erkennen .. diese bringst du dann noch in die richtige reihenfolge ... auch drin ...

weiter ins detail möchte ich hier jedoch nicht gehen da ich sonst zu viele hints geben würde


@e-phoenix
ähm .. das glaub ich kaum ... weil so n browser in der regel mit 10 oder mehr HTTP/1.1 connections auf die seite losgeht um den content möglichst schnell zu laden ... das musst du erstmal nachgebaut bekommen ... also sollte das wohl eher nicht der grund sein


----------



## FaxXer (4. Dez 2011)

Sodele hab heute mal Zeit gehabt um etwas rumzuprobieren. Und Cookies einzubauen. Das Problem besteht allerdings immer noch...
Hier mal mein Code, falls ich bei den Cookies irgendwas falsch gemacht habe.


```
static LinkedList<String> getSource(String uri) throws MalformedURLException, IOException
	{
	String line = null;
	String userAgent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0";
	LinkedList<String> Source = new LinkedList<String>();
	LinkedList<String> cookie = null;
	String cock = null;
	String cookieName = null;
	String cookieValue = null;
	
	cookie = getCookie(uri);
	
	URL url = new URL(uri);
	HttpURLConnection connection = (HttpURLConnection)url.openConnection();
	
	connection.setRequestMethod("GET");
	connection.addRequestProperty("User-Agent", userAgent);
	HttpURLConnection.setFollowRedirects(false);
	
	for(int i = 0; i < cookie.size(); i++)
	{
	cock = cookie.get(i);
	cock = cock.substring(0, cock.indexOf(";"));
	cookieName = cock.substring(0, cock.indexOf("="));
    cookieValue = cock.substring(cock.indexOf("=") + 1, cock.length());
	connection.setRequestProperty(cookieName, cookieValue);
	}
	
	connection.connect();
	
	BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
	
	while(((line = rd.readLine()) != null))
	{
       Source.add(line);
    }
	connection.disconnect();
    
	return Source;
	}

	static LinkedList<String> getCookie(String uri) throws IOException
	{
		String userAgent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0";
		URL url = new URL(uri);
		HttpURLConnection connection = (HttpURLConnection)url.openConnection();
		connection.setRequestMethod("GET");
		connection.addRequestProperty("User-Agent", userAgent);
		HttpURLConnection.setFollowRedirects(false);
		connection.connect();
		LinkedList<String> cookie = new LinkedList<String>();
			String headerName = null;
			for (int i = 1; (headerName = connection.getHeaderFieldKey(i))!=null; i++) {
			 	if (headerName.equals("Set-Cookie")) {    
				cookie.add(connection.getHeaderField(i));
			 	}
			 	}
			connection.disconnect();
	return cookie;
	}
```

Ist wahrscheinlich nicht grad die einfachste Lösung aber sollte ja funktionieren? Ist jetzt aber dumm, das Captcha ist das von Google.. Also denk ich mal nicht einfach zum übergehen.

@irgendjemand hast du Erfahrung mit diesen Google Captchas? Immer her mit deinem Beispiel Code 

Allerdings muss das Script ja irgendwie erkennen, dass ich kein Mensch bin. Man müsste halt nur herausfinden, was es überprüft.

Ich schreibe jetzt aufjedenfall mal den Betreiber der Seite an. Man kann ja Glück haben..


----------



## irgendjemand (4. Dez 2011)

google-captchas sind schon ne harte nummer ... geb ich ja zu ... allerdings sind es bei weitem nicht die schwierigsten ...

habe ich erfahrungen mit g-captchas : ja
habe ich es schon mal geschafft welche zu knacken : auch ja
habe ich grade source da : leider nein ...
da mein rechner gerade akut am streiken ist ... und ich leider kein externes gerät zum ankoppel einer S-ATA platte habe kann ich leider nicht auf diese daten zu greifen *schreibe grad von meinem laptop*

du hast aber recht : warum kommt diese meldung nur bei deinem "bot" ... nicht aber im browser ?

ich würde den traffic erstmal mit wireshark checken und dabei auf unregelmäßigkeiten achten ...
es kann auch sein das das script den kompletten header auswertet und informationen sendet welche der browser so interpretiert und dadurch auch wieder informationen zurückschickt die dem script zeigen : aha ... browser mit vermeintlichem mensch ...

man müsste das ganze system analysiren und den kompletten traffic nachbauen ...

da ich aber leider wie gesagt grade nicht an mein system kann bringt es auch nichts wenn ich dich mal eben nach der page frage da mir die mittel fehlen es selbst zu checken ... sorry


----------

