利用 PHP 与 MediaWiki API 来获取维基百科信息

利用 PHP 来通过 MediaWiki API 进行维基百科条目的搜索、检索、与修改

维基百科是终极在线百科全书,其中收录了几百万条各类人文知识。Web 应用程序开发人员能够通过 Wikipedia API 来访问并搜索这些条目。本文介绍了 Wikipedia API,并在 PHP 应用程序上下文中对其进行了演示,来说明如何利用 PHP 来搜索和检索维基百科内容的不同元素。

Vikram Vaswani, 创始人, Melonfire

Vikram Vaswani 的照片Vikram Vaswani 是 Melonfire 的创始人和 CEO,该公司是一家专门研究开源工具和技术的咨询服务公司。他还著有 PHP Programming SolutionsHow to do Everything with PHP and MySQL 等著作。



2011 年 6 月 27 日

简介

常用缩略语

  • API:应用程序编程接口
  • CSRF:跨站点请求伪造
  • HTML:超文本标记语言
  • HTTP:超文本传输协议
  • IP:因特网协议
  • JSON:JavaScript 对象标记法
  • OOP:面向对象编程
  • PEAR:PHP 扩展与应用程序库
  • REST:具象状态传输
  • WDDX:Web 分布式数据交换
  • XHTML:可扩展超文本标记语言
  • XML:可扩展标记语言
  • YAML:YAML Ain't 标记语言

很多人都知道维基百科:它是容纳各种来源知识的终极存储库,涵盖几乎每个您能想到的主题,通过 Web 浏览器就可轻松获得。不论您想要查找什么信息,都可在维基百科中找到,并能获得详细的相关信息。而且,因为它是公开可编辑的,所以,其中经常会包含一些更新信息以及相关信息。

大部分人可能对维基百科的另一个侧面不太了解。那就是隐藏的幕后的,强大的 Web 服务 API,它使得开发人员能够进行访问、搜索、以及将维基百科内容集成到自定义 Web 应用程序中。该 API 通过 HTTP 工作,并返回各种格式的数据(包括 XML),对广大编程人员免费提供,它使得利用维基百科的强大数据库来创建各类自定义 Web 应用程序成为可能。

在本文中,将对该 API 进行简要介绍,展示如何利用 PHP 编程语言来对其进行集成与使用。本文解释了该 API 的工作基础,然后为您介绍列出类目、通过类目或者关键字来搜索条目、检索并展示条目、以及远程增加和编辑内容等的相关实际例子。


理解 API

在开始研究 PHP 代码之前,先要介绍一下 Wikipedia API。首先,虽然本文中我将其称之为 “Wikipedia API”,但需要特别注意,该 API 不是 Wikipedia 专用的。它实际上是 MediaWiki(Wikipedia 的运行基础)的一部分,因此,本文中所列举的技术和 API 方法还可用于任何其他基于 MediaWiki 的 wiki 中。参考资料 中提供了 MediaWiki 与完整 MediaWiki API 参考手册的链接。

和所有基于 HTTP 的服务一样,该 API 通过接受 HTTP 请求(其中包含一个或多个输入参数并返回可被请求客户端使用和解析的响应)来运行。大多数情况下,响应的格式是 XML,因为当前几乎所有编程语言都能够解析 XML;然而,也有可能需要返回其他格式的数据,比如 JSON、WDDX、YAML、或者 PHP 序列化的。

该 API 的每一个 HTTP 请求都必须包含一个 “action” 参数,它指定请求的动作。该参数必须是一个查询、一个编辑或删除操作、一个认证请求、或者所支持的任何一个操作。除了这一强制参数外,基于所选择的操作,还必须传递附加的参数,例如,用于查询的搜索关键字、编辑或者删除操作的页面标题、或者需要进行认证的用户名和密码。

想要查看运行中的 API,可访问以下 URL。(注意:该 URL 实际上是一个字符串。因为格式的原因,用两行来显示。)

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

该方法会返回以前缀 “hollywood” 开始的前 10 个 Wikipedia 类。清单 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 很熟悉,并具有已经安装了最新版 Zend Framework 的 Apache/PHP 开发环境。还假定读者了解在 PHP 中的类与对象的相关知识,因为文中所采用的 PHP 组件是遵照 OOP 原则来编写的。

要想与 API 交互,就需要一个能够传输 GET 和 POST 请求,并能够处理响应的 HTTP 客户端。Zend Framework's Zend_Rest_Client 就是个很有效的工具,它就是为那些想要将 PHP 应用程序与 Web 服务集成到一起的开发人员专门设计的。可利用该客户端来执行对服务端点的 GET、POST、PUT、与 DELETE 响应。XML 响应以 Zend_Rest_Client_Response 对象实例的方式返回,这样就能更方便地访问单个响应属性。

