使用Fiddler抓包的时候,自动化、定制化的保存请求数据或响应数据是一个高频且刚需的需求。

实现过程

  1. 编写js脚本
  2. 获取响应数据
  3. 保存数据或处理数据

举一反三: 通过脚本可以实现多种功能,不仅仅是自动保存数据

设置脚本

Fiddler支持 自定义脚本来实现该功能,默认支持js脚本。
选择:Rules->Customize Rules..(规则-> 自定义规则)
也可以直接使用快捷键 Ctrl+R
image.png
这时会自动使用默认的文本编辑器打开Rules脚本文件。一般是Windows系统自带的txt软件,也可以自定义指定,我这里指定使用vscode软件。
设置过程如下:
image.png
image.png
这里就可以随意修改,增加你的自定义规则了。
脚本代码就是js语言。

保存Response

比如我这里做的:我抖音里关注了一千多个作者,设置fiddler抓包后,发现返回的是分页的json数据,我想让fiddler自动把这些json保存到磁盘文件。
修改脚本,找到 OnBeforeResponse 方法修改即可,修改后可能需要重启。
image.png

  1. static function OnBeforeResponse(oSession) {
  2. if (m_Hide304s && oSession.responseCode == 304) {
  3. oSession["ui-hide"] = "true";
  4. }
  5. //过滤:抖音关注接口
  6. if (oSession.fullUrl.Contains("https://api3-normal-c-lq.amemv.com/aweme/v1/user/following/list")){
  7. // 保存文件到本地
  8. var fso;
  9. var file;
  10. fso = new ActiveXObject("Scripting.FileSystemObject");
  11. // ActiveXObject.OpenTextFile()方法 必须是目录存在,需要提前建立文件目录
  12. file = fso.OpenTextFile("D:\\FiddlerData\\Sessions.txt",8 ,true, true);
  13. // oSession.GetResponseBodyAsString() 为获取相应的json数据
  14. file.writeLine(oSession.GetResponseBodyAsString());
  15. file.writeLine("\n");
  16. file.close();
  17. }
  18. }

抓取到数据如下:
image.png

记录下其他代码,方便拷贝:

保存数据并且发送给自己的某服务示例

  1. static function OnBeforeResponse(oSession: Session) {
  2. if (m_Hide304s && oSession.responseCode == 304) {
  3. oSession["ui-hide"] = "true";
  4. }
  5. // if (oSession.fullUrl.Contains("baidu.com")){
  6. if (1){
  7. oSession.utilDecodeResponse();//消除保存的请求可能存在乱码的情况
  8. var jsonString = oSession.GetResponseBodyAsString();
  9. var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(jsonString);
  10. if((responseJSON.JSONObject=='System.Collections.ArrayList' || responseJSON.JSONObject=='System.Collections.Hashtable')&&jsonString!='[]'&&jsonString!='{}'){
  11. // 判断是否是json数据 然后保存
  12. var str='{}';//构造自己的JSON http请求的信息及返回的结果
  13. var data = Fiddler.WebFormats.JSON.JsonDecode(str);
  14. data.JSONObject["request_method"] = oSession.RequestMethod;
  15. var requestString = oSession.GetRequestBodyAsString();
  16. data.JSONObject["request_body"]= requestString;
  17. data.JSONObject["response_data"] = responseJSON.JSONObject;
  18. data.JSONObject["url"] = oSession.fullUrl;
  19. data.JSONObject["response_code"] = oSession.responseCode;
  20. jsonString = Fiddler.WebFormats.JSON.JsonEncode(data.JSONObject)
  21. // 保存文件到本地
  22. var fso;
  23. var file;
  24. fso = new ActiveXObject("Scripting.FileSystemObject");
  25. file = fso.OpenTextFile("E:\\spider_img\\Sessions.dat",8 ,true, true);
  26. file.writeLine(jsonString);
  27. file.writeLine("\n");
  28. file.close();
  29. // 数据通过post请求发送自己的后台服务保存
  30. FiddlerObject.log('2222222222222222'+jsonString);
  31. // methods
  32. var method = "POST";
  33. var myUrl = 'http://localhost:8000/fiddler'
  34. var url = myUrl+'?data='+Utilities.UrlEncode(jsonString);
  35. var protocol = "HTTP/1.1";
  36. var raw="";
  37. var selected: Session = oSession;
  38. raw += method + " " + url + " " + protocol + "\r\n";
  39. raw +="Host:localhost:8000\r\n";
  40. raw +="Connection: keep-alive\r\n";
  41. raw +="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n";
  42. raw +="User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36\r\n";
  43. raw +="Accept-Encoding: gzip,deflate,sdch\r\n";
  44. raw +="Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
  45. raw +="Content-Type: application/json\r\n";
  46. var body= "jsondata=''";
  47. raw += "\r\n" + body;
  48. FiddlerObject.utilIssueRequest(raw);
  49. }
  50. }
  51. }

