从wikimedia commons获取缩略图

时间:2015-11-13 09:55:42

标签: thumbnails wikipedia-api

我确实有来自wikimedia commons的文件名,我想直接访问缩略图。

示例: Tour_Eiffel_Wikimedia_Commons.jpg

我找到了一种方法来获取包含我想要的缩略图的网址的json数据:

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

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

3 个答案:

答案 0 :(得分:5)

如果你可以依赖这样一个事实:当前建立网址的方式将来不会发生变化(这是不可保证的),那么你就可以做到。

网址如下所示:

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

答案 1 :(得分:1)

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

    public function filterOrderParams(\Enlight_Event_EventArgs $args)
    {
        $return = $args->getReturn();
        $return['invoice_shipping'] = ceil($return['invoice_shipping']);
        $return['invoice_shipping_net'] = ceil($return['invoice_shipping_net']);

        $subject->sShippingcostsNumeric = ceil($subject->sShippingcostsNumeric);
        $subject->sShippingcostsNumericNet = ceil($subject->sShippingcostsNumericNet);
        $args->setReturn($return);
    }

    public function afterGetOrder(\Enlight_Hook_HookArgs $args)
    {
        if (!$this->checkIfActive()) {
            return;
        }

        $return = $args->getReturn();
        $return['invoice_shipping'] = ceil($return['invoice_shipping']);
        $return['invoice_shipping_net'] = ceil($return['invoice_shipping_net']);

        $args->setReturn($return);
    }

在 Wikidata 的查询服务中运行此实时查询:here,如下所述:https://discourse-mediawiki.wmflabs.org/t/accessing-a-commons-thumbnail-via-wikidata/499

答案 2 :(得分:0)

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

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