Fiddler应用之FiddlerScript

Fiddler应用之FiddlerScript

Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大的帮助。Fiddler提供的功能基本上能满足大部分人的基本要求。但是如果我们需要一些更复杂,更便捷的方式的功能来支持我们的工作(比如同时对多个指定的会话设置端点,不带cookie发起会话等),那么Fiddler提供的功能就往往力不从心了,或者使用起来比较复杂。Fiddler提供了Jscript脚本,让我们随心所欲的改造Fiddler,实现一些其他更强大的功能。本文主要介绍的是通过编写Fiddler的Jscript脚本的方法来实现Fiddler功能的拓展。

一、准备篇。

1,安装fiddler,http://fiddler2.com/get-fiddler。选择Fiddler2即可。

2,安装 FiddlerScript editor,

http://fiddler2.com/docs/default-source/public-downloads/FiddlerSyntaxSetup.exe

3,简单了解一下Jscript。JScript 是一种解释型的、基于对象的脚本语言。与javascript比较相似。

http://doc.51windows.net/jscript5/?url=/jscript5/dir.htm

二、

Main函数是在CustomRules.JS脚本被Fiddler调用时,最先执行的函数。在里面默认都有一个today变量,是获取时间的。在我们打开fiddler的时候,这下面就可以看到具体的内容。如下图:

Fiddler的状态栏会提示,CustomRules.js脚本被重新加载的时间。当每次CustomRules.js文件被更新时,Fiddler感知CustomRules.js被修改,并重新加载一次。那么该状态栏也会进行展示。

另外,可以点击Fiddler的菜单栏,Tools=>Reset Script也可以触发fiddler重新加载一次CustomRules.js脚本。

如果我们需要对http请求的请求包和返回包进行修改,那么就可以在OnBeforeRequest和OnBeforeResponse两个函数中进行操作,添加相应的Jscript代码来实现。具体实例在后面介绍

3.fiddlerScript editor

点击fiddler的Rules=>Customize Rules,FiddlerScript editor工具就会自动的打开CustomRules.js文件。如果该文件是被其他编辑工具打开(如NotePad++),说明我们没有安装fiddlerScript Editor。那么我们需要按照安装一下该脚本编辑工具。

这里之所以推荐使用FiddlerScript editor进行脚本的修改,是因为当Fiddler处于打开状态时,该工具会对我们编辑的Jscript进行语法检查。另外,该编辑工具也会根据相应的对象提示属于该对象的函数或成员变量供我们选择。这些都会大大的提高我们的编程效率。

当然,如果我们的编程能力足够强。我们也可以使用NotePad++进行开发,然后保存编辑即可。不过一旦由于语法错误,Fiddler会在运行的时候直接崩溃掉。

接下来我们先认识一下fiddlerScript Editor。界面如下:

Main函数是在CustomRules.JS脚本被Fiddler调用时,最先执行的函数。在里面默认都有一个today变量,是获取时间的。在我们打开fiddler的时候,这下面就可以看到具体的内容。如下图:

Fiddler的状态栏会提示,CustomRules.js脚本被重新加载的时间。当每次CustomRules.js文件被更新时,Fiddler感知CustomRules.js被修改,并重新加载一次。那么该状态栏也会进行展示。

另外,可以点击Fiddler的菜单栏,Tools=>Reset Script也可以触发fiddler重新加载一次CustomRules.js脚本。

如果我们需要对http请求的请求包和返回包进行修改,那么就可以在OnBeforeRequest和OnBeforeResponse两个函数中进行操作,添加相应的Jscript代码来实现。具体实例在后面介绍

3.fiddlerScript editor

点击fiddler的Rules=>Customize Rules,FiddlerScript editor工具就会自动的打开CustomRules.js文件。如果该文件是被其他编辑工具打开(如NotePad++),说明我们没有安装fiddlerScript Editor。那么我们需要按照安装一下该脚本编辑工具。

这里之所以推荐使用FiddlerScript editor进行脚本的修改,是因为当Fiddler处于打开状态时,该工具会对我们编辑的Jscript进行语法检查。另外,该编辑工具也会根据相应的对象提示属于该对象的函数或成员变量供我们选择。这些都会大大的提高我们的编程效率。

当然,如果我们的编程能力足够强。我们也可以使用NotePad++进行开发,然后保存编辑即可。不过一旦由于语法错误,Fiddler会在运行的时候直接崩溃掉。

