2017-03-06 7 views
0

Ich möchte die Größe einer Datei auf Amazon S3 abrufen, ohne sie herunterladen zu müssen. Mein Versuch war, zu versuchen, einen HTTP HEAD zu senden, und die zurückgelieferte Anforderung schließt Inhalt-Länge HTTP-Überschrift mit ein.403 Forbidden anfordern Amazon S3-Datei anfordern

Hier ist mein Code:

import httplib 
import urllib 
urlPATH = urllib.unquote("/ticket/fakefile.zip?AWSAccessKeyId=AKIAIX44POYZ6RD4KV2A&Expires=1495332764&Signature=swGAc7vqIkFbtrfXjTPmY3Jffew%3D") 

conn = httplib.HTTPConnection("cptl.s3.amazonaws.com") 
conn.request("HEAD", urlPATH, headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 
     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 
     'Accept-Encoding': 'none', 
     'Accept-Language': 'en-US,en;q=0.8', 
     'Connection': 'keep-alive'} 
) 
res = conn.getresponse() 
print res.status, res.reason 

Fehlermeldung ist:

403 Forbidden 

So das "%" in der URL zu entkommen, habe ich urllib.unquote und nach 403 Forbidden immer, ich Versuchen Sie auch, einige Header hinzuzufügen, da ich dachte, dass Amazon nur Dateien zurückgibt, die anscheinend von einem Browser angefordert werden, aber ich bekomme weiterhin 403 Fehler.

Ist dies ein Fall von Amazon benötigt bestimmte Argumente, um die HTTP-Anfrage richtig zu bedienen oder ist mein Code schlecht?

+1

Sind Sie sicher, dass Sie die zusätzliche Angabe benötigen? Gibt es 403 auch ohne das? – Scovetta

+0

Auf welche zusätzlichen Zitate beziehen Sie sich? – Peter

+0

Sorry, Tippfehler, ich meinte die 'urllib.unquote'. – Scovetta

Antwort

0

Ok .... Ich habe eine Lösung gefunden, indem Sie einen Workaround verwenden. Meine beste Vermutung ist, dass curl/wget HTTP-Header in der Anfrage an S3 fehlen, so dass sie alle fehlschlagen und der Browser funktioniert. Versucht, die Anfrage zu analysieren, hat dies aber nicht getan.

Letztlich wurde es mit dem folgenden Code arbeiten:

import urllib 
d = urllib.urlopen("S3URL") 
print d.info()['Content-Length'] 
0

403 Verboten zeigt mild auf ein Auth-Problem hin. Sind Sie sicher, dass Ihr Zugangsschlüssel und Ihre Signatur korrekt sind?

Wenn Zweifel bestehen, können Sie immer versuchen, die Metadaten über Boto3, die alle Auth-Zeug für Sie (ziehen von Konfigurationsdateien oder Daten, die Sie übergeben haben) behandeln. Verdammt, wenn es funktioniert, können Sie vielleicht sogar den Debug-Modus einschalten und sehen, was es tatsächlich sendet.

+0

Wenn ich die URL aus meinem Code in einen Webbrowser kopiere und einfüge, wird die Datei ordnungsgemäß heruntergeladen. – Peter

+0

Ok, ich muss das vielleicht versuchen. Danke – Peter

+0

versuchen Sie die Copy-Paste-Sache in eine Befehlszeile mit 'Curl' - es verbirgt sich viel weniger als ein Webbrowser. – pjz