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

Azu*_*ash 6 python api upload imgur

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

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

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

授权:Client-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()
Run Code Online (Sandbox Code Playgroud)

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

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

Azu*_*ash 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'])
Run Code Online (Sandbox Code Playgroud)

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

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