新一代国产 API 抓包调试工具 Reqable

2023 年 8 月 24 日
 MegatronKing

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

1. 介绍

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

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

Reqable 打通了 API 调试和测试之间的壁垒,例如可以从抓包数据中创建 API 进行测试,也可以在 API 测试时进行流量抓包分析。

2. 安装证书

Reqable 使用经典的中间人( MITM )技术分析 HTTPS 流量,当客户端与 Reqable 的代理服务器(下文简称中间人)进行通信时,中间人需要重签远程服务器的 SSL 证书。为了保证客户端与中间人成功进行 SSL 握手通信,需要将中间人的根证书(下文简称CA 根证书)安装到客户端本地的证书管理中心。

如果目标客户端是 PC 应用程序,CA 根证书需要安装到 PC 的证书管理中心;如果目标客户端是移动端 App 应用程序,CA 根证书则需要安装到手机的证书管理中心。如果没有流量分析的需求,可以忽略这一步。

Reqable 会为每个用户自动生成完全不同的 CA 根证书,并使用随机的证书密钥,所以不必担心此证书会被第三方利用。

2.1 桌面端安装

不同的桌面端平台(这里主要是 Windows/MacOS/Linux ),证书安装方式有所不同,为了简化安装过程,Reqable 提供了一键安装证书的功能。

证书的安装入口位于顶部操作栏,点击盾牌图标打开弹窗。

直接点击现在安装

点击后系统会弹出确认弹窗或者输入账户密码进行授权,按照提示操作确认即可。不出意外的话,证书会自动安装成功;如果自动安装失败,可以切换到手动安装的 Tab 按照步骤手动安装。

注意,在 Linux 设备上 Chrome 和 Firefox 浏览器有内置的证书管理系统,还需要将 CA 根证书安装到浏览器的证书管理系统中,请按照 Reqable 内的提示进行操作。

CA 根证书未安装或安装失败时,盾牌图标显示为黄色;安装成功后,盾牌图标显示为绿色。

2.2 移动端安装

如果有分析移动端应用的需求,必须在移动端安装 CA 根证书。Reqable 中内置了 Android 和 iOS 证书安装的指引,请切换到AndroidiOS的 Tab 按照步骤进行安装。

由于 Android 7.0 起不再信任用户证书,需要将 CA 根证书安装到系统证书目录,这要求能够 Root 设备并解锁 System 分区。

3. 分析流量

在 API 调试中,获取流量是第一步也是最基本的操作,这里讲解下如何使用 Reqable 获取流量,通俗地讲就是抓包。

首先,需要启用 Reqable 的调试功能,点击最右上角的启动按钮进入调试状态。在调试状态下,任何 HTTP 请求经过 Reqable 的 MITM 代理服务器都会显示到界面上。

为了保证流量经过 Reqable 的 MITM 代理服务器并信任 Reqable 的 CA 根证书,请检查下面两项:

如果系统代理已经设置,网络图标是绿色;如果系统代理未设置,网络图标是黄色,点击网络图标可以自动设置系统代理。

如果 CA 根证书安装成功,盾牌图标是绿色;如果 CA 根证书未安装成功,网络图标是黄色,点击盾牌图标可以进入 CA 根证书安装界面,详细步骤请阅读上一节。

一切就绪后,我们可以看到如下的界面:

打开浏览器,输入地址 https://reqable.com 并回车,这里演示使用的是 Chrome 浏览器。回到 Reqable ,调试列表中已经捕获到了该网站的全部请求数据。

我们可以选择一个图片请求,双击打开详情面板,能够看到该请求的详细信息。注意,再次双击该请求,可以关闭详情面板。

点击侧边栏的工作台图标,打开调试列表的工作面板。然后展开reqable.com此域名的结构树,可以查看该域名下所有请求的目录结构,点击选择可以查看该请求的详情。

点击最右上角垃圾篓图标(快捷键 Control + Shift + R )可以清空列表。

这里,我们已经完成了获取流量最基本的操作了。

4. 开始调试

捕获到流量之后,开始使用调试功能进行数据模拟等各种测试。Reqable 提供了非常强大的调试功能,主要有重写、断点和脚本功能,下面分别来进行介绍。

4.1 重写

重写是 Reqable 的核心调试功能之一,通过预设规则自动修改请求或者响应。重写功能可以通过四种方式启用或关闭:

当重写功能开启后,快捷操作栏( Quickbar )上的重写图标将变为绿色激活状态。

Reqable 的重写支持下面 5 种模式。

4.1.1 重定向

重写重定向提供了非常细粒度的重定向操作,例如一个客户端请求 A:https://hello.com/foo,可以重定向为返回请求 B:https://world.com/bar 的结果。

4.1.2 替换请求

表示整体替换请求数据,支持替换的部分包括:请求方法、请求路径、请求头和请求体。从流量列表创建重写-替换请求规则,可以自动带入原始请求数据,我们可以在其他基础上进行修改。替换的时候,也可以选择一个本地文件进行替换。

4.1.3 修改请求

