如何使用mitmproxy拦截并修改API返回的JSON响应体字段值
问题排查与解决方法
你之前的脚本存在几个核心错误:
- 第一个脚本错误引用了不存在的
data根键,也没有按数组结构取Tickets的元素,同时Python原生布尔值为大写False,你写的小写false会直接触发变量未定义报错 - 第二个脚本错误地将布尔值
false改为了字符串"false",和接口原本的布尔值类型不匹配,会导致业务侧校验不通过 - 你使用的精确URL匹配容错率极低,如果接口带查询参数、或者实际请求的URL和你写的不完全一致,匹配逻辑就不会触发
可用修改脚本
from mitmproxy import http import json def response(flow: http.HTTPFlow) -> None: # 改用包含匹配,只要URL包含接口路径就触发,避免参数、域名前缀差异导致匹配失败 if "example.com/api/v1/something" in flow.request.pretty_url: # 仅处理正常响应,避免修改异常返回 if flow.response.status_code != 200: return try: data = json.loads(flow.response.text) # 遍历所有Tickets下的对象,避免只修改第一个的问题 if "Tickets" in data and isinstance(data["Tickets"], list): for ticket in data["Tickets"]: if "ticketAvailable" in ticket: ticket["ticketAvailable"] = False # 写回修改后的数据 flow.response.text = json.dumps(data) # 清除原有Content-Length头,mitmproxy会自动重新计算长度,避免内容截断 flow.response.headers.pop("Content-Length", None) except: # 解析出错时不修改原响应,避免影响正常请求 pass
生效注意事项
- 运行脚本时执行命令:
mitmproxy -s 你的脚本文件名.py - 确保请求设备已经正确安装mitmproxy的根证书,且全量流量已经走mitmproxy代理
- 如果目标接口启用了HTTPS证书绑定,mitmproxy无法正常解密响应,脚本自然不会生效
内容的提问来源于stack exchange,提问作者riwejak558
相关产品推荐
相关产品推荐

