mediawiki使用教程_使用PHP和MediaWiki API了解Wikipedia信息

mediawiki使用教程

大多数人都听说过Wikipedia:这是来自人群的知识的终极存储库,几乎涵盖了您可以想到的所有主题,并且可供使用Web浏览器的任何人使用。 无论您要查找什么信息,都可以在Wikipedia上找到详尽的详细信息。 并且由于它是可公开编辑的,因此它始终包含更新的相关信息。

大多数人对维基百科一无所知。 隐藏在幕后的是强大的Web服务API,它使开发人员可以访问,搜索Wikipedia内容并将其集成到自定义Web应用程序中。 该API可通过HTTP工作,并以多种不同格式(包括XML)返回数据,可供编程人员免费使用,并可以创建由Wikipedia庞大的内容数据库提供支持的各种自定义Web应用程序。

在本文中,我向您简要介绍了此API,向您展示了如何将其与我最喜欢的编程语言PHP集成和使用。 本文介绍了API如何工作的基础知识,然后为您提供了列出目录类别,按类别或关键字搜索条目,检索和显示条目以及远程添加和编辑内容的实用演练。

了解API

在深入研究PHP代码之前,需要对Wikipedia API进行一些说明。 首先,尽管我在本文中将其称为“ Wikipedia API”,但需要注意的是,该API并不是仅Wikipedia独有的。 它实际上是运行Wikipedia的MediaWiki基础应用程序的一部分,因此本文概述的技术和API方法也可以在任何其他基于MediaWiki的Wiki上使用。 您可以在参考资料中找到指向MediaWiki和完整的MediaWiki API参考手册的链接 。

与所有基于HTTP的服务一样,API的工作方式是接受包含一个或多个输入参数的HTTP请求,并返回可以由请求客户端解析和使用的响应。 响应通常采用XML格式,因为当今几乎每种编程语言都可以解析XML。 但是,也可以请求其他格式的响应,例如JSON,WDDX,YAML或序列化PHP。

API的每个HTTP请求都必须包含一个强制性的“ action”参数,该参数指定了所需的操作。 此参数可以是查询,编辑或删除操作,身份验证请求或其他任何受支持的操作。 除了此必需的参数之外,还必须根据选择的操作传递其他参数,例如,用于查询的搜索关键字,用于编辑或删除操作的页面标题,或用于认证的用户名和密码。

要查看运行中的API,请尝试在您喜欢的Web浏览器中访问以下URL。 ( 注意:此URL实际上是单个字符串。仅出于格式化目的,该URL显示为两行。)

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

此方法返回以前缀“好莱坞”开头的前10个Wikipedia类别的列表。 清单1展示了对此请求的原始XML响应。

清单1.一个示例API feed


  
    
      Hollywood
      Hollywood's Rock Walk inductees
      Hollywood, California
      Hollywood, Florida
      Hollywood, Los Angeles, California
      Hollywood.com/celebrity/Wanda Shelley
      Hollywood Actors
      Hollywood Actress
      Hollywood Blacklist
      Hollywood Boulevard
    
  
  
    
  

列出类别和页面

现在您已经了解了API的工作原理,下面让我们看一些代码。 在本文全文中,我假定您熟悉HTML和XML,并且您具有一个工作正常的Apache / PHP开发环境,并且安装了最新版本的Zend Framework。 我还假定您了解使用PHP中的类和对象的基础知识,因为本文中使用PHP组件是按照OOP原则编写的。

要与API交互,您需要一个HTTP客户端,该客户端能够传输GET和POST请求并处理响应。 Zend Framework的Zend_Rest_Client组件是一个很好的工具,该组件专门为试图将PHP应用程序与Web服务集成的开发人员设计。 该客户端可用于对服务端点执行GET,POST,PUT和DELETE响应。 XML响应作为Zend_Rest_Client_Response对象的实例返回,从而可以轻松访问各个响应属性。

清单2说明了在PHP脚本的上下文中使用Zend_Rest_Client检索和显示清单1中的类别的过程。

清单2.列出维基百科类别
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());
}
?>

  
  
    

Search results for categories starting with ''

    query->allcategories->c as $c): ?>

清单2首先初始化Zend Framework的自动加载器,然后加载Zend_Rest_Client组件。 创建Zend_Rest_Client对象的实例,并使用Wikipedia API服务端点作为构造函数参数进行初始化。 然后定义和添加请求参数,然后使用客户端对象的get()方法将请求传输到API。 Zend_Rest_Client自动接收来自服务器的XML响应,并将其转换为一组SimpleXML对象,您可以使用标准的对象属性表示法对其进行访问。

图1说明了清单2的输出。

图1.列出维基百科类别的网页