相比于替换请求,修改请求提供了更加细致化的修改策略。例如删除查询参数,修改请求头中的某一项,正则替换请求体的内容,适合动态修改。

4.1.4 替换响应

基本操作同上面替换请求

4.1.5 修改响应

基本操作同上面修改请求

4.2 断点

断点是 Reqable 的核心调试功能之一,通过设定匹配规则,触发断点后实时控制和修改请求和响应。断点功能可以通过四种方式启用或关闭:

当断点功能开启后,快捷操作栏( Quickbar )上的断点图标将变为绿色激活状态。

接下来新建一个断点规则:

输入规则名称和匹配的 URL ,URL 支持简单的 Wildcard * 和 ? 匹配。完成后,当请求或响应发生时,便可以进入断点操作界面。

我们可以在这个页面上,修改数据然后提交。

每个断点请求(响应)有180s的时间进行操作,超时后断点会自动失效,暂停住的请求和响应会继续。

4.3 脚本

脚本是 Reqable 的核心调试功能之一,支持编写 python 脚本处理 HTTP 请求和响应。Reqable 提供了一套基于 Python 的 API ,在脚本中,我们可以对请求和响应的数据进行修改、替换或者删除,甚至还可以中断请求和响应。除了使用 Reqable 内置的 API ,用户还可以使用自己安装的各种 Python 包,例如 requests 等。

脚本功能可以通过四种方式启用或关闭:

当脚本功能开启后,快捷操作栏( Quickbar )上的脚本图标将变为绿色激活状态。

脚本使用 python3 运行,必须使用 python3 的语法。脚本提供两个函数调用入口:onRequestonResponse,顾名思义即请求和响应。

脚本修改后会自动保存,也可以手动使用快捷键 Control + S 立即保存。

下面是脚本的功能代码示例:

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 可以参考文档: https://reqable.com/zh-CN/docs/capture/addons

5. API 测试

API 测试是 Reqable 的两大基本功能之一,帮助开发者调试接口 API 。Reqable 目前支持 HTTP1.1 、HTTP2 和 HTTP3 ( QUIC )协议,核心网络库采用的是Cronet,业内技术最领先的 HTTP 网络请求框架。

Reqable 支持将 API 请求收藏到集合中,并可以随时打开编辑。同时,Reqable 还支持导入 Postman 等格式的 API 集合,并且可以将调试列表中的 API 保存到集合。

6. 结尾

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

欢迎大家支持!

22042 次点击
所在节点    程序员
127 条回复
xrr2016
2023 年 8 月 24 日
在 v2 使用国产字样不是找喷吗
oIMOo
2023 年 8 月 24 日
@MegatronKing #39
我详细描述一下我的环境,除了系统版本,我没有给应用配置任何证书等等(因为才尝试就闪退了),另外,应用不在系统应用文件夹,而是在用户应用文件夹 —— /Users/[username]/Applications
本机没有翻墙,DNS 使用 AdGuard DNS, 但是不应该造成闪退
Alexonx
2023 年 8 月 25 日
小黄鸟的作者的产品 支持下
leokun
2023 年 8 月 25 日
看着界面很不错,不过有其他顺手的工具了,赞一个
Zeyes
2023 年 8 月 25 日
价格太贵,这种是工具,还搞包年,typora 都没这么飘。
MrHyde
2023 年 8 月 25 日
问个问题:flutter 现在开发桌面端 app ,效果咋样?体验咋样?
AilF
2023 年 8 月 25 日
这种的个人使用建议出买断
lanten
2023 年 8 月 25 日
好用是好用的,但有个致命问题:和 v2ray 打架了,两者都走的系统代理,有我无他,一个生效另一个就失效
learningman
2023 年 8 月 25 日
在全平台支持 HTTP1 、HTTP2 和 HTTP3(QUIC)协议
HTTP3(QUIC)暂不支持
呃呃
zorui
2023 年 8 月 25 日
@xrr2016 参考隔壁国产自主可控的 vscode ide /t/968064 。 好东西肯定认可, 为啥一定强调“国产”?
maotao456
2023 年 8 月 25 日
我说一下问题吧,关闭软件后没有自动取消系统代理状态,然后上不了网。
zzq825924
2023 年 8 月 25 日
是不是有点便宜
qb20150806
2023 年 8 月 25 日
和代理冲突
techmale
2023 年 8 月 25 日
"We promise that users do not need to pay extra for the mobile apps, free to use as long as you purchase a license."

如果是这样,价格卖低了 😆
rj
2023 年 8 月 25 日
下载一个试试
skiy
2023 年 8 月 25 日
@MegatronKing

默认缺少 gtk 依赖
```bash
sudo apt-get install libdbusmenu-gtk3-4
```


“是不是应该是 installer 的问题”???

解包
```bash
dpkg-deb -x reqable.deb reqable
```

