2012-01-21 72 views
2

我可能不應該使用file_get_contents()我應該使用什麼?我想保持簡單。如何從PHP維基百科API獲取結果?

警告:的file_get_contents(http://en.wikipedia.org/w/api.php?action=query &標題= Your_Highness &道具=修訂& rvprop =內容& rvsection = 0):未能打開流:HTTP請求失敗! HTTP/1.0 403禁止

+0

http://www.php.net/manual/en/book.curl.php – cspray

+0

你可以做它與file_get_contents,但如果你喜歡它簡單,使用cURL來代替,因爲你需要處理[API文檔](http://www.mediawiki.org/wiki/API:Login)中描述的cookie。 PHP本地和cURL方式都可以讓你,但在cURL中更簡單。 – netcoder

+0

比cURL更好的是HTTP_Request2你可以通過Pear下載它,因爲它是一個非常好的體驗,因爲它是一個合適的OO庫 –

回答

13

您遇到的問題與MW API的User-Agent policy有關 - 您必須提供User-Agent標頭,並且該標頭必須提供一些與您聯繫的方式。

您可以用stream contextfile_get_contents()做到這一點:

$opts = array('http' => 
    array(
    'user_agent' => 'MyBot/1.0 (http://www.mysite.com/)' 
) 
); 
$context = stream_context_create($opts); 

$url = 'http://en.wikipedia.org/w/api.php?action=query&titles=Your_Highness&prop=revisions&rvprop=content&rvsection=0'; 
var_dump(file_get_contents($url, FALSE, $context)); 

話雖如此,它可能被認爲是更「標準」的使用cURL,這當然會給你更多的控制:

$url = 'http://en.wikipedia.org/w/api.php?action=query&titles=Your_Highness&prop=revisions&rvprop=content&rvsection=0'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_USERAGENT, 'MyBot/1.0 (http://www.mysite.com/)'); 

$result = curl_exec($ch); 

if (!$result) { 
    exit('cURL Error: '.curl_error($ch)); 
} 

var_dump($result); 
+0

感謝您的代碼。 – Curtis

+2

這個問題的明確答案和「正確的做法」。先生回答得很好。 – ftrotter

0

他們自己的API文檔中說:

使用任何編程語言,使該URL的HTTP GET請求

你需要得到的URL對我而言,以下作品: http://en.wikipedia.org/w/api.php?format=json&action=query&titles=Main%20Page&prop=revisions&rvprop=content

根據我現在可以注意到的,您並未指定輸出格式!

+0

http://en.wikipedia.org/w/api.php?format=json&action=query&titles=Your_Highness&prop=revisions&rvprop=content&rvsection=0 您的網址在添加輸出格式後生效... – whizzzkid

1

file_get_contents應該工作。

file_get_contents('http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=New_York_Yankees&rvprop=timestamp|user|comment|content') 

這是以前在計算器here

此外,一些好看的代碼示例here討論

+0

嗯,如果file_get_contents剛剛工作,它會很好,它似乎比我想象的更復雜 – Curtis

1

你真的收到錯誤消息是

腳本應使用一個信息用戶 - 具有聯繫信息的代理字符串,或者可能在未通知的情況下被IP阻止。

這意味着您應該在使用API​​時提供有關自己的其他詳細信息。您使用file_get_contents會發送所需的用戶代理。

這裏是捲曲工作示例標識本身作爲這個問題的一個測試:

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://en.wikipedia.org/w/api.php?action=query&titles=Your_Highness&prop=revisions&rvprop=content&rvsection=0&format=xml"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_USERAGENT, "Testing for http://stackoverflow.com/questions/8956331/how-to-get-results-from-the-wikipedia-api-with-php"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($ch); 
curl_close($ch); 

echo $result; 
?>