如何通过API从Wikidata项中获取图像URL属性



我制作了一个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,其中abimg_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 ); 

相关内容

  • 没有找到相关文章

最新更新