# Reader **Repository Path**: workair/reader ## Basic Information - **Project Name**: Reader - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 24 - **Forks**: 5 - **Created**: 2024-09-05 - **Last Updated**: 2026-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 奇点阅读 #### 一、介绍 1) 本App只提供软件不提供内容,需自定义书源,vod源、m3u/txt直播源才能使用,视频中的任何广告和本App无关。 2) 自定义规则支持CSS选择器、XPath选择器、JSONPath 3) 直播订阅支持txt,m3u。比如:https://live.zbds.top/tv/iptv4.m3u 4) 兼容部分安卓阅读App书源 https://www.yckceo.com/yuedu/shuyuan/index.html 不建议导入集合,在导入视频源的时候先把bookSourceType改成4再导入,对于不支持的一些源可以按本文档规则修改后再导入。 5) 安卓12以下的设备webview内核版本低于90需要升级 https://github.com/gloeyisk/aosp-webview/releases/download/v6/webview_v6.zip 下载后解压得到webview.apk,版本为92.0.4515.159,兼容安卓5.1以上设备 6) QQ群 302098608 #### 二、VOD源格式 ``` { "name": "牛牛", "api": "https://xxx.com/api.php/provide/vod/", "searchable": false, "categories_name": ["国产剧", "欧美剧", "韩剧", "日剧"] } ``` categories_name如果有读取所有类目 #### 三、网页源格式 ——— CSS选择器 1) id选择: #id@text 2) class选择 .class.0@text 或 .class!0@text .0表示选择第一个匹配项,!0表示排除第一个选择项,自定义匹配多个索引用冒号隔开。比如.class.0:1:2@text 表示选择索引1/2/3项 @后面表示属性可以是text,href,html及自定义属性 取值后支持正则替换在上面规则后面加正则规则比如 .class.0@text##abc##def 表示把abc替换成def,支持正则中$符号替换 某些复杂的带索引的部分选择器不支持 3) 支持按属性选择,适合采集head中的数据比如head > meta[property=\"og:description\"]@content #### 四、网页源格式 ——— XPath选择器/JSONPath选择器 请参考官方文档 #### 五、网页源格式 ——— 支持Javascript处理规则 比如 #id@text@js:decodeAES(result,'f041c49714d39908','0123456789abcdef') @js:后面是js代码,decodeAES是app内置js库的函数,result是选择器取出来的结果。如果是订阅模式则可以自定义js函数库,见:六、订阅源格式 app内置js函数库内容见:https://gitee.com/workair/reader/raw/master/util.js #### 六、网页源格式 ``` { "name":"名称", "api":"目标网站网址,如果末尾有/规则中url开头就不要有/", "type":2 "searchable":false, "categories":[ {"name":"分类1","url":"/xxx/yyy"}, {"name":"分类2","url":"/xxx/yyy"} ], "list":{ "list":"选择列表", "name":"标题", "tips":"最后更新章节/剧集", "rate":"评分", "doubanId": "豆瓣id", "doubanUrl": "豆瓣url", "coverUrl": "封面url", "detailUrl": "详情url", "params": "{\"id\":{{z-cover@id}}}", }, "search":{ "url":"搜索页url", "post":"如果是post这里是post内容", "list":"选择列表", "name":"标题", "author","作者", "tips":"最后更新章节/剧集", "rate":"评分", "doubanId": "豆瓣id", "doubanUrl": "豆瓣url", "coverUrl": "封面url", "detailUrl": "详情url", "params": "{\"id\":{{z-cover@id}}},这里获取到数据用这种方式可以传递到detail", }, "detail":{ "meta":"影视资源简介,仅用于影视资源", "content":"小说正文,如果是漫画则是图片url列表,视频不需要", "intro": "小说音频简介", "author","作者", "tips":"最后更新章节/剧集", "category":"小说漫画音频类目", "tocUrl": "类目url,如果详情页已经有类目列表就不需要" }, "toc": { "list": "小说漫画章节列表/视频音频剧集列表", "name": "名称", "url": "视频/音频播放页地址/小说阅读页地址", "playUrl":"直接可以获取到的视频/音频地址播放地址,如果没有就是通过上面的url地址嗅探" "params": "{\"book_id\":{{$.book_id}}},这里获取到数据用这种方式可以传递到content", }, "line": { "list": "视频线路标题列表", "name": "名称", "contentList": "视频线路内容列表", "selected":["如果只需要采集个别线路,这里用数组匹配"] } "content":{ "content":"小说正文或音频源的音频地址,如果没有就是启用嗅探模式", "url":"音频源获取音频的接口url", "method":"接口http方法", "post":"接口post数据" }, "header":{ "token":"整个header可以放http都信息,字段不限", "User-Agent":"有些网站需要这个,区别手机电脑", "Referer": "有些图片资源需要这个才可以正常显示" }, "removeReferer": true, "injectJs": { "start": "网页头部注入脚本", "end": "网页尾部注入脚本" }, "login":{ "url":"有些网站需要登录获取cookie才可以用,这里写登录地址,会有一个按钮可以跳转到网站去登录,登录后返回就可以正常用了,比如z-library", "cookie": true } } ``` 1) type:没有填写默认vod源; 2:视频; 10:小说; 11:音频; 12:漫画; 20:下载电子书txt/epub,适用于z-library 2) categories: 发现的分类列表,如果不需要这个功能,这个规则可以没有 3) detail: 网站详情页规则 4) search: 网站搜索页规则 5) list: 网站列表页规则,如归规则和搜索页一样,这个规则页可以没有,默认使用搜索页规则 6) toc: 小说漫画章节/视频音频剧集列表规则 7) line: 视频线路规则,如果网站不是聚合视频网站就一个线路,这个规则可以没有 8) header: 这里可以放http头信息,比如cookie,token等 9) removeReferer: 有些资源不能用referer 10) injectJs: 嗅探页面注入js,start表示在头部注入,end表示尾部注入 11) login: 有些网站需要登录获取cookie的 12) params: js规则用到的公共变量,参考老白故事 13) js: js规则用到的公共fuction 凡没有的规则就不要出现,不要填写空白字符串 list或searh中的params是一个json参数,可以把列表的数据传入到详情规则或章节规则的url中 规则支持{{}}格式的模板 规则编写QQ交流群:542924576 #### 七、去除切片广告规则 ``` [ { "name": "优质", "hosts": ["-playback.com", "yzzy"], "regex": ["6.667", "6.133", "6.666667", "6.133333"] }, { "name": "非凡", "hosts": ["ffzy"], "regex": ["2.966667", "2.433333", "#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.000000,[\\s\\S]*?#EXTINF:3.866667[\\s\\S]*?(#EXT-X-DISCONTINUITY|#EXT-X-ENDLIST)"] }, { "name": "量子", "hosts": ["lz"], "regex": ["7.067"] }, { "name": "木耳", "hosts": ["heimuertv", "hmrvideo"], "regex": ["3.366667"] }, { "name": "iKun/魔都", "hosts": ["ikun", "modu"], "regex": ["#EXT-X-DISCONTINUITY\\r*\\n*#EXT-X-KEY[\\s\\S]*?(#EXT-X-DISCONTINUITY|#EXT-X-ENDLIST)"] } ] ``` hosts:用于匹配视频地址的域名,如果域名包含了规则中字母则匹配上。 regex:如果是正则则按正则匹配,记得结尾(#EXT-X-DISCONTINUITY|#EXT-X-ENDLIST),程序会把最后一个group替换成#EXT-X-DISCONTINUITY,如果没有group就会被替换成空字符串; 如果regex是一个数字比如"3.366667",这里其实是一个简化写法,程序会按 ``` "#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:3.366667,[\\s\\S]*?(#EXT-X-DISCONTINUITY|#EXT-X-ENDLIST)" ``` 来处理 #### 八、订阅源格式 按下面格式保存成json,放服务器上,就可以用app里的订阅模式订阅这个地址。 ``` { "lives": [ { "name": "视频", "type": 1, "api": "https://live.fanmingming.com/tv/m3u/ipv6.m3u" }, { "name": "音频", "type": 2, "api": "https://live.fanmingming.com/radio/m3u/fm.m3u" } ], "sites": [{书源1},{书源2},{影视源1},{音频源1},{漫画源1}...], "rules":[{去广告规则1},{去广告规则2}], "js":"书源规则js库地址,app默认自带,如果这里有则读这里的库", "webviewJs":"浏览器去广告js,app默认自带,如果这里有则读这里" } ```