# 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**: 19 - **Forks**: 5 - **Created**: 2024-09-05 - **Last Updated**: 2025-08-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 奇点阅读 #### 一、介绍 1) 本App只提供软件不提供内容,需自定义书源,vod源、m3u/txt直播源才能使用,视频中的任何广告和本App无关。 2) 自定义规则支持CSS选择器、XPath选择器、JSONPath 3) 书源示例 https://gitee.com/workair/reader/raw/master/demo.json 无广告视频源 https://gitee.com/workair/reader/raw/master/video.json 音频源 https://gitee.com/workair/reader/raw/master/audio.json 漫画源 https://gitee.com/workair/reader/raw/master/cartoon.json 小说源 https://gitee.com/workair/reader/raw/master/novel.json 【设置】-【书源管理】-【从网址导入】上面的网址测试。编写规则可参考示例源,并自己做好备份 4) 直播订阅示例 https://gh-proxy.com/raw.githubusercontent.com/fanmingming/live/refs/heads/main/tv/m3u/ipv6.m3u 5) 兼容部分安卓阅读App书源 https://www.yckceo.com/yuedu/shuyuan/index.html 不建议导入集合,在导入视频源的时候先把bookSourceType改成4再导入(1.0.9兼容漫画源、视频源) 对于不支持的一些源可以按本文档规则修改后再导入。 6) 安卓版下载地址 https://sj.qq.com/appdetail/cn.teamair.reader 安卓12以下的设备webview内核版本低于90需要升级 https://github.com/gloeyisk/aosp-webview/releases/download/v6/webview_v6.zip 下载后解压得到webview.apk,版本为92.0.4515.159,兼容安卓5.1以上设备 7) QQ群 302098608 #### 二、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 #### 五、书源格式 规则编写QQ交流群:542924576 ``` { "name":"名称", "api":"BaseURL,如果末尾有/规则中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": "小说简介", "tocUrl": "类目url" }, "toc": { "list": "小说章节列表", "name": "名称", "url": "章节地址", "params": "{\"book_id\":{{$.book_id}}},这里获取到数据用这种方式可以传递到content", }, "line": { "list": "视频线路标题列表", "name": "名称", "contentList": "视频线路内容列表", "selected":["如果只需要采集个别线路,这里用数组匹配"] } "content":{ "content":"小说正文或音频源的音频地址,如果没有就是启用嗅探模式", "url":"音频源获取音频的接口url", "method":"接口http方法", "post":"接口post数据,参考老白故事" }, "play": { "list": "视频播放列表", "name": "名称", "url": "url" }, "header":{ "token":"整个header可以放http都信息,字段不限" } "login":{ "url":"有些网站需要登录获取cookie才可以用,这里写登录地址,会有一个按钮可以跳转到网站去登录,登录后返回就可以正常用了,比如z-library", "cookie": true } } ``` type: 没有填写默认vod源 2:视频 10:小说 11:音频 12:漫画 20:下载电子书txt/epub,适用于z-library 规则主要分为以下几个部分 1) categories: 发现的分类列表,如果不需要这个功能,这个规则可以没有。 2) detail: 小说或视频详情页规则 3) search: 搜索页规则 4) list: 列表页规则,如归规则和搜索页一样,这个规则页可以没有,默认使用搜索页规则 5) toc: 小说章节规则(1.0.9也用于播放列表规则) 6) play: 播放列表规则(1.0.9可以用toc代替) 7) line: 视频线路规则,如果网站不是聚合视频网站就一个线路,这个规则可以没有 8) header: 这里可以放http头信息,比如cookie,token等 9) login: 有些网站需要登录获取cookie的 10) params: js规则用到的公共变量,参考老白故事 11) js: js规则用到的公共fuction 凡没有的规则就不要出现,不要填写空白字符串 list或searh中的params是一个json参数,可以把列表的数据传入到详情规则或章节规则的url中 规则支持{{}}格式的模板 #### 六、去除切片广告规则 ``` [ { "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默认自带,如果这里有则读这里" } ```