Appearance
Whistle 使用指南
Whistle 是基于 Node.js 实现的跨平台抓包调试代理工具,通过将设备流量指向本地代理端口,实现请求拦截、修改、重定向、Mock、注入等能力。本篇从「代理拦截原理」出发,梳理从环境搭建、HTTPS 证书、多端代理到高级调试的完整链路,帮助你构建对代理调试工具的系统认知。
导航目录
一、环境搭建篇
二、代理与证书篇
三、高级调试篇
四、实践与排障篇
安装 Whistle
核心原理:Whistle 如何拦截流量
Whistle 本质是一个运行在本地(默认 8899 端口)的 HTTP/HTTPS 代理服务器。当把浏览器或手机的网络代理指向它后,所有请求都会先经过 Whistle,命中规则的请求被拦截并按规则处理(重定向/Mock/延迟/注入等),未命中的则原样转发到真实服务器。
text
┌─(命中规则)─► 拦截处理(重定向/Mock/注入/延迟)─┐
浏览器/手机 ─(请求)─► Whistle 代理:8899 ├─► 返回响应给浏览器/手机
└─(未命中)──► 真实服务器 ─────────────────────────┘bash
npm install -g whistle常用命令
bash
w2 start # 启动 Whistle(开机后需要在 CMD 中输入)
w2 restart # 重启 Whistle
w2 stop # 停止 Whistle
w2 run # 调试模式启动(用于查看异常及插件开发)浏览器代理配置
代理插件的作用
浏览器默认走系统代理,全局切换较繁琐。使用 ZeroOmega 等代理管理插件,可为浏览器单独设置代理并一键开关,避免影响系统其他应用,是前端调试的推荐方式。
1. 安装代理插件
推荐插件:Zeroomega-3.4.1.crx
注意:Proxy SwitchyOmega 已不被新版谷歌支持
2. 配置代理设置

安装 HTTPS 证书
为什么必须安装证书?
HTTPS 流量是加密的,代理默认无法查看内容。Whistle 采用 中间人(MITM) 机制:它用自签根证书为目标域名动态签发证书,冒充服务器与客户端握手,从而解密流量。因此客户端必须信任 Whistle 的根证书,否则浏览器会报「证书不受信任」并拦截 HTTPS 请求。
text
客户端 Whistle 真实服务器
| 1. HTTPS 请求 | |
| ──────────────────────►| |
| 2. 动态签发证书冒充服务器| |
| ◄──────────────────────| |
| | 3. 以客户端身份请求 |
| | ──────────────────────────►|
| | 4. 加密响应 |
| | ◄──────────────────────────|
| 5. 解密查看/修改再加密返回| |
| ◄──────────────────────| |步骤
- 访问
http://127.0.0.1:8899/ - 选择 HTTPS → 勾选 "Capture TUNNEL CONNECTs" → 点击 "download"

Windows 系统

- 安装证书时需手动选择**"受信任的根证书"**目录
Mac 系统


- 双击下载的 rootCA.crt
- 在钥匙串访问中,将 whistle 证书设置为**"始终信任"**
配置 Host 代理规则
操作步骤
- 访问
http://127.0.0.1:8899/ - 选择左侧 "Rules" → 点击顶部 "Create"
- 输入规则名称创建代理规则

环境配置
本地 Whistle 代理通常包含以下环境:
- local
- dev
- ...
可通过双击规则名快速切换环境
手机代理配置
手机代理原理
手机代理与浏览器同理——把手机 WiFi 的代理指向电脑的 局域网 IP + Whistle 端口(8899),手机流量即可经电脑上的 Whistle 转发处理。关键前提是两台设备在同一局域网,且手机同样需要安装并信任 Whistle 证书才能抓取 HTTPS。
前提条件
- 手机与电脑需在同一局域网
代理设置
查看 IP 地址
- 访问
http://127.0.0.1:8899/点击右上角 "Online" - 或在 CMD 中输入
ipconfig
iOS 系统

- 点击 WiFi → 配置代理 → 手动 → 输入 IP 和端口
Android 系统

- 长按 WiFi → 修改网络 → 显示高级选项 → 配置代理
安装手机证书
下载证书

- 扫描二维码下载证书
Android 安装
- 打开下载的文件 → 输入锁屏密码
- 证书名称随意,必须勾选"VPN 和应用"
iOS 安装
Safari 访问
rootca.pro或扫描二维码安装设置 → 通用 → 描述文件 → 安装证书

