Ich arbeite an einem Projekt, das Hochladen eines Bildes auf Tumblr von Python beinhaltet. Ich hatte Glück mit Tumblr's API( http://www.tumblr.com/docs/en/api ) bei normalen Text-Posts, aber das Hochladen von Bildern bereitet mir Probleme. Die Fehlermeldungen ihres Servers beschränken sich darauf, mir mitzuteilen, dass ein "Fehler beim Hochladen eines Fotos" aufgetreten ist, was nicht gerade hilfreich ist.
Da ihre API auf der Verwendung von Standard-HTTP-POST-Vorgängen zu basieren scheint, weiß ich, dass es eine Möglichkeit geben muss, dies zu tun. Leider habe ich seit ein paar Tagen keine Fortschritte gemacht, und ich habe beschlossen, euch damit zu belästigen.
Ich habe versucht, curl und die Python-Bibliotheken zu verwenden: httplib, urllib, urllib2 und eine Drittanbieter-Bibliothek namens urllib2_file ( http://fabien.seisen.org/python/urllib2_file/ ). Ich bin frustriert, dass ich sie nicht zum Laufen gebracht habe, aber ich bin bereit, andere zusätzliche Terminalanwendungen auszuprobieren, die Ihnen einfallen.
Jede Methode funktioniert gut mit einfachen Textbeiträgen, aber jede von ihnen scheint das Hochladen von Fotos nicht richtig hinzubekommen.
Hier ist meine Syntax, um dies mit urllib2_file zu tun. Da urllib2 keine "multipart/form-data"-Methoden zum Hochladen von Daten unterstützt, verwende ich urllib2_file, um diese Funktionalität hinzuzufügen - aber ich habe es nicht zum Laufen gebracht. Die tumblr api sagt, dass ihre Server sowohl multipart/form-data als auch die 'normal post'-Methode zum Hochladen von Dateien akzeptieren. Ich wäre froh, wenn beides funktionieren würde.
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"
Dies wäre der ideale Weg, wenn es funktioniert, da die Verwendung von Wörterbüchern zur Definition der Felder wirklich einfach ist und ich es in Zukunft viel sauberer gestalten könnte.
Für jeden Ratschlag zur Fehlersuche wäre ich dankbar. Zu diesem Zeitpunkt weiß ich nicht, wie ich herausfinden kann, was schief laufen könnte. Ich wünschte, ich hätte die Aufmerksamkeitsspanne für den http-RFC.
Ich habe darüber nachgedacht, die Pakete zwischen meinem Computer und dem Server abzuschnüffeln, aber ein Reverse-Engineering von HTTP könnte zu viel Aufwand sein.
Danke!