从维基共享资源获取缩略图
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
我有一个来自维基共享资源的文件名,我想直接访问缩略图。
示例: 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