Reqable 脚本功能:快速对 API 进行数据模拟调试 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
MegatronKing
V2EX    程序员

Reqable 脚本功能:快速对 API 进行数据模拟调试

  •  
  •   MegatronKing 2023-09-01 11:37:59 +08:00 1263 次点击
    这是一个创建于 821 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1. 前言

    Reqable是一款跨平台的专业 HTTP 抓包、调试和 API 测试工具,在全平台支持 HTTP1 和 HTTP2 协议,简单易用、功能强大、性能高效,助力程序开发和测试人员提高生产力!

    Reqable 的特点是简洁美观,基本功能免费,无需登录,安装即用。

    • 20M 左右的安装包体积。
    • 跨平台,基于 Flutter 和 C++开发。
    • 支持亮色和暗色两种主题模式。
    • 支持 11 种不同的强调色。
    • 支持 Atom One 主题代码高亮配色。

    screenshot_zh_01.png

    Reqable 桌面端支持 Windows/Mac/Linux 三大主流平台,具备抓包调试和 API 测试两大基本功能,可以将其看成是 Fiddler/Charles + Postman 。

    Reqable支持使用 Python 脚本对 API 开发和调试进行辅助,今天写一篇实战教程,由浅入深地演示下如何使用 Reqable 的脚本功能。

    1. 准备工作

    首先,电脑上需要安装 Python 软件包。一般情况下,系统都会预安装 Python 软件包,如果系统没有安装或者希望使用其他版本,可以自行去Python 官网下载并安装。

    Reqable 要求 Python 版本必须大于 v3.6 。

    Reqable 会自动检测系统的 PATH 环境变量,如果已经将 Python 路径设置到系统 PATH 环境变量下面,那么就不需要在 Reqable 中额外配置 Python 环境了。Reqable 会默认使用 PATH 环境变量中的首个有效的 Python 程序(如果 PATH 中有多个 Python 路径的话)。在启用脚本功能(点击下图所示脚本图标)后,那么将会看到脚本的图标颜色为绿色;如果未检测到有效的 Python 环境,则脚本的图标颜色为黄色。

    screenshot_01.png

    如果没有将 Python 路径设置到系统 PATH 环境变量中,又或者希望自行指定 Python 的环境路径。可以鼠标右键 脚本图标 -> 设置环境,自定义设置 Python 路径。

    screenshot_02.png

    准备工作完成后,下面让我们开始 Reqable 的脚本实战之旅吧!

    2. 基本教程

    首先,按照业内习俗,我们先来一个简单Hello World熟悉下脚本的基本使用流程。

    2.1 新建脚本

    新建脚本有几种方式,比如鼠标右键 脚本图标 -> 新建脚本,或者使用快捷键 Shift + Alt + P,打开脚本编辑器窗口。

    screenshot_03.png

    输入脚本名称,随便起,主要是为了方便管理。输入脚本作用的 URL ,URL 可以使用通配符*?进行模糊匹配,表示这个脚本对匹配的 URL 生效。

    下面是脚本的正文部分,Reqable 提供了一个简单的脚本模板,在逻辑不复杂的情况下,我们基于这个模板修改即可。

    我们编写一个最简单的脚本,如下:

    screenshot_04.png

    脚本的含义是每匹配到https://reqable.com的请求,都会在控制台输出Hello World,其他的什么都不做。

    2.2 运行脚本

    脚本编写完成了,下面开始脚本的运行。

    第一步:启动 Reqable 的调试功能,首页右上角,点击启动

    screenshot_05.png

    由于脚本是挂载到https://reqable.com这个请求上面的,我们需要先有一个这样的请求。这个简单,我们可以在浏览器中打开这个链接。注意,由于我们需要拦截浏览器的请求,所以一定要启动系统代理,保证浏览器的流量经过 Reqable 。

    ** 为了避免浏览器缓存的影响,下面的操作都请在新建浏览器无痕窗口下进行!当然,您也可以在浏览器的开发者模式下禁用缓存。**

    打开浏览器,输入地址https://reqable.com并回车,可以看到脚本控制台输出的Hello World

    screenshot_06.png

    说明这个脚本已经生效了!

    3. 进阶教程

    下面我们会用到 Reqable 提供的 Python API 进行编程,建议阅读后面的内容时可以参照API 文档

    3.1 替换文本

    接下来,我们进行一个 cool 一点的脚本操作。比如,将https://reqable.com的响应替换成Hello World,这样我们在通过浏览器打开这个地址的时候,显示的不是 Reqable 的官网,而是Hello World文本。

    我们可以使用 Reqable 提供的修改响应数据的 API 进行替换,一行代码即可:

    screenshot_07.png

    编写完成后,<Shortcut>Control + S</Shortcut>保存我们修改的脚本,然后打开浏览器新开一个无痕窗口输入地址https://reqable.com并回车:

    screenshot_08.png

    我们可以看到脚本已经生效了。

    3.2 替换图片

    当然,除了替换成文本,我们还可以替换成图片,也是只需要一行代码:

    screenshot_09.png

    这行代码的意思是将响应数据替换成本地电脑的一个 JPG 图片文件。同样的,浏览器新开一个无痕窗口输入地址https://reqable.com并回车:

    screenshot_10.png

    可以看到数据已经被替换了,但是浏览器并没有显示出图片内容,这里涉及到一个Content-Type的问题。网站的数据格式一般情况下都是 html 文本格式,我们只修改了数据内容,但是没有修改Content-Type,所以浏览器把图片数据当成了文本进行显示了。如果需要正常显示图片,我们还需要修改下Content-Type

    screenshot_11.png

    再试一次,浏览器可以就正常显示图片了。

    screenshot_11.png

    3.3 修改数据

    这一次,我们进行一个高级点的操作,不再是整体替换数据,而是局部修改数据。比如将https://reqable.com网站内容中的Reqable字样全部修改成Awesome,其他的不修改。

    我们知道,一个网站是由很多个文件组成的,比如 html 、Javascript 、css 和资源文件等。我们并不知道Reqable出现在哪一个文件里面,所以我们需要用通配符*来匹配域名下所有的 URL 。同时根据数据格式进行响应的处理,比如跳过图片等资源文件,只处理文本数据。

    screenshot_13.png

    实测一下,浏览器新开一个无痕窗口:

    screenshot_14.png

    再看看脚本控制台的输出结果:

    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 文档,点击这里查阅。

    4. 终极教程

    前面已经讲完了脚本的常规使用步骤,实际上脚本除了可以对浏览器等应用程序的数据进行调试操作,还可以辅助我们进行 API 的开发和测试。

    为了方便地进行 API 请求测试,Reqable 可以在无需启动调试模式并设置系统代理的情况下运行脚本。我们只需要在 API 请求的设置项中选择跟随调试即可。

    screenshot_15.png

    点击 发送 按钮后,可以看到响应数据已经被脚本修改了。

    screenshot_16.png

    下面举一个在日常开发和测试工作中非常有用的例子。

    我们在生产 API 接口的时候,为了保证数据完整性,会对请求或者响应数据计算 Hash 值(签名),并存放到头部中。接收者可以对数据完整性进行校验,检查数据是否被篡改。虽然保证了安全性,但是对我们进行 API 调用或者测试带来了麻烦,因为每一次请求调用都去手动计算 Hash 值太费事了,这里我们可以使用 Reqable 的脚本自动计算请求的 Hash 值并添加到请求头中。

    这个例子中我们使用MD5信息摘要算法对请求参数进行签名计算。当然,在实际生产过程中,我们不建议使用MD5进行签名,应当选用更加安全的算法,比如RSA-256等。这里,为了演示方便,还是采用经典的MD5算法。

    假如我们有如下一个 API 请求,需要对请求参数( Query )进行 Hash 计算,这个请求示例如下:

    screenshot_17.png

    前后端约定的签名规则这样的:

    将请求参数按照名称的字母表进行排序,排序后使用&符号进行拼接,对拼接后的字符串进行 Md5 签名计算。以上图请求为例,需要对helloreqablename按照字母顺序进行排序,排序后按照顺序拼接,那么计算签名的字符串也就是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 

    我们发送一次请求,然后可以在调试列表中检查签名是否正确添加了签名:

    screenshot_19.png

    看起来已经自动添加了签名,如果不放心,还可以使用 Reqable 自带的 MD5 工具手动计算下签名值比对下:

    screenshot_20.png

    嗯,一切很完美!

    5. 结尾

    Reqable 还提供了非常多实用的功能,包括 API 测试、重发回放、代码生成等,最关键的是 Reqable 是可以免费使用的,下载即用,无需注册无需登录。

    欢迎大家支持!

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2505 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:38 PVG 12:38 LAX 20:38 JFK 23:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86