我制作了一个android应用程序,它使用JSON Google图像搜索API来提供图像,但我注意到Google已经停止支持它。我还发现Wikidata有时会在某些项目上提供图像属性,但我似乎无法使用Wikidata API获取图像的URL位置。
有什么方法可以从Wikidata中的项目中获取图像URL属性吗?
如果某些Wikidata项(ID:Qxxx)具有image(P18)属性,则可以通过MediaWiki API:访问该项
https://www.wikidata.org/w/api.php?action=wbgetclaims&property=P18&entity=Qxxx
响应将包括:
"claims": {
"P18": [{ "mainsnak": { "datavalue": { "value": "img_name.ext" }, "hash": ... }}]
}
其中img_name.ext是您要查找的图像的名称。
最终的图像URL将是:https://upload.wikimedia.org/wikipedia/commons/a/ab/img_name.ext
,其中a和b是img_name.ext的MD5哈希和的第一个和第二个字符(所有空格都被_
替换)。
示例:对于物品捷豹(Q35694),API将返回图像名称"Junior Jaguar Belize Zoo.jpg";,其具有MD5 hashsum("Junior-Jaguar-Belize-Zoo.jpg")
=213b31ec141dafebe457e49bcd7f9329
,因此a=2和b=1,或者最终图像URL将为:https://upload.wikimedia.org/wikipedia/commons/2/21/Junior-Jaguar-Belize-Zoo.jpg
注意:MD5散列和用于图像文件的名称,而不是JSON主体中包含的P18[0].mainsnak.hash
属性
您可以从image属性(以下示例中为Sample.png
)构建URL:
https://commons.wikimedia.org/w/index.php?title=Special:Redirect/file/Sample.png&width=300
参见Wikimedia Commons的";"重用维基媒体之外的内容";有关详细信息,请参阅文档。
我使用这个PHP函数将给定的图像文件名转换为wikipedia commons:的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对用户代理标头有点挑剔。因此,在下载时提供一个(根据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.0rn"
]
];
$context = stream_context_create($opts);
$content = file_get_contents( $pfad , false, $context );