Script API
本文档说明 Loon 脚本运行时提供的全局变量和方法。示例使用 JavaScript,可以直接放入
对应类型的脚本中测试。异步 API 完成后再调用 $done(),同步 API 可以在得到结果后立即
调用 $done()。
1. 基本约定
1.1 脚本完成
每次脚本执行只应调用一次 $done()。调用后,Loon 会提交脚本结果并释放本次执行使用的
资源。HTTP、DNS、定时器等异步任务尚未回调时,不要提前调用 $done()。
1.2 二进制数据
需要传递二进制内容的 API 使用 Uint8Array:
var bytes = new Uint8Array([0x4c, 0x6f, 0x6f, 0x6e]); // Loon
console.log(bytes);
$done();
字符串、Base64、十六进制和密码不会自动转换成 Uint8Array,脚本需要先自行编码或解码。
1.3 错误处理
$httpClient和$dns.query的运行错误通过 callback 返回。- gzip 和 AES 是同步 API,参数或运算失败时会抛出异常,应使用
try/catch。 - 部分参数错误在不同脚本运行时中可能表现为
TypeError,也可能带有error.code。
1.4 新增 API 的版本要求
本次新增的压缩、AES 和 DNS API 要求 Loon Build ≥ 988。低于该 Build 的运行时不保证 存在这些方法。
| API | 最低 Loon Build |
|---|---|
$utils.gzip | 988 |
$crypto.aes.encrypt | 988 |
$crypto.aes.decrypt | 988 |
$dns.query | 988 |
2. 基础 API
2.1 console.log(value)
向当前脚本日志写入一条记录。对象和 Error 会被序列化后记录。当前接口按一次调用的一
个主参数处理,需要输出多个值时,建议先组成对象或字符串。
console.log({
message: "Hello Loon",
time: new Date().toISOString()
});
$done();
2.2 setTimeout(callback, delay, ...args)
延迟指定毫秒后执行一次 callback。args 会原样传入 callback。
| 参数 | 类型 | 说明 |
|---|---|---|
callback | Function | 延迟执行的函数 |
delay | Number | 延迟时间,单位为毫秒 |
...args | 任意 | 传给 callback 的附加参数 |
setTimeout(function (text, count) {
console.log(text + ": " + count);
$done();
}, 1000, "timer finished", 1);
2.3 setInterval(callback, delay, ...args)
当前 Loon 运行时中的 setInterval 与 setTimeout 行为相同,只执行一次,不会自动重复。
需要周期执行时,可以在 callback 中再次调用 setTimeout。运行时没有提供可靠的
clearTimeout 或 clearInterval 配套接口。
var count = 0;
function runNext() {
count += 1;
console.log("run: " + count);
if (count < 3) {
setTimeout(runNext, 500);
} else {
$done();
}
}
setInterval(runNext, 500); // 首次只调度一次,后续由 runNext 自己继续调度。
3. 运行上下文
3.1 $loon
$loon 是描述当前设备和 Loon 版本的字符串,不是字段对象。不同平台的格式可能不同。
console.log("runtime: " + $loon);
$done();
可能的格式:
iPhone15,2 18.0 3.2.0(1000)
Mac 3.2.0(1000)