从维基共享资源获取缩略图

get Thumbnail image from wikimedia commons

我有一个来自维基共享资源的文件名,我想直接访问缩略图。

示例: Tour_Eiffel_Wikimedia_Commons.jpg

我找到了一种方法,可以将包含 url 的 json 数据获取到我想要的缩略图:

https://en.wikipedia.org/w/api.php?action=query&titles=Image:Tour_Eiffel_Wikimedia_Commons.jpg&prop=imageinfo&iiprop=url&iiurlwidth=200

但我不想要另一个请求。有没有办法直接访问缩略图?

如果您可以相信当前构建 URL 的方式将来不会改变(这不能保证),那么您可以这样做。

URL 看起来像这样:

https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Tour_Eiffel_Wikimedia_Commons.jpg/200px-Tour_Eiffel_Wikimedia_Commons.jpg

  • 第一部分始终相同:https://upload.wikimedia.org/wikipedia/commons/thumb
  • 第二部分是文件名的 MD5 散列的第一个字符。在这种情况下,Tour_Eiffel_Wikimedia_Commons.jpg 的 MD5 散列是 a85d416ee427dfaee44b9248229a9cdd,所以我们得到 /a.
  • 第三部分是上面MD5散列的前两个字符:/a8.
  • 第四部分为文件名:/Tour_Eiffel_Wikimedia_Commons.jpg
  • 最后一部分是想要的缩略图宽度,文件名又是:/200px-Tour_Eiffel_Wikimedia_Commons.jpg

Python中的解决方案基于@svick的解决方案:

import hashlib
def get_wc_thumb(image, width=300): # image = e.g. from Wikidata, width in pixels
    image = image.replace(' ', '_') # need to replace spaces with underline 
    m = hashlib.md5()
    m.update(image.encode('utf-8'))
    d = m.hexdigest()
    return "https://upload.wikimedia.org/wikipedia/commons/thumb/"+d[0]+'/'+d[0:2]+'/'+image+'/'+str(width)+'px-'+image

如果有人在 SPARQL 而不是 Python 中执行此查询: SPARQL中有一个MD5函数,整个字符串操作也可以在SPARQL中实现!

  BIND(REPLACE(wikibase:decodeUri(STR(?image)), "http://commons.wikimedia.org/wiki/Special:FilePath/", "") as ?fileName) .
  BIND(REPLACE(?fileName, " ", "_") as ?safeFileName)
  BIND(MD5(?safeFileName) as ?fileNameMD5) .
  BIND(CONCAT("https://upload.wikimedia.org/wikipedia/commons/thumb/", SUBSTR(?fileNameMD5, 1, 1), "/", SUBSTR(?fileNameMD5, 1, 2), "/", ?safeFileName, "/650px-", ?safeFileName) as ?thumb)
 

运行 维基数据查询服务中的实时查询:here, as discussed here: https://discourse-mediawiki.wmflabs.org/t/accessing-a-commons-thumbnail-via-wikidata/499