哔哩轻小说🏷
https://www.bilinovel.com
xiao-rongmu (5176)2024/03/19
建议登录 整理修改缝合:酷安 Wolken 灰色章节修复目录部分By叶落岚起+关耳/乃星改2021.8.3 补丁 : 神秘人 修复搜索问题 修复发现榜单没图的问题 修复章节内图片问题 新補丁: 神秘人 抓取源码中的关键字替换 更新补丁 更新补丁17/9 2023.9.27 新补丁:酷安 @吉王义昊 重新抓取源码中的关键字替换 2023.9.27 新补丁2nd:酷安 @吉王义昊 修复插图不能正常加载的问题 2023.9.30 酷安 @吉王义昊 添加登录URL 清理了无用代码 使用更易读的变量名 2023.10.1 酷安 @吉王义昊 重新抓取源码中的关键字替换 2023.10.1 酷安 @吉王义昊 在获取正文时自动拉取源码并解密进行关键字替换,一劳永逸(大概)解决问题 注意:此版本会使网络请求次数增加一倍,并一定程度上减慢加载速度 2023.10.1 酷安 @吉王义昊 增加登录URL和登录UI 启用CookieJar 去除章节名下方的URL 修正了下一页获取导致的正文加载错误 补全发现中的文库 修正部分小说目录获取错误的问题 2023.10.4 酷安 @吉王义昊 跟进源码新的加密方式 2023.10.5 酷安 @吉王义昊 跟进源码新的加密方式 2023.10.6 酷安 @吉王义昊 跟进源站网站结构改动 2023.10.7 酷安 @吉王义昊 改进了目录获取方式,现在能够处理更多意外情况 2023.10.7 酷安 @吉王义昊 @是樱椛不是樱花 发现新增标签 2023.10.9 酷安 @吉王义昊 改进了发现 2023.10.13 酷安 @吉王义昊 跟进源站结构改动 2023.10.15 酷安 @吉王义昊 修正部分小说目录获取错误的问题 2023.10.22 酷安 @吉王义昊 发现页更改为动态获取,为大家带来更多排列组合(乐 同样由于动态获取,现在可以查看标签对应的书籍数量了 小幅优化正文的获取速度 正文页可显示正确的章节名称(在加载对应正文页后目录里的错误名称会自动更正) 2023.10.23 酷安 @吉王义昊 加载详情页后会自动更改错误的书名 2023.10.25 酷安 @吉王义昊 发现页新增书架 2023.11.7 酷安 @吉王义昊 使用Cache小幅度加快连续加载时正文的加载速度 2023.11.11 酷安 @吉王义昊 解决了部分书籍目录最后一章获取链接错误的问题 2023.11.12 酷安 @吉王义昊 移除了站长的喊话 2023.11.14 酷安 @吉王义昊 修复了图片加载错误的问题 2023.11.16 酷安 @吉王义昊 解决了部分书籍获取目录失败的问题 2023.11.23 酷安 @吉王义昊 解决了未登录时无法正确加载发现页的问题 2023.11.28 酷安 @吉王义昊 wrap了一份WebCrypto API,现在搜索不用等待内置浏览器跳转了 2023.12.12 酷安 @吉王义昊 适配新版卷名 2023.12.13 酷安 @吉王义昊 适配新版卷名 2024.1.13 酷安 @吉王义昊 自动调用内置浏览器过cf盾 移除了并发率 将UA置空强制阅读使用WebView默认UA 目录下一页识别改为简繁通用 2024.1.20 酷安 @吉王义昊 实验性加入自动重试机制,大幅提高目录及多页正文加载成功率 2024.1.24 酷安 @吉王义昊 适配最新正文检测 2024.2.6 酷安 @吉王义昊 处理cf扩大化问题 解决部分小说目录加载失败的问题(《谁说从妥协开始的恋爱一定没结果》) 2024.2.14 酷安 @吉王义昊 正文重试优化 2024.3.11 酷安 @吉王义昊 适配最新正文检测 处理登录失败问题
{ "bookSourceComment": "建议登录\n整理修改缝合:酷安 Wolken\n灰色章节修复目录部分By叶落岚起+关耳\/乃星改2021.8.3\n补丁 : 神秘人\n修复搜索问题\n修复发现榜单没图的问题\n修复章节内图片问题\n新補丁: 神秘人\n抓取源码中的关键字替换\n更新补丁\n更新补丁17\/9\n2023.9.27\n新补丁:酷安 @吉王义昊\n重新抓取源码中的关键字替换\n2023.9.27\n新补丁2nd:酷安 @吉王义昊\n修复插图不能正常加载的问题\n2023.9.30\n酷安 @吉王义昊\n添加登录URL\n清理了无用代码\n使用更易读的变量名\n2023.10.1\n酷安 @吉王义昊\n重新抓取源码中的关键字替换\n2023.10.1\n酷安 @吉王义昊\n在获取正文时自动拉取源码并解密进行关键字替换,一劳永逸(大概)解决问题\n注意:此版本会使网络请求次数增加一倍,并一定程度上减慢加载速度\n2023.10.1\n酷安 @吉王义昊\n增加登录URL和登录UI\n启用CookieJar\n去除章节名下方的URL\n修正了下一页获取导致的正文加载错误\n补全发现中的文库\n修正部分小说目录获取错误的问题\n2023.10.4\n酷安 @吉王义昊\n跟进源码新的加密方式\n2023.10.5\n酷安 @吉王义昊\n跟进源码新的加密方式\n2023.10.6\n酷安 @吉王义昊\n跟进源站网站结构改动\n2023.10.7\n酷安 @吉王义昊\n改进了目录获取方式,现在能够处理更多意外情况\n2023.10.7\n酷安 @吉王义昊 @是樱椛不是樱花\n发现新增标签\n2023.10.9\n酷安 @吉王义昊\n改进了发现\n2023.10.13\n酷安 @吉王义昊\n跟进源站结构改动\n2023.10.15\n酷安 @吉王义昊\n修正部分小说目录获取错误的问题\n2023.10.22\n酷安 @吉王义昊\n发现页更改为动态获取,为大家带来更多排列组合(乐\n同样由于动态获取,现在可以查看标签对应的书籍数量了\n小幅优化正文的获取速度\n正文页可显示正确的章节名称(在加载对应正文页后目录里的错误名称会自动更正)\n2023.10.23\n酷安 @吉王义昊\n加载详情页后会自动更改错误的书名\n2023.10.25\n酷安 @吉王义昊\n发现页新增书架\n2023.11.7\n酷安 @吉王义昊\n使用Cache小幅度加快连续加载时正文的加载速度\n2023.11.11\n酷安 @吉王义昊\n解决了部分书籍目录最后一章获取链接错误的问题\n2023.11.12\n酷安 @吉王义昊\n移除了站长的喊话\n2023.11.14\n酷安 @吉王义昊\n修复了图片加载错误的问题\n2023.11.16\n酷安 @吉王义昊\n解决了部分书籍获取目录失败的问题\n2023.11.23\n酷安 @吉王义昊\n解决了未登录时无法正确加载发现页的问题\n2023.11.28\n酷安 @吉王义昊\nwrap了一份WebCrypto API,现在搜索不用等待内置浏览器跳转了\n2023.12.12\n酷安 @吉王义昊\n适配新版卷名\n2023.12.13\n酷安 @吉王义昊\n适配新版卷名\n2024.1.13\n酷安 @吉王义昊\n自动调用内置浏览器过cf盾\n移除了并发率\n将UA置空强制阅读使用WebView默认UA\n目录下一页识别改为简繁通用\n2024.1.20\n酷安 @吉王义昊\n实验性加入自动重试机制,大幅提高目录及多页正文加载成功率\n2024.1.24\n酷安 @吉王义昊\n适配最新正文检测\n2024.2.6\n酷安 @吉王义昊\n处理cf扩大化问题\n解决部分小说目录加载失败的问题(《谁说从妥协开始的恋爱一定没结果》)\n2024.2.14\n酷安 @吉王义昊\n正文重试优化\n2024.3.11\n酷安 @吉王义昊\n适配最新正文检测\n处理登录失败问题", "bookSourceGroup": "轻小说", "bookSourceName": "哔哩轻小说🏷", "bookSourceType": 0, "bookSourceUrl": "https:\/\/www.bilinovel.com", "bookUrlPattern": "", "concurrentRate": "", "coverDecodeJs": "", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nres = []\n\n\/\/书架\nuser = ajax(source.bookSourceUrl + \"\/user.php\")\n\/\/java.toast(user)\ntry {\nif (user.match(\/<title>(登录|错误).+哔哩轻小说<\\\/title>\/gi)) {\n \/\/未登录\n res.push(\n {\n title: `>> 我的书架 | 未登录 <<`,\n url: '',\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n })\n} else {\n \/\/已登录\n res.push(\n {\n title: `>> 我的书架 | ${user.match(\/<span class=\"user-name\">.+<\\\/span>\/gi)[0].replace(\/<\\\/?span.*?>\/gi,'')} <<`,\n url: '',\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n })\n bookcase = ajax(source.bookSourceUrl + \"\/bookcase.php\")\n bookcase.match(\/<select[\\s\\S]+?<\\\/select>\/gi)[0].match(\/<option.+<\\\/option>\/gi).forEach(option => {\n res.push(\n {\n title: option.match(\/>.+(?=<)\/gi)[0].replace('>', ''),\n url: source.bookSourceUrl + \"\/bookcase.php?classid=\" + option.match(\/value=\\\".+?(?=\\\")\/gi)[0].replace(\/(value=\\\")\/gi, ''),\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n })\n })\n}\n} catch (e) {\n throw(\"书架加载失败:\\n\"+e+\"\\n登录页源码:\\n\"+user)\n}\n\ncontent = ajax(source.bookSourceUrl + \"\/wenku\/\")\ncontent.match(\/排序方式[\\s\\S]+?<\\\/div>\/gi)[0].match(\/<a.+<\\\/a>\/gi).forEach(a => {\n let sortTitle = a.match(\/>.+(?=<)\/gi)[0].replace('>', '')\n let sortAddress = a.match(\/\\\/.+?(?=_)\/gi)[0].replace('\/', '')\n content.match(\/作品分类[\\s\\S]+?<\\\/div>\/gi)[0].match(\/<a.+<\\\/a>\/gi).forEach((v, i) => {\n if (i == 0) {\n res.push(\n {\n title: `>> 全部文库 | ${sortTitle} <<`,\n url: v.match(\/href=\\\".+?(?=\\\")\/gi)[0].replace(\/(href=\\\")\/gi, '')\n .replace(\/\\\/.+?(?=_)\/gi, '\/' + sortAddress).replace('1_0.html', '{{page}}_0.html'),\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n })\n } else {\n res.push(\n {\n title: v.match(\/>.+(?=<)\/gi)[0].replace('>', ''),\n url: v.match(\/href=\\\".+?(?=\\\")\/gi)[0].replace(\/(href=\\\")\/gi, '')\n .replace(\/\\\/.+?(?=_)\/gi, '\/' + sortAddress).replace('1_0.html', '{{page}}_0.html'),\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n })\n }\n })\n})\ncontent.match(\/排序方式[\\s\\S]+?重置\/gi)[0].match(\/<li[\\s\\S]+?<\\\/li>\/gi).forEach(li => {\n let sortTitle = li.match(\/>.+(?=<\\\/h3>)\/gi)[0].replace('>', '')\n res.push(\n {\n title: `>> ${sortTitle} <<`,\n url: '',\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n })\n li.match(\/<a.+<\\\/a>\/gi).forEach((v, i) => {\n if (i != 0) {\n res.push(\n {\n title: v.match(\/>.+(?=<)\/gi)[0].replace('>', ''),\n url: v.match(\/href=\\\".+?(?=\\\")\/gi)[0].replace(\/(href=\\\")\/gi, '').replace('1_0.html', '{{page}}_0.html'),\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n })\n }\n })\n})\ntagContent = ajax(source.bookSourceUrl + \"\/taglist\/1.html\")\nres.push(\n {\n title: '>> 标签分类 <<',\n url: '',\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n })\ntry {\ntagContent.match(\/标签分类<\\\/h3>[\\s\\S]+?重置\/gi)[0].match(\/<a.+<\\\/a>\/gi).forEach((v, i) => {\n res.push(\n {\n title: v.match(\/>.+(?=<)\/gi)[0].replace('>', ''),\n url: v.match(\/href=\\\".+?(?=\\\")\/gi)[0].replace(\/(href=\\\")\/gi, '').replace('1.html', '{{page}}.html'),\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n })\n})\n} catch (e) {\n throw(\"标签页解析错误:\"+e+\"\\n标签页源码:\\n\"+tagContent)\n}\nJSON.stringify(res)\n\/\/throw(JSON.stringify(res))", "header": "{\n\"Referer\": \"https:\/\/www.bilinovel.com\",\n\"User-Agent\":\"\",\n\"Accept-Language\":\"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n\"Accept-Encoding\":\"gzip,deflate,br,zstd\",\n\"Accept\":\"*\/*\"\n}", "jsLib": "function errorReg() {\n return \/(java.net.+Exception)|(okhttp.+Exception)|(error code: 1015)|(503 Service Temporarily Unavailable)|(Parse error.+in.+wwwroot.+php)|(_cf_chl_opt|challenges.css)|(<center.+>.+不支持)|(章节内容不支持该浏览器显示)\/gi\n}\nfunction ajax(url) {\n const { java, cookie } = this;\n let content = \"\";\n let time=1;\n \tcontent = java.ajax(url);\n \twhile (String(content).match(errorReg())) {\n if (time>10) {\n \t java.toast(\"重试10次后仍请求失败:\"+url)\n \t throw(\"重试10次后仍请求失败:\"+url+content)\n \t break;\n \t}\n \tif(!!String(content).match(\/不支持\/gi)) {\n \/\/java.log(cookie.getCookie(url));\n cookie.replaceCookie(url,java.webView(null,url,\"document.cookie\"));\n \t}\n \tif (!!String(content).match(\/_cf_chl_opt|challenges.css\/gi)) {\n \t\t i = 1;\n \twhile (!!String(content).match(\/_cf_chl_opt|challenges.css\/gi)) {\n\t java.log('盾');\n\t java.log(content);\n if (i <= 1) {\n java.toast(\"哦呼,五秒盾,正在尝试静默破盾ing……\");\n content = java.webView(null,url,null);\n } else {\n java.toast(\"啊哦,静默破盾好像不管用,试试手动过校验吧!\");\n content = java.startBrowserAwait(url,\"加载完毕后点完成,此页面可能会弹出多次\").body();\n }\n i++;\n }\n continue;\n }\n \t\t java.log(\"请求失败:\"+url)\n \t\t java.log(\"重试\"+time+\"次\")\n \t\t let t=new Date().getTime()\n while (new Date().getTime() - t < 500) { }\n if (String(content).match(\/1015|503|php\/gi)) {\n \t while (new Date().getTime() - t < 5000) { }\n \t}\n \t\t content = java.ajax(url);\n \t\t time++;\n \t}\n \treturn String(content);\n}", "lastUpdateTime": 1710337625074, "loginUi": "[\n {\n \"name\": \"账号\",\n \"type\": \"text\"\n },\n {\n \"name\": \"密码\",\n \"type\": \"password\"\n }\n]", "loginUrl": "@js:\nfunction login() {\n let une = source.getLoginInfoMap().get(\"账号\")\n let pwd = source.getLoginInfoMap().get(\"密码\")\n if (une && pwd) {\n let body = String('username=' + une + '&password=' + pwd + '&usecookie=86400&act=login')\n let url = source.bookSourceUrl + '\/login.php?do=submit'\n let res = java.post(url, body, {\n \"Content-Type\": \"application\/x-www-form-urlencoded\",\n \"Cookie\": java.webView(null,url,\"document.cookie\")\n })\n let ck = res.cookies()\n if (res.body().match(\/错误\/gi)) {\n throw(res.body().match(\/<div class=\"aui-ver-form\">[\\s\\S]+<br>\/gi)[0].replace(\/<.+>\\s*\/gi,\"\"))\n }\n let header = JSON.stringify({\n \"Cookie\": String(ck).match(\/\\{(.*?)\\}\/)[1].replace(\/,\/g, ';')\n })\n source.putLoginHeader(header)\n }\n}", "respondTime": 180000, "ruleBookInfo": { "author": "[property=\"og:novel:author\"]@content", "canReName": "1", "coverUrl": "[property=\"og:image\"]@content", "intro": "[email protected]@textNodes\n@js:\nresult=\" \"+result;", "kind": "[email protected]@ownText&&class.tag-small red@text\n##.*万字|·.*", "lastChapter": "class.gray ell@text##(\\d+-\\d+-\\d+\\s\\d+:\\d+)·(.*)##$2 • $1", "name": "[property=\"og:novel:book_name\"]@content", "tocUrl": "class.btn-normal red@href", "wordCount": "[email protected]@ownText##连载|完结" }, "ruleContent": { "content": "@js:\nif (String(src).match(errorReg())) {\n java.log(src)\n src=ajax(baseUrl);\n}\njava.setContent(src)\nif (java.get('jsContent') == '' || java.get('id') == '') {\n jsLink = java.getString(\"tag.script@src\").match(\/http.+zhmb.+\\?v.+\/gi)\n try {\n jsLink.forEach(link => {\n jsRaw = java.cacheFile(link)\n jsContent = jsRaw.match(\/.+\\\\x.+\/gi)\n if (jsContent) {\n java.put('id', jsRaw.match(\/contentid: '.+(?=',)\/gi)[0].replace(\"contentid: '\", ''))\n java.put('jsContent', jsContent[0])\n }\n \t})\n \t} catch(e) {\n \t\t throw(\"正文获取js错误:\\n\"+e+\"\\n正文源码:\\n\"+src)\n \t}\n \/\/java.ajaxAll(jsLink).forEach(res => {\n \/\/ jsRaw = res.body()\n \/\/})\n}\ntry {\n h = String(java.getString(\"id.\" + java.get('id') + \"@html\"))\n h = h.replace(\" \", \" \")\n el = { innerHTML: String(h) }\n document = { getElementById: () => { return el } }\n window = { document: document, RegExp: RegExp }\n eval(String(java.get('jsContent')))\n} catch(e) {\n java.log(src)\n throw(\"js 执行错误:\"+e+\"\\njs 内容;\\n\"+jsContent)\n}\nh = el.innerHTML\nh", "imageDecode": "", "imageStyle": "FULL", "nextContentUrl": "##url_next:'([^']*)'##$1###\n@js:\n\/\/121_2.html这样的是下一页,纯数字则是下一章\n\/\/带有catalog是详情页\njava.log(\"url: \"+result)\nif (result==\"\") java.log(src)\nvar isNew=\/(\\\/(\\d+).html)|catalog\/.test(result);\nvar out=isNew?'':result;\nout", "payAction": "@js:\nbaseUrl", "replaceRegex": "##((?<=[\\u4e00-\\u9fa5“‘「(,])\\s+)?<!--\\s*\\(继续下一页\\)\\s*-->\\s*|((?<=[\\u4e00-\\u9fa5“‘「(,])\\s+)?\\(本章未完\\)\\s*|.+tmygod.+\\n", "title": "id.atitle@text" }, "ruleExplore": { "author": "class.book-author@ownText", "bookList": "@js:\ni = 1;\n\nif (String(src).match(errorReg())) {\n src=ajax(baseUrl);\n}\njava.setContent(src)\nresult = java.getElement(\"[email protected]\");\nresult;", "bookUrl": "a@href", "coverUrl": "img@data-src", "intro": "class.book-desc@text&&class.ell@text", "kind": "class.tag-small-group [email protected]@text&&\nclass.tag-small-group [email protected]@text&&\ntag.time@text\n@js:\nres=[]\nresult.forEach(item=>{\n item.split(new RegExp(\"[ \\\/]\",\"gi\")).forEach(i=>res.push(i))\n})\nres", "name": "[email protected]@alt", "wordCount": "class.tag-small blue@text" }, "ruleSearch": { "author": "class.book-author@textNodes", "bookList": "@js:\njava.log(cookie.getCookie(baseUrl))\nif (String(result).match(errorReg())&&!result.includes(\"somework\")) {\n result=ajax(baseUrl);\n}\nif (result.includes(\"no-js\")) {\n java.log(result)\n jsContent = java.cacheFile(java.getString(\"tag.script@src\").match(\/http.+somework.+\\?v.+\/gi)[0])\n window = {\n a: result.match(\/window.a=\\'.+\\'\/gi)[0].replace(\/window.a=|\\'\/gi, ''),\n b: result.match(\/window.b=\\'.+\\'\/gi)[0].replace(\/window.b=|\\'\/gi, ''),\n c: result.match(\/window.c=\\'.+\\'\/gi)[0].replace(\/window.c=|\\'\/gi, ''),\n crypto: {\n subtle: {\n importKey(format, keyData, algorithm, extractable, keyUsages) {\n return {\n then(func) { func(keyData) }\n }\n },\n decrypt(algorithm, key, data) {\n cipher = java.createSymmetricCrypto(\"AES\/CTR\/NoPadding\", key, algorithm.counter)\n return {\n then: (func) => { func(cipher.decryptStr(data)) }\n }\n }\n }\n }\n }\n setTimeout = () => { }\n function TextDecoder() { }\n TextDecoder.prototype.decode = bytes => bytes\n document = { cookie: \"\" }\n java.log(jsContent)\n funcName=String(jsContent).match(\/^function.+\\(\/gi)[0].replace(\/function| |\\(\/gi,'')\n \tjava.log(funcName)\n eval(funcName + ' = str => java.base64DecodeToByteArray(str)')\n eval(String(jsContent)\n .replace(\/^function.+\\(\/gi, 'function ('))\n java.log(document.cookie)\n cookie.replaceCookie(baseUrl, document.cookie)\n do {\n t = new Date().getTime()\n while (new Date().getTime() - t < 5000) { }\n java.setContent(result = ajax(baseUrl + \",\"\n + JSON.stringify({\n headers: {\n Cookie: cookie.getCookie(baseUrl)\n }\n })))\n java.log(result)\n } while (result.includes(\"no-js\"))\n}\njava.getElement(\"class.book-ol [email protected]\")", "bookUrl": "tag.a.0@href", "checkKeyWord": "我的青春恋爱喜剧", "coverUrl": "a@href@js:\nvar id = result.match(\/\\\/(\\d+)\\.html\/)[1];\n'https:\/\/www.linovelib.com\/files\/article\/image\/'+parseInt(id\/1000)+'\/'+id+'\/'+id+'s.jpg';", "intro": "class.book-desc@text", "kind": "class.tag-small-group [email protected]@text\n@js:\nres=[]\nresult.forEach(item=>{\n item.split(new RegExp(\"[ \\\/]\",\"gi\")).forEach(i=>res.push(i))\n})\nres", "name": "[email protected]@text" }, "ruleToc": { "chapterList": "[email protected]\n@js:\n \/\/现实debug(尝试修复正文链接问题,和目录不全)\n \/\/《好友角色的我怎么可能大受欢迎》第三卷12\n \/\/《我的青春恋爱喜剧》\n \/\/2022-8-19\n \/\/原来的代码在源注释(已移除)\n \/\/2022-8-20修复https:\/\/w.linovelib.com\/novel\/2765.html目录加载失败\n \/\/2023-9-30使用易于理解的变量命名\n \/\/2023-10-7处理cid(1)以及连续多个cid(0)\n \/\/2023-11-11解决了一个原来手滑写出的bug\n \/\/2023-11-16处理连续多个卷名\n \/\/2023-12-12适配新版卷名\n \/\/2024-2-6处理《谁说从妥协开始的恋爱一定没结果》\n\nres = result\n\/\/java.log(res)\n\nfor (i = 0; i < res.length; i++) {\n java.setContent(res[i])\n if (java.getString(\"tag.a@href\").match(\/javascript:cid\\(.+\\)\/gi)) {\n if (String(res[(i == res.length - 1?i:i+1)]).match(\/javascript:cid\\(.+\\)\/gi)) {\n java.setContent(res[i - 1])\n prevLink = java.getString(\"tag.a@href\")\n if (prevLink == \"\") {\n java.setContent(res[i - 2])\n prevLink = java.getString(\"tag.a@href\")\n }\n content = ajax(source.bookSourceUrl + prevLink)\n java.setContent(content)\n foot = java.getElements(\"id.footlink\")\n path = prevLink\n\n \/\/java.log(foot)\n while (String(foot).match(\/下一页|下一頁\/gi)) {\n \t \/\/java.log(foot)\n str = content.match(\/<script type\\=\\\"text\\\/javascript\\\">var ReadParams.*\/)\n path = String(str).match(\/url_next\\:'.*?html\/)[0].replace(\"url_next:'\", \"\")\n content = java.ajax(\"https:\/\/w.linovelib.com\" + path)\n java.setContent(content)\n foot = java.getElements(\"id.footlink\")\n }\n\n next = ajax(source.bookSourceUrl + path)\n str = next.match(\/<script type\\=\\\"text\\\/javascript\\\">var ReadParams.*\/)\n path = String(str).match(\/url_next\\:'.*?html\/)[0].replace(\"url_next:'\", \"\")\n java.log('l:'+path)\n res[i] = String(res[i]).replace(\/javascript:cid\\(.+\\)\/gi, path)\n } else {\n nextLink = \"\"\n for (var j=1;nextLink==\"\";j++) {\n java.setContent(res[i + j])\n nextLink = java.getString(\"tag.a@href\")\n }\n next = ajax(source.bookSourceUrl + nextLink)\n str = next.match(\/<script type\\=\\\"text\\\/javascript\\\">var ReadParams.*\/)\n try {\n path = String(str).match(\/url_previous\\:'.*?html\/)[0].replace(\"url_previous:'\", \"\")\n } catch(e) {\n \t java.toast(String(next)+\"\\n\")\n \t java.log(next)\n \t throw(\"目录解析报错开始:\\n\"+String(next)+\"\\n结束\")\n \t}\n \/\/java.log(path)\n\n res[i] = String(res[i]).replace(\/javascript:cid\\(.+\\)\/gi, path)\n }\n }\n\n \/\/java.log(res[i])\n}\nres", "chapterName": "text", "chapterUrl": "@js:\n\/\/只有不为卷名时返回URL,避免阅读自动合并\njava.getString(\"class.chapter-bar@text\")!=java.getString(\"text\") ? java.getString(\"tag.a@href\") : \"\"", "isVolume": "@js:\njava.getString(\"class.chapter-bar@text\")==java.getString(\"text\")", "updateTime": "" }, "searchUrl": "<js>\npage == 1 ?\n \"\/search.html?searchkey={{key}}&searchtype=all\"\n :\n '\/search\/{{key}}_{{page}}.html'\n<\/js>", "weight": 0 }