Python调用Yandex OCR接口:无代理无响应,开Fiddler则正常
Yandex OCR接口直连无返回、经Fiddler可正常请求的原因分析
代理/IP路由差异
开启Fiddler后,requests会自动使用Fiddler作为代理,此时请求的出网IP、路由路径和直连时不同。Yandex的OCR接口可能对某些直连IP做了拦截(比如IP在黑名单、触发地域/频次限制),而通过Fiddler代理的IP不在限制范围内。
验证方法:手动给requests添加Fiddler代理,关闭Fiddler后运行代码测试:proxies = { 'http': 'http://127.0.0.1:8888', 'https': 'http://127.0.0.1:8888' } response = requests.post(url, headers=headers, files=files, verify=False, proxies=proxies)请求内容的隐式差异
Fiddler会自动调整请求细节,补全requests遗漏的关键信息:- 文件字段名错误:代码里的
fieldNameHere是占位符,实际Yandex接口要求的文件字段名可能是image或其他值。用Fiddler抓浏览器端上传请求,查看FormData里的文件字段名,替换掉这个占位符。 - 请求头顺序/细节差异:浏览器发送请求的头字段顺序和requests默认顺序可能不同,Yandex接口可能对头部顺序有校验。把Fiddler抓到的成功请求头部完全复制到代码中,覆盖现有headers再测试。
- 压缩处理差异:Fiddler会自动解压响应的压缩内容,而requests如果未正确处理
Accept-Encoding,可能无法解析返回数据,导致看似无有效返回。可以尝试去掉headers里的Accept-Encoding字段,或添加response.encoding = 'utf-8'后再打印响应。
- 文件字段名错误:代码里的
SSL/TLS协议兼容性问题
requests默认的SSL/TLS协议版本可能不被Yandex接口支持,而Fiddler作为中间人会重新协商兼容的协议版本(比如TLS 1.2)。手动指定requests使用的SSL版本验证:import ssl from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class TLS12Adapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1_2 ) session = requests.Session() session.mount('https://translate.yandex.net', TLS12Adapter()) response = session.post(url, headers=headers, files=files, verify=False) print(response.text)反爬机制拦截
Yandex接口可能通过请求指纹(比如Cookie、JS生成的参数)识别非浏览器请求。代码里的sid参数为空,这个参数可能是浏览器端JS生成的会话标识,直连时缺少会被拦截,而Fiddler转发时可能自动携带了浏览器的会话Cookie或补全了sid。从Fiddler抓包中复制有效的sid值和Cookie,添加到请求URL或headers里测试。
内容的提问来源于stack exchange,提问作者YagmiLite
相关产品推荐
相关产品推荐

