2010-07-16 13 views
3

Je travaille sur un projet qui consiste à télécharger une image sur tumblr à partir de Python. J'ai eu de la chance en utilisant l'API de Tumblr (http://www.tumblr.com/docs/en/api) en faisant des messages texte réguliers, mais les téléchargements d'images m'ont causé des problèmes. Les messages d'erreur renvoyés par le serveur se limitent à me dire qu'il y a eu une erreur de téléchargement de photo, ce qui a été moins qu'utile.Téléchargement d'images depuis Python ou cURL vers Tumblr?

Étant donné que leur API semble être basée sur l'utilisation des opérations HTTP POST standard, je sais qu'il doit y avoir un moyen de le faire. Malheureusement, je n'ai pas fait de progrès depuis quelques jours, et j'ai décidé de vous déranger à ce sujet.

J'ai essayé d'utiliser les bibliothèques curl et python: httplib, urllib, urllib2 et une bibliothèque tierce appelée urllib2_file (http://fabien.seisen.org/python/urllib2_file/). Je suis frustré de ne pas les avoir mis au travail, mais je suis prêt à essayer d'autres applications de terminaux supplémentaires. Chaque méthode fonctionne très bien avec des messages texte simples, mais chacun d'eux ne semble pas obtenir le téléchargement de la photo correctement.

Voici ma syntaxe pour le faire avec urllib2_file. Comme urllib2 ne supporte pas les méthodes 'multipart/form-data' pour télécharger des données, j'utilise urllib2_file pour ajouter cette fonctionnalité - mais je n'ai pas réussi à le faire fonctionner. L'API de tumblr indique que leurs serveurs acceptent les données multipart/form ainsi que la méthode de «post normal» pour télécharger des fichiers. Je serais heureux si l'un ou l'autre travaillait.

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" 

Ce serait la façon idéale si cela a fonctionné depuis l'utilisation des dictionnaires pour définir les champs est vraiment facile et je ne pouvais le faire paraître plus propre à l'avenir.

Tout conseil sur la façon de résoudre ce qui pourrait mal se passer serait apprécié. À ce stade, je ne sais pas comment apprendre ce qui pourrait mal se passer. Je voudrais avoir la capacité d'attention pour le RFC http.

J'ai envisagé de renifler les paquets entre mon ordinateur sur le serveur - mais le protocole HTTP inverse peut être trop lourd.

Merci!

+0

Ne nous demandez pas de le demander - offrez vos tentatives. –

+0

Assez juste. Désolé, je n'avais pas fait ça pour commencer. – Cheesemold

+1

Curl one liners fonctionne sur mon ordinateur: curl -v -F "[email protected]" -F "mot de passe = mypassword" -F "type = photo" -F "data = @ C: \ Dir \ Photo. jpg "http://www.tumblr.com/api/write Si cela ne fonctionne pas, éditez dans la sortie verbeuse de curl. – NorthGuard

Répondre

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

On dirait que vous êtes juste de passage dans un objet fichier .. ajouter un .read() il

+0

Génial! Cela fonctionne très bien! Je peux même découper la bibliothèque tierce 'urllib2_file' et cela fonctionne correctement. Je suppose que je devrais lire plus sur comment fonctionne la fonction open(). – Cheesemold

+0

La méthode read() est ici bonne. Mais si vous voulez télécharger des images plus grandes que 10 Mo, alors vous jetez un coup d'oeil au python multipart/form-data http: // hoisie.com/2010/05/18/python-envoi-a-multi-partformdata-request-avec-urllib2/et http://code.mythtv.org/doxygen/MultipartPostHandler_8py_source.html – DocWiki