阅读书源制作笔记

常见源类型处理

WEB

WEB网页型,使用html,js,css组合开发

HTML

解析HTML,因为是默认规则,即XPath,所以不用添加什么开头字符

APP

APP应用型,实现方式五花八门,但阅读唯一能处理的,也是大部分APP使用的就是HTTP协议实现的,但HTTP只是通信协议,具体通信数据也是五花八门,阅读能处理的,也是大部分APP使用的就是JSON,当然也不只限APP,WEB里也可能遇到

JSON

解析JSON数据,使用的JSONPath语法,使用$开头,以.分隔层级,类似文件系统里的/
。在线测试网站:JSONPath Online Evaluator

REGEX

也就是正则表达式,这个是通用的,既适用WEB,也适用APP,规则就是##正则##替换内容,若是替换内容为空,则正则后面内容可省略

发现

1
2
3
4
5
6
7
8
9
10
[
{
"title": "玄幻修真",
"url": "/api/ajax/list,{'method':'POST','body':'token=6e3d23fec1cfb91ea31c6f6870b4d093&time=1702660662&sort=1&key=1&order=1&page={{page}}'}"
},
{
"title": "都市言情",
"url": "/api/ajax/list,{'method':'POST','body':'token=e3a12a6ab5a73dda5ea82745839864a9&time=1702663025&sort=1&key=5&order=1&page={{page}}'}"
}
]

FAQ

Q: 搜索请求使用POST,GB2312编码,并且html内容是动态加载的
用规则说话:

1
https://qqq.xxx.com/ss/qq?q={{key}},{'method':'POST','charset':'gb2312','webView':true}

Q: 任意返回链接规则启用webview
A: 后面添加##$##,{'webView':true}
Q: 下一页处理
Q: 如何修改调试时的默认搜索关键字
A: 书源->基础->校验文字
Q: 书源若访问频繁会封禁IP
A: 书源->基础->并发率

参考

最后

