如何获取需勾选额外对话框复选框的有效S3预签名下载链接——解决SAM.gov公开文件访问被拒问题
获取SAM.gov排除名单有效下载链接的解决方案
你遇到的核心问题是:SAM.gov要求用户确认隐私条款后,后端才会生成带AWS签名的临时下载链接——你当前拿到的只是原始S3对象路径,没有签名所以会返回"Access denied"。下面是模拟手动操作流程的Python实现方案:
核心思路
手动下载时的勾选同意框,本质是向SAM.gov的后端API发送了一个"确认同意"的请求,后端收到请求后会调用AWS生成带签名的临时URL。我们只需要用代码模拟这个请求流程即可:
- 维持会话状态(保留cookie,模拟用户会话)
- 获取最新文件的唯一标识(S3对象key)
- 发送同意条款请求,触发后端生成签名链接
- 解析响应拿到有效下载URL
完整代码实现
import json import requests from operator import itemgetter def get_signed_sam_exclusions_url(): # 初始化会话,自动处理cookie以维持会话状态 session = requests.Session() # 第一步:获取最新排除名单文件的基础信息 files_api_url = 'https://sam.gov/api/prod/fileextractservices/v1/api/listfiles?domain=Exclusions/Public%20V2&privacy=Public' file_list_resp = session.get(files_api_url) file_list_data = json.loads(file_list_resp.text) # 筛选SAM排除名单文件,按修改时间倒序取最新 target_files = [ file for file in file_list_data['_embedded']['customS3ObjectSummaryList'] if 'SAM_Exclus' in file['displayKey'] ] latest_file = sorted(target_files, key=itemgetter('dateModified'), reverse=True)[0] file_s3_key = latest_file['key'] # 这是S3对象的完整标识 # 第二步:发送同意条款请求,获取带AWS签名的下载链接 sign_api_url = 'https://sam.gov/api/prod/fileextractservices/v1/api/generateDownloadUrl' request_payload = { "key": file_s3_key, "acknowledged": True, # 模拟手动勾选同意框的操作 "domain": "Exclusions/Public V2", "privacy": "Public" } # 设置请求头为JSON格式,发送POST请求 request_headers = {'Content-Type': 'application/json'} sign_resp = session.post(sign_api_url, json=request_payload, headers=request_headers) sign_data = json.loads(sign_resp.text) # 返回最终的有效下载链接 return sign_data['url'] # 测试调用 if __name__ == "__main__": valid_download_url = get_signed_sam_exclusions_url() print("生成的有效下载链接:", valid_download_url)
关键细节说明
- 会话保持:使用
requests.Session()是核心,它会自动管理cookie,确保请求之间的会话一致性——SAM.gov会验证会话是否已确认隐私条款。 - 请求参数:
acknowledged: True对应手动勾选的同意复选框,后端只有收到这个参数才会生成带签名的临时URL。 - API稳定性:如果后续SAM.gov调整了
generateDownloadUrl接口路径,你可以通过浏览器开发者工具的Network面板,观察手动勾选同意时发送的POST请求来更新接口地址。
注意事项
- 生成的AWS签名链接有有效期(通常约1小时),获取后请尽快下载。
- 如果遇到403错误,可以在会话初始化后先GET一次
https://sam.gov主页,获取初始会话cookie后再执行后续步骤。 - 请控制请求频率,避免触发SAM.gov的API限流机制。
内容的提问来源于stack exchange,提问作者Gryu
相关产品推荐
相关产品推荐