清单 2 演示了检索与显示 清单 1 中类目的流程,该例中的 PHP 脚本上下文中采用了 Zend_Rest_Client。

清单 2. 列出 Wikipedia 类目
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define category prefix
$prefix = 'hollywood';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('allcategories');
  $wikipedia->acprefix($prefix);
  $wikipedia->format('xml');

  // perform request
  // iterate over XML result set
  $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 对象的一个实例,在初始化操作中确定 Wikipedia API 服务端点作为构造函数参数。然后定义并添加请求参数,再使用客户端对象的 get() 方法来将请求传递给 API。来自服务器的 XML 响应会被自动接收,并被 Zend_Rest_Client 转换为一组 SimpleXML 对象,这样就可以利用标准对象属性标记来进行访问。

图 1 演示了 清单 2 的输出结果。

图 1. 列出 Wikipedia 类目的 Web 页
列出以 ‘hollywood’ 开头的 Wikipedia 类目的 Web 页截屏

注意通过使用 Zend_Rest_Client 将请求参数传递给服务器的方式。通过调用相同名称的客户端以及将值作为第一个参数传递给该方法,来指定每个参数。例如,要向请求增加参数 action=query,脚本会调用 $client->action('query')。可在 Zend_Rest_Client 文档中获得更多相关信息(见 参考资料 中的相关链接)。

您也可以通过将查询修改为返回类目成员清单而不是类目,来在类目中检索页面清单。很显然,需要将类目名作为输入来传递给 API。考虑 清单 3,它就是用于完成此任务的。

清单 3. 列出类目中的页面
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define category
$cat = 'Greek_legendary_creatures';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('categorymembers');
  $wikipedia->cmtitle('Category:'.$cat);
  $wikipedia->cmlimit('30');
  $wikipedia->format('xml');

  // perform request
  // iterate over XML result set
  $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 指出类目名,并利用 cmtitle 参数将此名字传递给 API。还要注意参数 cmlimit,它指定了返回结果的数量。正如前面一样,Zend_Rest_Client 传递请求并将 XML 响应转换为 SimpleXML 对象,这方便了查询结果的解析与展示。

图 2 展示了 清单 3 的输出。

图 2. Web 页面中列出了所选类目中的 Wikipedia 页
Web 页面抓屏中列出了所选类目中的 Wikipedia 页,Greek_legendary_creatures

执行全文搜索

接下来,为何不搜索匹配特定关键字的页面呢?可利用前页所描述的查询来轻松完成此任务,除非在本例中,想要列出搜索结果而不是类目成员。考虑 清单 4,其中对该流程进行了阐述。

清单 4. 列出全文搜索结果
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define search query
$query = 'michelangelo';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('search');
  $wikipedia->srwhat('text');
  $wikipedia->format('xml');
  $wikipedia->srsearch($query);

  // perform request
  // iterate over XML result set
  $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 Web 页来进行显示,如 图 3 所示。

图 3. Web 页面列出 Wikipedia 搜索结果
Web 页面截屏展示了 Wikipedia 对于 ‘michelangelo’ 的搜索结果

示例应用:Wikipedia 搜索

在现实中,搜索关键字没有硬编码到脚本中,而是由用户来输入。清单 5 改进了 清单 4 来提供更好的交互性,允许用户在应用程序中输入搜索关键字,并查看匹配该搜索术语 Wikipedia 页面。

