我可能不应该使用 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 禁止
我可能不应该使用 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 禁止
您在这里遇到的问题与 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);
您真正收到的错误消息是
脚本应使用包含联系信息的用户代理字符串,否则它们可能会被 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;
?>
他们自己在他们的 API 文档中说:
使用任何编程语言对该 URL 发出 HTTP GET 请求
您需要正确获取 URL,以下对我有用: http ://en.wikipedia.org/w/api.php ?format=json&action=query&titles=Main%20Page&prop=revisions&rvprop=content
据我所知,您没有指定输出格式!