# 爱宁呦小说 - 后台 **Repository Path**: jun-kenn/ai-ning-book ## Basic Information - **Project Name**: 爱宁呦小说 - 后台 - **Description**: 使用Java开发的小说阅读后台服务 自定义Jsoup爬虫源,, 配置简单, 可快速进行书源配置 支持书籍搜索、书城发现等功能 - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: v2.0.0 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 4 - **Created**: 2024-03-28 - **Last Updated**: 2025-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: 小说, Jsoup, 书源, Java, Spider ## README ### 爱宁呦小说 - 后台服务 - 小说阅读后台服务, 功能已经实现, 代码和数据库文件全部开源 - 自定义爬虫源, 爬虫规则文档下面有说明, 存在疑惑可联系作者 - 目前爬虫源配置接口暂未开发, 只有在数据库中手动配置, 目前库中已配置完成几个源, 可直接使用或参考并创建自己的源 ### 爱宁呦小说 - 小程序 - 使用uni-app、uView开发 - 仓库传送门: [爱宁呦小说 - 小程序v2.0.0](https://gitee.com/jun-kenn/ai-ning-book-ui/tree/v2.0.0) ### 版本变更项 - 去除服务端集成https相关配置 - 新增接口安全校验 - 优化书源配置规则, 提升查询效率 - 新增jasypt加密配置文件中敏感数据 ### 需知 - 微信小程序正式版或体验版需要配置成https协议, 请自行通过nginx代理实现 - 启动项增加-Djasypt.encryptor.password=xxxxx - yml配置文件里面的重要信息使用ENC(加密字符串) 加密字符串通过下面代码获取 ```tex StringEncryptor encryptor = SpringUtil.getBean(StringEncryptor.class); String pass = encryptor.encrypt("123456"); ``` - yml文件中kenn:signKey定义接口密钥 需与小程序requestInterceptors.js中的signKey保持一致 ### 自有标签 - js标签 > - 用法: `xxx` > > - 作用: 用于执行js代码串 xxx为js代码串 > > - 支持值: js代码串、page标签、result、baseUrl、currentUrl、自有的java方法(详见JavaUtils和ThreadLocalUtils工具类) > > 例: > > - result: 后面会有解释 先略过 > - baseUrl: 书源基础链接 > - currentUrl: 当前请求链接 如获取章节列表时代表的就是书籍链接 获取详情时代表的就是章节链接 > - java.ajaxGet(String str) 发起get请求 > - ThreadLocalUtils.addHeader(String key, String value) 添加header头 - page标签: > - 用法: `xxx` > > - 作用: 根据当前页码获取值 > > - 支持值: %s、%s组成的数字运算表达式 > > 例: > > - 若用户传过来的页码是2 `%s`得到的就是2 > - 若用户传过来的页码是2 `(%s-1)*10`时得到的就是10 - join标签: > - 用法: `xxx` > > - 作用: 拼接章节链接(获取章节链接时 通过爬虫规则获取到的时相对链接或章节id时 将书籍链接与爬虫结果拼接起来便于后续处理) > > - 支持值: Jsoup之css选择器爬虫规则、JsonPath爬虫规则 > > 例: > > - 书籍链接是http://www.kenn.com/100.html 通过爬虫规则获取到的章节链接是/1001.html 最后返回的结果就是http://www.kenn.com/100.html,/1001.html > - 书籍链接是http://www.kenn.com/book/detail?&id=1784900 通过爬虫规则获取到的章节链接是17059214170001 最后返回的结果就是http://www.kenn.com/book/detail?&id=1784900,17059214170001 ### 爬虫规则 - 书源基本信息(book_source表) - name: 书源名称(必填) - sort: 排序字段(必填) - baseUrl: 书源地址(必填) - header: 全局请求头配置(必填)(下面规则二选一 不支持同时使用) > - 支持json格式数据 > > 例: `{"Version-Code":"10000","Channel":"mz","appid":"wengqugexs","Version-Name":"1.0.0"}` > > - 支持js标签 > > 例: `要执行的具体js代码: 通过ThreadLocalUtils.addHeader自行添加请求头` - is_delete: 是否删除(必填)(0: 否、1: 是) - 书籍搜索规则(book_search_rule表) - sourceId: 书源id(必填) - charsetName: 返回内容的编码规则(必填)(GBK、 UTF-8等) - searchUrl: 搜索地址(必填) > - 普通字符串链接例: http://www.kenn.com/search.php > > - 支持js标签 > > 例: `要执行的具体js代码 需要返回请求的链接` > > - 支持多页占位符`%s` > > 例: > > `xxx` > > - 链接+js标签组合 > 例: `http://www.kenn.com/search.phpxxx` (注: js标签内部使用result代表的是http://www.kenn.com/search.php) - searchMethod: 请求方式(必填)(1: get、 2: post) - searchParam: 请求参数(非必填) > - 支持json格式数据 > > 例: `{"kw": "%s","pn": "%s","is_author": "0"} ` > > - json数据可使用page标签 > > - json数据书名值使用%s占位 - urlEncoder: 参数是否需要url编码(必填)(1: 是、0: 否) - paramCharset: 参数编码规则(非必填)(GBK、 UTF-8等) - bookList: 获取书籍列表的爬虫规则(必填) > - 支持Jsoup之css选择器爬虫规则 (注: 获取到的是html标签列表) > > 例: `tbody>tr:gt(0)` > > - 支持JsonPath爬虫规则 > > 例: `$.data.books[*]` > > - 支持js标签+JsonPath规则: js标签对书籍进行预处理后的结果再使用JsonPath规则获取(注: js标签的结果必须是json格式数据、js标签内部使用result代表的是通过书籍链接获取的数据 因数据可能加密 需在此解密后使用) > > 例: `xxx$.result[*]` - bookName: 获取书籍名称的爬虫规则(必填) > - 在bookList获取到的内容基础上进行获取 > > - 支持Jsoup之css选择器爬虫规则 + @ + text/href/src/html (注: text代表爬虫规则获取的html标签文本值 href代表爬虫规则获取的html标签href属性值等) > > 例: `tr>td:eq(0)>a@text` > > - 支持JsonPath爬虫规则 > > 例: `book_data[0].book_name` - bookUrl: 获取书籍链接的爬虫规则(必填) > - 在bookList获取到的内容基础上进行获取 > > - 支持Jsoup之css选择器爬虫规则 + @ + text/href/src/href (注: text代表爬虫规则获取的html标签文本值 href代表爬虫规则获取的html标签href属性值等) > > 例: `tr>td:eq(0)>a@href` > > - 支持JsonPath爬虫规则 > > 例: `book_data[0].book_id` - author: 获取作者的爬虫规则(必填) 同bookName - imgUrl: 获取封面链接的爬虫规则(非必填) 同bookName - updateTime: 获取更新时间的爬虫规则(非必填) 同bookName - 章节搜索规则(chapter_search_rule表) - sourceId: 书源id(必填) - charsetName: 返回内容的编码规则(必填)(GBK、 UTF-8等) - initUrl: 初始化搜索链接规则(非必填) > 仅支持js标签 > > 例: `要执行的具体js代码 需要返回具体的书籍链接`(注: js标签内部使用result代表的是通过书籍搜索规则获取到的书籍链接) - initData: 初始化搜索数据规则(非必填) > 仅支持js标签 > > 例: `要执行的具体js代码 需要返回处理后的数据`(注: 因获取的数据可能是密文 可在此解密后向下传递) - chapterPage: 章节列表页链接规则(非必填) > 因有些特殊情况 如章节信息和章节列表页不在同一个页面 所以需要在这里获取下章节列表页的链接 以下所有的规则返回的结果都应是章节列表页的链接 > - 支持Jsoup之css选择器爬虫规则+js标签 > > 例: `.button.clearfix>a:first-child@hrefbaseUrl + result`(注: 这里的result代表的js标签前部分爬虫规则获取到的数据) > > - 支持JsonPath爬虫规则+js标签 > > 例: `$.result.book_idxxx` > > - 支持纯js标签 > > 例: `xxx` - imgUrl: 获取书籍封面规则(非必填) > - 支持Jsoup之css选择器爬虫规则 + @ + text/href/src/html (注: text代表爬虫规则获取的html标签文本值 href代表爬虫规则获取的html标签href属性值等) > > 例: `#fmimg>img@src` > > - 支持JsonPath爬虫规则 > > 例: `$.data[0].url` - intro: 书籍简介规则(非必填) > - 支持Jsoup之css选择器爬虫规则 + @ + text/href/src/html (注: text代表爬虫规则获取的html标签文本值 href代表爬虫规则获取的html标签href属性值等) > > 例: `#intro@text` > > - 支持JsonPath爬虫规则 > > 例: `$.data.book.intro` - chapterList: 获取章节列表的规则(必填) > - 支持Jsoup之css选择器爬虫规则 (注: 获取到的是html标签列表) > > 例: `.mulu_list>li:nth-of-type(1) ~ li` > > - 支持JsonPath爬虫规则 > > 例: `$.data.chapter_lists` > > - JsonPath规则和js标签同时使用(注: js标签内的result代表的是获取到的章节列表的内容) > > 例: `xxx$.result[*]` - chapterName: 获取章节名称的规则(必填) > - 在chapterList获取到的内容基础上进行获取 > > - 支持Jsoup之css选择器爬虫规则 + @ + text/href/src/html (注: text代表爬虫规则获取的html标签文本值 href代表爬虫规则获取的html标签href属性值等) > > 例: `li>a@text` > > - 支持JsonPath爬虫规则 > > 例: `chapter_name` - chapterUrl: 获取章节链接的规则(必填) > - 在chapterList获取到的内容基础上进行获取 > > - 支持Jsoup之css选择器爬虫规则 + @ + text/href/src/href (注: text代表爬虫规则获取的html标签文本值 href代表爬虫规则获取的html标签href属性值等) > > 例: `dd>a@href` > > - 支持JsonPath爬虫规则 > > 例: `url` > > - 支持join标签内嵌以上两种规则使用: 用于拼接最终的链接地址 作用参考自由标签章节 > > 例: `dd>a@hrefurl` - nextPage: 获取章节列表页下一页的链接规则(非必填) > 因有些特殊情况 章节列表页带分页的情况 所以需要在这里获取下下一页的链接 以至于代码中递归往下查询 > - 支持Jsoup之css选择器爬虫规则+js标签 > > 例: `.input-group-btn:last-child>a.btn.btn-default:not([disabled])@hrefbaseUrl + result`(注: 这里的result代表的js标签前部分爬虫规则获取到的数据) > > - 支持JsonPath爬虫规则+js标签 > > 例: `$.result.book_idxxx` > > - 带分页的需要遍历查询 效率较低 慎用这种源 - 阅读页搜索规则(info_search_rule表) - sourceId: 书源id(必填) - charsetName: 返回内容的编码规则(必填)(GBK、 UTF-8等) - initUrl: 初始化搜索链接规则(非必填) > 仅支持js标签 > > 例: `要执行的具体js代码 需要返回具体的书籍链接`(注: js标签内部使用result代表的是通过章节搜索规则获取到的章节链接) - initData: 初始化搜索数据规则(非必填) > 仅支持js标签 > > 例: `要执行的具体js代码 需要返回处理后的数据`(注: 因获取的数据可能是密文 可在此解密后向下传递) - info: 章节内容规则(必填) > - 支持Jsoup之css选择器爬虫规则 + @ + text/href/src/html (注: text代表爬虫规则获取的html标签文本值 href代表爬虫规则获取的html标签href属性值等) > > 例: `#content@html` > > - 支持JsonPath爬虫规则 > > 例: `$.content` > > - 支持JsonPath规则+js标签(可能获取到的数据需要解密 js返回具体的章节内容 js内部的result代表JsonPath规则获取到的数据) > > 例: `$.data.contentxxx` > > - 支持精华规则(注: 只能在最后使用 ##要替换的内容->替换后的内容) > > 例: `$.content##\n->