清单 5. 交互式 Wikipedia 搜索工具
<html>
  <head></head>
  <body>
    <h2>Search</h2>
    <form method="post">
      Search: <input type="text" name="q" />
    </form>

    <?php
    // if form submitted
    if (isset($_POST['q'])) {
      // load Zend classes
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass('Zend_Rest_Client');

      try {
        // initialize REST client
        $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

        // set query parameters
        $wikipedia->action('query');
        $wikipedia->list('search');
        $wikipedia->srwhat('text');
        $wikipedia->format('xml');
        $wikipedia->srsearch($_POST['q']);

        // perform request
        // iterate over XML result set
        $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 演示了初始页面表单以及搜索结果。

图 4. 用于 Wikipedia 搜索的 Web 表单及搜索结果
Web 表单截屏展示了 Wikipedia 对短语 ‘fruit fly’ 的搜索及其结果

检索页面内容

MediaWiki API 还支持通过在查询动作后附加 prop=revisions 参数来访问页面内容目前或以前版本。在本例中,指定想要返回的页面标题很有必要。考虑 清单 6,演示了其工作方式。

清单 6. 检索页面内容
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define page title
$query = 'The A Team';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->prop('revisions');
  $wikipedia->rvprop('content');
  $wikipedia->format('xml');
  $wikipedia->redirects('1');
  $wikipedia->titles($query);

  // perform request
  // get page content as 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 属性来指定获取每个 revision 的哪个属性 — 在本例中,仅是 revision 的内容。还有一个参数 rvlimit,这个用于获取 revision 的多个版本;然而,目前您只关注最新(当前)版本,因此查询并没有指定该参数。

图 5 演示了 清单 6 的输出。

图 5. Web 页面展示 Wikitext 的内容
Web 页面截屏以连续的、非格式化文本字符串(主题:The A-Team)

图 5 所示,清单 6 的输出是 wiki 标记(Wikitext)中特定页面的内容。然而,想要在 Web 应用程序中使用该数据,就需要将其从 wiki 标记转换为 XHTML 标记。有很多现成的转换器可完成此任务,但其中比较好的是 PEAR Text_Wiki 包,它可以实现在 Wikitext 与多个其他格式之间相互转换。

要安装该工具,仅需在 shell 提示符下执行如下命令:

shell> pear install Text_Wiki
shell> pear install Text_Wiki_Mediawiki

PEAR 安装程序已连接到 PEAR 包服务器,下载此包,并将其安装到系统中的适当位置。如果选择手动安装,可在 参考资料 中找到下载链接。

程序包安装完成之后,修改 清单 6 来使用 Text_Wiki 转换程序,如 清单 7 所示。

清单 7. 检索页面内容并转换为 XHTML
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// load wikitext converter
require_once 'Text/Wiki.php';

// instantiate a Text_Wiki object from the given class
// and set it to use the Mediawiki adapter
$wiki = & Text_Wiki::factory('Mediawiki');

// set some rendering rules  
$wiki->setRenderConf('xhtml', 'wikilink', 'view_url', 
  'http://en.wikipedia.org/wiki/');
$wiki->setRenderConf('xhtml', 'wikilink', 'pages', false);
  
// define page title
$query = 'The A Team';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->prop('revisions');
  $wikipedia->rvprop('content');
  $wikipedia->format('xml');
  $wikipedia->redirects('1');
  $wikipedia->titles($query);

  // perform request
  // get page content as 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 转换的参数,包括内部 wiki 链接的默认 URL 前缀。清单 7 利用 API 来检索特定的页面内容,然后使用 Text_Wiki 对象的 transform() 方法来进行传递,将其转换为 XHTML。图 6 展示了调整后的输出。

图 6. Web 页面展示了转换为 XHTML 后的 wiki 内容
Web 页面截屏展示了转换为 XHTML 后的格式化 wiki 内容(主题:The A-Team)

图 6 所示,虽然 Text_Wiki 包并不完美,不能照顾到 Wikitext 标记的所有方面(例如,它不能处理 infoboxes),但 Text_Wiki 包的确能够很好地将 Wikitext 转换为标准 XHTML。如果您觉得它不够完美,可以考虑采用 Steve Blinch 的 Wikitext 解析器(见 参考资料),它提供了另一种 Wikitext 解析和转换方法。


执行 URL 引用搜索

Wikipedia 查询 API 比较有趣的是,允许您搜索引用特定 URL 的页面。如果想要查看 Web 页面在 Wikipedia 条目中出现的频率,这个功能就很有用。

要执行该查询,需要调整查询来采用外部 URL 清单,然后传递所要检查的特定 URL。考虑 清单 8,其演示了实现方式。

清单 8. 列出引用特定 URL 的页面
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define category prefix
$url = 'httpd.apache.org';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('exturlusage');
  $wikipedia->euquery($url);
  $wikipedia->eulimit('30');
  $wikipedia->eunamespace('0');
  $wikipedia->format('xml');

  // perform request
  // iterate over XML result set
  $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>

除了标准 actionlist 参数外,清单 8 还增加了参数 euquery,它指定了需要检查的 URL(在本例中,是 Apache Web 站点),以及参数 eunamespace,这指定了需要查看的 wiki 名称空间。注意,没有 “http://” 协议前缀的话,必须指定 URL。用常规方式来对结果进行解析与处理,产生类似 图 7 中的输出。

图 7. Web 页面展示引用特定 URL 的页面
Web 页面截屏展示引用特定 URL 的页面:httpd.apache.org

很有必要对 清单 8 的名称空间进行简要介绍。MediaWiki API 为 wiki 中不同类型的内容定义多个不同的名称空间。通过附加到页面标题的前缀来指定每个名称空间。例如,用户页面总会有名称空间前缀 “User:”,而类目页会具有名称空间前缀 “Category:”。

每个名称空间与一个整数对应,这个用于过滤每个查询。可在 MediaWiki 文档中找到完整的名称空间整数与前缀清单(见 参考资料 中相关链接),以下是常用部分:

  • 0:内容页的默认名称空间
  • 1:talk 页的名称空间
  • 2:用户页的名称空间
  • 6:文件的名称空间
  • 14:类目页的名称空间

依据以上清单,可以清楚知道 清单 8 限制仅通过 eunamespace 参数来查询内容页。如果取消这种限制,将会返回大量的结果,包括包含特定 URL 的用户页与 talk 页。


增加并编辑页面

本文前面所有的清单都关注于 API 的 query 动作,演示如何从内容库中检索不同类型的数据。然而,API 还支持很多其他方法,包括创建新页或编辑现有页的功能。想要完成这些任务,可调用 API 的 edit 动作并将想要编辑或者创建的页的标题,以及有关页或者部分的内容传递给它。

每个编辑操作必须伴有一个令牌,这可确保用户请求的有效性,并抵御 CSRF 攻击。令牌通常由字母数字串组成,并以特定的 +\ 序列结束。对于匿名用户,令牌仅包含 +\ 序列。

令牌必须附加到编辑请求,如 清单 9 所示。

清单 9. 编辑页面
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('edit');
  $wikipedia->title('Wikipedia:Sandbox');
  $wikipedia->section('new');
  $wikipedia->summary('My Section');
  $wikipedia->text('Some text');
  $wikipedia->token('+\\');
  
  // POST page data 
  $wikipedia->post();
} catch (Exception $e) {
}
?>

清单 9 引入了多个新的请求参数。

  • title 参数指定需要编辑的页面。在本例中,在特定 Wikipedia sandbox 页面上执行编辑操作,这主要用于实验和测试,会定期进行自动清理。
  • section 参数指定需要编辑的节数。利用特定关键字 “new” 来增加新节。省略这一参数将替换整个页面。
  • summary 参数指定创建新节时的节标题。
  • text 参数包含节或者页的内容。
  • token 参数指定用于编辑操作的令牌。

还要注意,与前面的清单不同,必须利用 POST 而不是 GET 来传递编辑请求。这就是 清单 9 特别采用 Zend_Rest_Client 的 post() 方法来传递请求的原因。因为 Wikipedia API 不会向 POST 返回 XML 响应,所以 Zend_Rest_Client 在读取响应时会发出 SimpleXML 异常。这就是清单中包含异常捕获功能,但实际却没有进行任何操作的原因。作为替代方法,在此处可以采用 Zend_Http_Client,并手动创建 POST 包。

完成请求后,可在目标页上看修改效果,系统的 IP 地址(对于匿名用户)或者用户名(对于认证用户)会出现在页面修订历史中。修订历史条目包含日期时间戳、IP 地址或者用户名、编辑指示器的类型、以及字节数。图 8 展示了一个示例。

图 8. Wikipedia 页的修订历史,展示了通过 API 所执行的编辑
Wikipedia 页修订历史截屏展示了通过 API 所执行的编辑操作

结束语

在前面的内容当中,本文提供了有关如何利用 MediaWiki API 来从 Wikipedia 中检索信息,并将其集成到 PHP Web 应用程序中的速成课程。文中还简要介绍了该 API 的一些比较特别的方面,比如名称空间、属性、以及清单,并演示了如何从 wiki 读取数据,以及如何进行数据回写。

本文所介绍的只是冰山一角。前面内容中所探讨的查询模块非常强大,它可用于访问 wiki 内容的更多方面,包括图片、文件、用户数据、以及页面修订数据。除了这一查询模块外,还有很多其他模块,包括可用于计算统计数据的模块,比如用户点击情况、用户编辑情况、以及用户注册情况;提交文章返回的模块;返回用户配置文件信息的模块;页面编辑回滚的模块;上传文件的模块;操纵用户关注列表的模块等等。

正如本文中所演示的示例,MediaWiki API 为开发人员提供了灵活的工具,来围绕 Wikipedia 内容或其他基于 Wikipedia 的 wiki 构建创造性的新应用程序。试用一下它,看看感觉如何!

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Open source, Web development
ArticleID=682339
ArticleTitle=利用 PHP 与 MediaWiki API 来获取维基百科信息
publish-date=06272011