注意使用Zend_Rest_Client将请求参数传递到服务器的方式。 通过调用具有相同名称的客户端方法并将该值作为第一个参数传递给该方法来指定每个参数。 例如,要将参数action=query添加到请求中,脚本将调用$client->action('query') 。 您可以将Zend_Rest_Client文档(见阅读更多关于此相关信息中的链接)。

您还可以通过更改查询以返回类别成员而不是类别的列表来检索类别中的页面列表。 显然,您需要将类别名称作为输入传递给API。 考虑清单3 ,它仅完成此任务。

清单3.列出类别中的页面
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());
}
?>

  
  
    

Search results for pages in category ''

    query->categorymembers->cm as $c): ?>

清单3指定类别的名称,并使用cmtitle参数将该名称传递给API。 还要注意cmlimit参数,该参数指定要返回的结果数。 和以前一样,Zend_Rest_Client传输请求并将XML响应转换为SimpleXML对象,从而使解析和显示查询结果变得容易。

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

图2.列出所选类别中的维基百科页面的网页

执行全文搜索

接下来,如何搜索与特定关键字匹配的页面? 使用上一页中所述的相同查询可以轻松完成此任务,除了在这种情况下,您要列出搜索结果而不是类别成员。 考虑清单4 ,它说明了该过程。

清单4.列出全文搜索结果
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());
}
?>

  
  
    

Search results for ''

    query->search->p as $r): ?>

清单4使用了与前面相同的query操作,但是在这种情况下,参数略有不同。 list参数指定这是一个全文本搜索操作,而srsearch参数指定搜索关键字(在本例中为“ michelangelo”)。 指定srwhat参数也很重要,该参数指示是否应在页面标题或页面文本上执行搜索。

每个搜索结果条目都包含页面标题,大小,字数,名称空间(稍后会详细介绍)以及页面内容的摘要。 然后,您可以格式化该数据并将其显示为HTML网页, 如图3所示 。

图3.列出维基百科搜索结果的网页

示例应用程序:Wikipedia搜索

在现实世界中,搜索关键字不是硬编码到脚本中的,而是由用户输入的。 清单5对 清单4进行了改进,使其更具交互性,允许用户在应用程序中输入搜索词,并查看与该搜索词匹配的Wikipedia页面。

清单5.交互式维基百科搜索工具

  
  
    

Search

Search:
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()); } ?>

Search results for ''

    query->search->p as $r): ?>

清单5中没有什么太复杂的:它只是对用户的输入执行附加检查,并将该输入传递给srsearch参数。 图4说明了初始Web表单和搜索结果。

图4. Wikipedia搜索和结果的Web表单

检索页面内容

MediaWiki API还允许您通过将prop=revisions参数附加到查询操作来访问页面内容的当前或先前版本。 在这种情况下,必须指定要返回的页面的标题。 考虑清单6 ,它说明了它是如何工作的。

清单6.检索页面内容
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());
}
?>

  
  
  
    

Page result for ''

清单6中的查询与您迄今为止看到的查询略有不同,因为它使用属性而不是列表。 属性用于指定要为一组页面检索的信息。 有许多不同的属性可用,包括页面元数据,修订,链接,图像,模板,类别等。

在查询清单6个指定的revisions属性,并进一步使用rvprop参数指定要获取每个修订,在这种情况下,只有修改的内容的属性。 还有一个rvlimit参数,您可以使用它获取多个先前的修订版; 但是,目前,您只对最新(当前)版本感兴趣,因此查询未指定此参数。

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

图5.一个以Wikitext显示内容的网页

从图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
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());
}
?>

  
  
  
    

Page result for ''

transform($content, 'Xhtml'); ?>

清单7初始化了一个Text_Wiki对象,并将其设置为使用Mediawiki适配器。 它还指定了用于XHTML转换的一些参数,包括用于内部Wiki链接的默认URL前缀。 清单7然后使用API​​检索指定页面的内容,并将其通过Text_Wiki对象的transform()方法传递,以将其转换为XHTML。 图6显示了修改后的输出。

图6.转换为XHTML后显示Wiki内容的网页

如图6所示,Text_Wiki包在将Wikitext转换为标准XHTML方面做得相当不错。 但是,它并不是完美的,并且不能说明Wikitext标记的所有方面(例如,它根本无法处理信息框)。 如果你发现它不这样做你需要的一切,考虑与史蒂夫Blinch的wikitext的解析器替换它(见相关信息 ),它提供了一种替代的方法来解析wiki文字和转换。

执行URL参考搜索

Wikipedia的查询API的一个有趣的方面是,它使您可以搜索引用特定URL的页面。 例如,如果您想查看您的网站在Wikipedia条目中出现的频率,则此功能非常有用。

