Files
QieKan-3.0/docs/dev/rule.md
T
yusheng d2d2ecd3bc
Auto Release / build (app, release) (push) Canceled after 0s
Auto Release / create_release (push) Canceled after 0s
Auto Release / prepare (push) Canceled after 0s
CodeQL / Analyze (java-kotlin) (java-kotlin) (push) Canceled after 0s
Deploy Docs / build (push) Canceled after 0s
Deploy Docs / Deploy (push) Canceled after 0s
feat: release QieKan 3.26.15
2026-08-08 12:22:26 +08:00

5.2 KiB
Raw Blame History

源规则 (Source Rule) 帮助

toc

本文档介绍 Legado 源规则的核心配置项和语法。源通过声明式的 JSON 配置和可选的 JavaScript 逻辑,从网站抓取书籍内容。

::: tip 相关文档

辅助键盘 中可插入 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」规则中获取文件链接。

工作原理:

  1. 通过截取下载链接或文件响应头获取文件信息
  2. 获取失败时自动拼接 书名作者 和下载链接 UrlOptiontype 字段
  3. 压缩文件解压缓存在下次启动后自动清理,不占用额外空间

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。

返回值 行为
网络链接 自动打开浏览器
trueJS 返回) 自动刷新目录和当前章节

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)