如何向Imgur的APIv3形成匿名请求

时间:2012-12-22 00:48:16

标签: python api upload imgur

前一段时间,我创建了一个python函数,它接受了一个图像的URL并将其传递给Imgur的API v2。由于我已被告知v2 API将被弃用,因此我尝试使用API​​ v3。

正如他们在Imgur API文档中所说:

  

[发送]带有client_id的授权标题以及您的请求[...]如果您想要匿名上传图像(图像不附加到帐户)也可以使用。这让我们知道哪个应用程序正在访问API。**

     

授权:客户ID YOURCLIENTID

我不清楚(特别是他们提出的斜体)是否表示标题应为{'Authorization': 'Client-ID ' + clientID}{'Authorization: Client-ID ': clientID}{'Authorization:', 'Client-ID ' + clientID},或其他一些变体......

无论哪种方式,我都试过,这就是我得到的(使用Python 2.7.3):

def sideLoad(imgURL):
    img = urllib.quote_plus(imgURL)
    req = urllib2.Request('https://api.imgur.com/3/image', 
                          urllib.urlencode([('image', img), 
                                            ('key', clientSecret)]))
    req.add_header('Authorization', 'Client-ID ' + clientID)
    response = urllib2.urlopen(req)
    return response.geturl()

在我看来,这就像Imgur要我做的一切:我有正确的端点,将数据传递给urllib2.Request使它成为一个POST请求,根据Python文档,我传递的图像参数与表单编码的URL,我也尝试将它作为POST参数提供给我的客户机密码,因为我收到错误说我需要一个ID(即使没有提到我需要在相关文档中的任何地方使用我的客户机密码)。我添加了Authorization标头,它似乎是正确的形式,所以...为什么我收到错误400:错误的请求?

提问:如果我能看到Imgur返回的实际错误,我可能自己调试它,但由于它返回错误的HTTP状态,Python会死掉并给我一个令人作呕的堆栈跟踪。有什么方法可以让Python停止抱怨并给我一个我知道Imgur返回的错误消息JSON吗?

2 个答案:

答案 0 :(得分:5)

嗯,我会被诅咒。我尝试取出编码函数,然后直接形成字符串,然后让它工作。我想Imgur的API需要非格式编码的URL?

哦......还是因为我使用了两个 quote_plus()和url_encode(),将URL编码两次?这似乎更有可能......

这是我的工作解决方案,终于让我花了一天时间,当时我认为最多需要一个小时:

def sideLoad(imgURL):
    img = urllib.quote_plus(imgURL)
    req = urllib2.Request('https://api.imgur.com/3/image', 'image=' + img)
    req.add_header('Authorization', 'Client-ID ' + clientID)
    response = urllib2.urlopen(req)
    response = json.loads(response.read())
    return str(response[u'data'][u'link'])

这不是最终版本,请注意,它仍然缺少一些测试(我会看看我是否可以摆脱quote_plus(),或者是否可能更喜欢单独使用url_encode)以及错误处理(特别是对于大GIF,最常见的失败案例。)

我希望这有帮助!我搜遍了谷歌,Imgur和Stack Overflow以及关于匿名使用API​​v3的信息令人困惑(并淹没在一个完全可怕的OAuth2之中)。

答案 1 :(得分:0)

在使用urllib的python 3.4中,我能够这样做:

import urllib.request
import json

opener = urllib.request.build_opener()
opener.addheaders = [("Authorization", "Client-ID"+ yourClientId)]
jsonStr = opener.open("https://api.imgur.com/3/image/"+pictureId).read().decode("utf-8")
jsonObj = json.loads(jsonStr)
#jsonObj is a python dictionary of the imgur json response.