Php 从WikiData ID获取Wikipedia页面的URL
我正在尝试使用API从Wikidata ID获取不同的Wikipedia URL,即en.Wikipedia.org/wiki/Page_Name 例如,给定URL,我希望获得所有语言的维基百科文章的链接en.Wikipedia.org/wiki/Joseph_Haydn、es.Wikipedia.org/wiki/Joseph_Haydn等。我使用的ATM:Php 从WikiData ID获取Wikipedia页面的URL,php,wikipedia-api,wikidata,Php,Wikipedia Api,Wikidata,我正在尝试使用API从Wikidata ID获取不同的Wikipedia URL,即en.Wikipedia.org/wiki/Page_Name 例如,给定URL,我希望获得所有语言的维基百科文章的链接en.Wikipedia.org/wiki/Joseph_Haydn、es.Wikipedia.org/wiki/Joseph_Haydn等。我使用的ATM: 但是我不知道如何从实体提供的对象获取WP URL。我想这应该是一项简单的任务,但几个小时后我仍然不知道怎么做,如果有使用WP API经验
但是我不知道如何从实体提供的对象获取WP URL。我想这应该是一项简单的任务,但几个小时后我仍然不知道怎么做,如果有使用WP API经验的人能为我指出正确的方向,我将不胜感激:我以前没有使用过这个特定的库,但它的文档非常简单,让我们一起来看看: \Wikidata\Wikidata::entities返回 Wikidata\Entity\Entity\EntityResponse有一个get方法返回 Wikidata\Entity\Entity似乎没有任何功能返回到相关Wikipedia页面的站点链接。。。死胡同 基于此,截至2015年8月14日,该图书馆似乎不适合您的需要。它只实现基本的实体数据。此库也不使用官方wikibase/数据模型库提供的数据模型。使用它会使事情变得更简单,因为Wikibase使用它,而MediaWiki扩展实际上是Wikidata的底层软件。在该库中,您可以简单地使用::getSiteLinkList获取从版本0.4开始的站点链接列表 使用替代库的解决方案 另一个使用上述数据模型库(也在使用)的库是 有一些关于GitHub repo的文档,还有一些关于Wikidata wiki本身的文档 从该页上的示例中,您可以获得一个基本想法,阅读一些API文档,您可以构建以下代码:
use \Mediawiki\Api as MwApi;
use \Wikibase\Api as WbApi;
use \Wikibase\DataModel\SiteLink;
$api = new MwApi\MediawikiApi( "http://www.wikidata.org/w/api.php" );
$api->login( new MwApi\ApiUser( 'USER', 'PASSWORD' ) );
$wikidata = new WbApi\WikibaseFactory( $api );
// Get the current revision of item Q7349
$revision = $wikidata->newRevisionGetter()->getFromId( 'Q7349' );
/** @var \Wikibase\DataModel\Entity\Item $item */
$item = $revision->getContent()->getData();
/** @var SiteLink $siteLink */
$itemSiteLinks = $item->getSiteLinkList();
因此,$itemSiteLinks将包含所有站点链接,不仅是到维基百科站点,还包括到Wiktionary和其他站点的链接。此外,我们还没有网址。不幸的是,使用的库没有提供一种开箱即用的链接构建方法。相反,我们必须直接访问wikidata API来获取所有站点的信息,然后根据这些信息构建链接
/**
* @param MwApi\MediawikiApi $mwApi
* @param string[] $projectTypes The desired projects, e.g. [ "Wikipedia", "Wiktionary" ]
* @return string[] Project's ID as key, url string as value.
*/
function getProjectUrls( MwApi\MediawikiApi $mwApi, $projectTypes ) {
$urls = [];
// TODO: Could optimize this request with additional parameters:
$siteMatrix = $mwApi->postRequest( new \Mediawiki\Api\SimpleRequest( 'sitematrix' ) )[ 'sitematrix' ];
foreach( $siteMatrix as $key => $wmProjectsByLang ) {
if( !is_numeric( $key ) ) {
continue; // not a project but meta info (e.g. "count")
}
foreach( $wmProjectsByLang[ 'site' ] as $mwProject ) {
if( in_array( $mwProject[ 'sitename' ], $projectTypes ) ) {
$urls[ $mwProject[ 'dbname' ] ] = $mwProject[ 'url' ];
}
}
}
return $urls;
}
/**
* @param SiteLink $siteLink
* @param array $sitesInfo
* @return null|string
*/
function buildSiteLinkUrl( SiteLink $siteLink, array $sitesInfo ) {
$siteId = $siteLink->getSiteId();
if( !array_key_exists( $siteId, $sitesInfo ) ) {
return null;
}
$baseUrl = $sitesInfo[ $siteId ];
$titlePart = urlencode( str_replace( ' ', '_', $siteLink->getPageName() ) );
return "$baseUrl/wiki/$titlePart";
}
$wikipediaSites = getProjectUrls( $api, [ 'Wikipedia' ] );
foreach( $itemSiteLinks as $siteLink ) {
$url = buildSiteLinkUrl( $siteLink, $wikipediaSites );
if( $url !== null ) {
echo "$url\n";
}
}
这应该可以做到,尽管第二部分有点粗糙,因为我们创建了一个关于如何构建wiki链接的假设。理论上可能有其他url模式,但据我所知,所有Wikimedia Wiki都遵循这个模式
无论如何,为了以一种完全安全的方式构建URL,sitematrix API模块返回的信息中应该有关于URL架构的信息,但是没有。我以前没有使用过这个特定的库,但是它的文档非常简单,所以让我们一起来讨论一下: \Wikidata\Wikidata::entities返回 Wikidata\Entity\Entity\EntityResponse有一个get方法返回 Wikidata\Entity\Entity似乎没有任何功能返回到相关Wikipedia页面的站点链接。。。死胡同 基于此,截至2015年8月14日,该图书馆似乎不适合您的需要。它只实现基本的实体数据。此库也不使用官方wikibase/数据模型库提供的数据模型。使用它会使事情变得更简单,因为Wikibase使用它,而MediaWiki扩展实际上是Wikidata的底层软件。在该库中,您可以简单地使用::getSiteLinkList获取从版本0.4开始的站点链接列表 使用替代库的解决方案 另一个使用上述数据模型库(也在使用)的库是 有一些关于GitHub repo的文档,还有一些关于Wikidata wiki本身的文档 从该页上的示例中,您可以获得一个基本想法,阅读一些API文档,您可以构建以下代码:
use \Mediawiki\Api as MwApi;
use \Wikibase\Api as WbApi;
use \Wikibase\DataModel\SiteLink;
$api = new MwApi\MediawikiApi( "http://www.wikidata.org/w/api.php" );
$api->login( new MwApi\ApiUser( 'USER', 'PASSWORD' ) );
$wikidata = new WbApi\WikibaseFactory( $api );
// Get the current revision of item Q7349
$revision = $wikidata->newRevisionGetter()->getFromId( 'Q7349' );
/** @var \Wikibase\DataModel\Entity\Item $item */
$item = $revision->getContent()->getData();
/** @var SiteLink $siteLink */
$itemSiteLinks = $item->getSiteLinkList();
因此,$itemSiteLinks将包含所有站点链接,不仅是到维基百科站点,还包括到Wiktionary和其他站点的链接。此外,我们还没有网址。不幸的是,使用的库没有提供一种开箱即用的链接构建方法。相反,我们必须直接访问wikidata API来获取所有站点的信息,然后根据这些信息构建链接
/**
* @param MwApi\MediawikiApi $mwApi
* @param string[] $projectTypes The desired projects, e.g. [ "Wikipedia", "Wiktionary" ]
* @return string[] Project's ID as key, url string as value.
*/
function getProjectUrls( MwApi\MediawikiApi $mwApi, $projectTypes ) {
$urls = [];
// TODO: Could optimize this request with additional parameters:
$siteMatrix = $mwApi->postRequest( new \Mediawiki\Api\SimpleRequest( 'sitematrix' ) )[ 'sitematrix' ];
foreach( $siteMatrix as $key => $wmProjectsByLang ) {
if( !is_numeric( $key ) ) {
continue; // not a project but meta info (e.g. "count")
}
foreach( $wmProjectsByLang[ 'site' ] as $mwProject ) {
if( in_array( $mwProject[ 'sitename' ], $projectTypes ) ) {
$urls[ $mwProject[ 'dbname' ] ] = $mwProject[ 'url' ];
}
}
}
return $urls;
}
/**
* @param SiteLink $siteLink
* @param array $sitesInfo
* @return null|string
*/
function buildSiteLinkUrl( SiteLink $siteLink, array $sitesInfo ) {
$siteId = $siteLink->getSiteId();
if( !array_key_exists( $siteId, $sitesInfo ) ) {
return null;
}
$baseUrl = $sitesInfo[ $siteId ];
$titlePart = urlencode( str_replace( ' ', '_', $siteLink->getPageName() ) );
return "$baseUrl/wiki/$titlePart";
}
$wikipediaSites = getProjectUrls( $api, [ 'Wikipedia' ] );
foreach( $itemSiteLinks as $siteLink ) {
$url = buildSiteLinkUrl( $siteLink, $wikipediaSites );
if( $url !== null ) {
echo "$url\n";
}
}
这应该可以做到,尽管第二部分有点粗糙,因为我们创建了一个关于如何构建wiki链接的假设。理论上可能有其他url模式,但据我所知,所有Wikimedia Wiki都遵循这个模式
无论如何,为了以一种完全安全的方式构建URL,sitematrix API模块返回的信息中应该有关于URL模式的信息,但没有