- 设置 → 通用 → 关于本机 → 证书信任设置 → 信任该证书

功能使用
规则语法速查
Whistle 规则统一采用 匹配模式 操作协议://参数 的格式。常用操作协议:redirect://(重定向)、statusCode://(改状态码)、resDelay://(延迟)、resBody://(替换响应体 Mock)、htmlAppend://(注入脚本)、weinre://(远程调试)。左侧匹配可用域名、路径或正则。
页面重定向
功能说明:将一个 URL 重定向到另一个 URL,用于测试不同环境或页面。
bash
https://www.test1.com/ redirect://https://www.test2.com/- 访问 www.test1.com 时自动跳转到 www.test2.com
模拟网络问题
模拟接口错误
功能说明:模拟接口返回错误状态码,用于测试错误处理逻辑。
bash
wq.xx.com/official_account/queryCouponInfo statusCode://500- 接口返回 500 状态码
模拟网络延迟
功能说明:模拟网络延迟,用于测试应用在慢速网络下的表现。
bash
wq.xx.com/official_account/queryCouponInfo resDelay://1000- 接口延迟 1 秒响应
Mock 接口数据
功能说明:使用本地 JSON 文件模拟接口返回数据,用于前端开发和测试。
bash
https://beta-api.m.xx.com/queryCouponInf resBody://{queryCouponInf.json}
- 接口返回本地 JSON 文件内容
Mock 的典型场景
resBody:// 是前后端并行开发的利器:后端接口未就绪时,前端可用本地 JSON 先行联调;也可用于复现线上异常数据、构造边界值测试。配合 values 面板管理 Mock 数据,比手改代码更灵活且不侵入项目。
注入 Eruda 调试工具
功能说明:在页面中注入 Eruda 调试工具,方便在移动端或生产环境进行调试。
配置规则
- 通过 Ctrl+单击模拟数据名称(html_test)跳转到 values 界面,写 js 代码
bash
https://m.xx.com/ htmlAppend://{html_test}
编写注入代码

html
<script src="https://cdn.bootcss.com/eruda/1.5.4/eruda.min.js"></script>
<script>
eruda.init();
window.GLOBAL_SQ_HEADER = true;
</script>注意:域名需精确匹配,避免影响其他接口
配置 Weinre 远程调试
功能说明:使用 Weinre 进行远程调试,查看移动端页面的 DOM 结构、网络请求等。
配置规则
bash
https://m.xx.com/ weinre://test1使用步骤
- 保存规则后,鼠标悬停 weinre 展开菜单
- 点击新建的 test1

调试界面

Eruda 与 Weinre 如何选择
- Eruda:注入到页面内的移动端控制台,查看 Console/Network/Element 等,在手机上直接操作,轻量、零配置,适合快速排查。
- Weinre:远程调试,在电脑上审查手机页面的 DOM 与样式,适合处理复杂布局问题,但功能较老、不支持断点。
- 现代方案更推荐 Chrome DevTools 远程调试(
chrome://inspect),Weinre 主要用于无法直连 USB 的场景。
最佳实践
- 规则管理:按照环境和功能对规则进行分类,便于管理和维护
- 证书安装:确保所有设备都正确安装了 HTTPS 证书,避免 HTTPS 拦截失败
- 域名匹配:使用精确的域名匹配规则,避免影响其他接口
- 规则备份:定期备份 Whistle 规则,防止规则丢失
- 性能优化:避免创建过多规则,影响 Whistle 的运行性能
常见问题
1. 启动失败
- 检查端口是否被占用:
netstat -ano | findstr :8899 - 尝试使用其他端口启动:
w2 start --port 8888
2. HTTPS 拦截失败
- 确保已正确安装并信任 HTTPS 证书
- 检查浏览器是否允许不安全的证书
3. 手机代理无法连接
- 确认手机和电脑在同一局域网
- 检查防火墙是否阻止了连接
- 验证 IP 地址和端口是否正确
结语:抓住「代理 + 证书」两个核心
Whistle 的所有能力都建立在两个基础之上——代理让流量流经本地(决定了「能不能拦」),证书信任让 HTTPS 可解密(决定了「能不能看内容」)。理解这两点,无论是排查连不上、抓不到 HTTPS,还是设计复杂的重定向/Mock/注入规则,都能快速定位问题根源。剩下的只是规则语法的熟练度问题。