如何从Python或cURL向Tumblr上传图片?
我正在做一个项目,需要从Python上传图片到Tumblr。我之前用Tumblr的API(http://www.tumblr.com/docs/en/api)成功地发布了一些普通的文字帖子,但上传图片时遇到了麻烦。服务器返回的错误信息仅仅告诉我“上传照片时出错”,这对我帮助不大。
因为他们的API似乎是基于标准的HTTP POST操作,所以我知道一定有办法做到这一点。不幸的是,我已经几天没有进展了,决定来请教你们。
我尝试过使用curl,还有Python的库:httplib、urllib、urllib2,以及一个叫做urllib2_file的第三方库(http://fabien.seisen.org/python/urllib2_file/)。我很沮丧,因为这些都没有成功——但我愿意尝试你们能想到的其他终端应用。
每种方法在处理简单的文字帖子时都没问题,但在上传照片时似乎都不太行。
这是我用urllib2_file上传图片的代码。由于urllib2不支持“multipart/form-data”这种上传数据的方法,所以我使用urllib2_file来增加这个功能——但我一直没能让它工作。Tumblr的API说他们的服务器接受multipart/form-data和“普通POST”方法来上传文件。如果其中一种能成功,我就很开心了。
import urllib, urllib2, urllib2_file
url = "http://www.tumblr.com/api/write"
values1 = { 'email':'EMAIL',
'password':'PASSWORD',
'type':'regular',
'title':'Pythons urllib2',
'body':'its pretty nice. Not sure how to make it upload stuff yet, though. Still getting some "error uploading photo" errors... So unhelpful.'}
values2 = { 'email':'EMAIL',
'password':'PASSWORD',
'type':'photo',
'data': open('../data/media/pics/2009/05-14/100_1167.JPG'),
'caption':'Caption'}
data = urllib.urlencode(values2)
print "just before defining the request"
req = urllib2.Request(url,data)
print "just before doing the urlopen."
#response = urllib2.urlopen(req)
try:
response = urllib2.urlopen(req)
except urllib2.URLError, e:
print e.code
print e.read()
print "figure out how to handle .read() properly"
#the_page = response.read()
#print the_page
print "done"
如果这个方法能成功,那就太理想了,因为用字典来定义字段非常简单,将来我可以让代码看起来更整洁。
如果你们能给我一些关于如何排查问题的建议,我将非常感激。现在我不知道怎么找出问题出在哪里。我希望我能有耐心去研究HTTP的RFC。
我考虑过在我的电脑和服务器之间嗅探数据包——但反向工程HTTP可能有点过头了。
谢谢!
2 个回答
Tumblr 为 Python 提供了一个叫做 API v2 的接口。你可以在 GitHub PyTumblr 上找到它。
我用这个接口创建了一个基于终端的工具,叫做 teblr。你可以在这里找到它的源代码:https://github.com/vijaykumarhackr/teblr/
'data': open('../data/media/pics/2009/05-14/100_1167.JPG'),
看起来你只是传入了一个文件对象……在那儿加上一个 .read()
命令吧。