保存图片示例

  1. static function OnDone(oSession: Session) {
  2. //检查Content-Type
  3. if (oSession.ResponseHeaders["Content-Type"]!=null || oSession.ResponseHeaders["content-type"]!=null)
  4. {
  5. //避免不规范标头
  6. var contentType=oSession.ResponseHeaders["Content-Type"];
  7. if (String.IsNullOrEmpty(contentType) )
  8. contentType=oSession.ResponseHeaders["content-type"];
  9. //判定请求是否图片
  10. if (contentType.Contains("image"))
  11. {
  12. //确定文件名(保存用)
  13. var fileName="";
  14. var fileIndex = oSession.RequestHeaders.RequestPath.LastIndexOf ("/");
  15. if (fileIndex>0)
  16. fileName = oSession.RequestHeaders.RequestPath.Substring (fileIndex+1);
  17. //如果文件名非法(名称含非法字符)
  18. if(fileName.IndexOf('?')>0 || fileName.IndexOf('&') )
  19. fileName=String.Empty;
  20. //输出日志(在Fiddler 主窗口,日志处输出)
  21. //FiddlerObject.log("Content-Type:"+ contentType +" RequestPath:"+oSession.RequestHeaders.RequestPath);
  22. //如果文件名为Null,自行创建一个文件名(Guid)
  23. if (String.IsNullOrEmpty( fileName))
  24. {
  25. fileName=Guid.NewGuid().ToString();
  26. var extName= contentType.Replace("image/","");
  27. fileName=fileName+"."+extName;
  28. }
  29. //太小的图片不要,比如站位图片(自行调节)
  30. if (oSession.ResponseBody.Length>100)
  31. {
  32. //指定保存位置
  33. var saveDir="d:\\Temp\\";
  34. //不存在则创建文件夹
  35. if (!System.IO.Directory.Exists(saveDir))
  36. System.IO.Directory.CreateDirectory(saveDir);
  37. //保存响应流
  38. oSession.SaveResponseBody(saveDir+fileName);
  39. //写日志
  40. FiddlerObject.log("[文件保存]:"+fileName)
  41. }
  42. }
  43. }
  44. }

保存Request

理,也可以修改Request,把下面代码贴在OnBeforeRequest()方法末尾

  1. //过滤无关请求,只关注特定请求
  2. if (oSession.fullUrl.Contains("szhome.com"))
  3. {
  4. var fso;
  5. var file;
  6. fso = new ActiveXObject("Scripting.FileSystemObject");
  7. //文件保存路径,可自定义
  8. file = fso.OpenTextFile("D:\\Fiddler Sessions\\Sessions.txt",8 ,true, true);
  9. file.writeLine("Request url: " + oSession.url);
  10. file.writeLine("Request header:" + "\n" + oSession.oRequest.headers);
  11. file.writeLine("Request body: " + oSession.GetRequestBodyAsString());
  12. file.writeLine("\n");
  13. file.close();
  14. }

FiddlerScript 中的主要方法

你的FiddlerScript 文件中包含一个静态类Handlers,一般来说,你的代码应该写在这个类的静态方法中。
Fiddler 运行时会自动执行一些” Application event methods”:

static function OnBoot fiddler 启动时调用
static function OnShutdown fiddler关闭时调用
static function OnAttach fiddler注册成系统代理时调用
static function OnDetach fiddler 取消注册系统代理时调用
static function Main 在每次fiddler启动时和编译CustomRules.js 脚本时调用。


// 在这个方法中修改Request的内容, 我们用得最多
static function OnBeforeRequest(oSession: Session)
// 在这个方法中修改Response的内容
static function OnBeforeResponse(oSession: Session)
// 在个方法中包含Fiddler 命令,在Fiddler界面中左下方的QuickExec Box,如果你的脚本处理了指定的命令,则返回true,否则返回false.
static function OnExecAction(sParams: String[])

参考资料