Fiddler自动保存HTTP请求

Posted 别宥之行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fiddler自动保存HTTP请求相关的知识,希望对你有一定的参考价值。


最近接手一个新项目的自动化测试,由于项目还处于前期不太稳定的阶段,考虑到性价比,所以先做了接口的自动化测试,但是,由于HTTP请求进行了定制的加密处理,与项目经理沟通无果,这无疑加大了我的工作量。其中很大一个工作量就是,大量的用Fiddler抓取请求和响应,再拿去解密,分析。为了偷懒,于是有了此文。

操作步骤

大致的步骤如下:

  1. Fiddler菜单 → Rules → Customize Rules
  2. 如果提示没有下载Fiddler ScriptEditor则按提示下载后进入下一步操作
  3. 安装好Fiddler ScriptEditor后,就能打开Customize Rules.js文件
  4. 编辑Customize Rules.js文件,并保存
  5. 重启fiddler
    那么,重点就是如何修改这个js文件了。

    设置开关

    在CustomRules.js文件发现了这样一段代码:
    public static RulesOption("Hide 304s")BindPref("fiddlerscript.rules.Hide304s")var m_Hide304s: boolean = false;
    其实上面这段代码提供了菜单Rules → Hide 304s的开关控制功能,我们可以依葫芦画瓢,写上这么两行。
    // Data Storagepublic static RulesOption("Data Storage")var m_DataStorage: boolean = false;
    保存CustomRules.js后,马上会在Rules菜单下看到Data Storage选项,勾上后,变量m_DataStorage就设置为true,反之false。

    保存请求

    把下面代码贴在OnBeforeRequest()方法末尾
    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();
     }
    }
    这里我需要补充一下OpenTextFile方法:
    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()方法末尾
    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();
     }
    }
    说明:dataPath是我定义的全局变量,注意:要自己先在D盘创建fiddler的文件夹,否则会报错
    //存储路径    static var dataPath: String = "D://fiddler//";
    Fiddler自动保存HTTP请求

    结果展示


    数据处理

    保存下来的文件内容是加密了的,还需要我再解密输出。
    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是一个挺强大的工具,感兴趣的可以深入研究一下。