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 是可以免费使用的,下载即用,无需注册无需登录。
欢迎大家支持!