Curl可正常运行但Requests调用失败,求Bitbucket下载解决方案
解决Requests下载Bitbucket文件时的401未授权问题
首先咱们拆解下你遇到的问题:你的curl命令能正常下载,但Requests代码返回401,核心是两个关键细节没处理对:
问题1:多余的Content-Type请求头
你给GET请求加了headers={'Content-Type': 'application/json'},但这是下载文件的请求,完全不需要这个头。Bitbucket服务器收到这个不符合场景的请求头后,可能直接拒绝认证,返回401——而curl默认不会发送这类多余头,所以能正常工作。
问题2:跨域名重定向的认证逻辑(次要但需注意)
Requests默认只会把Basic Auth信息传递给同一域名的重定向目标。当Bitbucket把请求重定向到S3存储域名时,Requests不会自动带原认证信息,但好在Bitbucket返回的S3临时下载链接本身不需要认证,只要初始请求的认证正确,后续重定向就能正常完成。
修正后的Requests代码
import requests # 注意:确保这个URL和你curl命令里的完全一致(你原来的curl用的是api.bitbucket.org的2.0链接,要对应上) url = "https://api.bitbucket.org/2.0/repositories/EEEE/AAA/downloads/zip.zip" src = r"C:\1\1\SR131.zip" # 去掉多余的Content-Type头,用with语句自动管理文件更安全 respo = requests.get( url, stream=True, verify=False, auth=('你的用户名', '你的密码或Bitbucket App密码'), allow_redirects=True # 显式开启重定向,默认是True,写出来更清晰 ) if respo.status_code == requests.codes.ok: with open(src, "wb") as out: for block in respo.iter_content(1024): if not block: break out.write(block) print("文件下载成功!") else: print(f"无法下载文件:URL={url},状态码={respo.status_code},响应内容={respo.content.decode('utf-8')}")
额外注意事项
- URL一致性:你原来的curl用的是
api.bitbucket.org的2.0接口,但Requests代码里写的是bitbucket.org的用户仓库链接,这两个可能不是同一个资源,一定要确保URL完全匹配。 - Bitbucket认证建议:如果是Bitbucket Cloud,优先用App密码代替账号密码,它能更精细地控制权限,避免泄露主账号密码。
- SSL验证:
verify=False会跳过SSL证书验证,生产环境里不安全,建议配置正确的CA证书后去掉这个参数。
内容的提问来源于stack exchange,提问作者user9171937
相关产品推荐
相关产品推荐

