Skip to content

规则说明

通过编写规则, 可以把不同网站的内容以相同的格式呈现, 以实现聚合搜索或阅读的功能。

为了避免重复造轮子、重复制定规则规范, 目前 any-reader 的规则规范是按照 eso 的规则实现的, 所以规则的编写方法您可以参考 eso 书源, 目前 any-reader 也支持少量 eso 书源 规则

规则结构

typescript
export interface Rule {
  host: string; // 域名
  id: string; // uuid
  name: string; // 书源名称
  sort: number; // 书源排序
  contentType: ContentType; // 书源类型
  cookies?: string;
  loadJs: string; // 全局JS脚本

  // 搜索
  enableSearch?: boolean; // 搜索 - 启用
  searchUrl: string; // 搜索 - 地址
  searchList: string; // 搜索 - 列表
  searchCover: string; // 搜索 - 封面
  searchName: string; // 搜索 - 标题
  searchAuthor: string; // 搜索 - 作者
  searchChapter: string; // 搜索 - 章节
  searchDescription: string; // 搜索 - 描述
  searchResult: string; // 搜索 - 结果

  // 章节列表
  chapterUrl: string; // 章节列表 - 请求地址
  chapterName: string; // 章节列表 - 标题
  chapterList: string; // 章节列表 - 列表
  chapterCover: string; // 章节列表 - 封面
  chapterTime: string; // 章节列表 - 时间
  chapterResult: string; // 章节列表 - 结果

  contentItems: string; // 章节列表 - 内容

  // 发现
  enableDiscover: boolean; // 发现页 - 是否启用
  discoverUrl: string; // 发现页 - 请求地址
  discoverList: string; // 发现页 - 列表
  discoverName: string; // 发现页 - 标题
  discoverCover: string; // 发现页 - 封面
  discoverAuthor: string; // 发现页 - 作者
  discoverDescription: string; // 发现页 - 描述
  discoverResult: string; // 发现页 - 结果
  discoverItems: string;
  discoverTags: string;
  discoverChapter: string;
  discoverNextUrl?: string;

  // 线路
  enableMultiRoads: boolean; // 启用多线路
  chapterRoads: string; // 线路列表
}

enum ContentType {
  MANGA = 0,
  NOVEL = 1,
  VIDEO = 2,
  AUDIO = 3,
  RSS = 4,
  NOVELMORE = 5,
}

解析流程

搜索小说

  1. 通过 hostsearchUrl 字段获取请求地址、方式、参数等
  2. 通过 searchList 字段获取搜索结果列表数组
  3. 通过 searchCoversearchNamesearchAuthorsearchChaptersearchDescription 字段获取每单个搜索结果的具体内容
  4. 通过 searchResult 字段匹配数据以用来给 获取章节数据 使用

获取章节数据

  1. 通过 hostchapterUrlsearchResult 字段获取请求地址、方式、参数等
  2. 通过 chapterList 字段获取章节列表数组
  3. 通过 chapterNamechapterCoverchapterTime 字段获取单个章节的具体内容
  4. 通过 chapterResult 字段匹配数据以用来给 获取内容 使用

获取内容

  1. 通过 hostcontentItemschapterResult 字段获取请求地址、方式、参数等
  2. 通过 contentType 按类型解析内容

规则类型

规则支持情况

  • ✅ 理论支持
  • ⚠️ 支持部分
  • ❌ 暂不支持

URL 规则

特性支持情况示例
URLhttps://xxx.com/search?q=$keyword&pageSize=10
JSON{"url":"https://xxx.com/search","method":"post","headers":{"token":"111"},"body":{"keyword":"$keyword"}}
@js@js:(() => { return {url, method, body, encoding, headers}; })();
encoding

变量

字段名支持情况说明
$keyword搜索用的关键字
searchKey$keyword
$host替换规则的 host
$result
lastResult⚠️
searchPage
$page
$pageSize

结果规则会成为下一条地址规则的 result,成为下一条除地址规则的 lastResult。地址规则的响应会成为其他规则的 result

取内容规则

特性支持情况说明示例
@css@css:.box1 .box2@text
@json@json:$.list[:1].title
@xpath@xpath://*[@class="box3"]/text()
@js
@filter模拟浏览器加载地址后匹配指定链接@filter:(?:m3u8|mp4)(?:$|/|\\?|&)
@replace@replace:.*?url=|.*?v=
##正则替换@css:.c2 a@href##\\d+\\.html
{‍​‍{}}使用变量http://www.aaa.com/{‍{$.id}}
嵌套组合$.info.body@css:.box1 .box2@text
||
&&

规则可以省略开头的,@css@xpath@json, 因为解析器会尝试自动识别。

规则表达式

CSS

例子: @css:.box1 .box2@text

该类规则分为 2 部分,以 @ 符号分割.

前部分与 CSS 标准一致,可省略(表示取根节点). 后部分则是 APP 自定义行为, 包括 text、html、innerHtml、outerHtml 取文本,src、href、data-original、bid 等取属性。

XPath

例子: @xpath://*[@class="box3"]/text()

XPath 文档

XPath 测试工具

JSONPath

例子: @json:$.list[:1].title

文档

JSONPath 测试工具

JavaScript

正则

例子: rule##match##replacement##replaceFirstFlag

其中 replacementreplaceFirstFlag 均可以省略。

变量

例子: aa{‍​‍{rule1}}bb{‍​‍{rule2}}cc

级联

例子: $.html@css:html

@ 分割规则后,第一个部分为 JSONPath, 使用 JSONPath 解析后继续用第二部分的 css 规则解析拿到最终结果