XIU2 / UserScript

🐵 自用的一些乱七八糟 油猴脚本~
https://greasyfork.org/users/457025
GNU General Public License v3.0
7.93k stars 620 forks source link

[自动无缝翻页] `自定义翻页规则` 示例说明 #176

Open XIU2 opened 2 years ago

XIU2 commented 2 years ago

该 Issues 下只讨论 自定义翻页规则,其他请求/反馈请新开 Issues,否则将会删除。

自动无缝翻页 脚本从 v4.8.8 版本开始,支持了自定义翻页规则。

不过当初仅为自用,压根没有考虑过这需求,我只能简单实现自定义翻页规则,因此只适用于简单的静态加载内容网站,当然这类网站占大多数,我写的上千规则中大部分都是这类网站,因此一般是够用了~

# 自写规则 前提条件

  1. 了解 JSON 基本格式 ( 主要是末尾逗号、转义、双引号 )
  2. 了解 CSS 或 XPath 选择器用法 ( 推荐优先使用简单点的 CSS 选择器,对于复杂或需要选择文字的才建议使用 XPath )
  3. 可能需要会一点 JavaScript 语言 / 正则表达式 ( 针对一些较为复杂的网页,主要还是用于 URL 匹配,比如要匹配多个页面什么的 )
    (现在可以直接使用 "url": "return fun.isPager()", 这个新的内置函数通过匹配元素来匹配规则,适用于大部分网站,算是降低了一些编写规则门槛)

简单的来说,这就是提供给 懂一些技术 的用户自给自足制作规则用的~

大多数网站的规则一般都只需要这样(下方示例规则中,urlreplaceEscrollD 均可按需省略):

// "aaa"       是规则名,唯一,因为 自定义翻页规则 优先级最高,所以会覆盖同名的 外置翻页规则

// "host"      是域名,支持正则表达式,也可以像这样 "host": ["bbb1.com", "bbb2.com"], 写多个域名或正则表达式,如果省略,则默认匹配所有域名(会对所有域名匹配 url 规则判断,可以当成一个简单的外置/自定义通用规则的方案)

// "url"       是用来控制哪些网站中页面适用该规则,省略后代表该规则应用于全站(如果不知道写什么,那么就写 return fun.isPager() 这样脚本会默认自动匹配当前网站下存在 nextL 及 pageE 元素的网页,大部分网站是没问题的,如果改为匹配 replaceE 或者其他组合,那么请去下面的 Github Issues 里的 内置函数 中查看具体使用方法)

// "nextL"     是用来指定含有下一页地址的元素选择器(CSS 或 XPath 都行,一般都是 <a> 元素)

// "pageE"     是指定要从下一页获取的元素选择器(也就是网页主体内容),并将其插入当前网页中同样元素的末尾

// "replaceE"  用于将当前网页中的页码元素替换为下一页的页码元素选择器(这样才能无限翻页下去),省略后将会自动判断是替换 nextL 元素自身还是 nextL 元素的父元素(当 nextL 元素后面或前面有其自身 <a> 的相邻兄弟元素时脚本会替换其父元素,反之没有相邻兄弟元素则替换其自身,仅限模式1/3/6,且 "js;" 开头的 nextL 规则除外),值为空 "" 时则完全不替换

// "scrollD"   是用来指定触发翻页的滚动条与底部之间的距离,当滚动条底部距离网页底部之间的距离等于或小于该值时,将触发翻页,因此值越大就越早触发翻页,访问速度慢的网站需要调大,可省略(记得移除上一行末尾逗号),省略后默认 2000

"aaa": {
    "host": "aaa.com",
    "url": "return fun.isPager()",
    "pager": {
        "nextL": "xxx",
        "pageE": "xxx",
        "replaceE": "xxx",
        "scrollD": 2000
    }
}

// 另外还有个大家可能会用的上的:
// "inherits"  规则是继承标识,仅用于自定义规则,用于增删改某个外置规则的部分规则时(比如只是修改域名),可使用该标识来省略不需要修改的规则,只写有变化的规则
// 假如上面那个 "aaa" 翻页规则是脚本的外置翻页规则之一,那么就可以像下面这个 "aaa" 规则一样写一个同名规则(放到自定义翻页规则中),规则内只需要有要修改的 host 内容,以及 inherits 标识,这样脚本就会将这个自定义翻页规则中的 host 覆盖掉外置翻页规则中的 host,而该翻页规则内的其他规则内容则不变。
// 即更灵活了,无需每次为了修改部分规则而去复制全部规则了,也不用担心我后续更新这个外置规则后,你还需要再次复制一遍来修改。。。

"aaa": {
    "host": "ccc.com",
    "inherits": true
}

大家也可以在下面 提出改进建议分享规则~


# 规则总览(只列出了目前 自定义翻页规则 能用的)

