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

2023-09-01 11:37:59 +08:00
 MegatronKing

1. 前言

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

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

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 环境,则脚本的图标颜色为黄色。

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

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

2. 基本教程

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

2.1 新建脚本

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

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

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

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

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

2.2 运行脚本

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

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

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

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

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

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

3. 进阶教程

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

3.1 替换文本

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

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

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

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

3.2 替换图片

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

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

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

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

3.3 修改数据

这一次,我们进行一个高级点的操作,不再是整体替换数据,而是局部修改数据。比如将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 文档,点击这里查阅。

4. 终极教程

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

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

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

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

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

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

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

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

将请求参数按照名称的字母表进行排序,排序后使用&符号进行拼接,对拼接后的字符串进行 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

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

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

嗯,一切很完美!

5. 结尾

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

欢迎大家支持!

644 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/970039

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX