Доступ к информации Википедии с помощью PHP и API MediaWiki

Используем PHP для поиска, получения и изменения элементов Википедии с помощью API MediaWiki

Википедия - наиболее авторитетная онлайн-энциклопедия, содержащая миллионы статей по различным областям знания. Web-разработчики могут обращаться к этим статьям и выполнять поиск в них с помощью специального API. Данная статья знакомит читателя с API Википедии и демонстрирует его в контексте PHP-приложения, объясняя методы поиска и получения различных элементов содержимого Википедии с помощью PHP.

Введение

Часто используемые аббревиатуры

  • API: Application programming interface, интерфейс прикладного программирования
  • CSRF: Cross-site request forgery, межсайтовая подстановка запроса
  • HTML: Hypertext Markup Language, язык гипертекстовой разметки
  • HTTP: Hypertext Transfer Protocol
  • IP: Internet Protocol
  • JSON: JavaScript Object Notation
  • OOP: Object-oriented programming, объектно-ориентированное программирование, ООП
  • PEAR: PHP Extension and Application Repository
  • REST: REpresentational State Transfer
  • WDDX: Web Distributed Data eXchange
  • XHTML: Extensible Hypertext Markup Language, расширяемый язык гипертекстовой разметки
  • XML: Extensible Markup Language, расширяемый язык разметки
  • YAML: YAML Ain't Markup Language

С Википедией знаком, наверное, каждый. Это важнейшее хранилище знаний, созданное силами множества пользователей, охватывающее почти любую мыслимую область знаний и доступное через Web-браузер. Какая бы информация ни была вам нужна, вы можете найти ее в Википедии, зачастую в очень подробном изложении. При этом, поскольку Википедия доступна для публичного редактирования, она всегда содержит обновленную и своевременную информацию.

Однако большинство людей не знают об одной важной части Википедии. Это спрятанный за кулисами мощный API для Web-сервисов, который позволяет разработчикам обращаться к содержимому Википедии, осуществлять в нем поиск и интегрировать его в собственное приложение. Этот API, работающий через HTTP и возвращающий данные в целом ряде различных форматов, в том числе XML, находится в свободном доступе для программистов и делает возможным создание любых видов собственных Web-приложений, использующих материалы Википедии.

В данной статье я вкратце ознакомлю вас с этим API на примере интеграции и использования его с моим любимым языком программирования - PHP. В статье объясняются основы работы API, а затем подробно разбираются процессы получения списка категорий, поиска записей по категории или ключевому слову, получения и отображения записей и удаленного добавления и редактирования содержимого.


Знакомство с API

Перед погружением в PHP-код необходимо сказать несколько слов об API Википедии. Во-первых, хотя я и называю его «API Википедии», важно заметить, что он используется не только в Википедии. На самом деле он является частью базового приложения MediaWiki, на котором работает Википедия, поэтому методы и подходы, представленные в этой статье, применимы и к любому другому приложению, основанному на MediaWiki. В разделе Ресурсы приведены ссылки как на MediaWiki, так и на полное справочное руководство по API MediaWiki.

Как и все сервисы, основанные на HTTP, данный API работает, принимая HTTP-запросы, содержащие один или несколько входящих аргументов, и выдавая ответы, которые могут быть проанализированы и использованы запрашивающим клиентом. Чаще всего ответ предоставляется в формате XML, так как практически каждый язык программирования поддерживает анализ XML. Однако можно запрашивать ответ и в других форматах, таких как JSON, WDDX, YAML, или в сериализованном с помощью PHP виде.

Каждый HTTP-запрос к API должен содержать обязательный параметр «action», который определяет требуемое действие. Параметр может быть операцией запроса, редактирования или удаления, запросом аутентификации или любым другим из поддерживаемых действий. Вдобавок к этому обязательному параметру, в зависимости от требуемого действия, требуются дополнительные аргументы – например, ключевые слова для запросов, заголовок страницы для операций удаления и редактирования, или имя пользователя и пароль для аутентификации.

