用Python重放捕获的请求与浏览器结果不一致的问题排查
问题描述
尝试通过Python与目标表单交互,已通过Chrome开发者工具捕获浏览器的请求/响应,但用Python重放请求时,响应结果与浏览器不一致:
- 浏览器提交无效凭证时返回:
{"message":"Credenziali non valide","errorCode":"","success":false}(符合预期) - Python请求返回:
{'dataResult': ['<long alphanumeric code redacted>'], 'success': True}(固定长串,不符合预期)
捕获的浏览器请求详情
请求头
Accept: application/json, text/plain, */* Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryPvCnB4Ae6FtNAcnc Referer: https://referti.policlinicodiliegro.it/servizi/ sec-ch-ua: "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "macOS" User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36
请求负载
------WebKitFormBoundaryPvCnB4Ae6FtNAcnc Content-Disposition: form-data; name="serviceName" PortaleRefertoPublicService ------WebKitFormBoundaryPvCnB4Ae6FtNAcnc Content-Disposition: form-data; name="methodName" accessByPinSisWeb ------WebKitFormBoundaryPvCnB4Ae6FtNAcnc Content-Disposition: form-data; name="parametri" {"utente":"A","password":"B","pin":"C"} ------WebKitFormBoundaryPvCnB4Ae6FtNAcnc--
初始Python代码
import requests r = requests.post('https://referti.policlinicodiliegro.it/IasiSmartControl/sisweb/dataServiceLoad.action', files={ 'serviceName': 'PortaleRefertoPublicService', 'methodName': 'accessByPinSisWeb', 'parametri': '{"utente":"A","password":"B","pin":"C"}', }, headers={ 'Accept': 'application/json, text/plain, */*', 'Referer': 'https://referti.policlinicodiliegro.it/servizi/', 'sec-ch-ua': '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', }) print(r.json())
排查发现的关键差异
检查Python发送的请求体,发现每个form字段都被自动添加了filename属性,而浏览器的原生请求里没有这个字段:
--c960d72f4d302329b731d85ef4ee4b37 Content-Disposition: form-data; name="serviceName"; filename="serviceName" PortaleRefertoPublicService ...
解决方法
要去掉自动添加的filename,需要将files中的每个值改为元组(None, 值),这样requests就不会额外添加filename字段:
import requests r = requests.post('https://referti.policlinicodiliegro.it/IasiSmartControl/sisweb/dataServiceLoad.action', files={ 'serviceName': (None, 'PortaleRefertoPublicService'), 'methodName': (None, 'accessByPinSisWeb'), 'parametri': (None, '{"utente":"A","password":"B","pin":"C"}'), }, headers={ 'Accept': 'application/json, text/plain, */*', 'Referer': 'https://referti.policlinicodiliegro.it/servizi/', 'sec-ch-ua': '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', }) print(r.json())
补充说明
如果修改后仍有问题,可能存在其他检测机制:
- Cookie验证:浏览器请求前可能已获取会话Cookie,Python需要先访问目标页面获取Cookie再提交请求
- 前置请求验证:站点可能要求先发送OPTIONS预请求,或加载页面时的其他请求作为验证依据
- 动态生成参数:部分字段可能由页面JS动态生成(如签名、token),需要分析页面JS逻辑获取正确参数
内容的提问来源于stack exchange,提问作者fferri
相关产品推荐
相关产品推荐

