Php 从WikiData ID获取Wikipedia页面的URL

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经验

我正在尝试使用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经验的人能为我指出正确的方向,我将不胜感激:

我以前没有使用过这个特定的库,但它的文档非常简单,让我们一起来看看:

\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模式的信息,但没有