当前位置:首页 > 休闲

fiddler 读取文件

Fiddler 抓包时最烦人的取文一件事,就是取文每次都得手动在 UI 里点开响应体,再复制到本地。取文尤其是取文调试接口返回的 JSON 或 XML,鼠标点得人想摔键盘。取文其实 Fiddler 早就给了个隐藏技能——直接用脚本把响应内容 dump 成文件,取文全程不用碰一次鼠标。取文

打开 Fiddler 的取文 FiddlerScript 标签页(快捷键 Ctrl+R),你会看到一段 OnBeforeResponse 函数。取文在它里面加几行代码,取文就能实现“每个响应都自动存盘”。取文我常用的取文写法是这样:

if (oSession.ResponseCode == 200) {  var path = "C:\\captures\\" + oSession.RequestMethod + "_" + oSession.id + "_" + System.DateTime.Now.ToString("HHmmss") + ".txt"; oSession.SaveResponseBody(path); }

这段代码的逻辑很直白:只要响应码是 200,就把响应体按“请求方法_会话ID_时间戳.txt”的取文命名方式存到指定目录。你可能会问,取文为什么不直接存成 JSON 后缀?取文因为有些接口会返回纯文本或图片,统一存成 txt 反而安全,之后再用工具批量改后缀就行。

有个坑得提醒你——SaveResponseBody 方法只对已解码的响应生效。如果服务器返回的是 gzip 压缩内容,脚本里得先加一句 oSession.Unzip()。我最初没加这行,存下来的文件全是乱码,排查了半天才发现是压缩没解。加完之后世界清净了。

更进阶的玩法是配合 URL 过滤。比如只关心某个域名下的接口,可以在脚本里加个判断:

if (oSession.HostnameIs("api.example.com") && oSession.ResponseCode == 200) {  // 存盘逻辑同上 }

这样就不会把静态资源(图片、CSS)也一起存下来,省得硬盘被垃圾填满。我调试支付回调时就这么干过,只抓指定回调地址的 POST 请求,存下来的文件直接丢给后端同事做联调,效率翻倍。

还有个小技巧——Fiddler 的 SaveResponseBody 默认覆盖同名文件。如果你连续请求同一个接口两次,第二次会把第一次的覆盖掉。想保留历史版本,就在文件名里加个毫秒级时间戳:

DateTime.Now.ToString("HHmmssfff")

末尾那个 fff 就是毫秒,实测连续点击十次也不会重名。

有人觉得写脚本麻烦,宁可手动导出。但手动操作有个致命缺陷——你没法在接口返回的瞬间立刻拿到数据。比如调试 WebSocket 推送或者轮询接口,响应一直在变,手动复制永远慢半拍。脚本自动存盘则能精确记录每一次响应,连响应时间都跟着文件名走,事后复盘时间线特别方便。

最后说个反直觉的细节:Fiddler 脚本修改后不用重启软件,直接点工具栏的 Save Script 按钮就生效。但要注意,如果你开了多个 Fiddler 实例(比如同时抓 HTTP 和 HTTPS),脚本只对当前激活的实例有效。别问我怎么知道的,我曾在两个实例间来回切换,存盘文件却只出现在一个目录里,愣是找了十分钟原因。

用文件系统当调试日志,虽然土,但比 Fiddler 自带的 Log 面板直观多了。至少你可以直接用 VS Code 打开目录,全局搜索关键字,或者用 diff 工具对比两次响应差异。这招我用了三年,至今没找到更顺手的替代方案。

分享到: