Я пытаюсь получить разные 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 мог указать мне правильное направление 🙂
Я не работал с этой конкретной библиотекой раньше, но ее документация довольно проста, поэтому давайте пройдемся по этому вопросу вместе:
\Wikidata\Wikidata::entities()
возвращает Wikidata\Entity\Entity\EntityResponse
Wikidata\Entity\Entity\EntityResponse
имеет get()
метод, возвращающий массив Wikidata\Entity\Entity
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 но нет.
Других решений пока нет …