
Reqable是一款跨平台的专业 HTTP 抓包、调试和 API 测试工具,在全平台支持 HTTP1 和 HTTP2 协议,简单易用、功能强大、性能高效,助力程序开发和测试人员提高生产力!
Reqable 的特点是简洁美观,基本功能免费,无需登录,安装即用。
Reqable 桌面端支持 Windows/Mac/Linux 三大主流平台,具备抓包调试和 API 测试两大基本功能,可以将其看成是 Fiddler/Charles + Postman 。
Reqable支持使用 Python 脚本对 API 开发和调试进行辅助,今天写一篇实战教程,由浅入深地演示下如何使用 Reqable 的脚本功能。
首先,电脑上需要安装 Python 软件包。一般情况下,系统都会预安装 Python 软件包,如果系统没有安装或者希望使用其他版本,可以自行去Python 官网下载并安装。
Reqable 要求 Python 版本必须大于 v3.6 。
Reqable 会自动检测系统的 PATH 环境变量,如果已经将 Python 路径设置到系统 PATH 环境变量下面,那么就不需要在 Reqable 中额外配置 Python 环境了。Reqable 会默认使用 PATH 环境变量中的首个有效的 Python 程序(如果 PATH 中有多个 Python 路径的话)。在启用脚本功能(点击下图所示脚本图标)后,那么将会看到脚本的图标颜色为绿色;如果未检测到有效的 Python 环境,则脚本的图标颜色为黄色。
如果没有将 Python 路径设置到系统 PATH 环境变量中,又或者希望自行指定 Python 的环境路径。可以鼠标右键 脚本图标 -> 设置环境,自定义设置 Python 路径。
准备工作完成后,下面让我们开始 Reqable 的脚本实战之旅吧!
首先,按照业内习俗,我们先来一个简单Hello World熟悉下脚本的基本使用流程。
新建脚本有几种方式,比如鼠标右键 脚本图标 -> 新建脚本,或者使用快捷键 Shift + Alt + P,打开脚本编辑器窗口。
输入脚本名称,随便起,主要是为了方便管理。输入脚本作用的 URL ,URL 可以使用通配符*和?进行模糊匹配,表示这个脚本对匹配的 URL 生效。
下面是脚本的正文部分,Reqable 提供了一个简单的脚本模板,在逻辑不复杂的情况下,我们基于这个模板修改即可。
我们编写一个最简单的脚本,如下:
脚本的含义是每匹配到https://reqable.com的请求,都会在控制台输出Hello World,其他的什么都不做。
脚本编写完成了,下面开始脚本的运行。
第一步:启动 Reqable 的调试功能,首页右上角,点击启动。
由于脚本是挂载到https://reqable.com这个请求上面的,我们需要先有一个这样的请求。这个简单,我们可以在浏览器中打开这个链接。注意,由于我们需要拦截浏览器的请求,所以一定要启动系统代理,保证浏览器的流量经过 Reqable 。
** 为了避免浏览器缓存的影响,下面的操作都请在新建浏览器无痕窗口下进行!当然,您也可以在浏览器的开发者模式下禁用缓存。**
打开浏览器,输入地址https://reqable.com并回车,可以看到脚本控制台输出的Hello World:
说明这个脚本已经生效了!
下面我们会用到 Reqable 提供的 Python API 进行编程,建议阅读后面的内容时可以参照API 文档。
接下来,我们进行一个 cool 一点的脚本操作。比如,将https://reqable.com的响应替换成Hello World,这样我们在通过浏览器打开这个地址的时候,显示的不是 Reqable 的官网,而是Hello World文本。
我们可以使用 Reqable 提供的修改响应数据的 API 进行替换,一行代码即可:
编写完成后,<Shortcut>Control + S</Shortcut>保存我们修改的脚本,然后打开浏览器新开一个无痕窗口输入地址https://reqable.com并回车:
我们可以看到脚本已经生效了。
当然,除了替换成文本,我们还可以替换成图片,也是只需要一行代码:
这行代码的意思是将响应数据替换成本地电脑的一个 JPG 图片文件。同样的,浏览器新开一个无痕窗口输入地址https://reqable.com并回车:
可以看到数据已经被替换了,但是浏览器并没有显示出图片内容,这里涉及到一个Content-Type的问题。网站的数据格式一般情况下都是 html 文本格式,我们只修改了数据内容,但是没有修改Content-Type,所以浏览器把图片数据当成了文本进行显示了。如果需要正常显示图片,我们还需要修改下Content-Type。
再试一次,浏览器可以就正常显示图片了。
这一次,我们进行一个高级点的操作,不再是整体替换数据,而是局部修改数据。比如将https://reqable.com网站内容中的Reqable字样全部修改成Awesome,其他的不修改。
我们知道,一个网站是由很多个文件组成的,比如 html 、Javascript 、css 和资源文件等。我们并不知道Reqable出现在哪一个文件里面,所以我们需要用通配符*来匹配域名下所有的 URL 。同时根据数据格式进行响应的处理,比如跳过图片等资源文件,只处理文本数据。
实测一下,浏览器新开一个无痕窗口:
再看看脚本控制台的输出结果:
16:08:25.886: 正在替换: https://reqable.com/ 16:08:26.198: 正在替换: https://reqable.com/assets/js/main.6b2d94ba.js 16:08:26.379: 正在替换: https://reqable.com/assets/js/c4f5d8e4.10af3d6a.js 我们一次性修改了多个文件的内容。
Reqable 提供了丰富的 API ,可以帮助我们实现各种功能。
def onRequest(context, request): # 打印请求方法,例如:POST print(request.method) # 打印请求路径,例如:/foo print(request.path) # 打印请求参数列表,例如:[('foo', 'bar'), ('hello', 'world')] print(request.queries) # 打印请求头列表,例如:['host: reqable.com', 'content-length: 6', 'content-type: text/plain'] print(request.headers) # 打印请求体,例如 {"foo":"bar"} print(request.body) # 修改请求方法 request.method = 'GET' # 修改请求路径 request.path = '/bar' # 修改请求参数,更多 API 请参考下文`CaptureHttpQueries` request.queries['foo'] = 'bar' # 直接赋值请求参数 request.queries = 'foo=bar&hello=world&abc=123' request.queries = { 'foo': 'bar', 'hello': 'world', 'abc': '123' } # 删除指定请求参数 request.queries.remove('foo') # 修改请求头,更多 API 请参考下文`CaptureHttpHeaders` request.headers['content-type'] = 'application/json' # 直接赋值请求头 request.headers = [ 'content-type: application/json', 'foo: bar' ] # 删除指定请求头 request.headers.remove('foo') # 将文本设置给 Body request.body = 'Hello World' # 将字典设置给 Body ,会自动转成 JSON request.body = { 'foo': 'bar', 'abc': 123 } # 将二进制数据设置给 Body request.body = b'\x01\x02\x03\x04' # 将本地文件设置给 Body request.body.file('/User/Reqable/Desktop/test.png') # JSON 类型的 Body 转成字典 request.body.jsonify() # 然后操作字典来修改 Body request.body['foo'] = 'bar' request.body['error'] = { 'code': 1000, 'message': 'Runtime Error' } # Done return request 更详细的 API 文档,点击这里查阅。
前面已经讲完了脚本的常规使用步骤,实际上脚本除了可以对浏览器等应用程序的数据进行调试操作,还可以辅助我们进行 API 的开发和测试。
为了方便地进行 API 请求测试,Reqable 可以在无需启动调试模式并设置系统代理的情况下运行脚本。我们只需要在 API 请求的设置项中选择跟随调试即可。
点击 发送 按钮后,可以看到响应数据已经被脚本修改了。
下面举一个在日常开发和测试工作中非常有用的例子。
我们在生产 API 接口的时候,为了保证数据完整性,会对请求或者响应数据计算 Hash 值(签名),并存放到头部中。接收者可以对数据完整性进行校验,检查数据是否被篡改。虽然保证了安全性,但是对我们进行 API 调用或者测试带来了麻烦,因为每一次请求调用都去手动计算 Hash 值太费事了,这里我们可以使用 Reqable 的脚本自动计算请求的 Hash 值并添加到请求头中。
这个例子中我们使用MD5信息摘要算法对请求参数进行签名计算。当然,在实际生产过程中,我们不建议使用MD5进行签名,应当选用更加安全的算法,比如RSA-256等。这里,为了演示方便,还是采用经典的MD5算法。
假如我们有如下一个 API 请求,需要对请求参数( Query )进行 Hash 计算,这个请求示例如下:
前后端约定的签名规则这样的:
将请求参数按照名称的字母表进行排序,排序后使用&符号进行拼接,对拼接后的字符串进行 Md5 签名计算。以上图请求为例,需要对hello、reqable和name按照字母顺序进行排序,排序后按照顺序拼接,那么计算签名的字符串也就是hello=world&name=megatronking&reqable=awesome。
下面我们按照约定,编写一个排序+计算 Md5 的脚本:
# API Docs: https://reqable.com/docs/capture/script#api-addons from reqable import * import hashlib def onRequest(context, request): # 对 query 列表进行排序 queries = sorted(request.queries) # 拼接 query 数据 text = '&'.join(['='.join(query) for query in queries]) # 选用 md5 算法进行签名 algorithm = hashlib.md5() # 计算字符串的签名 algorithm.update(text.encode(encoding='UTF-8')) signature = algorithm.hexdigest() # 签名加到请求头中 request.headers['signature'] = signature # Done return request def onResponse(context, response): # Done return response 我们发送一次请求,然后可以在调试列表中检查签名是否正确添加了签名:
看起来已经自动添加了签名,如果不放心,还可以使用 Reqable 自带的 MD5 工具手动计算下签名值比对下:
嗯,一切很完美!
Reqable 还提供了非常多实用的功能,包括 API 测试、重发回放、代码生成等,最关键的是 Reqable 是可以免费使用的,下载即用,无需注册无需登录。
欢迎大家支持!