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

通过Proxyman可正常发送Post请求,Python调用却返回401

问题分析与调试方案

可能的原因

  • TLS/SSL握手参数不匹配:直接用Python发送请求时,TLS版本、加密套件和Proxyman代理后的请求不一致。部分API服务器会校验TLS配置,仅允许特定版本或套件的请求通过,而Proxyman代理会自动调整这些参数,使其符合服务器要求。
  • 请求头隐式差异:虽然手动指定了headers,但requests库会自动添加默认头(如Connection、Content-Length),或在无代理场景下修改部分头的取值。另外Accept-Encoding字段在直接请求时,实际生效的压缩方式可能和设置的不一致,导致服务器拒绝。
  • 服务器代理信任逻辑:部分API会验证请求是否来自可信代理环境,Proxyman的CONNECT请求建立的隧道会被服务器标记为可信来源,而直接请求的连接方式不在信任列表中,因此返回401。
  • 会话上下文差异:Proxyman终端可能保留了之前请求的Cookie或会话状态,而直接运行脚本是全新会话,导致身份校验失败(虽你说请求数据完全相同,但仍需排查此点)。

调试步骤

  1. 对齐TLS配置
    查看Proxyman中成功请求的TLS版本和加密套件,在Python中强制使用相同配置:

    import ssl
    import requests
    from requests.adapters import HTTPAdapter
    from urllib3.poolmanager import PoolManager
    
    class TLSAdapter(HTTPAdapter):
        def init_poolmanager(self, *args, **kwargs):
            ctx = ssl.create_default_context()
            # 替换为Proxyman中显示的加密套件
            ctx.set_ciphers('ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256')
            # 禁用服务器不支持的旧TLS版本
            ctx.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1
            kwargs['ssl_context'] = ctx
            return super().init_poolmanager(*args, **kwargs)
    
    session = requests.Session()
    session.mount('https://', TLSAdapter())
    response = session.post(
        url="https://auth.site.com/v2/users/sessions",
        headers=headers,
        json=data
    )
    
  2. 消除请求头隐式差异
    清空requests默认头,完全手动匹配Proxyman中的所有请求头字段:

    session = requests.Session()
    session.headers.clear()
    # 确保headers包含Proxyman中显示的所有字段,包括Connection、Content-Length等
    session.headers.update(headers)
    response = session.post(
        url="https://auth.site.com/v2/users/sessions",
        json=data
    )
    
  3. 通过Proxyman代理Python请求
    将Python请求通过Proxyman代理,验证是否能正常工作,同时对比代理前后的请求细节:

    proxies = {
        'http': 'http://127.0.0.1:9090',
        'https': 'http://127.0.0.1:9090'
    }
    response = requests.post(
        url="https://auth.site.com/v2/users/sessions",
        headers=headers,
        json=data,
        proxies=proxies,
        verify=False  # 忽略Proxyman自签证书的校验
    )
    

    如果此方式能成功,说明问题出在直接请求的连接参数上,可进一步抓包对比差异。

  4. 抓包对比完整流量
    用Wireshark抓取两种场景下的完整流量:直接运行Python脚本的流量、Proxyman终端运行脚本的流量。重点对比TLS握手过程、请求头的二进制内容、请求体编码细节,排查是否存在细微差异(如换行符、空格、编码格式)。

  5. 验证会话上下文
    在Proxyman中清空所有会话Cookie后,再通过Proxyman终端运行脚本,看是否仍能成功。如果此时也返回401,说明之前的成功依赖于保留的会话信息,需调整脚本添加对应的Cookie或会话参数。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:55:20