` - 发现搜索规则(explore_search_rule表) - sourceId: 书源id(必填) - charsetName: 返回内容的编码规则(必填)(GBK、 UTF-8等) - categoryInfo:分类规则(必填) > - json格式的分类数据 json内部可使用page标签 > > 例: > > `[{"name":"玄幻","url":"http://www.kenn.com/fenlei/1_%s/"},{"name":"科幻","url":"http://www.kenn.com/fenlei/6_%s/"},{"name":"修真","url":"http://www.kenn.com/fenlei/2_%s/"},{"name":"都市","url":"http://www.kenn.com/fenlei/3_%s/"},{"name":"历史","url":"http://www.kenn.com/fenlei/4_%s/"},{"name":"网游","url":"http://www.kenn.com/fenlei/5_%s/"}]` > > - 支持json格式数据+js标签(js标签的做一个是对json数据中某一项具体的url做扩展 比如json格式里面的是假链接 需要js处理最后返回真实的链接 js标签里面的result代表json数据中某一项具体的url) > > 例: > > `[{"name":"都市","url":"https://www.kenn.com/category/gender=2&category_id=203&need_filters=1&page=%s&need_category=1"},{"name":"异能","url":"https://www.kenn.com/category/gender=2&category_id=219&need_filters=1&page=%s&need_category=1"},{"name":"玄幻","url":"https://www.kenn.com/category/gender=2&category_id=202&need_filters=1&page=%s&need_category=1"},{"name":"武侠","url":"https://www.kenn.com/category/gender=2&category_id=205&need_filters=1&page=%s&need_category=1"},{"name":"奇异","url":"https://www.kenn.com/category/gender=2&category_id=204&need_filters=1&page=%s&need_category=1"},{"name":"文学","url":"https://www.kenn.com/category/gender=2&category_id=243&need_filters=1&page=%s&need_category=1"}]xxx` - bookList: 获取书籍列表的爬虫规则(必填) ```tex 同书籍搜索规则的bookList ``` - bookName: 获取书籍名称的爬虫规则(必填) ```tex 同书籍搜索规则的bookName ``` - bookUrl: 获取书籍链接的爬虫规则(必填) ```tex 同书籍搜索规则的bookUrl ``` - author: 获取作者的爬虫规则(必填) 同bookName - imgUrl: 获取封面链接的爬虫规则(非必填) 同bookName - updateTime: 获取更新时间的爬虫规则(非必填) 同bookName ### 免责声明 - 本项目提供的爬虫源代码仅用学习,请勿用于商业盈利。 - 用户使用本系统从事任何违法违规的事情,一切后果由用户自行承担作者不承担任何法律责任。 - 如有侵犯权利,请联系作者删除。 - 下载本站源码则代表你同意上述的免责声明协议。 - 无任何商业用途,无任何侵权想法。但如发现侵权或其它问题请 及时 且 成功 与作者本人取得联系。 作者本人会在第一时间进行相关内容的删除。