接下来我们先认识一下fiddlerScript Editor。界面如下:

如果没有右边的类视图,我们可以点击FiddlerScript Editor菜单栏View,然后勾选上Class Exploer。类视图对我们的脚本编写提供了极大的变量,因为我们不知道,也不可能记得Fiddler提供了哪些对象和函数供我们使用,那么我们可以在开发的过程中,类视图中查找相应的函数。

三、高级篇

1.增加HTTP会话的Server IP的显示。

如果我们的fiddler没有显示Server IP,那么我们使用Fiddler进行抓包的时候,就不知道该请求是从哪儿返回来的。Httpwatch是有显示server IP功能的,但是httpwatch只能用与IE浏览器。Fiddler确可以做到对任何程序发起的HTTP请求进行捕获(包括一些客户端程序)。

那么我们就可以在CustomRules.JS中添加如下代码即可。

//显示Server IP public static BindUIColumn("Server IP",60) function FillServerIpColumn1(oS:Session):String { return oS.m_hostIP; }

添加的位置在class Handlers中,如下图。

然后Ctrl+S或FiddlerScript Editor的File=>save进行保存。如果Fiddler是已经打开的话,我们会听到一声清脆的声音,表明编辑成功,没有语法错误。

就会发现有如下变化。增加了对http会话的服务器端的IP地址的显示。

提示点;

1,在输入以上代码过程中,可以对Session类型的oS对象弹出数据成员或函数成员,我们可以进行选择。在这里我们选择m_hostIP变量即可。

3,以上弹出的提示变量或函数。我们也可以在类视图中对应的类中找到。如Session类中,有如下变量及函数:

我们在实现一些功能之前,就可以到类视图中查找出我们想要的函数。

4,如果出现语法编辑错误,在保存时,会弹出错误提示框。如下,

提示框给出了出错的原因,我们只需根据相应的提示,进行修改即可。

5,可能我们在工作中临时增加了一些功能,对CustomRules.js文件进行了修改。但是在以后的fiddler使用过程中,不需要该功能。那么我们有两种方法解决:1,对CustomRules.js中增加的代码进行注释掉,2,删除掉fiddler按照目录下的CustomRules.js文件。然后重启Fiddler,Fiddler会采用最新版本的SampleRules.js生成该CustomRules.js文件。

我们可以采用以上类似的做法,增加如下代码,展示会话的请求方法。

public static BindUIColumn("Method", 60) function FillMethodColumn(oS: Session): String { return oS.RequestMethod; }

2,增加菜单栏

我们可以对Fiddler的菜单栏进行改造,添加一些自己常使用的功能。下面举一个简单的示例,在菜单栏中增加一些常访问的网站。

增加以下代码,可以在Fiddler的菜单栏进行编辑。

Fiddler.QuickLinkMenu("&Links") //QuickLinkItem("IE GeoLoc TestDrive", "http://ie.microsoft.com/testdrive/HTML5/Geolocation/Default.html") QuickLinkItem("FiddlerCore", "http://fiddler.wikidot.com/fiddlercore") QuickLinkItem("baidu","http://www.baidu.com") QuickLinkItem("易迅","http://www.yixun.com") public static function DoLinksMenu(sText: String, sAction: String) { Utilities.LaunchHyperlink(sAction); }

Utilities对象里全是一些很有用的静态函数。

在文件中CustomRules.js增加了上面的代码后,然后进行保存。就可以看到fiddler的变化。增加了我们自己定义的菜单栏。然后我们点击baidu,就会发现。浏览器会自动访问百度网站。

2,通过Jscript设置特定CGI的拦截。

与设置特色URL进行标注,特色字体显示类似。采用Fiddler脚本命令输入方式,需要在Fiddler重启后,重新输入相关命令。如果需要多条CGI进行拦截,就需要大量的命令。

下面通过JScript脚本的方式实现对多条CGI的拦截。

在函数OnBeforeRequest中,输入以下代码,可以对包括特色字符串的多条CGI进行拦截。

if(oSession.uriContains( "showcart/showcart" )||oSession.uriContains("mod=event&act=getjson")) { oSession["x-breakrequest"]=""; }

}

在官网上,通过oSession["ui-breakrequest"]="";进行请求或返回包的拦截,貌似不起作用,需要使用“x-breakrequest”标记。

