导读:
Shadowrocket 的脚本功能(Scripting)允许用户使用 JavaScript 对 HTTP/HTTPS 请求和响应进行动态修改,实现去广告、解锁功能、数据重写、接口调试等高级操作。
基础概念
脚本类型
| 类型 | 触发时机 | 用途 |
|---|---|---|
| http-request | 请求发送前 | 修改请求头、URL、Body,重定向 |
| http-response | 响应返回后 | 修改响应体、响应头,去广告,解锁 |
| cron | 定时执行 | 自动签到、数据同步(功能较基础) |
核心对象
$request: 请求对象(URL、headers、body、method)$response: 响应对象(status、headers、body)$done(): 结束脚本并返回数据$notify(): 发送通知(iOS 15+ 受限)$persistentStore: 本地存储
脚本配置格式
在 Shadowrocket 中,脚本通常写在 Module(模块) 或配置文件 [Script] 段落中:
[Script] 脚本名称 = type=http-response,pattern=^https?:\/\/api\.example\.com\/user\/info,requires-body=1,script-path=https://raw.githubusercontent.com/xxx/xxx.js
参数说明:
type: 脚本类型(http-request/http-response/cron)pattern: URL 正则匹配规则requires-body: 是否需要处理 body(0/1/true/false)script-path: 脚本路径(本地或远程 URL)max-size: 最大 body 处理大小(默认 2097152 bytes)
常见使用场景
修改响应体(解锁/去广告)
// 示例:修改会员状态
let body = JSON.parse($response.body);
body.data.is_vip = true;
body.data.expire_time = "2099-12-31";
$done({body: JSON.stringify(body)});
请求重定向
// 将请求指向本地或新地址
$done({
url: "https://new-api.example.com" + $request.url.match(/\/api.*/)[0],
headers: $request.headers
});
修改请求头
// 添加自定义 Header
let headers = $request.headers;
headers['User-Agent'] = 'CustomApp/1.0';
headers['X-Token'] = 'Bearer xxx';
$done({headers});
定时任务(Cron)
[Script] 签到任务 = type=cron,cronexp="0 9 * * *",script-path=checkin.js
完整示例
示例 1:知乎去广告(简化版)
/*
[Script]
知乎去广告 = type=http-response,requires-body=1,pattern=^https:\/\/www\.zhihu\.com\/api\/v4\/feed,script-path=zhihu.js
*/
let body = JSON.parse($response.body);
if (body.data) {
body.data = body.data.filter(item => !item.ad);
}
$done({body: JSON.stringify(body)});
示例 2:Bilibili 番剧区域解锁检测
let url = $request.url;
// 修改区域参数
url = url.replace(/area=\w+/, 'area=CN');
$done({url});
配置步骤
-
开启 HTTPS 解密(必须)
- 安装证书:设置 → 证书 → 安装
- 信任证书:iOS 设置 → 通用 → 关于本机 → 证书信任设置
- 开启 MITM:配置 → 启用 HTTPS 解密
-
添加脚本
- 导入模块(Module)文件(
.sgmodule) - 手动在配置
[Script]段添加 - 使用远程脚本 URL
- 导入模块(Module)文件(
-
调试
- 查看日志:设置 → 日志 → 脚本执行记录
- 使用
$notify("标题", "副标题", "内容")输出变量
注意事项
- 性能影响:复杂脚本会增加延迟,避免在高频接口上使用重型正则
- Body 大小限制:默认 2MB,超过需设置
max-size参数 - 语法兼容:使用 ECMAScript 5 语法(部分 ES6 支持但不稳定)
- 证书问题:iOS 16+ 需开启开发者模式才能信任自定义证书
- 与规则冲突:脚本优先级通常高于普通规则,但低于 REJECT 规则
与 Surge/Quantumult X 的区别
| 特性 | Shadowrocket | Surge | QX |
|---|---|---|---|
| 脚本引擎 | JavaScriptCore | JavaScriptCore | JavaScriptCore |
| 外部资源 | 支持 | 支持 | 支持 |
| 脚本并发 | 一般 | 优秀 | 良好 |
| 定时任务 | 基础支持 | 完整支持 | 完整支持 |
| 调试工具 | 日志查看 | 完整调试 | 通知调试 |
提示:Shadowrocket 的脚本功能适合轻量级修改,复杂逻辑建议使用 Surge 或 Quantumult X。
需要具体的脚本示例或遇到执行问题,可以提供目标 App/网站信息,我可以协助编写对应的脚本代码。