android 如何通过API从维基数据项中获取图像URL属性?

nnsrf1az  于 2022-12-28  发布在  Android
关注(0)|答案(3)|浏览(117)

我开发了一个Android应用程序,使用JSON Google图像搜索API来提供图像,但我注意到Google已经停止支持它。我还发现Wikidata有时会在一些项目上提供图像属性,但我似乎无法使用Wikidata API获得图像的URL位置。
有没有办法从维基数据中的条目获取图像URL属性?

9bfwbjaz

9bfwbjaz1#

如果某个维基数据项(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.extMD5 hashsum的第一个和第二个字符(所有空格都替换为_)。

**示例:**对于项目jaguar (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属性。

mtb9vblg

mtb9vblg2#

您可以从image属性(以下示例中的Sample.png)构建URL:

https://commons.wikimedia.org/w/index.php?title=Special:Redirect/file/Sample.png&width=300

请参阅维基共享资源的"Reusing content outside Wikimedia" documentation以了解更多细节。

s4n0splo

s4n0splo3#

这是一个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对用户代理头有点挑剔,所以下载时提供一个(根据https://meta.wikimedia.org/wiki/User-Agent_policy更改User-Agent字符串:

$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 );

相关问题