Как получить свойство URL изображения из элемента Wikidata через API?
Я создал приложение для Android, которое использует API поиска изображений JSON Google для предоставления изображений, но я заметил, что Google прекратил его поддерживать. Я также обнаружил, что Wikidata иногда предоставляет свойство изображения для некоторых элементов, однако я не могу получить URL-адрес изображения с помощью API Wikidata.
Есть ли способ получить свойство URL изображения из элементов в Викиданных?
4 ответа
Если какой-то элемент Wikidata (с идентификатором: Qxxx) имеет свойство image (P18), вы можете получить к нему доступ через API MediaWiki:
https://www.wikidata.org/w/api.php?action=wbgetclaims&entity=Qxxx&property=P18
Ответ будет включать в себя:
"claims": {
"P18": [{ "mainsnak": { "datavalue": { "value": "img_name.ext" }}}]
}
где img_name.ext - имя искомого изображения (все пробелы должны быть заменены на _
).
Окончательный URL изображения будет: https://upload.wikimedia.org/wikipedia/commons/a/ab/img_name.ext
где a и b - первый и второй символы md5sum из img_name.ext.
Например, для элемента jaguar (Q35694) API вернет имя изображения " Junior-Jaguar-Belize-Zoo.jpg ", которое имеет md5sum: 21 3b31ec141dafebe457e49bcd7f9329, поэтому a = 2 и b = 1, или URL окончательного изображения будет: https://upload.wikimedia.org/wikipedia/commons/2/21/Junior-Jaguar-Belize-Zoo.jpg
Вы можете создавать URL-адреса из свойства изображения (
Sample.png
в следующем примере):
https://commons.wikimedia.org/w/index.php?title=Special:Redirect/file/Sample.png&width=300
Дополнительные сведения см. в документации Wikimedia Commons «Повторное использование контента вне Викимедиа» .
Мне потребовалось время, чтобы понять это. Хеш-сумма, о которой идет речь, не является значением в P18[0].mainsnak.hash.
Вам нужен хешсум ("Junior-Jaguar-Belize-Zoo.jpg"). Строка, являющаяся именем (после замены пробелов на "_". Это даст вам хэш-сумму 213B31EC141DAFEBE457E49BCD7F9329, которую вы можете использовать для определения URL-адреса.
Я использую эту функцию PHP для преобразования заданного имени файла изображения в URL-адрес для википедии:
function getWikimediaImageURL($aFilename) {
#-- Example: $aURLString = getWikimediaImageURL('Fortuna Düsseldorf.svg');
$aFilename = str_replace( ' ', '_', $aFilename);
$md5 = md5($aFilename);
return "https://upload.wikimedia.org/wikipedia/commons/" .
substr($md5,0,1) .
"/" .
substr($md5,0,2).
"/" .
urlencode($aFilename);
}
Commons немного придирчив к заголовку пользовательского агента. Поэтому предоставьте его при загрузке (измените строку User-Agent в соответствии с https://meta.wikimedia.org/wiki/User-Agent_policy):
$opts = [
"https" => [
"method" => "GET",
"header" => "User-Agent: oolBot/0.0 (https://example.org/coolbot/; coolbot@example.org) generic-library/0.0\r\n"
]
];
$context = stream_context_create($opts);
$content = file_get_contents( $pfad , false, $context );