Pobieranie danych z Wikipedii

tech • 338 słów • 2 minuty czytania

Pisząc klasę do tlena oraz bota wiki a’la jabberowy wiki@jabber.autocom.pl potrzebowałem sposobu na łatwe pobranie danych z Wikipedii. Najłatwiej skorzystać z opcji eksportu wiki do XML-a. Wchodząc na odpowiedni adres otrzymujemy XML z danym hasłem. Wszystko byłoby ładne i piękne, 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:

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

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ę pod jakąś przeglądarkę i przekonać się jak jest w rzeczywistości.

W tym celu 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 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:

$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.

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/