I'm working on a project that involves uploading an image to tumblr from Python. I've had luck using Tumblr's API( http://www.tumblr.com/docs/en/api ) in doing regular text-posts, but image uploads have been giving me trouble. The error messages their server returns have been limited to just telling me that there was an "Error Uploading Photo", which has been less than helpful.
Since their API seems to be based in using standard HTTP POST operations, I know that there has to be a way to do this. Unfortunately, I haven't made any progress for a couple of days, and I've decided to resort to bothering you guys about it.
I have tried using curl, and python's libraries: httplib, urllib, urllib2, and a third party library called urllib2_file (http://fabien.seisen.org/python/urllib2_file/). I'm frustrated that I haven't gotten them to work-- but I'm willing to try other additional terminal apps you can come up with.
Each method works fine with simple text posts, but each one of them doesn't seem to get the photo uploading done properly.
Here's my syntax for doing it with urllib2_file. Since urllib2 doesn't support 'multipart/form-data' methods for uploading data, I'm using urllib2_file to add that functionality-- but I haven't been able to get it to work. The tumblr api says that their servers accept multipart/form-data as well as the 'normal post' method for uploading files. I'd be happy if either worked.
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"
This would be the ideal way if it worked since using dictionaries to define the fields is really easy and I could make it look much cleaner in the future.
Any advice on how to troubleshoot what could be going wrong would be appreciated. At this point I don't know how to learn what could be going wrong. I wish I had the attention span for the http RFC.
I've been considering sniffing the packets between my computer at the server-- but reverse-engineering HTTP might be overkill.
Thanks!