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

Python下载文件被识别为ASCII文本而非Zip包问题求助

问题分析与解决方案

你遇到的核心问题是:接口返回内容实际是文本(大概率是JSON格式的错误提示),而非预期的二进制Zip包——哪怕状态码显示200。以下是具体排查和解决方向:

1. 先确认响应内容到底是什么

别着急写入文件,先打印响应的文本内容,大概率能发现问题(比如权限验证失败、参数不匹配的JSON提示):

if response.status_code == 200:
    print("响应文本预览:", response.text[:500])  # 打印前500字符,看是否是错误信息
    # 再通过Content-Type判断是否为二进制文件
    if response.headers.get('Content-Type') in ['application/zip', 'application/octet-stream']:
        with open("linux-client-bundle.zip", "wb") as fd:
            for chunk in response.iter_content(chunk_size=1024):
                fd.write(chunk)
        print("文件下载成功")
    else:
        print("返回非二进制文件,Content-Type:", response.headers.get('Content-Type'))

2. 补充缺失的浏览器请求头

你当前的请求头只包含session和Accept-Encoding,但Chrome发起请求时会带更多关键头,至少要补上User-Agent(模拟浏览器身份),如果服务器校验来源,还需要加上Referer:

headers = {
    'session': api_token,
    'Accept-Encoding': 'gzip, deflate, br',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    # 对照Chrome抓包结果添加Referer(如果有):
    # 'Referer': 'abc.com/plugin/products/client-management/'
}

3. 关闭requests自动编码解码(可选)

requests会根据Accept-Encoding自动解码响应,若服务器编码处理有异常,可以直接读取原始字节:

import shutil

response = requests.post(url, headers=headers, verify=False, json=payload, stream=True)
response.raw.decode_content = False  # 关闭自动解码
with open("linux-client-bundle.zip", "wb") as fd:
    shutil.copyfileobj(response.raw, fd)

4. 再次核对Payload参数细节

即便你说和Chrome一致,也再检查一遍:比如枚举值大小写(CATEGORY_LINUX是否需要全小写?)、是否遗漏了Chrome请求里的隐藏参数(比如额外的字段、嵌套层级)。


内容的提问来源于stack exchange,提问作者vicky.charles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:42:12