使用mitmproxy导出捕获Web流量为JSON格式失败问题咨询
mitmproxy 导出捕获流量为JSON格式解决方案
操作问题根源
mitmproxy -w参数输出的是mitmproxy专属的二进制流格式,用于后续流量回放,本身就不是JSON格式,所以无论是否搭配jsondump脚本,只要加了-w参数生成的outfile都不会是JSON- 官方
jsondump.py脚本不支持和-w参数同时使用,且使用交互式mitmproxy运行脚本时,必须有实际流量经过代理才会触发写入,空跑不会生成文件内容,优先推荐使用非交互式的mitmdump运行脚本稳定性更高 - 新版mitmproxy(>=8.0)的配置参数传递优先级:命令行传参 > 配置文件参数,直接在config.yaml写
dump_destination可能出现脚本读取不到参数的情况
方案1:正确使用官方jsondump.py脚本
直接通过命令行传递参数,无需修改配置文件,执行以下命令即可:
mitmdump -s /pkg/mitmproxy/jsondump.py --set dump_destination=/tmp/mitmproxy.log.json
运行后所有经过代理的流量会自动以JSON Lines格式(每行一个JSON对象)写入目标路径。
方案2:使用自定义脚本实现可控的JSON导出
如果官方脚本无法正常运行,可以用极简自定义脚本实现,按需自定义导出字段:
- 新建
custom_json_dump.py文件,写入以下内容:
from mitmproxy import http import json import os class CustomJsonDumper: def __init__(self): # 可自行修改输出路径 self.dump_path = "/tmp/mitmproxy.log.json" if not os.path.exists(self.dump_path): with open(self.dump_path, "w", encoding="utf-8") as f: pass def response(self, flow: http.HTTPFlow) -> None: # 可根据需求增减字段,比如不需要body可以删除对应行 record = { "request": { "url": flow.request.url, "method": flow.request.method, "headers": dict(flow.request.headers), "body": flow.request.text, "timestamp": flow.request.timestamp_start }, "response": { "status_code": flow.response.status_code, "headers": dict(flow.response.headers), "body": flow.response.text, "timestamp": flow.response.timestamp_end } } # 追加写入JSON Lines格式 with open(self.dump_path, "a", encoding="utf-8") as f: f.write(json.dumps(record, ensure_ascii=False) + "\n") addons = [CustomJsonDumper()]
- 执行命令运行脚本:
mitmdump -s custom_json_dump.py
补充说明
如果需要输出标准JSON数组格式,可在流量捕获结束后用以下命令转换JSON Lines为标准JSON:
jq -s '.' /tmp/mitmproxy.log.json > /tmp/mitmproxy.standard.json
内容的提问来源于stack exchange,提问作者xpt
相关产品推荐
相关产品推荐

