2010-07-16 3 views
3

Я работаю над проектом, который включает загрузку изображения в tumblr из Python. Мне повезло с использованием API Tumblr (http://www.tumblr.com/docs/en/api) при регулярных текстовых сообщениях, но загрузка изображений давала мне проблемы. Сообщения об ошибках, полученные их серверами, были ограничены тем, что я просто сказал, что есть «Ошибка загрузки фото», которая была менее чем полезной.Загрузка изображения с Python или cURL в Tumblr?

Поскольку их 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-запрос может быть излишним.

Спасибо!

+0

Не просите нас просить его - предлагайте свои попытки. –

+0

Достаточно честный. Извините, что я не сделал этого для начала. – Cheesemold

+1

Curl один лайнер работает на моем компьютере: curl -v -F "[email protected]" -F "password = mypassword" -F "type = photo" -F "data = @ C: \ Dir \ Photo. jpg "http://www.tumblr.com/api/write Если это не сработает, отредактируйте в подробном выводе из curl. – NorthGuard

ответ

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

Похоже, вы просто проездом в объект файла .. добавить .read() там

+0

Удивительный! Это отлично работает! Я даже могу вырезать стороннюю библиотеку «urllib2_file», и она работает правильно. Я думаю, я должен больше узнать о том, как работает функция open(). – Cheesemold

+0

Метод read() здесь хорош. Но если вы хотите загрузить изображения размером более 10 МБ, то вы посмотрите на python multipart/form-data http: // hoisie.com/2010/05/18/python-send-a-multipartformdata-request-with-urllib2/и http://code.mythtv.org/doxygen/MultipartPostHandler_8py_source.html – DocWiki

0

Tumblr имеет API v2, определенные для Python. Вы можете найти его на GitHub PyTumblr.

Я использовал его для создания основанного на терминале инструмента для использования tumblr, который называется teblr. Вы можете найти исходный код здесь: https://github.com/vijaykumarhackr/teblr/

Смежные вопросы