书源规则说明

书源规则说明

概况

  • 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必知必会
  1. 请求头
  • 一般形式,如下所示

    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转换为字符串。

  1. 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)

  1. 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

  1. @put与@get
    只能用于js以外的规则中,@put里使用JSONPath不需要加引号,其他规则需要加引号,
    例:@put:{bid:"//*[@bid-data]/@bid-data"}

  2. java.put与java.get
    只能用于js中,在js中无法使用@get

  • {{}}与{}规则
  1. 在搜索URL与发现URL中的{{}}
    在{{}}里只能使用js

  2. 在搜索URL与发现URL以外的{{}}
    可在{{}}中使用任意规则(正则除外?),默认为js,使用其他规则需要有明显的标志头,
    如:Default规则需要以@@开头,XPath需要以@xpath:或//开头,JSONPath需要以@json:或$.开头,CSS需要以@css:开头

  3. {}规则
    留用了阅读2.0的规则,只能使用JSONPath,尽量避免使用

  • 自定义js
  1. 在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')

  1. 下面是一些常用的函数/变量
  • 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
    }

你可能感兴趣的:(书源规则说明)