书源规则说明
概况
- 1、语法说明
- 2、特殊规则
- 3、书源之「基本」
- 4、书源之「搜索」
- 5、书源之「发现」
- 6、书源之「详情页」
- 7、书源之「目录」
- 8、书源之「正文」
- 9、补充说明
1、语法说明
JSOUP之Default
语法如下:
-
xxxxxxxxxx
@为分隔符,用来分隔获取规则
每段规则可分为3段
第一段是类型,如class,id,tag,text,children等, children获取所有子标签,不需要第二段和第三段,text可以根据文本内容获取
第二段是名称,text. 第二段为文本内容的一部分
第三段是位置,class,tag,id等会获取到多个,所以要加位置
如不加位置会获取所有
位置正着数从0开始,0是第一个,如为负数则是取倒着数的值,-1为倒数第一个,-2为倒数第二个
!是排除,有些位置不符合需要排除用!,后面的序号用:隔开0是第1个,负数为倒数序号,-1最后一个,-2倒数第2个,依次
获取列表的最前面加上负号- 可以使列表倒置,有些网站目录列表是倒的,前面加个负号可变为正的
@的最后一段为获取内容,如text,textNodes,ownText,href,src,html,all等
如需要正则替换在最后加上 ##正则表达式##替换内容,替换内容为空时,第二个##可以省略
例:[email protected]@text||[email protected]@text##全文阅读
例:[email protected]@[email protected]@text##全文阅读 标准规范与实现库 Package org.jsoup.select, CSS-like element selector
JSOUP之CSS
语法见https://blog.csdn.net/hou_angela/article/details/80519718
必须以 @css: 开头
标准规范与实现库 Package org.jsoup.select
在线测试 Try jsoup online
注意:获取内容可用text,textNodes,ownText,html,all,href,src等
例子见最后的【书源一】的搜索页和正文页规则
JSONPath
语法见 JsonPath教程
最好以 @json: 或 $. 开头,其他形式不可靠
标准规范 goessner JSONPath - XPath for JSON
实现库 json-path/JsonPath
在线测试 Jayway JsonPath Evaluator
例子见最后的【书源三】的搜索页、目录页和正文页规则
XPath
语法见 XPath教程-入门、XPath教程-基础、XPath教程-高级、XPath库的说明
必须以 @XPath: 或 // 开头
标准规范 W3C XPATH 1.0
实现库 hegexiaohuozi/JsoupXpath
例子见最后的【书源二】的搜索页、详情页和正文页规则,以及目录页的下一页规则
JavaScript
可以在
、@js:中使用,结果存在result中 @js:只能放在其他规则的最后使用
可以在任意位置使用,还能作为其他规则的分隔符,例:tag.li //a 在搜索列表、发现列表和目录中使用可以用+开头,使用AllInOne规则
正则之AllInOne
只能在搜索列表、发现列表、详情页预加载和目录列表中使用
必须以 : 开头
教程 veedrin/horseshoe 2018-10 | Regex专题
语法 方法 引擎例子见最后的【书源一】的目录页规则,最前面的-表示目录倒序,以及【书源二】的目录页规则
正则之OnlyOne
形式 ##正则表达式##替换内容###
只能在搜索列表、发现列表、详情页预加载、目录列表之外使用
例子见最后的【书源一】的详情页规则
注意点:该规则只能获取第一个匹配到的结果并进行替换
正则之净化
形式 ##正则表达式##替换内容
只能跟在其他规则后面,独立使用相当于all##正则表达式##替换内容
例子见最后的【书源一】的正文页规则
注意点:该规则为循环匹配替换
自定义三种连接符号
符号:&&、||、%%
只能在同种规则间使用,不包括js和正则
&&会合并所有取到的值,
||会以第一个取到值的为准
%%会依次取数,如三个列表,
先取列表1的第一个,再取列表2的第一个,再取列表3的第一个,
再取列表1的第二个,再取列表2的第二个...
2、特殊规则
- URL必知必会
- 请求头
-
一般形式,如下所示
xxxxxxxxxx
{
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
"Accept-Language":"zh-CN,zh;q=0.9"
} -
复杂情况可使用js
xxxxxxxxxx
(()=>{
var ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36";
var headers = {"User-Agent": ua};
return JSON.stringify(headers);
})()
※其中,ua必须保证是JavaScript的String类型,JSON.stringify()才能将header转换为字符串。
- GET请求
-
一般形式如下,charset为utf-8时可省略,无特殊情况不需要请求头和webView,参数webView非空时采用webView加载
xxxxxxxxxx
https://www.baidu.com,{
"charset": "gbk",
"headers": {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"},
"webView": true
} -
复杂情况可使用js
xxxxxxxxxx
var ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36";
var headers = {"User-Agent": ua};
var option = {
"charset": "gbk",
"headers": headers,
"webView": true
};
"https://www.baidu.com," + JSON.stringify(option)
- POST请求
-
一般形式如下,body是请求体,charset为utf-8时可省略,无特殊情况不需要请求头和webView,参数webView非空时采用webView加载
xxxxxxxxxx
https://www.baidu.com,{
"charset": "gbk",
"method": "POST",
"body": "bid=10086",
"headers": {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"},
"webView": true
} -
复杂情况可使用js
xxxxxxxxxx
var ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36";
var headers = {"User-Agent": ua};
var body = "bid="+"10086";
var option = {
"charset": "gbk",
"method": "POST",
"body": String(body),
"headers": headers,
"webView": true
};
"https://www.baidu.com," + JSON.stringify(option)
※其中,body必须保证是JavaScript的String类型,变量是计算得到的尽量都用String()强转一下类型。
变量的put与get
@put与@get
只能用于js以外的规则中,@put里使用JSONPath不需要加引号,其他规则需要加引号,
例:@put:{bid:"//*[@bid-data]/@bid-data"}java.put与java.get
只能用于js中,在js中无法使用@get
- {{}}与{}规则
在搜索URL与发现URL中的{{}}
在{{}}里只能使用js在搜索URL与发现URL以外的{{}}
可在{{}}中使用任意规则(正则除外?),默认为js,使用其他规则需要有明显的标志头,
如:Default规则需要以@@开头,XPath需要以@xpath:或//开头,JSONPath需要以@json:或$.开头,CSS需要以@css:开头{}规则
留用了阅读2.0的规则,只能使用JSONPath,尽量避免使用
- 自定义js
- 在js中调用java的常规方法:由于java这个关键字已经被使用,调用java开头的包名时需使用全局变量Packages 参考脚本之家
只调用某个public函数:,例:io.legado.app.utils.htmlFormat(str)、org.jsoup.Jsoup.parse(str)
直接引入java类,如下所示,引入了两个java包,java包的作用域是在with的范围内,其内使用java相关语法,最后在作用域外被js调用了作用域内的函数
-
xxxxxxxxxx
var javaImport = new JavaImporter();
javaImport.importPackage(
Packages.java.lang,
Packages.java.security
);
with(javaImport){
function strToMd5By32(str) {
var reStr = null;
var md5 = MessageDigest.getInstance("MD5");
var bytes = md5.digest(String(str).getBytes());
var stringBuffer = new StringBuilder();
bytes.forEach(a=>{
var bt = a & 0xff;
if (bt < 16) {
stringBuffer.append("0");
}
stringBuffer.append(Integer.toHexString(bt));
});
reStr = stringBuffer.toString();
return reStr;
}
}
strToMd5By32('123')
- 下面是一些常用的函数/变量
-
x
//当前页的responseBody
result
//当前页的URL
baseUrl//访问网络,urlStr为url字符串,返回类型String?
java.ajax(urlStr: String)
//访问网络,urlStr为url字符串,返回Response,已废弃
java.connect(urlStr: String)
//文件下载,content为十六进制字符串,url用于生成文件名,返回String文件路径
java.downloadFile(content: String, url: String)
//文件解压,zipPath为压缩文件路径,返回String解压路径,会删除原文件只保留解压后的文件
java.unzipFile(zipPath: String)
//文件夹内所有文件读取,返回内容String,会删除原文件
java.getTxtInFolder(unzipPath: String)
//删除文件/文件夹路径,path为路径
java.deleteFolder(path: String)
//实现重定向拦截,返回[Connection.Response](https://jsoup.org/apidocs/org/jsoup/Connection.Response.html)
java.get(url: String, headers: Map)
java.post(urlStr: String, body: String, headers: Map)
//实现cookie读取,返回String
java.getCookie(tag: String, key: String?)
//base64解码,返回类型String
java.base64Decode(str: String)
java.base64Decode(str: String, flags: Int)
//base64解码,返回类型ByteArray?
java.base64DecodeToByteArray(str: String?)
java.base64DecodeToByteArray(str: String?, flags: Int)
//base64编码,返回类型String?
java.base64Encode(str: String)
java.base64Encode(str: String, flags: Int)
//md5编码,返回类型String?
java.md5Encode(str: String)
java.md5Encode16(str: String)
//格式化时间戳,返回类型String
java.timeFormat(timestamp: Long)
java.timeFormat(time: String)
//utf8编码转gbk编码,返回String
java.utf8ToGbk(str: String)
//实现字符串的URI编码,enc为编码格式,返回String
java.encodeURI(str: String) //默认enc="UTF-8"
java.encodeURI(str: String, enc: String)
//html格式化,返回String
java.htmlFormat(str: String)
//读取本地文件,返回ByteArray
java.readFile(path: String)
//读取本地文本文件,charsetName为编码格式
java.readTxtFile(path: String) //默认charsetName="UTF-8"
java.readTxtFile(path: String, charsetName: String)
//解析字体,返回字体解析类QueryTTF?
java.queryBase64TTF(base64: String?)
java.queryTTF(str: String?)
java.replaceFont(text: String,font1: QueryTTF?,font2: QueryTTF?)
//输出调试日志
java.log(msg: String)
/**************以下部分方法由于JAVA不支持参数默认值,调用时不能省略***************/
//设置需解析的内容content和baseUrl,返回类型AnalyzeRule
java.setContent(content: Any?, baseUrl: String? = this.baseUrl)
//输入规则rule和URL标志isUrl获取文本列表,返回类型List?
java.getStringList(rule: String, isUrl: Boolean = false)
//输入规则rule和URL标志isUrl获取文本,返回类型String
java.getString(ruleStr: String?, isUrl: Boolean = false)
//输入规则ruleStr获取节点列表,返回类型List
java.getElements(ruleStr: String)
3、书源之「基本」
书源URL(bookSourceUrl)
必填
唯一标识,不可重复
与其他源相同会覆盖
书源名称(bookSourceName)
必填
名字可重复
书源分组(bookSourceGroup)
可不填
用于整理源
登录URL(loginUrl)
可不填
用于登录个人账户
书籍URL正则(bookUrlPattern)
可不填
添加网址时,用于识别书源
-
xxxxxxxxxx
例:https?://www.piaotian.com/bookinfo/.*
请求头(header)
可不填
访问网址时使用
4、书源之「搜索」
搜索地址(url)
key为关键字标识,通常形态为{{key}},运行时会替换为搜索关键字
也可以对key进行加密等操作,如:{{java.base64Encode(key)}}page为关键字标识,通常形态为{{page}},page的初值为1也可以对page进行计算,
如:{{(page-1)*20}},有时会遇到第一页没有页数的情况,有两种方法:
① {{page - 1 == 0 ? "": page}}
② <,{{page}}>支持相对URL
书籍列表规则(bookList)
书名规则(name)
作者规则(author)
分类规则(kind)
字数规则(wordCount)
最新章节规则(lastChapter)
简介规则(intro)
封面规则(coverUrl)
详情页url规则(bookUrl)
5、书源之「发现」
发现地址规则(url)
page为关键字标识,通常形态为{{page}},page的初值为1,也可以对page进行计算,
如:{{(page-1)*20}},有时会遇到第一页没有页数的情况,有两种方法:
① {{page - 1 == 0 ? "": page}}
② <,{{page}}>发现URL可使用&&或换行符隔开
支持相对URL
书籍列表规则(bookList)
书名规则(name)
作者规则(author)
分类规则(kind)
字数规则(wordCount)
最新章节规则(lastChapter)
简介规则(intro)
封面规则(coverUrl)
详情页url规则(bookUrl)
6、书源之「详情」
预处理规则(bookInfoInit)
只能使用正则之AllInOne或者js
正则之AllInOne必须以:开头
-
js的返回值需要是json对象,例:
xxxxxxxxxx
(function(){
return {
a:"圣墟",
b:"辰东",
c:"玄幻",
d:"200万字",
e:"第两千章 辰东肾虚",
f:"在破败中崛起,在寂灭中复苏。沧海成尘,雷电枯竭...",
g:"https://bookcover.yuewen.com/qdbimg/349573/1004608738/300",
h:"https://m.qidian.com/book/1004608738"
};
})()
此时,书名规则填a,作者规则填b,分类规则填c,字数规则填d,最新章节规则填e,简介规则f,封面规则填g,目录URL规则填h
书名规则(name)
作者规则(author)
分类规则(kind)
字数规则(wordCount)
最新章节规则(lastChapter)
简介规则(intro)
封面规则(coverUrl)
目录URL规则(tocUrl)
7、书源之「目录」
目录列表规则(chapterList)
首字符使用负号(-)可使列表反序
章节名称规则(ruleChapterName)
章节URL规则(chapterUrl)
VIP标识(isVip)
当结果为null false 0 ""时为非VIP
章节信息(ChapterInfo)
可调用java.timeFormat(timestamp: Long)将时间戳转为yyyy/MM/dd HH:mm格式的时间
目录下一页规则(nextTocUrl)
可返回list或者string
js中返回 []或 null或 ""时停止加载下一页
8、书源之「正文」
正文规则(content)
-
如下示例,在详情页(目录页)和正文使用webView加载,例:
x
{
"bookSourceComment": "",
"bookSourceGroup": " 有声",
"bookSourceName": "猫耳FM",
"bookSourceType": 1,
"bookSourceUrl": "https://www.missevan.com",
"customOrder": 0,
"enabled": false,
"enabledExplore": true,
"lastUpdateTime": 0,
"ruleBookInfo": {},
"ruleContent": {
"content": "https://static.missevan.com/{{//*[contains(@class,"pld-sound-active")]/@data-soundurl64}}",
"sourceRegex": "",
"webJs": ""
},
"ruleExplore": {},
"ruleSearch": {
"author": "author",
"bookList": ".id}},{"webView":true}",
"coverUrl": "cover ",
"intro": "abstract",
"kind": "{{.catalog_name}}",
"lastChapter": "newest ",
"name": "name",
"wordCount": "catalog_name "
},
"ruleToc": {
"chapterList": "@css:.scroll-list.btn-groups>a",
"chapterName": "text",
"chapterUrl": "href##$##,{"webView":true}"
},
"searchUrl": "https://www.missevan.com/dramaapi/search?s={{key}}&page=1",
"weight": 0
} 正文下一页URL规则(nextContentUrl)
webJs
用于模拟鼠标点击等操作,必须有返回值(不为空,表示webjs执行成功,否则会无限循环),返回值会用于资源正则或正文中
举个栗子,在webJs中执行了getDecode(),使正文部分解密:
-
x
{
"bookSourceGroup": "阅读3.0书源合集",
"bookSourceName": "斋书苑",
"bookSourceType": 0,
"bookSourceUrl": "https://www.zhaishuyuan.com",
"bookUrlPattern": "",
"customOrder": 11,
"enabled": false,
"enabledExplore": false,
"exploreUrl": "男生书库::/shuku/0_1_0_0_0_{{page}}0_0\n男频连载::/shuku/0_2_0_0_0{{page}}0_0\n男频完结::/shuku/0_3_0_0_0{{page}}0_0\n添加时间::/shuku/0_1_0_0_8{{page}}0_0\n总点击榜::/shuku/0_1_0_0_2{{page}}0_0\n月点击榜::/shuku/0_1_0_0_5{{page}}0_0\n周点击榜::/shuku/0_1_0_0_4{{page}}0_0\n总推荐榜::/shuku/0_1_0_0_1{{page}}0_0\n月推荐榜::/shuku/0_1_0_0_7{{page}}0_0\n周推荐榜::/shuku/0_1_0_0_6{{page}}0_0\n总收藏榜::/shuku/0_1_0_0_3{{page}}0_0\n总字数榜::/shuku/0_1_0_0_9{{page}}0_0\n玄幻奇幻::/shuku/1_1_0_0_0{{page}}0_0\n东方玄幻::/shuku/1_1_0_11_0{{page}}0_0\n异世大陆::/shuku/1_1_0_12_0{{page}}0_0\n史诗奇幻::/shuku/1_1_0_13_0{{page}}0_0\n异类兽族::/shuku/1_1_0_14_0{{page}}0_0\n历史神话::/shuku/1_1_0_15_0{{page}}0_0\n王朝争霸::/shuku/1_1_0_16_0{{page}}0_0\n高武世界::/shuku/1_1_0_17_0{{page}}0_0\n剑与魔法::/shuku/1_1_0_18_0{{page}}0_0\n二次元 ::/shuku/1_1_0_19_0{{page}}0_0\n武侠仙侠::/shuku/2_1_0_0_0{{page}}0_0\n古典仙侠::/shuku/2_1_0_21_0{{page}}0_0\n修真文明::/shuku/2_1_0_22_0{{page}}0_0\n现代修真::/shuku/2_1_0_23_0{{page}}0_0\n神话修真::/shuku/2_1_0_24_0{{page}}0_0\n传统武侠::/shuku/2_1_0_25_0{{page}}0_0\n浪子异侠::/shuku/2_1_0_26_0{{page}}0_0\n国术武技::/shuku/2_1_0_27_0{{page}}0_0\n武侠幻想::/shuku/2_1_0_28_0{{page}}0_0\n幻想修仙::/shuku/2_1_0_29_0{{page}}0_0\n都市青春::/shuku/3_1_0_0_0{{page}}0_0\n都市生活::/shuku/3_1_0_31_0{{page}}0_0\n官场沉浮::/shuku/3_1_0_32_0{{page}}0_0\n娱乐明星::/shuku/3_1_0_33_0{{page}}0_0\n乡土小说::/shuku/3_1_0_34_0{{page}}0_0\n异术超能::/shuku/3_1_0_35_0{{page}}0_0\n现实百态::/shuku/3_1_0_36_0{{page}}0_0\n校园青春::/shuku/3_1_0_37_0{{page}}0_0\n历史军事::/shuku/4_1_0_0_0{{page}}0_0\n架空历史::/shuku/4_1_0_41_0{{page}}0_0\n上古先秦::/shuku/4_1_0_42_0{{page}}0_0\n秦汉三国::/shuku/4_1_0_43_0{{page}}0_0\n两晋隋唐::/shuku/4_1_0_44_0{{page}}0_0\n五代十国::/shuku/4_1_0_45_0{{page}}0_0\n两宋元明::/shuku/4_1_0_46_0{{page}}0_0\n清史民国::/shuku/4_1_0_47_0{{page}}0_0\n外国历史::/shuku/4_1_0_48_0{{page}}0_0\n历史传记::/shuku/4_1_0_49_0{{page}}0_0\n军事战争::/shuku/4_1_0_410_0{{page}}0_0\n抗战烽火::/shuku/4_1_0_411_0{{page}}0_0\n战争幻想::/shuku/4_1_0_412_0{{page}}0_0\n科幻灵异::/shuku/5_1_0_0_0{{page}}0_0\n未来世界::/shuku/5_1_0_51_0{{page}}0_0\n星际文明::/shuku/5_1_0_52_0{{page}}0_0\n宇宙练功::/shuku/5_1_0_53_0{{page}}0_0\n超级科技::/shuku/5_1_0_54_0{{page}}0_0\n时空穿梭::/shuku/5_1_0_55_0{{page}}0_0\n进化变异::/shuku/5_1_0_56_0{{page}}0_0\n末世危机::/shuku/5_1_0_57_0{{page}}0_0\n灵异鬼怪::/shuku/5_1_0_58_0{{page}}0_0\n恐怖惊悚::/shuku/5_1_0_59_0{{page}}0_0\n悬疑侦探::/shuku/5_1_0_510_0{{page}}0_0\n寻墓探险::/shuku/5_1_0_511_0{{page}}0_0\n风水秘术::/shuku/5_1_0_512_0{{page}}0_0\n游戏竞技::/shuku/6_1_0_0_0{{page}}0_0\n虚拟网游::/shuku/6_1_0_61_0{{page}}0_0\n游戏异界::/shuku/6_1_0_61_0{{page}}0_0\n体育竞技::/shuku/6_1_0_61_0{{page}}0_0\n游戏生涯::/shuku/6_1_0_61_0{{page}}0_0\n电子竞技::/shuku/6_1_0_61_0{{page}}0_0\n弈林春秋::/shuku/6_1_0_61_0{{page}}0_0\n女生书库::/shuku/9_1_0_0_0{{page}}0_0\n女频连载::/shuku/9_2_0_0_0{{page}}0_0\n女频完结::/shuku/9_3_0_0_0{{page}}0_0\n添加时间::/shuku/9_1_0_0_8{{page}}0_0\n总点击榜::/shuku/9_1_0_0_2{{page}}0_0\n月点击榜::/shuku/9_1_0_0_5{{page}}0_0\n周点击榜::/shuku/9_1_0_0_4{{page}}0_0\n总推荐榜::/shuku/9_1_0_0_1{{page}}0_0\n月推荐榜::/shuku/9_1_0_0_7{{page}}0_0\n周推荐榜::/shuku/9_1_0_0_6{{page}}0_0\n总收藏榜::/shuku/9_1_0_0_3{{page}}0_0\n总字数榜::/shuku/9_1_0_0_9{{page}}0_0\n豪门总裁::/shuku/9_1_0_91_0{{page}}0_0\n都市生活::/shuku/9_1_0_92_0{{page}}0_0\n青春校园::/shuku/9_1_0_93_0{{page}}0_0\n都市异能::/shuku/9_1_0_94_0{{page}}0_0\n星际科幻::/shuku/9_1_0_95_0{{page}}0_0\n游戏竞技::/shuku/9_1_0_96_0{{page}}0_0\n灵异推理::/shuku/9_1_0_97_0{{page}}0_0\n婚恋情缘::/shuku/9_1_0_98_0{{page}}0_0\n官场沉浮::/shuku/9_1_0_99_0{{page}}0_0\n娱乐明星::/shuku/9_1_0_910_0{{page}}0_0\n穿越架空::/shuku/9_1_0_911_0{{page}}0_0\n经商种田::/shuku/9_1_0_912_0{{page}}0_0\n玄幻仙侠::/shuku/9_1_0_913_0{{page}}0_0\n历史军事::/shuku/9_1_0_914_0{{page}}0_0\n宫闱宅斗::/shuku/9_1_0_915_0{{page}}0_0\n重生复仇::/shuku/9_1_0_916_0{{page}}0_0\n豪门恩怨::/shuku/9_1_0_917_0{{page}}_0_0",
"lastUpdateTime": 0,
"loginUrl": "",
"ruleBookInfo": {
"author": "@css:[property=og:novel:author]@content",
"coverUrl": "@css:[property=og:image]@content",
"intro": "@css:#bookintro@html",
"kind": "@css:[property=og:novel:category]@content",
"lastChapter": "@css:[property=og:novel:latest_chapter_name]@content",
"name": "@css:[property=og:novel:book_name]@content",
"tocUrl": "@css:[property=og:novel:read_url]@content",
"wordCount": "@css:.count li:eq(3)>span@text"
},
"ruleContent": {
"content": "all",
"nextContentUrl": "",
"webJs": "getDecode();1.jpg###",
"intro": "//li[6]/text()",
"kind": "//li[2]/text()##\[|\]",
"lastChapter": "//span/a/text()",
"name": "//li[3]/a/text()",
"wordCount": "//li[5]/text()"
},
"ruleSearch": {
"author": "//dd[2]/span[1]/text()",
"bookList": "//[@id="sitembox"]/dl",
"bookUrl": "//dt/a/@href",
"coverUrl": "//img/@_src",
"intro": "//dd[3]/html()",
"kind": "//dd[2]/span[3]/text()",
"lastChapter": "//dd[4]/a/text()",
"name": "//h3/a//text()",
"wordCount": "//dd[2]/span[4]/text()"
},
"ruleToc": {
"chapterList": ":href="(/chapter/[^"])"[>]*>([<])([^<])",
"chapterName": "1,{"webView":true}",
"nextTocUrl": "//strong/following-sibling::a/@href",
"updateTime": "$3"
},
"searchUrl": "/search/,{\n "charset": "gbk",\n "method": "POST",\n "body": "page={{page}}&key={{key}}"\n}",
"weight": 0
} 资源正则(sourceRegex)
用于嗅探
一般情况下的无脑教程如下_φ( °-°)/
章节链接后面加 ,{"webView":true}٩(๑❛ᴗ❛๑)۶,不要洒敷敷的写成 tag.a@href,{"webView":true}或$.link,{"webView":true}
在有嗅探功能的浏览器(如:via、x浏览器等)中,输入章节链接。注意(。•́︿•̀。) 千万别带,{"webView":true} (╯﹏╰)b
媒体开始播放后使用浏览器的嗅探功能,查看资源的链接
在资源正则里填写资源链接的正则,一般写..(mp3|mp4).这个就可以了
最后在正文填写
result ヾ(@▽@)ノ-
如下示例,在正文嗅探mp3和mp4的资源:
x
{
"bookSourceComment": "",
"bookSourceGroup": " 有声",
"bookSourceName": "猫耳FM",
"bookSourceType": 1,
"bookSourceUrl": "https://www.missevan.com",
"customOrder": 0,
"enabled": false,
"enabledExplore": true,
"lastUpdateTime": 0,
"ruleBookInfo": {},
"ruleContent": {
"content": "https://static.missevan.com/{{//*[contains(@class,"pld-sound-active")]/@data-soundurl64}}",
"sourceRegex": "",
"webJs": ""
},
"ruleExplore": {},
"ruleSearch": {
"author": "author",
"bookList": ".id}},{"webView":true}",
"coverUrl": "cover ",
"intro": "abstract",
"kind": "{{.catalog_name}}",
"lastChapter": "newest ",
"name": "name",
"wordCount": "catalog_name "
},
"ruleToc": {
"chapterList": "@css:.scroll-list.btn-groups>a",
"chapterName": "text",
"chapterUrl": "href##$##,{"webView":true}"
},
"searchUrl": "https://www.missevan.com/dramaapi/search?s={{key}}&page=1",
"weight": 0
}
9、补充说明
-
显示js的报错信息
xxxxxxxxxx
(function(result){
try{
// 处理result
// ...
// 当返回结果为字符串时
return result;
// 当返回结果为列表时
return list;
}
catch(e){
// 当返回结果为字符串时
return ""+e;
// 当返回结果为列表时
return [""+e]; //列表对应名称处填""+result 查看
}
})(result); 请善用调试功能
调试搜索
输入关键字,如:系统调试发现
输入发现URL,如:月票榜::https://www.qidian.com/rank/yuepiao?page={{page}}调试详情页
输入详情页URL,如:https://m.qidian.com/book/1015609210调试目录页
输入目录页URL,如:++https://www.zhaishuyuan.com/read/30394调试正文页
输入正文页URL,如:--https://www.zhaishuyuan.com/chapter/30394/20940996无脑{"webView":true}很方便
特别注意用JSON.stringify()方法时,需要保证JSON对象的value都是JavaScript的String类型(在阅读3.0中)
附:
-
书源一
x
{
"bookSourceComment": "",
"bookSourceGroup": "CSS; 正则",
"bookSourceName": "小说2016",
"bookSourceType": 0,
"bookSourceUrl": "https://www.xiaoshuo2016.com",
"bookUrlPattern": "",
"customOrder": 0,
"enabled": true,
"enabledExplore": false,
"exploreUrl": "",
"lastUpdateTime": 0,
"loginUrl": "",
"ruleBookInfo": {
"author": "##:author"["]+"(["])##1###",
"intro": "##:description"[^"]+"([\w\W]?)"/##1###",
"lastChapter": "##_chapter_name"["]+"(["])##1###",
"tocUrl": ""
},
"ruleContent": {
"content": "@css:.articleDiv p@textNodes##搜索.手机访问|一秒记住.|.阅读下载|",
"nextContentUrl": ""
},
"ruleExplore": {},
"ruleSearch": {
"author": "@css:p:eq(2)>a@text",
"bookList": "@css:li.clearfix",
"bookUrl": "@css:.name>a@href",
"coverUrl": "@css:img@src",
"intro": "@css:.note.clearfix p@text",
"kind": "@css:.note_text,p:eq(4)@text",
"lastChapter": "@css:p:eq(3)@text",
"name": "@css:.name@text"
},
"ruleToc": {
"chapterList": "-: - "]+"(["])">([^<])",
"chapterName": "1",
"nextTocUrl": ""
},
"searchUrl": "/modules/article/search.php?searchkey={{key}}&submit=&page={{page}},{\n "charset": "gbk"\n}",
"weight": 0
} -
书源二
x
{
"bookSourceComment": "",
"bookSourceGroup": "XPath; 正则",
"bookSourceName": "采墨阁手机版",
"bookSourceType": 0,
"bookSourceUrl": "https://m.caimoge.com",
"bookUrlPattern": "",
"customOrder": 0,
"enabled": true,
"enabledExplore": false,
"exploreUrl": "",
"lastUpdateTime": 0,
"loginUrl": "",
"ruleBookInfo": {
"author": "//[@property="og:novel:author"]/@content",
"coverUrl": "//[@property="og:image"]/@content",
"intro": "//[@property="og:description"]/@content",
"kind": "//[@property="og:novel:category"]/@content",
"lastChapter": "//[@id="newlist"]//li[1]/a/text()",
"name": "//[@property="og:novel:book_name"]/@content",
"tocUrl": "//a[text()="阅读"]/@href"
},
"ruleContent": {
"content": "//[@id="content"]",
"nextContentUrl": ""
},
"ruleExplore": {},
"ruleSearch": {
"author": "//dd[2]/text()",
"bookList": "//[@id="sitebox"]/dl",
"bookUrl": "//dt/a/@href",
"coverUrl": "//img/@src",
"kind": "//dd[2]/span/text()",
"lastChapter": "",
"name": "//h3/a/text()"
},
"ruleToc": {
"chapterList": ":href="(/read["]*html)">([<])",
"chapterName": "1",
"nextTocUrl": "//[@id="pagelist"]/*[position()>1]/@value"
},
"searchUrl": "/search.html,{\n "method": "POST",\n "body": "searchkey={{key}}"\n}",
"weight": 0
} -
书源三
x
{
"bookSourceComment": "",
"bookSourceGroup": "JSon",
"bookSourceName": "猎鹰小说网",
"bookSourceType": 0,
"bookSourceUrl": "http://api.book.lieying.cn",
"customOrder": 0,
"enabled": true,
"enabledExplore": false,
"header": "{\n "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"\n}",
"lastUpdateTime": 0,
"ruleBookInfo": {},
"ruleContent": {
"content": ".author",
"bookList": "._id}",
"coverUrl": ".shortIntro",
"kind": ".lastChapter",
"name": ".chapterInfo.chapters.[]",
"chapterName": ".link"
},
"searchUrl": "/Book/search?query={{key}}&start={{(page-1)20}}&limit=40&device_type=android&app_version=165",
"weight": 0
}