「 点击展开查看 」 **** ``` yaml inherits: 继承标识,仅用于自定义规则,用于增删改某个外置规则的部分规则时,可使用该标识来省略不需要修改的规则,只写有变化的规则 host: 先匹配域名,可以是文本,也可以是正则表达式,也可以是数组(数组中也可以文本和正则表达式混合使用),如果省略,则默认匹配所有域名(会对所有域名匹配 url 规则判断,可以当成一个简单的外置/自定义通用规则的方案) url: 匹配到域名后,再来匹配 URL,也可以用来执行一些 JS 代码 urlC: 对于使用 pjax 技术的网站,需要监听 URL 变化来重新判断翻页规则(需要放在 url: 中,自定义规则的话需要使用 fun.isUrlC()) noReferer: 获取下一页内容时,不携带 Referer(部分网站携带与不携带可能不一样) hiddenPN: 不显示脚本左下角的页码 history: 添加历史记录 并 修改当前 URL(默认开启,对于不支持的网站要设置为 false) thread: 对于社区类网站,要在 帖子内 的规则中加入这个,用于脚本的 [帖子内自动翻页] 功能(即用户可以选择开启/关闭所有社区类网站帖子内的自动翻页) style: 要插入网页的 CSS Style 样式,当只需要单纯屏蔽部分网页元素时,可以只写 CSS 选择器省略掉 {display: none !important;} retry: 允许获取失败后重试 blank: 强制新标签页打开链接 1 = 网页 添加 来让所有链接默认新标签页打开(对已单独指定 target 或已监听点击事件的元素无效) 2 = 对 委托点击事件 3 = 对 pageE 的父元素 委托点击事件(也会阻止冒泡,但因为距离 标签较远,因此只有在委托点击事件的元素是 pageE 的父元素的父元素时,才有意义) 4 = 对 pageE 的子元素 标签 添加 target="_blank" 5 = 对 pageE 的子元素 标签 清理事件后 再添加 target="_blank" 6 = 对 pageE 的子元素 标签 清理事件后 再添加 target="_blank" 并阻止冒泡(避免父元素事件委托捕获该元素的点击事件) pager: { type: 翻页模式 1 = 由脚本实现自动无缝翻页,可省略(适用于:静态加载内容网站,常规模式) 2 = 只需要点击下一页按钮(适用于:网站自带了 自动无缝翻页 功能) nextText: 按钮文本,当按钮文本 = 该文本时,才会点击按钮加载下一页(避免一瞬间加载太多次下一页,下同) nextTextOf: 按钮文本的一部分,当按钮文本包含该文本时,才会点击按钮加载下一页 nextHTML: 按钮内元素,当按钮内元素 = 该元素内容时,才会点击按钮加载下一页 interval: 点击间隔时间,对于没有按钮文字变化的按钮,可以手动指定间隔时间(省略后默认 500ms,当指定上面三个时,会忽略 interval) isHidden: 只有下一页按钮可见时(没有被隐藏),才会点击 3 = 依靠 [基准元素] 与 [浏览器可视区域底部] 之间的距离缩小来触发翻页(适用于:主体元素下方内容太多 且 高度不固定时) scrollE: 作为基准线的元素(一般为底部页码元素),和 replaceE 一样的话可以省略 scrollD: 当 [基准元素] 与 [可视区域底部] 之间的距离 等于或小于该值时,将触发翻页,省略后默认 2000 4 = 动态加载类网站(适用于:简单的动态加载内容网站) insertE: 用来插入元素的函数 5 = 插入 iframe 方式来加载下一页,无限套娃(适用于:部分动态加载内容的网站,需要允许 iframe 且支持通过 GET/POST 直接打开下一页) style: 加载 iframe 前要插入的 CSS Style 样式(比如为了悬浮的样式与下一页的重叠,隐藏网页底部间距提高阅读连续性) iframe: 这个必须加到 pager{} 外面(这样才会在该域名的 iframe 框架下运行脚本) 6 = 通过 iframe 获取下一页动态加载内容插入本页,只有一个娃(适用于:部分动态加载内容的网站,与上面不同的是,该模式适合简单的网页,没有复杂事件什么的) loadTime: 预留的网页加载时间,确保网页内容加载完成(省略后默认为 300ms) nextL: 下一页链接所在元素 pageE: 要从下一页获取的元素 insertP: 下一页元素插入本页的位置(数组第一个是基准元素,第二个是基准元素的前后具体位置) 1 = 插入基准元素自身的前面 2 = 插入基准元素内,第一个子元素前面 3 = 插入基准元素内,最后一个子元素后面 4 = 插入基准元素自身的后面 5 = 插入 pageE 列表最后一个元素的后面(该 insertP 可以直接省略不写,等同于 ['pageE', 5] ) 6 = 插入该元素自身内部末尾(针对小说网站等文本类的),附带参数 insertP6Br: true, 用来中间插入换行 // 小技巧:当基准元素是下一页主体元素的父元素时(或者说要将下一页元素插入到本页同元素最后一个后面时)是可以省略不写 insertP 例如:当 pageE: 'css;ul>li' 且 insertP: ['css;ul', 3] 时,实际等同于 ['css;ul>li', 5] 当 pageE: 'css;.item' 且 insertP: ['css;.item', 4] 时,实际等同于 ['css;.item', 5] 当 pageE: 'css;.item' 且 insertP: ['css;.page', 1] 时,实际等同于 ['css;.item', 5] 注意:如 pageE 中选择了多类元素,则不能省略 insertP(比如包含 `,` 与 `|` 符号),除非另外的选择器是 Githubissues.
  • Githubissues is a development platform for aggregating issues.