You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取需勾选额外对话框复选框的有效S3预签名下载链接——解决SAM.gov公开文件访问被拒问题

获取SAM.gov排除名单有效下载链接的解决方案

你遇到的核心问题是:SAM.gov要求用户确认隐私条款后,后端才会生成带AWS签名的临时下载链接——你当前拿到的只是原始S3对象路径,没有签名所以会返回"Access denied"。下面是模拟手动操作流程的Python实现方案:

核心思路

手动下载时的勾选同意框,本质是向SAM.gov的后端API发送了一个"确认同意"的请求,后端收到请求后会调用AWS生成带签名的临时URL。我们只需要用代码模拟这个请求流程即可:

  1. 维持会话状态(保留cookie,模拟用户会话)
  2. 获取最新文件的唯一标识(S3对象key)
  3. 发送同意条款请求,触发后端生成签名链接
  4. 解析响应拿到有效下载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:12:34