分享几个刚制作的听书源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
{
"bookSourceComment": "最新 order=1\n人气 order=2\n连载 order=4\n完结 order=5",
"bookSourceGroup": "📻有声电台",
"bookSourceName": "📻 听13",
"bookSourceType": 1,
"bookSourceUrl": "https://m.ting13.com",
"bookUrlPattern": "",
"customOrder": 1,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"exploreUrl": "@js:\nsort=[];\npush=(title,url,type1,type2)=>sort.push({\n\t\ttitle: title,\n\t\turl: url,\n\t\tstyle: {\n\t\t\t\tlayout_flexGrow: type1,\n\t\t\t\tlayout_flexBasisPercent: type2\n\t\t\t}\n\t});\n\t\nfl=[[\"玄幻修真\",\"xuanhuan\"],[\"灵异惊悚\",\"lingyi\"],[\"都市言情\",\"dushi\"],[\"军事历史\",\"junshi\"],[\"儿童故事\",\"ertong\"],[\"经典纪实\",\"jishi\"],[\"长篇评书\",\"pingshu\"],[\"相声戏曲\",\"xiangsheng\"],[\"综艺娱乐\",\"yule\"],[\"百家讲坛\",\"bjjt\"],[\"网游竞技\",\"jingji\"],[\"官场商战\",\"guanchangshangzhan\"],[\"人物传记\",\"chuanji\"],[\"通俗文学\",\"wenxue\"],[\"其他有声\",\"qita\"]];\n\n [[\"连载\",\"lastupdate\"],[\"完结\",\"over\"]].map([title,status]=>{\n\tpush('🔖分类'+title+'🔖', null, 1, 1);\n\t fl.map(([title,uri],index)=>{\n\t url= `/yousheng/${uri}/${status}/{{page}}.html`;\n\tif(index+1 <= fl.length - fl.length%3)\n\t\t\t {\tpush(title, url, 1, 0.25);}\n\t\t\t\telse{ push(title, url, 0, 0.29);}\n \t\n \t});\n\t});\n\nJSON.stringify(sort);",
"header": "{\n \"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; Redmi Note 8 Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.186 Mobile Safari/537.36\"\n}",
"lastUpdateTime": 1699982520560,
"loginUrl": "",
"respondTime": 13927,
"ruleBookInfo": {
"author": ".book-rand-a.2@text",
"coverUrl": "[property=\"og:image\"]@content",
"init": "",
"intro": "🔔 更新时间: {{@@.book-rand-a.4@text##连载|完结}}\n📯 {{@@.book-rand-a.3@text}}\n🏷 {{@@.book-rand-a.1@text}}\n📂 内容简介:{{@@.book-des@text}}##(^|[。!?]+[”」)】]?)##$1<br>",
"kind": "{{@@.book-rand-a a.0@text}}\n{{@@.book-rand-a.4@text##\\s.*}}",
"lastChapter": "",
"name": "h1@text",
"tocUrl": "",
"wordCount": ""
},
"ruleContent": {
"content": "<js>result</js>",
"replaceRegex": "",
"sourceRegex": ".*\\.(mp3|m4a).*"
},
"ruleExplore": {
"author": "演播:{{@@.book-meta.1@text}}",
"bookList": ".book-li",
"bookUrl": "a.0@href",
"coverUrl": "img@data-original",
"intro": ".book-desc@text",
"kind": "{{@@.score@text}}\n{{@@.playCountText@text}}℃\n{{@@h4 span@text}}",
"lastChapter": ".book-meta.0@text",
"name": "h4 a.0@text",
"wordCount": ""
},
"ruleReview": {},
"ruleSearch": {
"author": "{{$.author.name}} 演播:{{$.boyin.name}}",
"bookList": "$.data[*]",
"bookUrl": "$.novel.url",
"checkKeyWord": "倚天屠龙记",
"coverUrl": "$.novel.cover",
"intro": "$.novel.intro",
"kind": "{{$.novel.isovername}}\n{{$.data.allvisit}}℃\n{{$.novel.lasttime}}",
"lastChapter": "$.novel.lastname",
"name": "$.novel.name",
"wordCount": ""
},
"ruleToc": {
"chapterList": ".play-list li",
"chapterName": "a@textNodes",
"chapterUrl": "a@href@js:result+',{webView:“true”}'",
"isVolume": "",
"nextTocUrl": "<js>\nif(result.indexOf('<div class=\"play-list\"><ul style=\"width: 100%;\"></ul></div>')==-1){\n let p=baseUrl.split('p=')[1];\n var page=2;\n if(p){\n page=Number(p)+1;\n }\n baseUrl.split('?p=')[0]+'?p='+page;\n}\n</js>\n\n\n",
"updateTime": "span@text"
},
"searchUrl": "https://m.ting13.com/api/ajax/solist?word={{key}}&type=name&page={{page}}&order=1",
"weight": 11,
"concurrentRate": "15/60000"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{
"bookSourceGroup": "有声",
"bookSourceName": "听中国",
"bookSourceType": 1,
"bookSourceUrl": "https://app.365ting.com",
"customOrder": 0,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"exploreUrl": "[\n{\"title\":\"热门推荐\",\"url\":\"/listen/apptingchina/hotRecommendList?activityId=12&size=10&page={{page}}\"},\n {\"title\":\"玄幻奇幻\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=6\"},\n{\"title\":\"都市言情\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=7\"},\n{\"title\":\"宫斗女频\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=8\"},\n{\"title\":\"官场商战\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=9\"},\n{\"title\":\"武侠仙侠\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=10\"},\n{\"title\":\"刑侦推理\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=11\"},\n{\"title\":\"探险科幻\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=12\"},\n{\"title\":\"重生穿越\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=13\"},\n{\"title\":\"恐怖惊悚\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=14\"},\n{\"title\":\"文学历史\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=15\"},\n{\"title\":\"两性情感\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=49\"},\n{\"title\":\"网游竞技\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=50\"},\n{\"title\":\"相声评书\",\"url\":\"/listen/apptingchina/categoryList?size=10&page={{page}}&categoryId=51\"}\n]",
"header": "{\r\n \"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\",\r\n \"Accept-Language\":\"zh-CN,zh;q=0.9\"\r\n}",
"lastUpdateTime": 1702663552467,
"respondTime": 180000,
"ruleBookInfo": {
"author": "$.data.bookData.bookAnchor",
"canReName": "",
"coverUrl": "$.data.bookData.bookImage",
"downloadUrls": "",
"init": "",
"intro": "$.data.bookData.bookDesc",
"kind": "$.data.bookData.categoryName",
"lastChapter": "",
"name": "$.data.bookData.bookTitle",
"tocUrl": "/listen/apptingchina/chapter?size=30&page=1&sort=asc&bookId={$.data.bookData.id}",
"wordCount": ""
},
"ruleContent": {
"content": "$.src"
},
"ruleExplore": {
"author": "$.bookAnchor",
"bookList": "$.data.list",
"bookUrl": "/listen/apptingchina/book?bookId={$.id}",
"coverUrl": "$.bookImage",
"intro": "$.bookDesc",
"name": "$.bookTitle"
},
"ruleReview": {},
"ruleSearch": {
"author": "bookAnchor",
"bookList": "$.data.bookData",
"bookUrl": "/listen/apptingchina/book?bookId={$.id}",
"coverUrl": "bookImage",
"intro": "bookDesc",
"name": "bookTitle",
"wordCount": "count"
},
"ruleToc": {
"chapterList": "$.data.list",
"chapterName": "title",
"chapterUrl": "<js>\nvar timestamp=Math.round(new Date());\n//java.log(\"timestamp:\"+timestamp);\nvar addItParapet=java.md5Encode(\"\"+timestamp+\"C97y8JZWFpGIarkd\");\naddItParapet=java.md5Encode(\"\"+addItParapet+\"C97y8JZWFpGIarkd\");\n//java.log(\"addItParapet:\"+addItParapet);\njava.put(\"timestamp\",timestamp);\njava.put(\"addItParapet\",addItParapet);\n</js>\n\n/listen/apptingchina/AppGetChapterUrl2023?timeStamp={{java.get(\"timestamp\")}}&chapterId={{$.chapterId}}&uid=&addItParapet={{java.get(\"addItParapet\")}}&bookId={{$.bookId}}",
"isVolume": "",
"nextTocUrl": "<js>\nvar res=JSON.parse(result);\nvar pageNo=Number(res.data.pageNo);\nif(res.data.list.length>0){\n\t java.put(\"bookId\",res.data.list[0].bookId);\n\t java.put(\"pageNo\",pageNo+1);\n\t}\n</js>\n/listen/apptingchina/chapter?size=30&page={{java.get(\"pageNo\")}}&sort=asc&bookId={{java.get(\"bookId\")}}",
"preUpdateJs": "",
"updateTime": "uploadDate"
},
"searchUrl": "https://app.365ting.com/listen/apptingchina/appSearch?search={{key}}",
"weight": 0
}