Fiddler自动保存HTTP请求
Posted 别宥之行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fiddler自动保存HTTP请求相关的知识,希望对你有一定的参考价值。
最近接手一个新项目的自动化测试,由于项目还处于前期不太稳定的阶段,考虑到性价比,所以先做了接口的自动化测试,但是,由于HTTP请求进行了定制的加密处理,与项目经理沟通无果,这无疑加大了我的工作量。其中很大一个工作量就是,大量的用Fiddler抓取请求和响应,再拿去解密,分析。为了偷懒,于是有了此文。
操作步骤
大致的步骤如下:
- Fiddler菜单 → Rules → Customize Rules
- 如果提示没有下载Fiddler ScriptEditor则按提示下载后进入下一步操作
- 安装好Fiddler ScriptEditor后,就能打开Customize Rules.js文件
- 编辑Customize Rules.js文件,并保存
- 重启fiddler
那么,重点就是如何修改这个js文件了。设置开关
在CustomRules.js文件发现了这样一段代码:
其实上面这段代码提供了菜单Rules → Hide 304s的开关控制功能,我们可以依葫芦画瓢,写上这么两行。public static RulesOption("Hide 304s")BindPref("fiddlerscript.rules.Hide304s")var m_Hide304s: boolean = false;
保存CustomRules.js后,马上会在Rules菜单下看到Data Storage选项,勾上后,变量m_DataStorage就设置为true,反之false。// Data Storagepublic static RulesOption("Data Storage")var m_DataStorage: boolean = false;
保存请求
把下面代码贴在OnBeforeRequest()方法末尾
这里我需要补充一下OpenTextFile方法:if (m_DataStorage){ //当开关打开时才生效 //过滤无关请求,只关注特定请求 if (oSession.fullUrl.Contains("rf-app")) { var fso; var file; fso = new ActiveXObject("Scripting.FileSystemObject"); //文件保存路径,可自定义 file = fso.OpenTextFile(dataPath+"request.txt",8 ,true, true); file.writeLine("Request url: " + oSession.url); file.writeLine("Request header:" + "\n" + oSession.oRequest.headers); file.writeLine("Request body: " + oSession.GetRequestBodyAsString()); file.writeLine("\n"); file.close(); } }
参数说明:object.OpenTextFile(filename[, iomode[, create[, format]]])
object:必选项。 object 应为 FileSystemObject 的名称。
filename:必选项。 指明要打开文件的字符串表达式。
iomode:可选项。 可以是三个常数之一: ForReading 、 ForWriting 或 ForAppending 。
create:可选项。 Boolean 值,指明当指定的 filename 不存在时是否创建新文件。 如果创建新文件则值为 True ,如果不创建则为 False 。 如果忽略,则不创建新文件。
format:可选项。 使用三态值中的一个来指明打开文件的格式。 如果忽略,那么文件将以 ASCII 格式打开。
其中:
iomode 参数可以是下列设置中的任一种:
ForReading 1 以只读方式打开文件。 不能写这个文件。
ForWriting 2 以写方式打开文件
ForAppending 8 打开文件并从文件末尾开始写。
我在此处直接写的8,意思就是在文件尾追加内容。
format 参数可以是下列设置中的任一种:
TristateTrue 以 Unicode 格式打开文件。
TristateFalse 以 ASCII 格式打开文件。
TristateUseDefault 使用系统默认值打开文件。
编码格式需要格外注意,我在用Java代码读出这些保存下来的txt文件时,会因为编码格式而报错,如果你的请求中没有中文,保存的时候可以考虑用ASCII的格式,UTF-8兼容ASCII码保存响应
把下面代码贴在OnBeforeResponse()方法末尾
说明:dataPath是我定义的全局变量,注意:要自己先在D盘创建fiddler的文件夹,否则会报错if (m_DataStorage){ //过滤无关请求,只关注特定请求 if (oSession.fullUrl.Contains("rf-app")) { oSession.utilDecodeResponse();//消除保存的请求可能存在乱码的情况 var fso; var file; fso = new ActiveXObject("Scripting.FileSystemObject"); //文件保存路径,可自定义 file = fso.OpenTextFile(dataPath+"reponse.txt",8 ,true, true); file.writeLine("Response code: " + oSession.responseCode); file.writeLine("Response body: " + oSession.GetResponseBodyAsString()); file.writeLine("\n"); file.close(); } }
//存储路径 static var dataPath: String = "D://fiddler//";
结果展示
数据处理
保存下来的文件内容是加密了的,还需要我再解密输出。
除了保存这些报文以外,还可以做点别的,比如看到好的图片想要自动保存等,Fiddler是一个挺强大的工具,感兴趣的可以深入研究一下。public class ReadFiddlerData { public static void main(String[] args) { String requestFile = "D:\\fiddler\\data.txt"; try { String s1 = null,data = null; JSONObject dataobj = new JSONObject(); BufferedReader rf = new BufferedReader(new InputStreamReader(new FileInputStream(requestFile),"UTF-8")); while ((s1 = rf.readLine()) != null) { if (s1.contains("=")){ data = ((s1.split("="))[1]).replace(" ", "");// System.out.println(data); System.out.println(MssUtil.decrypt(data)); }else if(s1.contains("\":\"")){ dataobj = JSONObject.fromObject(s1); data = dataobj.getString("data").replace(" ", "");// System.out.println(data); System.out.println(MssUtil.decrypt(data)); } Thread.sleep(1000); } } catch (Exception e) { e.printStackTrace(); } } }
以上是关于Fiddler自动保存HTTP请求的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Fiddler\其他应用程序自动拦截和修改 HTTP 请求参数?