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

如何识别请求所用语言?Python≥3.5调用API返回JSON异常原因排查

问题原因分析

该现象的核心是TLS握手指纹(JA3指纹)识别,和HTTP请求头、请求体内容没有关联:

  • Python 3.4版本内置的ssl模块默认支持的加密套件列表、套件排序、TLS扩展字段组合和Python 3.5+版本存在明显差异,两者的JA3指纹完全不同
  • 目标API的服务端部署了JA3指纹识别规则,识别到请求来自Python 3.5+的requests默认客户端指纹时,就会返回篡改后的假数据;匹配到Python3.4、Postman、JS、cURL的正常指纹时才返回真实数据
  • 自行搭建的Node.js服务只能抓取到HTTP层的内容,看不到传输层的TLS握手细节,所以会误以为两种请求完全一致
复现验证说明

提供的测试代码可以稳定复现问题:

# python version >= 3.5
import requests

url = {
    'url': 'https://apiauto.ru/1.0/offer/cars/1105235269-6558d30b',
    'headers': {
        'x-authorization': 'Vertis ios-62ca2575df9c74b3958d118afcbb7602',
    }
}

r = requests.get(**url)
print(r.json().get('offer').get('state').get('mileage'))
# 预期输出170000,Python≥3.5环境默认输出199000
修复方案

方案1:修改requests默认的SSL加密套件配置,模拟Python3.4的TLS特征

在初始化请求前调整ssl模块的默认加密套件顺序:

import requests
import ssl

# 替换为Python3.4默认的加密套件列表
ssl_context = ssl.create_default_context()
ssl_context.set_ciphers('DEFAULT:!DH')

adapter = requests.adapters.HTTPAdapter(
    ssl_context=ssl_context
)
session = requests.Session()
session.mount('https://', adapter)

url = {
    'url': 'https://apiauto.ru/1.0/offer/cars/1105235269-6558d30b',
    'headers': {
        'x-authorization': 'Vertis ios-62ca2575df9c74b3958d118afcbb7602',
    }
}

r = session.get(**url)
print(r.json().get('offer').get('state').get('mileage'))

方案2:使用支持JA3指纹模拟的第三方库curl_cffi,直接模拟cURL的指纹

直接调用模拟原生cURL的客户端,完美匹配正常请求的指纹:

from curl_cffi import requests

url = {
    'url': 'https://apiauto.ru/1.0/offer/cars/1105235269-6558d30b',
    'headers': {
        'x-authorization': 'Vertis ios-62ca2575df9c74b3958d118afcbb7602',
    }
}
# 可指定impersonate='curl7.68'匹配cURL指纹,也可模拟浏览器指纹
r = requests.get(**url, impersonate="chrome110")
print(r.json().get('offer').get('state').get('mileage'))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:18:03