2

我可能不应该使用 file_get_contents() 我应该使用什么?我想保持简单。

警告:file_get_contents(http://en.wikipedia.org/w/api.php?action=query&titles=Your_Highness&prop=revisions&rvprop=content&rvsection=0):打开流失败:HTTP 请求失败!HTTP/1.0 403 禁止

4

4 回答 4

13

您在这里遇到的问题与 MW API 的用户代理策略有关- 您必须提供一个User-Agent标头,并且该标头必须提供一些联系您的方式。

您可以file_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);
于 2012-01-21T20:41:48.293 回答
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')

这之前在 stackoverflow 上讨论

此外,这里有一些漂亮的代码示例

于 2012-01-21T20:42:33.457 回答
1

您真正收到的错误消息是

脚本应使用包含联系信息的用户代理字符串,否则它们可能会被 IP 阻止,恕不另行通知。

这意味着您应该在使用 API 时提供有关您自己的其他详细信息。您对 file_get_contents 的使用确实发送了所需的用户代理。

这是 curl 中的一个工作示例,它将自己标识为该问题的测试:

<?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;
?>
于 2012-01-22T16:53:44.073 回答
0

他们自己在他们的 API 文档中说:

使用任何编程语言对该 URL 发出 HTTP GET 请求

您需要正确获取 URL,以下对我有用: http ://en.wikipedia.org/w/api.php ?format=json&action=query&titles=Main%20Page&prop=revisions&rvprop=content

据我所知,您没有指定输出格式!

于 2012-01-21T20:35:24.740 回答