5,操作会话内容。

1,保存会话内容到本地。

A,选中需要保存的会话,然后点击右键。选择save=>Resonse=>Response Body。就可以对选中的会话返回内容进行保存

B,方法二:下面介绍另一种使用Jscript对会话内容进行保存的方法,用Fiddler自带的保存会话内容函数。

在OnBeforeResponse中输入以下代码:

if(oSession.fullUrl.Contains("shoppingcart/addproduct")) { oSession. utilDecodeResponse();//如果保存的内容有乱码,加上这一句,对返回的内容进行解码处理。 oSession.SaveResponseBody ("E:\\Users\\lenovo\\Desktop\\fiddler\\addproductresponse.txt"); }

其中,utilDecodeResponse是对返回包的内容进行解码,常常http在传输之前会对传输的内容进行编码。如果没有这一句,保存到本地的内容会出现乱码的情况。

SaveResponseBody函数参数是文件名。

C,方法三,用Jscript脚本新建文件,并写入返回包内容到本地。

if(oSession.fullUrl.Contains("showcart")) { var ts,s; var fs= new ActiveXObject ("Scripting.FileSystemObject"); var ts=fs.OpenTextFile ("E:\\Users\\lenovo\\Desktop\\fiddler\\addproductresponse2.txt",2 , true); var s=oSession.GetResponseBodyAsString(); ts.Write(s); ts.Close(); } OpenTextFile函数的使用方法可以参考:

http://doc.51windows.net/jscript5/?url=/jscript5/dir.htm

以上方法任意一种都可以对返回包的内容进行保存。返回包保存的内容如下:

Fiddler的其他脚本命令可以参考http://fiddler2.com/documentation/KnowledgeBase/QuickExec

2,Jscript脚本

以上命令方式,只能一次性对包含一个特殊字符串的URL进行控制,也只能是字体变成粗体,命中的URL中也有大部分不是我们需要的。那么接下来介绍一种对多条CGI进行标注,且设置背景颜色以及字体颜色。

在CustomRules.JS文件中的OnBeforeRequest函数内(也可以在OnBeforeResponse内)输入以下代码:

if(oSession .uriContains( "showcart" )&&oSession.uriContains("buy.yixun.com")) { oSession["ui-bold"]="red"; oSession["ui-color"]="red"; oSession["ui-backcolor"]="green"; } if(oSession .uriContains( "mod=event" )&&oSession.uriContains("event.yixun.com")) { oSession["ui-bold"]="red";//粗体 oSession["ui-color"]="red";//字体颜色 oSession["ui-backcolor"]="green";//背景颜色 }

其中红色字体标注的字符串就是URL中包含的字符串。通过两个字符串对一个会话进行更加精确的描述。大大提高了命中的URL的准确性。

具体的效果如下,可以看到我们希望的两条CGI请求都给用特色的颜色标注出来了,更加显眼明了。另外,可以同时对多条CGI进行特殊颜色的显示。

4,对某条CGI设置断点

Fiddler比较强大的功能之一就是对http请求进行拦截,对request和response进行拦截。可以达到对请求包和返回包进行修改。

如上图,点击Fiddler的Rules=>Automatic Breakpoints=>Before Requests(After Responses)。那么我们就可以分别对所有的请求包或返回包进行拦截了。

但是我们往往需要拦截修改的是某一条重要的CGI,所以以上设置方式不是最理想的方式。

下面介绍两种方法,来设置对指定的CGI进行拦截。

1,通过脚本命令,设置拦截。

在Fiddler的命令输入框中,输入bpu URL(URL是我们需要拦截的CGI,或者是该CGI包含的部分字符串),我们就可以对请求包进行拦截。取消对该CGI的拦截,我们输入命令:bpu即可。

同理,我们在命令输入框中,输入bpafter URL,即可对CGI的返回包进行拦截。输入bpafter命令,就可以取消对该CGI的断点拦截。

以上bpu URL命令执行成功后,在Fiddler的状态栏会显示,具体是被设置端点的CGI。

然后就可以看到对包含showcart/showcart字符串的CGI进行端点。实现了对特定的一条CGI设置端点的功能。

2,通过Jscript设置特定CGI的拦截。

与设置特色URL进行标注,特色字体显示类似。采用Fiddler脚本命令输入方式,需要在Fiddler重启后,重新输入相关命令。如果需要多条CGI进行拦截,就需要大量的命令。

下面通过JScript脚本的方式实现对多条CGI的拦截。

在函数OnBeforeRequest中,输入以下代码,可以对包括特色字符串的多条CGI进行拦截。

if(oSession.uriContains( "showcart/showcart" )||oSession.uriContains("mod=event&act=getjson")) { oSession["x-breakrequest"]=""; }

}

在官网上,通过oSession["ui-breakrequest"]="";进行请求或返回包的拦截,貌似不起作用,需要使用“x-breakrequest”标记。

5,操作会话内容。

1,保存会话内容到本地。

A,选中需要保存的会话,然后点击右键。选择save=>Resonse=>Response Body。就可以对选中的会话返回内容进行保存

B,方法二:下面介绍另一种使用Jscript对会话内容进行保存的方法,用Fiddler自带的保存会话内容函数。

保存的会话文件,这样在Jscript读取出来才不会是乱码。

if(oSession.fullUrl.Contains("showcart")) { var fs,s,ts; fs=new ActiveXObject("Scripting.FileSystemObject"); ts=fs.OpenTextFile("E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponsebody.txt"); s = ts.ReadAll(); oSession.utilSetResponseBody(sss); ts.Close(); }

以上的方式即可读取本地文件内容作为返回包的body,这种方法稍微有点麻烦。不过能确保读取出来的中文没有乱码。

其他功能待续……………….

第一个参数是保存会话的文件,第二个参数是一个bool值,用户控制保存的返回内容是否包含respsonsebody。当第二个参数至是true时,指保存http返回包的头部

oSession.SaveResponse("E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponse.txt",true);

如果第二个参数是false时,则既有头部又有body。

//true,只有头部,false,既有头部又有body oSession.SaveResponse("E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponse.txt",false);

l如果保存的文件是本地某个文件夹,一定是“\\”,而不是“\”。

在Jscript中,“\”具有特殊的含义,主要用于一些特殊字符的转义。因此在使用的“\”也需要转义“\\”。

oSession. SaveResponse("F:\\fiddlertest\\fucengresponse.txt" ,false);

l如果是相对路径保存

oSession.SaveResponseBody ("./fucengBody.txt");

则保存地方是安装的fiddler目录中。

loSession.SaveSession函数。该函数也有两个参数,第一个是文件名,第二个是bool值。

//false既有请求包,又有返回包。true,只有请求包、返回包的头部 oSession.SaveSession("E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponse.txt",true);

True只有请求包以及返回包的头部。False既有请求包,又有返回包(头部及body)

从以上可以看出,各种保存的文件内容按照大小顺序为:session>=response>=responsebody

2,对http请求自动应答。

A,自动应答方法一,Fiddler自带的AutoResponder。在会话列表中选中需要自动应答的会话,拖到到右边的AutoResponder中,按照下图进行操作。

然后在AutoResponder选中该CGI,然后右键,选择Edit Response。

然后在TextView中,对返回内容进行编辑。进行保存后,重新访问需要自动应答的CGI,那么该CGI自动应答就是我们刚才编辑的返回包。

以上方法有一个缺点是,必须是Rule Editor中的EXACT的URL和会话中的URL完全匹配。或者是通过正则表达式的方式进行匹配。才能是需要的CGI进行自动应答。但是对于一些重要的CGI,常常带有gtk参数,该参数经常变化,从而导致设置的自动应答的URL不匹配,那么就需要再一次进行编辑规则,比较麻烦。

在编辑完规则后,我们可以选中会话列表中的URL,然后与AutoResponder中的规则进行匹配测试。只有匹配测试通过的,才能自动应答。方法如下:

B,自动应答方法二,通过Jscript进行自动应答。

LoadResponseFromFile函数参数是自动应答内容的文件名。该文件的内容必须有HTTP返回包头部。如果自己构造比较困难,我们先可以通过

oSession.SaveResponse("E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponse.txt",false);

先在本地保存一份返回包内容,然后对返回包内容进行修改即可。

将以下代码放置在OnBeforeResponse中。

if(oSession.fullUrl.Contains("showcart")) { oSession.LoadResponseFromFile("E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponse.txt"); }

然后我们就可以看到效果。这种方法常用户对前端的测试。通过自己构造相应的返回包,对前端展示的设置。

C,自动应答方法三,Session的flag标志“x-replywithfile”。

OnBeforeResponse或OnBeforeRequest中

增加以下代码:

if(oSession.fullUrl.Contains("showcart")) { oSession["x-replywithfile"]="E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponse.txt"; }

x-replywithfile ---The value of this flag is the name of a file in the Captures/Responses folder (or a fully-qualified filename) containing a HTTP response to return to the client rather than sending the request to the server。

同样,文件中的内容也是有返回头部以及body的。

D,Jscript读取本地文件。

我们需要读取的文件从从Http返回包中获取,首先需要获取返回包内容,保存到本地,然后在本地修改该文件为我们需要的返回包内容。这样可以不需要注意返回包内容的格式,降低出错率。

通过以下代码获取返回包的内容:

//对返回包进行解码处理 oSession.utilDecodeResponse(); //oSession.SaveResponseBody("E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponsebody.txt") //对保存到本地的数据进行UTF8编码,否则读取出来的中文是乱码 var oBodyString = System.Text.Encoding.UTF8.GetString(oSession.ResponseBody); //var oBodyString="hh"; //写文件,保存会话内容 var fs,s,ts; fs=new ActiveXObject("Scripting.FileSystemObject"); ts=fs.OpenTextFile("E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponsebody.txt",2 , true); ts.Write(oBodyString); ts.Close();

保存的会话文件,这样在Jscript读取出来才不会是乱码。

if(oSession.fullUrl.Contains("showcart")) { var fs,s,ts; fs=new ActiveXObject("Scripting.FileSystemObject"); ts=fs.OpenTextFile("E:\\Users\\lenovo\\Desktop\\fiddler\\showcartresponsebody.txt"); s = ts.ReadAll(); oSession.utilSetResponseBody(sss); ts.Close(); }

以上的方式即可读取本地文件内容作为返回包的body,这种方法稍微有点麻烦。不过能确保读取出来的中文没有乱码。

其他功能待续……………….

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的Python

Scrapy分布式爬虫打造搜索引擎 -(二)伯乐在线爬取所有文章Python分布式爬虫打造搜索引擎

Python分布式爬虫打造搜索引擎 基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站 二、伯乐在线爬取所有文章 ...

4145
来自专栏carven

gulp尝试开发

这是挺久之前的事情了,还是觉得先记录下来,免得自己忘记了。 在实习的公司做web开发,gulp 是经常用到的,可是我做的不仅仅的前端,还包括后台, 所以将前端文...

1120
来自专栏Golang语言社区

深入学习Golang—channel

Channel 1. 概述 “网络,并发”是Go语言的两大feature。Go语言号称“互联网的C语言”,与使用传统的C语言相比,写一个Server所使用的代码...

4669
来自专栏京东技术

Flutter图片缓存 | Image.network源码分析

Android高级工程师,6年以上开发经验,有丰富的代码重构和架构设计经验,负责京东商城我的京东的开发工作,热衷于学习和研究新技术。

5672
来自专栏我和未来有约会

CaseStudy(showcase)数据篇-加载图片

做silvelight也有一段时间了,相册、游戏,刚刚完成的showcase这个小程序算是一个阶段了。这里就以showcase这个项目来做一下CaseStudy...

1849
来自专栏代码世界

AJAX

先了解JSON 什么是JSON? JSON 指的是JavaScript对象表示法(JavaScript Object Notation) JSON 是轻量级的文...

3437
来自专栏java架构师

解决ASP.NET中的各种乱码问题

经常发现有人被乱码困扰着,而我感觉比较幸运,很少为此烦恼过。 在这篇博客中,我将把我想到的一些与乱码有关的经验总结出来,供大家参考。 页面显示乱码问题 在一...

3166
来自专栏高性能服务器开发

libevent源码深度剖析十 支持I/O多路复用技术

(1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基本使...

911
来自专栏大内老A

了解ASP.NET MVC几种ActionResult的本质:FileResult

FileResult是一个基于文件的ActionResult,利用FileResult我们可以很容易地将从某个物理文件的内容响应给客户端。ASP.NET MVC...

18910
来自专栏Java 源码分析

SpringBoot 笔记 ( 二 ):自定义配置

SpringBoot 笔记 ( 二 ) 1. 配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固定的: application.propert...

3636

扫码关注云+社区