-
Notifications
You must be signed in to change notification settings - Fork 15
规则开发
在说明规则编写之前必须要说明的是,这套规则体系并不是专门为本项目设计的,其使用了作者另一个尚未(即将)开源的工具 Squirrel(使用 kotlin-multiplatform 开发,具备跨 JVM、JS、Android 等平台的天然特性的一个页面解析工具),所以下文中部分设计如果放在本项目专用的场景下似乎有些繁琐,但是从跨平台跨项目的角度考虑会更容易理解。
规则试图使用如下的结构来表达一个待解析的目标页面(下简称: Site
):
- 具备一个列表的页面
- 具备一段文本的页面
- 同时满足两点的页面
于是, 取一个并集, 一个Site
的基本抽象就是
{
"text": {},
"list": {}
}
当然, Site
里面还有比如上一页, 下一页等琐碎的信息, 暂且不表.
不管是text
还是list
, 统一称为Content
, 最美妙的地方在于, 如果把list
里的每一项看做text
的话, 那么两类Content
唯一的区别就是其选取的范围了.
于是, 完全相同的Content
结构便可以同时胜任列表和文本两种页面的定义, 这就是这套规则体系的运作方式.
当然, 上面这些废话看不懂也无所谓, 看具体的字段解释和例子也可以明白.
一个完整的站点规则看起来长这样:
{
"code": "43e259b9-abd3-465f-bd22-7bdc8ad907a2",
"name": "Nyaa",
"category": "ACG",
"icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABAlBMVEURbeMIN2////8hd+Xn9P4ofeYBefoAcfXX6/0op/84jOz4/P898v8dov845P8vg+cwq/8Chf9C//0AavJvxP7d7Pyw1vo3hegSmf/w+P4zu/87ovQ/+f856v8MkP9q4v4Zivgysv/O7P40zv7J5fy42vsqoPqgyvkYc+s4xP/C4PsqmvgPePIujfE43P821f8+qv2K3/yAyfzQ5fskf+4Fi/+76v2b3f1auv1ouf1Ls/2OzfuDwPqsz/l8vfmTvvVsrfWDtPE1lvFio+4/iOcq1/8kw/+Y8f5K3f563/1a1/xmy/xF7Pue1ft11PlRq/lcsPhL0PZDmfIysPAAS95YlOoND8hKAAACLElEQVQ4y4WR53LiQBCE5d2VWSSExKEEAiQTRTqTjpzBOdt37/8qNyMZkP3HDaXaqv6qe3ZWOPtBwhmlwheJolpyu8ERHADUr7b07tQ/3GeBUvHj8c0BQIz6UtXRLrLZO7eUzCd+gQCwThVqU1HicS173XWTyUQiFwJQiggV1bZtIwAR3fvfkAAEAtg2aJ2nUn8K9oGoly6RyOUQiMVi5yAECgW7ua1W4xdZIDAiAoREmwq0qmhTLVu/DEsASB8JzxJA1bg+hgwseTwCYYmEPnUmejjGlXuTTyDwGeGBj3KmMGdcf3i7k2+SAQDEYNBSDwvbdhRF0XV9SGQ3mcdr+mKr1Tpta6d3FE3vsWKm694mEaB+Om0dbKrOXzV73JuZfDS8v0KA+qq/P/pUNDv2mC01bcaH17dFBARLjD7nslA1ydTWy0/Z5wwLKk79FJ7lpfDCCHuqsN6IMBYknHy8qZfSCarICZE5JkQA6NqmUg30ZRm/owgQDiJ5nlckB8kPEYDin7altjcjR7HvCZIFv3loZiCpHAFUjJBUSdibZcIZAwI6ohUWpKgipTs26TcqZpnhVUJgZ272sENftUTaXi7IvMF5owKA3AsAy4BjbeDDs76vzQVjGcYZ57JcXjsBsAoHXlVWa0IMzgzCZG6UJx1JQoAKjASqNGoZAAwDF5Dh5qtKmwoAf/+RULUN+ISbeO7XWM0UhKaDwOIT2BiBhZRR6xsVTsWmBcAP+g8dajvM1EuD+QAAAABJRU5ErkJggg==",
"target": "SEARCH",
"home": "https://nyaa.si",
"author": "lanyuanxiaoyao",
"description": "A BitTorrent community focused on Eastern Asian media including anime, manga, music, and more",
"parser": "CSS",
"rules": {
"https://nyaa\\.si/\\?q=.+&p=\\d+": {
"list": {
"expression": ".container table.torrent-list tbody > tr",
"title": {
"expression": "td[colspan] > a[title]:not(.comments)",
"attribute": "title"
},
"dateTime": {
"expression": "td:nth-child(5)"
},
"link": {
"expression": "td[colspan] > a[title]:not(.comments)",
"attribute": "href",
"prefix": "{home}"
},
"extra": {
"size": {
"expression": "td:nth-child(4)"
},
"view": {
"expression": "td:nth-child(8)"
}
}
},
"next": {
"expression": "ul.pagination > li.next > a",
"attribute": "href",
"prefix": "{home}"
}
},
"https://nyaa\\.si/view/\\d+": {
"text": {
"expression": ".container > .panel:contains(Magnet)",
"title": {
"expression": "h3.panel-title"
},
"author": {
"expression": "a[title=User]"
},
"dateTime": {
"expression": "div[data-timestamp]"
},
"extra": {
"size": {
"expression": "div.col-md-1:contains(File size) + div"
}
}
},
"list": {
"expression": ".container > .panel:contains(Magnet)",
"title": {
"expression": "h3.panel-title"
},
"content": {
"expression": ".panel-footer a:contains(Magnet)",
"attribute": "href"
}
}
}
},
"search": "{home}/?q={query}&p=1",
"properties": {
"SEARCH_LITE_SUPPORT": "true",
"SEARCH_LITE_TITLE_TEMPLATE": "#title{${i.title}}#size{${i.size}}#view{${i.view}}#datetime{${i.datetime}}",
"SEARCH_LITE_DESC_TEMPLATE": "#description{${i.link}}#link{${i.link}}",
"SEARCH_LITE_IMAGE_TEMPLATE": "",
"SEARCH_LITE_KEYS": "Nyaa",
"TEST_SEARCH_KEY": "girl"
}
}
部分字段本项目没有支持, 将会用删除线标注, 这些字段不写即可
字段 | 名称 | 类型 | 默认值 | 必填 |
---|---|---|---|---|
code | ID | String | 是 | |
enable | 是否可用 | Boolean | false |
否 |
version | 版本号 | Int | 0 |
否 |
name | 名称 | String | 是 | |
category | 分类 | String | "" |
否 |
icon | 图标 | String | "" |
否 |
target | 规则目标 | Target | 是 | |
home | 站点主页 | String | 是 | |
author | 规则作者 | String | 是 | |
description | 描述 | String | "" |
否 |
banner | 横幅 | String | "" |
否 |
parser | 解析器类型 | Parser.Type | 是 | |
downloader | 下载器类型 | Downloader.Type | "HTTP" |
否 |
charset | 网页编码 | String | "UTF-8" |
否 |
headers | 访问时 headers | Map<String, String> | {} |
否 |
tags | 站点 tag, 或分类 | Map<String, String> | {} |
否 |
rules | 解析规则 | Map<String, Rule> | 是 | |
platform | 规则适用平台 | List | [] |
否 |
options | 其他选项 | List | [] |
否 |
search | 搜索入口 | String | "" |
否 |
properties | 附加参数 | Map<String, String> | {} |
否 |
站点规则唯一识别码, 建议使用 UUID, 在导入规则以及 API 调用的时候使用该code
来识别站点规则.
UUID
通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID)是用于计算机体系中以识别信息数目的一个128位标识符,还有相关的术语:全局唯一标识符(GUID)。
由于没有相应的下载器或其他情况可能会导致站点不可用, 此时规则会改字段会被置为false
, 规则不需要写, 这个字段由程序自动管理.
站点规则版本, 用于识别规则是否升级.
站点名称, 这个没啥好说的, 必填就对了.
站点分类, 分类用于对不同类型的规则进行区分, 供前端识别使用, 比如漫画类, 资讯类, 搜索类等, 这种类型上的区别往往会导致前端需要使用不同的布局来展示, 因此使用这个字段供识别使用.
站点图标, 可以填链接也可以填 base64 格式的图片, base64 格式为data:image/png;base64,...
.
base64 图片可以让规则第一时间显示图标, 比较美观, 但是如果图标较大, 会导致规则文件体积大增, 建议压缩后再转换为 base64 格式.
站点主页, 用于在各种需要跳转到原站点的时候用到.
规则作者
站点描述, 对站点的一些说明.
本项目所示技术仅用于学习交流, 请勿直接用于任何商业场合和非法用途