Чтобы увидеть API Википедии в действии, попробуйте открыть приведенный ниже URL в браузере. (Обратите внимание: этот адрес представляет собой одну строку. Он разбит на две строки исключительно из соображений форматирования.)

http://en.wikipedia.org/w/api.php?action=query&list=allcategories&acprop=size
          &acprefix=hollywood&format=xml

Этот метод возвращает список десяти первых категорий Википедии, начинающихся с префикса "hollywood". В листинге 1 приведен необработанный XML-результат этого запроса.

Листинг 1. Пример API
<?xml version="1.0"?>
<api>
  <query>
    <allcategories>
      <c size="31" pages="28" files="0" subcats="3" 
        xml:space="preserve">Hollywood</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood's Rock Walk inductees</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood, California</c>
      <c size="1" pages="1" files="0" subcats="0" 
        xml:space="preserve">Hollywood, Florida</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood, Los Angeles, California</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood.com/celebrity/Wanda Shelley</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood Actors</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood Actress</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood Blacklist</c>
      <c size="2" pages="2" files="0" subcats="0" 
        xml:space="preserve">Hollywood Boulevard</c>
    </allcategories>
  </query>
  <query-continue>
    <allcategories acfrom="Hollywood Cemetery (Richmond)" />
  </query-continue>
</api>

Получение списка категорий и страниц

Теперь, когда вы поняли принципы работы API, рассмотрим пару примеров кода. Я предполагаю, что мои читатели знакомы с HTML и XML и имеют рабочую среду разработки для Apache/PHP со свежей версией Zend Framework. Также я предполагаю, что вы знаете основы работы с классами и объектами на PHP, так как PHP-компоненты, использованные в данной статье, написаны в соответствии с принципами ООП.

Для взаимодействия с API вам потребуется HTTP-клиент, способный передавать GET- и POST-запросы и работать с ответами. Неплохим инструментом для этого является компонент Zend_Rest_Client из Zend Framework, который разработан специально для разработчиков, объединяющих PHP-приложения с Web-сервисами. Этот клиент можно использовать для выполнения GET-, POST-, PUT- и DELETE-запросов к конечной точке сервиса. XML-ответы возвращаются как экземпляры класса Zend_Rest_Client_Response, что позволяет легко обращаться к индивидуальным свойствам ответа.

Листинг 2 иллюстрирует процесс получения и отображения категорий из листинга 1 с использованием Zend_Rest_Client в контексте PHP-скрипта.

Листинг 2. Получение списка категорий Википедии
<?php
// Загрузка классов Zend
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// Определение префикса категории
$prefix = 'hollywood';

