Получить URL-адреса страниц Википедии из идентификаторов WikiData

Я пытаюсь получить разные URL-адреса Википедии (то есть en.wikipedia.org/wiki/Page_Name) из идентификатора Википедии с помощью API.

Например, учитывая URL http://www.wikidata.org/wiki/Q7349 Я хочу получить ссылки на статьи Википедии на всех языках (en.wikipedia.org/wiki/Joseph_Haydn, es.wikipedia.org/wiki/Joseph_Haydn и т. Д.). Я использую банкомат https://github.com/freearhey/wikidata:

$wdAPI = new \Wikidata\Wikidata();
$resp = $wdAPI->entities('Q7349');

но тогда я не знаю, как получить URL-адреса WP от объекта, заданного entity (). Я полагаю, что это должно быть легкой задачей, но через несколько часов я все еще не могу понять, как это сделать, и я был бы очень признателен, если бы кто-то с предыдущим опытом использования WP API мог указать мне правильное направление 🙂

1

Решение

Я не работал с этой конкретной библиотекой раньше, но ее документация довольно проста, поэтому давайте пройдемся по этому вопросу вместе:

  1. \Wikidata\Wikidata::entities() возвращает Wikidata\Entity\Entity\EntityResponse

  2. Wikidata\Entity\Entity\EntityResponse имеет get() метод, возвращающий массив Wikidata\Entity\Entity

  3. Wikidata\Entity\Entity похоже, нет функции, возвращающей вам ссылки сайта на связанные страницы Википедии … тупик.

Исходя из этого, кажется, что эта библиотека не подходит (по состоянию на 14 августа 2015 года) для ваших нужд. Он реализует только основные данные объекта, в то время как в настоящее время только элементы содержат ссылки сайта. Эта библиотека также не использует модель данных, предложенную официальным wikibase/data-model библиотека. Его использование облегчит задачу, поскольку именно оно используется Wikibase, расширением MediaWiki, которое фактически является базовым программным обеспечением Wikidata. В этой библиотеке вы можете просто использовать Wikibase\DataModel\Entity\Item::getSiteLinkList() получить список ссылок на сайт (начиная с версии 0.4).

Альтернативная библиотека, которая использует библиотеку моделей данных, упомянутую выше, которая также используется, будет addwiki/wikibase-api.

Существует некоторая документация по репозиторию GitHub и еще немного документации по самой вики Wikidata («Wikidata: создание бота»).

Из примеров на этой странице вы можете получить основную идею, прочитав некоторую документацию по 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 будет содержать все сайт ссылается не только на сайты Википедии, но и на Викисловарь и другие. Кроме того, у нас пока нет URL-адресов. К сожалению, используемая библиотека не предлагает способ создания ссылок из коробки. Вместо этого нам нужно получить доступ к API wikidata напрямую, чтобы получить информацию обо всех сайтах, а затем создать ссылки из этой информации.

/**
* @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";
}
}

Это должно сработать, хотя вторая часть довольно хакерская, так как мы создали предположение о том, как создаются ссылки на вики. В теории могут быть и другие схемы URL, но, насколько я знаю, все вики Викимедиа следуют этой.

В любом случае, для создания URL-адресов совершенно безопасным способом, должна быть информация о схемах URL-адресов, представленная в информации, возвращаемой sitematrix Модуль API но нет.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]