要执行此查询,您需要调整查询以使用外部URL列表并传递要检查的特定URL。 考虑清单8 ,该清单说明了如何执行此操作。

清单8.引用URL的清单页面
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());
}
?>

  
  
    

Search results for pages referencing URL ''

    query->exturlusage->eu as $r): ?>

除了标准的actionlist参数之外, 清单8还添加了euquery参数和euquery参数,该参数指定要检查的URL(在本例中为Apache网站),而eunamespace参数指定要查看的Wiki名称空间。该URL必须不带“ http://”协议前缀指定。 以通常的方式对结果进行解析和处理,产生类似于图7的输出。

图7.一个网页,显示引用特定URL的页面

清单8的名称空间方面值得简要说明。 MediaWiki API为Wiki中的不同类型的内容定义了许多不同的名称空间。 每个名称空间由页面标题附带的前缀标识。 例如,用户页面始终具有“ User:”名称空间前缀,而类别页面具有“ Category:”名称空间前缀。

每个名称空间还与一个整数关联,该整数可用于过滤搜索查询。 您可以在MediaWiki文档中找到名称空间整数和前缀的完整列表(请参阅参考资料中的链接),但是以下是您最常使用的名称:

  • 0:内容页面的默认名称空间
  • 1:对话页面的名称空间
  • 2:用户页面的名称空间
  • 6:文件的命名空间
  • 14:类别页面的名称空间

从上面的列表中,应该很清楚, 清单8通过eunamespace参数将查询仅限制在内容页面上。 删除此约束将返回大量结果,包括包含指定URL的用户页面和讨论页面。

添加和编辑页面

本文前面的所有清单都集中在API的query操作上,说明了如何使用它从内容存储库中检索不同类型的数据。 但是,该API还支持许多其他方法,包括创建新页面或编辑现有页面的能力。 要完成这些任务,请调用API的edit动作,并将要编辑或创建的页面的标题以及页面或部分的内容传递给API。

每个编辑操作都必须带有令牌,以确保用户请求的有效性并防止CSRF攻击。 令牌通常由一个字母数字字符串组成,以特殊的+ \序列结尾。 对于匿名用户,令牌仅由+ \序列组成。

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

清单9.编辑页面
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沙盒页面上执行编辑,该页面专门用于实验和测试,并会定期自动清除。
  • section参数指定要编辑的段号。 使用特殊关键字“ new”会添加一个新部分。 忽略此参数将替换整个页面。
  • 创建新节时, summary参数指定节的标题。
  • text参数包含节或页面的内容。
  • token参数指定用于编辑操作的令牌。

还请注意,与以前的清单不同,必须使用POST而不是GET来发送编辑请求。 这就是为什么清单9特别使用Zend_Rest_Client的post()方法来发送请求。 由于Wikipedia API不会将XML响应返回给POST,因此Zend_Rest_Client在读取响应时会引发SimpleXML异常。 这就是为什么清单被编写为捕获异常但实际上不对其执行任何操作的原因。 这里的替代方法可能是使用Zend_Http_Client并手动创建POST数据包。

请求完成后,您可以在目标页面上看到所做的更改,并且系统的IP地址(对于匿名用户)或用户名(对于经过身份验证的用户)将显示在页面的修订历史记录中。 修订历史记录条目包括日期时间戳,IP地址或用户名,编辑指示符的类型以及字节大小。 图8有一个例子。

图8. Wikipedia页面的修订历史记录,显示了通过API执行的编辑

结论

在最后几页中,本文为您提供了速成课程,内容涉及如何使用MediaWiki API从Wikipedia中检索信息并将其与PHP Web应用程序集成。 它还简要检查了该API的一些独特方面,例如名称空间,属性和列表,并演示了如何使用API​​不仅可以从Wiki读取数据,还可以将数据写回到Wiki。

本文提供的信息只是冰山一角。 前几页讨论的查询模块功能非常强大,可让您访问Wiki内容的更多方面,包括图像,文件,用户数据和页面修订数据。 虽然查询模块无疑是您最常使用的模块,但其他现有模块可让您计算统计信息,例如用户点击,用户编辑和用户注册。 提交文章反馈; 返回用户个人资料信息; 回滚页面编辑; 上传文件; 操纵用户监视列表; 以及更多。

如本文示例所示,MediaWiki API为希望围绕Wikipedia或任何其他基于MediaWiki的Wiki内容构建创造性的新应用程序的开发人员提供了一种灵活的工具。 有时玩,看看你的想法。


翻译自: https://www.ibm.com/developerworks/web/library/x-phpwikipedia/index.html

mediawiki使用教程

你可能感兴趣的:(python,linux,java,编程语言,php)