再用 tree 查看
```bash
.
└── usr
└── share
├── applications
│   └── reqable.desktop
├── pixmaps
│   └── reqable.png
└── reqable
├── data
│   ├── flutter_assets
│   │   ├── AssetManifest.bin
│   │   ├── AssetManifest.json
│   │   ├── AssetManifest.smcbin
│   │   ├── assets
│   │   │   ├── fonts
│   │   │   │   ├── ReqableDesign.ttf
│   │   │   │   └── RobotoMono-VariableFont_wght.ttf
│   │   │   └── images
│   │   │   ├── common
│   │   │   │   ├── dark
│   │   │   │   │   ├── ic_tray_active.png
│   │   │   │   │   └── ic_tray_normal.png
│   │   │   │   ├── ic_tray_active.ico
│   │   │   │   ├── ic_tray_normal.ico
│   │   │   │   ├── ic_unlock_feature.png
│   │   │   │   ├── light
│   │   │   │   │   ├── ic_tray_active.png
│   │   │   │   │   └── ic_tray_normal.png
│   │   │   │   ├── qrcode_ca_link.png
│   │   │   │   └── qrcode_qq_group.jpg
│   │   │   ├── en-US
│   │   │   │   └── certificate
│   │   │   │   ├── android_ca_install_state.png
│   │   │   │   ├── android_wifi_proxy.png
│   │   │   │   ├── chrome_certificate_setup1.png
│   │   │   │   ├── chrome_certificate_setup2.png
│   │   │   │   ├── firefox_certificate_setup1.png
│   │   │   │   ├── firefox_certificate_setup2.png
│   │   │   │   ├── ios_ca_install.png
│   │   │   │   ├── ios_ca_install_state.png
│   │   │   │   ├── ios_wifi_proxy.png
│   │   │   │   ├── mac_certificate_setup1.png
│   │   │   │   ├── mac_certificate_setup2.png
│   │   │   │   ├── windows_certificate_setup1.png
│   │   │   │   └── windows_certificate_setup2.png
│   │   │   └── zh-CN
│   │   │   └── certificate
│   │   │   ├── android_ca_install_state.png
│   │   │   ├── android_wifi_proxy.png
│   │   │   ├── ios_ca_install.png
│   │   │   ├── ios_ca_install_state.png
│   │   │   ├── ios_wifi_proxy.png
│   │   │   ├── mac_certificate_setup1.png
│   │   │   ├── mac_certificate_setup2.png
│   │   │   ├── windows_certificate_setup1.png
│   │   │   └── windows_certificate_setup2.png
│   │   ├── FontManifest.json
│   │   ├── fonts
│   │   │   └── MaterialIcons-Regular.otf
│   │   ├── kernel_blob.bin
│   │   ├── NOTICES.Z
│   │   ├── packages
│   │   │   └── reqable_framework
│   │   │   └── assets
│   │   │   └── fonts
│   │   │   └── ReqableIconFont.ttf
│   │   ├── shaders
│   │   │   └── ink_sparkle.frag
│   │   └── version.json
│   └── icudtl.dat
├── lib
│   ├── esbrotli-linux64.so
│   ├── libapp.so
│   ├── libayatana-appindicator3.so.1
│   ├── libayatana-indicator3.so.7
│   ├── libdesktop_drop_plugin.so
│   ├── libdesktop_multi_window_plugin.so
│   ├── libfile_selector_linux_plugin.so
│   ├── libflutter_linux_gtk.so
│   ├── libmenubar_plugin.so
│   ├── libobjectbox_flutter_libs_plugin.so
│   ├── libobjectbox.so
│   ├── libplatform_device_id_linux_plugin.so
│   ├── libreqable_cronet.so
│   ├── libreqable_flugin_plugin.so
│   ├── libreqable_http.so
│   ├── libreqable_netbare.so
│   ├── libtray_manager_plugin.so
│   ├── liburl_launcher_linux_plugin.so
│   └── libwindow_size_plugin.so
└── reqable
```

怎么看都知道源程序的二进制文件在 /usr/share/reqable 。而 google chrome 等其它应用都是在 /opt
```bash
tree -L 2 /opt/google
/opt/google
└── chrome
├── chrome
├── chrome_100_percent.pak
├── chrome_200_percent.pak
├── chrome_crashpad_handler
├── chrome-management-service
...
```

```bash
tree -L 1 -d /opt/
/opt/
├── apps
├── balenaEtcher
├── bytedance
├── containerd
├── freedownloadmanager
├── google
├── kingsoft
├── microsoft
├── MindMaster-10
├── QQ
└── vivaldi
```

当然,我不了解相关规则。可能放在 /usr/share/ 下也符合规范。我只是从其它的软件角度看而已。
wukaige
2023 年 8 月 25 日
好东西,支持一下。
shen13176101
2023 年 8 月 25 日
添加重写规则,可以实现去广告???
johnnyNg
2023 年 8 月 25 日
公司安全软件报了恶意进程,安全那边找我了😅
MegatronKing
2023 年 8 月 25 日
@johnnyNg 非常抱歉,我也不知道怎么回事。或者,你可以给安全同事安利下 Reqable ,说不定他们也有使用需求?

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

https://v2ex.ih06.com/t/968017

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

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

© 2021 V2EX