完本小说网
https://www.finalbooks.work
yezechuandl (3004)07/22 14:13
//2025.7.22 ◎夜泽川◎
{
"bookSourceComment": "\/\/2025.7.22 ◎夜泽川◎",
"bookSourceGroup": "网络,自制",
"bookSourceName": "完本小说网",
"bookSourceType": 0,
"bookSourceUrl": "https:\/\/www.finalbooks.work",
"bookUrlPattern": "https?:\\\/\\\/www\\.finalbooks\\.work\\\/book\\\/\\d+\\\/?",
"customOrder": 2,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"exploreUrl": "@js:\nvar result = [];\nvar push = (title, url, size) => result.push({\n title: title,\n url: url,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: size\n }\n});\n\nvar tags = org.jsoup.Jsoup.parse(java.ajax(source.key + \"\/category\/\"))\n .select('.CGsectionTwo-left a')\n .toArray()\n .map(tag => {\n let text = [String(tag.text()).trim(), String(tag.attr('href')).match(\/(\\d+)\/)[1]];\n return String(tag.text()).trim() ? text : null;\n })\n .filter(item => item !== null);\n\n[\n [\"༺ˇ»`ʚ 分类 ɞ´«ˇ༻\", \"\/category\/\"],\n [\"༺ˇ»`ʚ 排行榜 ɞ´«ˇ༻\", null],\n [\"༺ˇ»`ʚ 总榜 ɞ´«ˇ༻\", \"\/rank\/all\/\"],\n [\"༺ˇ»`ʚ 周榜 ɞ´«ˇ༻\", \"\/rank\/\"],\n [\"༺ˇ»`ʚ 月榜 ɞ´«ˇ༻\", \"\/rank\/month\/\"],\n [\"༺ˇ»`ʚ 全本 ɞ´«ˇ༻\", \"\/category\/finish\/\"]\n].forEach(item => {\n push(item[0], null, 1);\n if (item[1]) {\n tags.forEach((tag, index) => {\n let url = item[1] + tag[1] + \"\/{{page}}.html\";\n push(tag[0], url, (index ? 0.2 : 1));\n });\n }\n});\nJSON.stringify(result);",
"header": "{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 9) Mobile Safari\/537.36\"}",
"jsLib": "function decrypt(encryptedTxt, keySeed) {\n const { java } = this;\n let result;\n try {\n const fullKey = java.md5Encode(keySeed);\n const ivBytes = java.strToBytes(fullKey.substring(0, 16));\n const keyBytes = java.strToBytes(fullKey.substring(16));\n\n const Cipher = java.createSymmetricCrypto(\n \"AES\/CBC\/Pkcs7Padding\",\n keyBytes,\n ivBytes\n );\n\n result = Cipher.decryptStr(java.base64DecodeToByteArray(encryptedTxt));\n } catch (e) {\n java.log(e.message);\n result = \"解密失败\";\n }\n return result;\n}",
"lastUpdateTime": "1753164782957",
"respondTime": 180000,
"ruleBookInfo": {
"author": "@get:{a}",
"coverUrl": "@get:{i}",
"init": "@put:{\"n\":\"[property$=book_name]@content\",\n\"a\":\"[property$=author]@content\",\n\"t\":\"[property~=category|status]@content\",\n\"l\":\"[property$=lastest_chapter_name]@content\",\n\"i\":\"[property$=image]@content\",\n\"o\":\"[property$=description]@content\",\n\"g\":\"[property$=update_time]@content\",\n\"m\":\".BGsectionOne-bottom@li.1@a@href\"\n}",
"intro": "@get:{o}",
"kind": "@get:{t}",
"lastChapter": "@get:{l}◎@get:{g}",
"name": "@get:{n}",
"tocUrl": "@get:{m}"
},
"ruleContent": {
"content": "@js:\nlet data = src.match(\/d\\(\"([^\\)]+)\/)[1].replace(\/\"|\\s\/g, \"\").trim().split(\",\");\ndecrypt(data[0], data[1]);"
},
"ruleExplore": {
"author": "a[href^=\"\/writer\/\"]@text",
"bookList": "[class$=\"unit\"]",
"bookUrl": "a[href^=\"\/book\/\"]@href",
"kind": "p.-1@text",
"name": "a[href^=\"\/book\/\"][0]@text"
},
"ruleSearch": {
"author": "a[href^=\"\/writer\/\"]@text",
"bookList": ".SHsectionThree-middle > p",
"bookUrl": "a[href^=\"\/book\/\"]@href",
"kind": "a[href^=\"\/category\/\"]@text",
"name": "a[href^=\"\/book\/\"]@text"
},
"ruleToc": {
"chapterList": "ol > li\n<js>\nlet Regex_ = \/(data-[a-zA-Z0-9]+)\/g;\nlet label = result.select('li')[0].outerHtml().match(Regex_)[1];\nresult.sort((a, b) => +a.attr(label) - +b.attr(label));\nchapterList = result.select('a').toArray().map(e => {\n let labeln = e.outerHtml().match(Regex_);\n return {\n title: String(e.attr(labeln[0])).trim() || e.text(),\n url: java.base64Decode(String(e.attr(labeln[1])))\n }\n});\nJSON.stringify(chapterList);\n<\/js>\n$[*]",
"chapterName": "$.title",
"chapterUrl": "$.url",
"nextTocUrl": "@js:\nvar pages = [];\nvar endPage = String(java.getString('#end@href'));\nvar num = +endPage.match(\/(\\d+)\/g)[1];\nfor (let i = 2; i <= num; i++) {\n pages.push(String(book.tocUrl).replace(\/$\/, i + \".html\"));\n}\npages;"
},
"searchUrl": "\/search\/{{key}}\/{{page}}",
"weight": 0
}