V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MegatronKing
V2EX  ›  程序员

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

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

    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   ·   实用小工具   ·   1439 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:17 · PVG 01:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.