2017-03-06 14 views
0

Amazon S3でファイルのサイズを取得したいのですが、ダウンロードする必要はありません。 HTTPヘッダーを送信しようとしましたが、返される要求にはコンテンツ長のHTTPヘッダーが含まれます。403を取得するAmazon S3ファイルを要求していません

ここに私のコードです:

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 

エラーメッセージは次のとおりです。

403 Forbidden 

ので、URLに "%" をエスケープするために、私はurllib.unquoteを使用し、403は禁断の取得後、私は私はAmazonがブラウザによって要求されたように見えるファイルを返すだけかもしれないと思ったので、いくつかのヘッダーを試してみようと試みますが、私は403エラーを受け取り続けます。

これは、HTTPリクエストを正しく処理するための特定の引数を必要とするAmazonのケースですか、それとも自分のコードが悪いですか?

+1

あなたは余分な引用必要か?それもなくても403に戻りますか? – Scovetta

+0

あなたは何を参照していますか? – Peter

+0

申し訳ありませんが、私は 'urllib.unquote'を意味していました。 – Scovetta

答えて

0

Ok ....回避策を使用して解決策を見つけました。私の最高の推測では、curl/wgetはS3へのリクエストでhttpヘッダーが見つからないので、それらはすべて失敗し、ブラウザが動作します。要求の分析を開始しようとしましたが、要求を分析しませんでした。

は最終的に、それは次のコードで作業しました:

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

403禁止されていることは、認証問題を軽度に指摘しています。あなたのアクセスキーと署名は正しいですか?

疑問がある場合は、Boto3でメタデータを取得することができます。これはすべての認証情報を処理します(設定ファイルや渡されたデータから取得する)。ちょっと、もしうまくいけば、デバッグモードをオンにして実際にそれが送信しているものを見ることさえできます。

+0

URLからコードをコピーしてWebブラウザに貼り付けると、正常にダウンロードされます。 – Peter

+0

さて、私はそれを試みなければならないかもしれません。ありがとう – Peter

+0

'' curl'でコマンドラインにコピー・ペーストを試してください。これはウェブブラウザよりもはるかに少ないものです。 – pjz

関連する問題