try {
  // инициализация Rest-клиента
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // Задание параметров запроса
  $wikipedia->action('query');
  $wikipedia->list('allcategories');
  $wikipedia->acprefix($prefix);
  $wikipedia->format('xml');

  // выполнение запроса
  // Итерирование по множеству XML-результатов
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for categories starting with 
      '<?php echo $prefix; ?>'</h2>
    <ol>
    <?php foreach ($result->query->allcategories->c as $c): ?>
      <li><a href="http://www.wikipedia.org/wiki/Category:
        <?php echo $c; ?>"><?php echo $c; ?></a></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

В листинге 2 сначала инициализируется автозагрузчик Zend Framework, а затем загружается компонент Zend_Rest_Client. Создается и инициализируется экземпляр класса Zend_Rest_Client с конечной точкой сервиса API Википедии в качестве аргумента конструктора. Затем определяются и добавляются параметры запроса, который передается API с помощью клиентского метода get(). Zend_Rest_Client автоматически принимает XML-ответ сервера и преобразует его в набор SimpleXML-объектов, к которым вы можете обращаться, используя стандартную нотацию «объект-свойство».

Рисунок 1 иллюстрирует результат работы листинга 2.

Рисунок 1. Web-страница со списком категорий Википедии
Screen capture of a web page listing Wikipedia categories that begin with 'hollywood'

Обратите внимание на способ передачи серверу параметров запроса с помощью Zend_Rest_Client. Каждый параметр задается вызовом клиентского метода с тем же именем и передачей в этот метод нужного значения в качестве первого параметра. Например, для добавления параметра action=query в запрос скрипт вызывает $client->action(‘query’). Подробнее узнать об этом можно из документации к Zend_Rest_Client (см. Ресурсы).

Также вы можете получить список страниц внутри категории, изменив запрос так, чтобы он возвращал список элементов категорий вместо самих категорий. Очевидно, для этого придется передать в API имя категории в качестве входных данных. Рассмотрим листинг 3, в котором решается эта задача.

Листинг 3. Получение списка страниц внутри категории
<?php
// Загрузка классов Zend
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// определение категории
$cat = 'Greek_legendary_creatures';

try {
  // инициализация клиента Rest
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // задание параметров запроса
  $wikipedia->action('query');
  $wikipedia->list('categorymembers');
  $wikipedia->cmtitle('Category:'.$cat);
  $wikipedia->cmlimit('30');
  $wikipedia->format('xml');

  // выполнение запроса
  // итерирование по множеству XML-результатов
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for pages in category 
      '<?php echo $cat; ?>'</h2>
    <ol>
    <?php foreach ($result->query->categorymembers->cm as $c): ?>
      <li><a href="http://www.wikipedia.org/wiki/
        <?php echo $c['title']; ?>">
        <?php echo $c['title']; ?></a></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

Код листинга 3 задает имя категории и передает это имя в API, используя параметр cmtitle. Обратите внимание на параметр cmlimit, который задает количество возвращаемых результатов. Как и прежде, Zend_Rest_Client передает запрос и преобразует XML-ответ в объекты SimpleXML, облегчая анализ и отображение результатов запроса.

Результаты работы листинга 3 показаны на рисунке 2.

Рисунок 2. Web-страница со списком страниц Википедии в выбранной категории
Screen capture of a web page listing Wikipedia pages in the selected category, Greek_legendary_creatures

Выполнение полнотекстового поиска

Как насчет поиска страниц, которые содержат некоторое ключевое слово? Эта задача легко решается с помощью запроса, аналогичного описанному ранее, за исключением того, что в данном случае вам нужен список результатов поиска вместо элементов категории. Рассмотрите листинг 4, который иллюстрирует этот процесс.

Листинг 4. Получение списка результатов полнотекстового поиска
<?php
// загрузка классов Zend
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// определение поискового запроса
$query = 'michelangelo';

try {
  // инициализация клиента Rest
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // задание параметров запроса
  $wikipedia->action('query');
  $wikipedia->list('search');
  $wikipedia->srwhat('text');
  $wikipedia->format('xml');
  $wikipedia->srsearch($query);

  // выполнение запроса
  // итерирование по множеству XML-результатов
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for '<?php echo $query; ?>'</h2>
    <ol>
    <?php foreach ($result->query->search->p as $r): ?>
      <li><a href="http://www.wikipedia.org/wiki/
        <?php echo $r['title']; ?>">
        <?php echo $r['title']; ?></a> <br/>
      <small><?php echo $r['snippet']; ?></small></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

В листинге 4 используется то же действие query, что мы видели раньше, но с несколько другими параметрами. Параметр list указывает, что это операция полнотекстового поиска, в то время как параметр srsearch задает ключевое слово (в данном случае «michelangelo»). Также важно задать параметр srwhat который определяет, где необходимо производить поиск – по заголовкам страниц или по всему тексту.

Каждый результат поиска содержит заголовок страницы, размер, количество слов, пространство имен (об этом чуть позже) и фрагмент содержимого страницы. Вы можете отформатировать и отобразить эти данные как HTML-страницу, как показано на рисунке 3.

Рисунок 3. Web-страница с результатами поиска по Википедии
Screen capture of a web page listing Wikipedia search results for 'michelangelo'

Пример приложения: поиск по Википедии

В реальном мире ключевые слова для поиска не «зашиваются» в код, а вводятся пользователем. Код листинга 5 представляет собой усовершенствованную версию листинга 4 с большей интерактивностью. Он позволяет пользователю вводить поисковые слова в приложение и просматривать страницы Википедии, удовлетворяющие условиям поиска.

Листинг 5. Интерактивное приложение для поиска по Википедии
<html>
  <head></head>
  <body>
    <h2>Search</h2>
    <form method="post">
      Search: <input type="text" name="q" />
    </form>

    <?php
    // Если форма отправлена
    if (isset($_POST['q'])) {
      // Загрузка классов Zend
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass('Zend_Rest_Client');

      try {
        // инициализация клиента Rest
        $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

        // задание параметров запроса
        $wikipedia->action('query');
        $wikipedia->list('search');
        $wikipedia->srwhat('text');
        $wikipedia->format('xml');
        $wikipedia->srsearch($_POST['q']);

        // выполнение запроса
        // итерирование по множеству XML-результатов
        $result = $wikipedia->get();
      } catch (Exception $e) {
          die('ERROR: ' . $e->getMessage());
      }
    ?>
    <h2>Search results for '<?php echo $_POST['q']; ?>'</h2>
    <ol>
    <?php foreach ($result->query->search->p as $r): ?>
      <li><a href="http://www.wikipedia.org/wiki/
      <?php echo $r['title']; ?>">
      <?php echo $r['title']; ?></a> <br/>
      <small><?php echo $r['snippet']; ?></small></li>
    <?php endforeach; ?>
    </ol>
    <?php 
    }
    ?>

  </body>
</html>

В листинге 5 нет ничего сложного. В нем добавлены проверка на корректность введенных пользователем данных и передача этих данных в параметр srsearch. На рисунке 4 показаны исходная Web-форма и результаты поиска.

Рисунок 4. Web-форма для поиска по Википедии и результаты поиска
Screen capture of a web form for Wikipedia searches and the results for the phrase 'fruit fly'

Получение содержимого страницы

API MediaWiki также позволяет обращаться к текущей или к старым версиям содержимого страницы, присоединяя к запросу параметр prop=revisions. В данном случае необходимо задать заголовок возвращаемой страницы. Рассмотрите листинг 6, где показано, как это работает.

Листинг 6. Получение содержимого страницы
<?php
// Загрузка классов Zend
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// Задаем заголовок искомой страницы
$query = 'The A Team';

try {
  // Инициализация клиента Rest
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // задание параметров запроса
  $wikipedia->action('query');
  $wikipedia->prop('revisions');
  $wikipedia->rvprop('content');
  $wikipedia->format('xml');
  $wikipedia->redirects('1');
  $wikipedia->titles($query);

  // выполнение запроса
  // получение содержимого страницы в виде XML
  $result = $wikipedia->get();
  $content = $result->query->pages->page->revisions->rev;
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head>
  </head>
  <body>
    <h2>Page result for '<?php echo $query; ?>'</h2>
    <div>
      <?php echo $content; ?>
      </script>
    </div>
  </body>
</html>

Запрос из листинга 6 немного отличается от тех, которые вы уже видели, так как он использует свойство вместо списка. Свойства используются для определения того, какую информацию вы хотите извлечь из набора страниц. Имеется несколько различных свойств, включая метаданные страницы, исправления, ссылки, изображения, шаблоны, категории и т.д.

Запрос из листинга 6 определяет свойство revisions и затем использует параметр rvprop для определения параметров, получаемых для каждого исправления. В данном случае это просто содержимое правки. Также есть параметр rvlimit, который можно использовать для получения нескольких предыдущих правок. Однако в данный момент нас интересует только текущая правка, поэтому этот параметр в данном параметре не задается.

На рисунке 5 показан результат работы кода из листинга 6.

Рисунок 5. Web-страница, отображающая содержимое в Wikitext
Screen capture of a web page displaying content in Wikitext as continuous, unformatted text string (topic: The A-Team)

Как вы можете видеть на рисунке 5, результат работы листинга 6 – это содержимое определенной страницы в формате вики-разметки (Wikitext). Однако для использования этих данных в Web-приложении их придется переформатировать из вики-разметки в разметку XHTML. Для этой задачи существует несколько готовых конвертеров, и один из самых лучших – это пакет PEAR Text_Wiki, который может преобразовывать из Wikitext во множество других форматов и обратно.

Для установки просто выполните в консоли следующие команды:

shell> pear install Text_Wiki
shell> pear install Text_Wiki_Mediawiki

Установщик PEAR присоединится к серверу пакетов PEAR, скачает пакеты и установит их в подходящее место в вашей системе. Если вы предпочитаете ручную установку, в разделе Ресурсы можно найти ссылку для скачивания.

После установки пакета исправьте листинг 6 для использования конвертера Text_Wiki, как в листинге 7.

Листинг 7. Получение содержимого страницы и преобразование его в XHTML
<?php
// Загрузка классов Zend
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// Загрузка конвертера Wikitext
require_once 'Text/Wiki.php';

// Создание экземпляра Text_Wiki исходного класса
// и установка Mediawiki-адаптера
$wiki = & Text_Wiki::factory('Mediawiki');

// задание правил обработки 
$wiki->setRenderConf('xhtml', 'wikilink', 'view_url', 
  'http://en.wikipedia.org/wiki/');
$wiki->setRenderConf('xhtml', 'wikilink', 'pages', false);
  
// определение заголовка страницы
$query = 'The A Team';

try {
  // инициализация клиента Rest
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // задание параметров запроса
  $wikipedia->action('query');
  $wikipedia->prop('revisions');
  $wikipedia->rvprop('content');
  $wikipedia->format('xml');
  $wikipedia->redirects('1');
  $wikipedia->titles($query);

  // выполнение запроса
  // получение содержимого в виде XML
  $result = $wikipedia->get();
  $content = $result->query->pages->page->revisions->rev;
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head>
  </head>
  <body>
    <h2>Page result for '<?php echo $query; ?>'</h2>
    <div>
      <?php echo $wiki->transform($content, 'Xhtml'); ?>
      </script>
    </div>
  </body>
</html>

Код в листинге 7 инициализирует объект Text_Wiki и настраивает его на использование Mediawiki-адаптера. Он также определяет некоторые параметры, используемые для преобразования в XHTML, включая установленный по умолчанию URL-префикс, используемый для внешних вики-ссылок. Затем листинг 7 получает требуемое содержимое страницы, используя API, и пропускает его через метод transform() объекта Text_Wiki для преобразования в XHTML. На рисунке 6 показан результирующий текст с правкой.

Рисунок 6. Web-страница, отображающая вики-содержимое после преобразования в XHTML
Screen capture of a web page displaying formatted wiki content after conversion to XHTML (topic: The A-Team

Как видно из рисунка 6, пакет Text_Wiki неплохо преобразует Wikitext в стандартный XHTML. Однако результат не идеален, поскольку Text_Wiki учитывает не все аспекты разметки Wikitext (например, он совершенно не может работать с инфобоксами). Если вы обнаружите, что этот пакет недостаточен для ваших потребностей, попробуйте использовать вместо него анализатор Wikitext Стива Блинча (см. Ресурсы), который реализует альтернативный подход к анализу и преобразованию Wikitext.


Поиск по ссылкам на URL

Интересным аспектом API запросов Википедии является то, что он позволяет искать страницы, ссылающиеся на конкретный URL. Эта возможность крайне полезна, например, если вы хотите узнать количество ссылок на ваш сайт в статьях Википедии.

Для выполнения этого запроса вам потребуется изменить запрос так, чтобы он использовал внешний список URL и передавал искомый URL. Рассмотрим листинг 8, иллюстрирующий этот процесс.

Листинг 8. Получение списка страниц, ссылающихся на заданный URL
<?php
// Загрузка классов Zend
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// Задаем префикс категории
$url = 'httpd.apache.org';

try {
  // Инициализация клиента Rest
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // задание параметров запроса
  $wikipedia->action('query');
  $wikipedia->list('exturlusage');
  $wikipedia->euquery($url);
  $wikipedia->eulimit('30');
  $wikipedia->eunamespace('0');
  $wikipedia->format('xml');

  // выполнение запроса
  // итерирование апо множеству XML-результатов
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for pages referencing URL 
      '<?php echo $url; ?>'</h2>
    <ol>
    <?php foreach ($result->query->exturlusage->eu as $r): ?>
      <li><a href="http://www.wikipedia.org/wiki/
      <?php echo $r['title']; ?>"><?php echo $r['title']; ?>
      </a></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

К стандартным параметрам action и list код листинга 8 добавляет параметр euquery, который задает проверяемый URL (в данном случае сайт Apache), и параметр eunamespace, который задает вики-пространство имен для поиска. Обратите внимание, что URL должен быть задан без префикса протокола «http://». Результаты анализируются и обрабатываются обычным образом, и итог выглядит примерно так, как на рисунке 7.

Рисунок 7. Web-страница, отображающая страницы, ссылающиеся на заданный URL
Screen capture of a web page displaying pages referencing a specific URL: httpd.apache.org

Следует отдельно остановиться на использовании пространства имен в листинге 8 . API MediaWiki определяет несколько различных пространств имен для различных типов вики-содержимого. Каждое пространство имен определяется префиксом к заголовку страницы. Например, страница пользователя всегда имеет префикс пространства имен «User:», в то время как категория имеет префикс “Category:”.

Каждому пространству имен также сопоставляется целое число, которое можно использовать для фильтрации поисковых запросов. Полный список номеров и префиксов пространств имен приведен в документации к MediaWiki (см. Ресурсы). Ниже приведены наиболее часто используемые:

  • 0: пространство имен по умолчанию для страниц с содержимым
  • 1: пространство имен для страниц дискуссий
  • 2: пространство имен для страниц пользователей
  • 6: пространство имен для файлов
  • 14: пространство имен для страниц категорий

Из приведенного выше списка становится понятно, что листинг 8 отсеивает все запросы кроме тех, что связаны со страницами с содержимым с помощью параметра eunamespace . Удаление этого ограничения приведет к увеличению количества результатов – будут включены страницы пользователей и страницы дискуссий, содержащие заданный URL.


Добавление и редактирование страниц

Все предыдущие листинги в этой статье были посвящены действию query и показывали, как его можно использовать для получения различных типов данных из хранилища содержимого. Однако API Википедии также поддерживает несколько других методов, включая возможность создания новых страниц или редактирования существующих страниц. Для выполнения этих задач вызовите действие edit и передайте ему заголовок создаваемой или редактируемой страницы вместе с содержимым для страницы или раздела.

Каждая операция редактирования должна сопровождаться маркером, который гарантирует подлинность пользовательского запроса и защищает от CSRF-атак. Маркер обычно представляет собой строку букв и цифр, оканчивающуюся специальной последовательностью +\. Для анонимных пользователей маркер состоит только из последовательности +\.

Маркер должен быть присоединен к запросу на редактирование, как в листинге 9.

Листинг 9. Редактирование страниц
<?php
// Загрузка классов Zend
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

try {
  // Инициализация клиента Rest
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // задание параметров запроса
  $wikipedia->action('edit');
  $wikipedia->title('Wikipedia:Sandbox');
  $wikipedia->section('new');
  $wikipedia->summary('My Section');
  $wikipedia->text('Some text');
  $wikipedia->token('+\\');
  
  // POST данных страницы
  $wikipedia->post();
} catch (Exception $e) {
}
?>

Листинг 9 знакомит нас с несколькими новыми параметрами запроса.

  • Аргумент title задает редактируемую страницу. В данном случае редактирование производится на специальной странице-«песочнице», предназначенной специально для экспериментов и тестирования. Время от времени она автоматически очищается.
  • Аргумент section определяет номер редактируемого раздела. Использование ключевого слова «new» добавляет новый раздел. Пропуск этого аргумента приведет к замене целой страницы.
  • Аргумент summary определяет заголовок раздела при создании.
  • Аргумент text содержит содержимое раздела или страницы.
  • Аргумент token задает маркер для операции редактирования.

Стоит также заметить, что, в отличие от предыдущих листингов, запрос на редактирование передается с помощью POST, а не GET. Поэтому в листинге 9 для передачи запроса специально используется метод post() из Zend_Rest_Client. Так как API Википедии не возвращает XML-ответ на POST-запросы, Zend_Rest_Client при прочтении ответа генерирует исключительное событие SimpleXML. Поэтому код листинга предусматривает перехват исключительного события, но ничего с ним не делает. Альтернативным подходом здесь может быть использование Zend_Http_Client и создание пакета POST вручную.

После выполнения запроса вы можете наблюдать изменения на выбранной странице, а в истории правок вашей страницы появятся ваш IP-адрес (для анонимных пользователей) или ваше имя (для аутентифицированных пользователей). Каждая запись истории правок содержит дату, IP-адрес или имя пользователя, тип маркера редактирования и размер в байтах. На рисунке 8 показан пример.

Рисунок 8. История правок страницы Википедии, показывающая изменения, внесенные с помощью API
Screen capture of the revision history of a Wikipedia page, showing edits performed through the API

Заключение

На последних страницах этой статьи был приведен ускоренный вводный курс в использование API MediaWiki для получения и интеграции информации из Википедии с помощью вашего Web-приложения на PHP. Также мы вкратце изучили некоторые уникальные аспекты данного API, такие как пространства имен, свойства и списки. Также было показано, как использовать этот API не только для считывания информации из вики-ресурса, но и для записи данных в него.

Представленная в данной статье информация – это только верхушка айсберга. Модуль запросов, обсуждавшийся на нескольких последних страницах, - это чрезвычайно мощный инструмент, позволяющий взаимодействовать с множеством категорий вики-контента, включая изображения, файлы, данные о пользователях и данные о правках страницы. Безусловно, именно модуль запросов вы будете использовать чаще всего, но есть и дополнительные модули, позволяющие выполнять другие действия - вычислять статистику, такую как количество кликов, изменений и регистраций пользователей; публиковать отзывы к статье; возвращать данные из профиля пользователя; откатывать изменения в странице; загружать файлы; работать со списками наблюдения пользователей и т.д.

Как показывают приведенные в данной статье примеры, API MediaWiki предоставляет гибкий инструмент разработчикам, желающим строить новые креативные приложения на основе содержимого из Википедии или любого другого вики-ресурса, основанного на Mediawiki. Поэкспериментируйте с ним на досуге и оцените его возможности.

Ресурсы

Научиться

Получить продукты и технологии

  • MediaWiki (EN): скачайте этот вики-пакет с открытым исходным кодом, написанный на PHP.
  • Zend Framework (EN): скачайте этот пакет и стройте защищенные, надежные и современные Web 2.0 приложения и Web-сервисы с помощью широко доступных API.
  • Компонент PEAR Text_Wiki (EN): скачайте основной механизм, используемый во всех подклассах Text_Wiki.
  • Компонент PEAR Text_Wiki_MediaWiki (EN): скачайте Mediawiki-анализатор для Text_Wiki.
  • WikiText-анализатор Стива Блинча (EN): cкачайте и испытайте простой класс, который получает и анализирует страницы из MediaWiki. Этот класс способен работать с большей частью разметки форматирования текста и управления изображениями.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, Open source
ArticleID=773556
ArticleTitle=Доступ к информации Википедии с помощью PHP и API MediaWiki
publish-date=11112011