获取403 Forbidden请求Amazon S3文件

时间:2017-03-06 05:34:03

标签: python

我想在Amazon S3上获取文件大小而无需下载。我的尝试是尝试发送HTTP HEAD,返回的请求将包含内容长度的HTTP标头。

这是我的代码:

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 Forbidden之后,我还尝试添加一些标题,因为我认为亚马逊可能只返回看似请求的文件一个浏览器,但我继续得到403错误。

这是亚马逊需要特定参数来正确提供HTTP请求还是我的代码不好的情况?

2 个答案:

答案 0 :(得分:0)

403 Forbidden温和地指出了一个身份验证问题。您确定您的访问密钥和签名是否正确?

如果有疑问,您可以随时尝试通过Boto3获取元数据,{{3}}可以为您处理所有身份验证内容(从配置文件或您传入的数据中提取)。哎呀,如果它有效,你甚至可以打开调试模式,看看它实际发送的是什么。

答案 1 :(得分:0)

好的....我通过使用变通方法找到了解决方案。我最好的猜测是curl / wget在S3的请求中缺少http标头,因此它们全都失败并且浏览器正常工作。试图开始分析请求,但没有。

最终,让它使用以下代码:

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