用Python或cURL上传图片到Tumblr?

3
我正在从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'和“普通发布”方法上传文件。如果其中任何一种方法可行,我会很高兴的。
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可能会过度了吧。
谢谢!

不要要求我们请求-提供您的尝试。 - Jed Smith
好的。很抱歉一开始没有这样做。 - Cheesemold
1
Curl一行代码在我的电脑上可以工作:curl -v -F "email=myemail@server.com" -F "password=mypassword" -F "type=photo" -F "data=@C:\Dir\Photo.jpg" http://www.tumblr.com/api/write。如果不起作用,请编辑curl的详细输出。 - NorthGuard
@ NorthGuard:看起来它不再起作用了。我得到了“301永久移动”的错误。有人知道是仅仅URL已更改还是其他原因吗? - Kevin Whitefoot
2个回答

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

看起来你只是传入了一个文件对象.. 在那里加上.read()


太棒了!这个运作得非常好!我甚至可以剔除第三方库“urllib2_file”并且它可以正常工作。 我想我应该更多地了解一下open()函数的工作原理。 - Cheesemold
这里的read()方法很好。但是如果你想上传大于10MB的图片,那么可以看一下Python的multipart/form-data http://hoisie.com/2010/05/18/python-sending-a-multipartformdata-request-with-urllib2/和http://code.mythtv.org/doxygen/MultipartPostHandler_8py_source.html。 - DocWiki

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接