如何从Python或cURL向Tumblr上传图片?

3 投票
2 回答
1749 浏览
提问于 2025-04-16 01:24

我正在做一个项目,需要从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 个回答

0

Tumblr 为 Python 提供了一个叫做 API v2 的接口。你可以在 GitHub PyTumblr 上找到它。

我用这个接口创建了一个基于终端的工具,叫做 teblr。你可以在这里找到它的源代码:https://github.com/vijaykumarhackr/teblr/

2
                 'data': open('../data/media/pics/2009/05-14/100_1167.JPG'),

看起来你只是传入了一个文件对象……在那儿加上一个 .read() 命令吧。

撰写回答