Как получить результаты из Википедии API с PHP?

Я, вероятно, не должен использовать 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 ответа

Решение

Проблема, с которой вы здесь сталкиваетесь, связана с политикой User-Agent 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);

Сообщение об ошибке вы действительно получаете

Скрипты должны использовать информативную строку User-Agent с контактной информацией, или они могут быть заблокированы IP без уведомления.

Это означает, что вы должны предоставить дополнительную информацию о себе при использовании API. Ваше использование file_get_contents отправляет требуемого User-Agent.

Вот рабочий пример в 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://stackru.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;
?>

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')

Это было ранее обсуждено на стеке потока

Кроме того, некоторые красивые примеры кода здесь

Они сами говорят в своей документации API:

Используйте любой язык программирования, чтобы сделать запрос HTTP GET для этого URL

Вам нужно правильно настроить URL, для меня работает следующее: http://en.wikipedia.org/w/api.php?format=json&action=query&titles=Main%20Page&prop=revisions&rvprop=content

Вы не указываете формат вывода, насколько я могу заметить прямо сейчас!

Другие вопросы по тегам