5.2 KiB
5.2 KiB
源规则 (Source Rule) 帮助
本文档介绍 Legado 源规则的核心配置项和语法。源通过声明式的 JSON 配置和可选的 JavaScript 逻辑,从网站抓取书籍内容。
::: tip 相关文档
- JS 变量和函数 — 内置变量和扩展 API
- XPath 路径表达式 — XPath 语法
- 正则表达式 — 正则语法
- 请求头配置 — 代理、Headers、重定向拦截
- 认证与登录 — CookieJar、登录 UI、登录 URL
- 发现 URL 配置 — 发现页入口 JSON 格式 :::
辅助键盘 ❓ 中可插入 URL 参数模板,打开帮助,js 教程,正则教程,选择文件。
2. 规则标志 (Rule Flags)
在 {{......}} 内使用规则时,必须包含明确的规则标志。没有规则标志的内容将作为
JavaScript 执行。
| 标志 | 语法 | 可省略条件 | 适用范围 |
|---|---|---|---|
@@ |
默认规则 | 直接写时可省略 | 所有字段 |
@XPath: |
XPath 规则 | 以 // 开头时可省略 |
所有字段 |
@Json: |
JSON 规则 | 以 $. 开头时可省略 |
所有字段 |
: |
正则规则 | 不可省略 | 仅书籍列表和目录列表 |
3. JS 库注入 (jsLib)
注入 JavaScript 到 Rhino 引擎中,支持两种格式,可实现函数共用。
| 格式 | 说明 | 示例 |
|---|---|---|
JavaScript Code |
直接填写 JavaScript 片段 | function myUtil(s) { return s.trim() } |
| JSON Map | URL 映射表,自动复用已下载的 js 文件 | {"example":"https://example.com/lib.js"} |
::: warning 线程安全 此处定义的函数可能被多个线程同时调用,函数内的全局变量内容将被共享。对其进行修改可能导致竞争问题。
- 函数内不可声明全局变量
- 函数外的全局变量不可再赋值,否则会抛出
无法修改密封对象的属性异常 :::
4. 并发率 (Request Rate Limit)
控制对目标网站的请求频率,支持两种格式:
| 格式 | 说明 | 示例 |
|---|---|---|
N |
访问间隔(毫秒) | 1000 — 每次请求间隔 1 秒 |
N/M |
时间窗口内最大请求数 | 20/60000 — 60 秒内最多 20 次请求 |
5. 源类型:文件 (File Source)
适用于提供文件下载的网站(如知轩藏书)。在源详情的「下载 URL」规则中获取文件链接。
工作原理:
- 通过截取下载链接或文件响应头获取文件信息
- 获取失败时自动拼接
书名、作者和下载链接UrlOption的type字段 - 压缩文件解压缓存在下次启动后自动清理,不占用额外空间
6. 字体解析 (Font Parsing)
在正文替换规则中使用,根据源字体的字形数据到目标字体中查找对应编码。
(function(){
var b64 = String(src).match(/ttf;base64,([^\)]+)/);
if (b64) {
var f1 = java.queryTTF(b64[1]);
var f2 = java.queryTTF("https://example.com/font/SourceHanSansCN.ttf");
return java.replaceFont(result, f1, f2, true);
}
return result;
})()
7. 购买操作 (Purchase Action)
可直接填写链接或 JavaScript。
| 返回值 | 行为 |
|---|---|
| 网络链接 | 自动打开浏览器 |
true(JS 返回) |
自动刷新目录和当前章节 |
8. 图片解密 (Image Decryption)
适用于图片需要二次解密的情况。直接填写 JavaScript,返回解密后的 ByteArray。
可用变量:
| 变量 | 说明 |
|---|---|
java |
仅支持 JsExtensions 中的方法 |
result |
待解密图片的 ByteArray |
src |
图片链接 |
示例 — AES 解密:
java.createSymmetricCrypto("AES/CBC/PKCS5Padding", key, iv).decrypt(result)
示例 — XOR 解密:
function decodeImage(data, key) {
var input = new Packages.java.io.ByteArrayInputStream(data)
var out = new Packages.java.io.ByteArrayOutputStream()
var byte
while ((byte = input.read()) != -1) {
out.write(byte ^ key)
}
return out.toByteArray()
}
decodeImage(result, key)
封面解密
与图片解密类似,其中 result 为待解密封面的 InputStream。
java.createSymmetricCrypto("AES/CBC/PKCS5Padding", key, iv).decrypt(result)