一旦需要逻辑判断,固定规则就不够用了。比如根据 Body 计算签名头,只在某个字段等于特定值时修改另一个字段,或者在多次请求之间计数。HTTPS Capture 可以在 iPhone 上直接对匹配的流量运行 JavaScript 脚本,类似 Proxyman、mitmproxy 这些桌面工具的脚本功能。
创建脚本
- 在抓包页点 规则 → 脚本。
- 打开 启用脚本。
- 点 新建脚本 从模板开始,点 示例 选一个内置示例,或者点 导入脚本 加载
.capture.js文件。
编辑器带语法高亮、行号和括号补全。保存时会先检查脚本有没有错误,保存后立即对新请求生效。
脚本格式
每个脚本都调用一次 Capture.defineScript:
Capture.defineScript({
name: "Add debug header",
version: "1.0.0",
match: {
urls: ["https://api.example.com/*"],
methods: ["GET", "POST"]
},
onRequestHeaders(context, request) {
request.headers.set("X-Debug", "1");
request.queries.set("lang", "en");
return request;
}
});
一共有五个可选的钩子:
| 钩子 | 执行时机 |
|---|---|
shouldMatch(request) | 额外判断,返回 false 则跳过这条请求 |
onRequestHeaders(context, request) | 请求发出之前,可以改 URL、方法、Header、查询参数 |
onRequest(context, request) | 拿到完整的请求 Body 之后 |
onResponseHeaders(context, request, response) | 响应头到达时 |
onResponse(context, request, response) | 拿到完整的响应 Body 之后 |
示例:修改 JSON 响应
Capture.defineScript({
name: "Unlock feature flag",
version: "1.0.0",
match: { urls: ["https://api.example.com/config*"] },
onResponse(context, request, response) {
const body = JSON.parse(response.body || "{}");
body.features = body.features || {};
body.features.newCheckout = true;
response.body = JSON.stringify(body);
return response;
}
});
常用 API
request.url、method、host、port、path:读取或修改请求目标request.headers和request.queries:支持get、set、append、delete,也可以直接写request.headers["X-Debug"] = "1"request.body/response.body是文本,二进制数据用bodyBytesresponse.statusCodecontext.state:同一条请求的各个钩子之间共享数据context.shared:抓包期间在多条请求之间共享数据env.get(key)/env.set(key, value):持久保存的值,比如需要反复使用的 TokenCapture.crypto.md5()、Capture.crypto.sha256()、Capture.base64.encode()/decode()console.log()的输出显示在 运行时日志 里
在请求钩子里返回 null,可以 拦截 这条请求。
安全设计
脚本运行在沙箱里:fetch、XMLHttpRequest、WebSocket 等网络 API 都被禁用,每个钩子都有严格的时间限制。脚本报错或超时时,流量原样通过,错误会写进日志,脚本出 bug 不会导致断网。每条请求只由第一个匹配的已启用脚本处理,拖动脚本可以调整优先级。
让 AI 帮你写脚本
点 AI 提示词 可以复制完整的脚本 API 文档。把它和你的需求一起发给 ChatGPT、Claude 等 AI 助手,就能得到完全符合 API 的脚本。
准备好试试了吗?
HTTPS Capture · Capture and decrypt HTTPS traffic on iPhone
App Store 免费下载