Pobieranie danych z Wikipedii

Pisząc klasę do tlena oraz bota wiki a'la jaberowy wiki@jabber.autocom.pl potrzebowałem sposobu na łatwe pobranie danych z Wikipedii. Najłatwiej skorzystać z opcji eksportu wiki do XMLa. Wchodząc na odpowiedni adres otrzymujemy XML z danymi hasła. Wszystko byłoby ładnie i pięknie gdyby jakiekolwiek zdalna próba pobrania tych danych z wikipedii (http://pl.wikipedia.org/wiki/hasło) w PHP nie zwracała błędu 403.

Przy próbie użycia funkcji fopen(), file() czy file_get_contents() dostaję błąd:

<strong>Warning</strong>: fopen(http://pl.wikipedia.org/wiki/Komunikator_Tlen.pl): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in <strong>/home/malcom/public_html/wiki.php</strong> on line <strong>19</strong>

Czyżby Wikipedia była w jakiś sposób zabezpieczona przed zewnętrznym pobieraniem jej danych inną metodą niż użycie przeglądarki? A może to jakiś efekt uboczny używanego przez nich systemu? Tak, więc czas podszyć się za jakąś przeglądarkę i wyciągną potrzebne dane :D

Aby się przekonać czy tak jest w rzeczywistości wysłałem proste żądanie HTTP do serwera polskiej wikipedii z wypełnionym User-Agent-em:

GET /wiki/Specjalna:Export/Komunikator_Tlen.pl HTTP/1.1
Host: pl.wikipedia.org
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Content-type: application/x-www-form-urlencoded
Connection: close

Pewnie wystarczyłoby standardowe Mozilla 4.0, ale niech będzie IE6.

Żądanie zostało przyjęte przez serwer pozytywnie, czego odpowiedzią był kod HTTP 200 i zawartość danego zasobu:

HTTP/1.0 200 OK
Date: Sun, 19 Mar 2006 15:36:34 GMT
Server: Apache
X-Powered-By: PHP/5.1.1
Content-Type: application/xml; charset=utf-8
X-Cache: MISS from srv10.wikimedia.org
X-Cache-Lookup: MISS from srv10.wikimedia.org:80
X-Cache: MISS from mint.knams.wikimedia.org
X-Cache-Lookup: MISS from mint.knams.wikimedia.org:80
Connection: close

Poniżej odpowiedni fragment testowego kodu w PHP użytego do pobrania danego hasła z Wikipedii w formacie XML:

<?php
 
$host = 'pl.wikipedia.org';
$file = '/wiki/Specjalna:Export/Komunikator_Tlen.pl';
 
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
	echo "$errstr ($errno)<br/>\n";
	echo "Error reading or opening XML file";
} else {
	// compose HTTP request header;
	$out  = "GET $file HTTP/1.1\r\n";
	$out .= "Host: $host\r\n";
	$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";
	$out .= "Content-type: application/x-www-form-urlencoded\r\n";
	$out .= "Connection: close\r\n\r\n";
 
	fwrite($fp, $out);
	while (!feof($fp)) {
		$content .= fgets($fp, 128);
	}
	fclose($fp);
}
 
?>

Więcej na temat nagłówków HTTP znaleźć można w specyfikacji protokołu HTTP/1.1.

Ciągle intryguje mnie czy to jakieś celowe działanie, czy efekt uboczny związany z wykorzystaniem jakiegoś oprogramowanie czy systemu na maszynach udostępniających zasoby internetowej encyklopedii.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *