From 859a160f65605e8520ab170195ac6d9679601791 Mon Sep 17 00:00:00 2001 From: Tthfyth Date: Mon, 8 Dec 2025 17:14:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B9=A6=E6=BA=90=E8=B0=83?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1765179391.json | 1 + README.md | 289 +- analyze-results.ts | 68 + assets/icon.icns | Bin 111909 -> 0 bytes assets/icon.ico | Bin 370070 -> 12655 bytes assets/icon.png | Bin 32456 -> 128110 bytes assets/icon.svg | 76 +- batch-results.json | 407 +++ check-source.js | 6 + package.json | 5 +- pnpm-lock.yaml | 60 + release/app/package.json | 6 +- shareBookSource(1).json | 2513 ++++++++++++++++++ src/main/debug/analyze-url.ts | 86 +- src/main/debug/cache-manager.ts | 255 ++ src/main/debug/cookie-manager.ts | 181 ++ src/main/debug/index.ts | 2 + src/main/debug/rule-parser.ts | 470 +++- src/main/debug/source-debugger.ts | 401 ++- src/main/debug/yiciyuan-debugger.ts | 791 ++++++ src/main/main.ts | 84 +- src/main/services/puppeteer-service.ts | 81 +- src/renderer/App.tsx | 5 +- src/renderer/components/AIChatPanel.tsx | 17 +- src/renderer/components/AppTour.tsx | 335 +++ src/renderer/components/CodeEditor.tsx | 30 +- src/renderer/components/DebugConsole.tsx | 14 +- src/renderer/components/DebugPanel.tsx | 404 ++- src/renderer/components/MainLayout.tsx | 18 +- src/renderer/components/SourceFormEditor.tsx | 77 +- src/renderer/components/SourceSidebar.tsx | 66 +- src/renderer/components/SourceVisualizer.tsx | 617 +++++ src/renderer/components/TopToolbar.tsx | 129 +- src/renderer/index.ejs | 2 +- src/renderer/lib/yiciyuanSourceEditConfig.ts | 362 +++ src/renderer/stores/bookSourceStore.ts | 111 +- src/renderer/types/index.ts | 142 +- src/renderer/utils/sourceConverter.test.ts | 265 ++ src/renderer/utils/sourceConverter.ts | 481 ++++ test-20-sources.ts | 501 ++++ test-9comic-detail.ts | 59 + test-9comic-toc.ts | 46 + test-9comic.ts | 60 + test-actual-parselist.ts | 45 + test-actual-parselist2.ts | 53 + test-aes.ts | 28 + test-all-legado-sources.ts | 257 ++ test-all-results.json | 285 ++ test-baozi-chapter.ts | 63 + test-baozi-direct.ts | 43 + test-batch-quick.ts | 156 ++ test-batch-results.json | 261 ++ test-batch.ts | 134 + test-convert-request.ts | 221 ++ test-convert-rhino.ts | 46 + test-debug-flow.ts | 223 ++ test-debug-issues.ts | 244 ++ test-debug-parselist-internal.ts | 243 ++ test-debug-search-url.ts | 39 + test-debug-search.ts | 146 + test-debug-select.ts | 50 + test-exclude-syntax.ts | 54 + test-execute-js-debug.ts | 94 + test-full-flow.ts | 324 +++ test-gshe-tocurl.ts | 52 + test-gshe-tocurl2.ts | 57 + test-gshe.ts | 44 + test-gshe2.ts | 51 + test-gstation-api.ts | 48 + test-gstation.ts | 149 ++ test-js-debug.ts | 65 + test-js-exec.ts | 42 + test-keywords.ts | 27 + test-mhua-chapter.ts | 77 + test-mhua-structure.ts | 76 + test-multiple-sources.ts | 238 ++ test-parse-list.ts | 140 + test-parse-or.ts | 67 + test-parse-rule-debug.ts | 45 + test-parselist-debug.ts | 86 + test-parselist-debug2.ts | 59 + test-parselist-trace.ts | 125 + test-process-js-rule.ts | 119 + test-process-js.ts | 54 + test-qmmh.ts | 36 + test-quick.ts | 148 ++ test-reliable-sources.ts | 317 +++ test-results.json | 511 ++++ test-select-debug.ts | 86 + test-selector.ts | 39 + test-source-one.ts | 182 ++ test-specific-sources.ts | 103 + test-tencent-zymk.ts | 154 ++ test-ul-selector.ts | 37 + test-wuqian-search.ts | 64 + test-yiciyuan-compat.ts | 229 ++ test-yiciyuan-debugger.ts | 100 + test-yiciyuan-full.ts | 113 + test-yiciyuan-sources.json | 227 ++ test-zymk-chapterlist.ts | 60 + test-zymk-content.ts | 65 + test-zymk-search.ts | 84 + test-zymk-toc.ts | 76 + test-zymk.ts | 22 + test-zymk2.ts | 31 + 105 files changed, 16451 insertions(+), 386 deletions(-) create mode 100644 1765179391.json create mode 100644 analyze-results.ts delete mode 100644 assets/icon.icns create mode 100644 batch-results.json create mode 100644 check-source.js create mode 100644 shareBookSource(1).json create mode 100644 src/main/debug/cache-manager.ts create mode 100644 src/main/debug/cookie-manager.ts create mode 100644 src/main/debug/yiciyuan-debugger.ts create mode 100644 src/renderer/components/AppTour.tsx create mode 100644 src/renderer/components/SourceVisualizer.tsx create mode 100644 src/renderer/lib/yiciyuanSourceEditConfig.ts create mode 100644 src/renderer/utils/sourceConverter.test.ts create mode 100644 src/renderer/utils/sourceConverter.ts create mode 100644 test-20-sources.ts create mode 100644 test-9comic-detail.ts create mode 100644 test-9comic-toc.ts create mode 100644 test-9comic.ts create mode 100644 test-actual-parselist.ts create mode 100644 test-actual-parselist2.ts create mode 100644 test-aes.ts create mode 100644 test-all-legado-sources.ts create mode 100644 test-all-results.json create mode 100644 test-baozi-chapter.ts create mode 100644 test-baozi-direct.ts create mode 100644 test-batch-quick.ts create mode 100644 test-batch-results.json create mode 100644 test-batch.ts create mode 100644 test-convert-request.ts create mode 100644 test-convert-rhino.ts create mode 100644 test-debug-flow.ts create mode 100644 test-debug-issues.ts create mode 100644 test-debug-parselist-internal.ts create mode 100644 test-debug-search-url.ts create mode 100644 test-debug-search.ts create mode 100644 test-debug-select.ts create mode 100644 test-exclude-syntax.ts create mode 100644 test-execute-js-debug.ts create mode 100644 test-full-flow.ts create mode 100644 test-gshe-tocurl.ts create mode 100644 test-gshe-tocurl2.ts create mode 100644 test-gshe.ts create mode 100644 test-gshe2.ts create mode 100644 test-gstation-api.ts create mode 100644 test-gstation.ts create mode 100644 test-js-debug.ts create mode 100644 test-js-exec.ts create mode 100644 test-keywords.ts create mode 100644 test-mhua-chapter.ts create mode 100644 test-mhua-structure.ts create mode 100644 test-multiple-sources.ts create mode 100644 test-parse-list.ts create mode 100644 test-parse-or.ts create mode 100644 test-parse-rule-debug.ts create mode 100644 test-parselist-debug.ts create mode 100644 test-parselist-debug2.ts create mode 100644 test-parselist-trace.ts create mode 100644 test-process-js-rule.ts create mode 100644 test-process-js.ts create mode 100644 test-qmmh.ts create mode 100644 test-quick.ts create mode 100644 test-reliable-sources.ts create mode 100644 test-results.json create mode 100644 test-select-debug.ts create mode 100644 test-selector.ts create mode 100644 test-source-one.ts create mode 100644 test-specific-sources.ts create mode 100644 test-tencent-zymk.ts create mode 100644 test-ul-selector.ts create mode 100644 test-wuqian-search.ts create mode 100644 test-yiciyuan-compat.ts create mode 100644 test-yiciyuan-debugger.ts create mode 100644 test-yiciyuan-full.ts create mode 100644 test-yiciyuan-sources.json create mode 100644 test-zymk-chapterlist.ts create mode 100644 test-zymk-content.ts create mode 100644 test-zymk-search.ts create mode 100644 test-zymk-toc.ts create mode 100644 test-zymk.ts create mode 100644 test-zymk2.ts diff --git a/1765179391.json b/1765179391.json new file mode 100644 index 0000000..32a3c07 --- /dev/null +++ b/1765179391.json @@ -0,0 +1 @@ +[{"bookDelayTime":"","bookSingleThread":"\u5426","bookSourceGroup":"","bookSourceName":"\u518d\u6f2b\u753b","bookSourceType":"\u6f2b\u753b","bookSourceUrl":"https:\/\/v4api.zaimanhua.com","enable":true,"httpUserAgent":"Dart\/3.4 (dart:io)","lastUpdateTime":0,"loginUrl":"https:\/\/zaimanhua.com","loginUrlResult":"","ruleBookAuthor":"","ruleBookContent":"*.data.page_url.*@Header:{referer=\"https:\/\/www.zaimanhua.com\/\"}","ruleBookContentDecoder":"","ruleBookKind":"$.data.data.status&&$.data.data.types(function(result){\n var sp = new String(result).split(\",\");\n var l = [];\n for (var i = 0; i < sp.length; i++){\n var current = sp[i];\n current = current.trim();\n var index = current.indexOf(\"=\");\n var key = current.slice(0, index).replace(\"{\",\"\").replace(\" \",\"\");\n if (key != \"tag_name\"){\n continue;\n }\n var value = current.slice(index + 1).replace(\"}\",\"\");\n l.push(value);\n }\n return l;\n})(result);\n<\/js>","ruleBookLastChapter":"$.data.data.last_update_chapter_name","ruleBookName":"","ruleBookUrlPattern":"","ruleChapterId":"","ruleChapterList":"-$.data.data.chapters.*.data.*","ruleChapterName":"$.chapter_title","ruleChapterParentId":"","ruleChapterParentName":"","ruleChapterUrl":"","ruleChapterUrlNext":"","ruleContentUrl":"$.chapter_id(function(result,prePage){\n var prePageUrl = new String(prePage);\n var first = prePageUrl.split(\"?\")[0].replace(\"detail\",\"chapter\");\n var timestamp = Math.floor(new Date().getTime() \/ 1000);\n return first + \"\/\" + result + \"?platform=android×tamp=\" + timestamp + \"&_v=2.3.0&_c=101_01_01_000\";\n})(result,baseUrl);<\/js>","ruleContentUrlNext":"","ruleCoverDecoder":"","ruleCoverUrl":"","ruleFindUrl":"\u6700\u8fd1\u66f4\u65b0::https:\/\/v4api.zaimanhua.com\/app\/v1\/comic\/update\/list\/0\/searchPage@Header:{Authorization:\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE3NjQ3NjQwMTMsImlhdCI6MTc2MjE3MjAxMywianRpIjoidW5pcXVlX2lkIiwibmJmIjoxNzYyMTcyMDEzLCJzdWIiOiJrd2FmZjg3IiwidWlkIjoxOTAyNTMsInVzZXJfbGV2ZWwiOjJ9.gciya97PgYAEwEBou3l3OatF6fRPbfOOpRImJcCZb7c\"}\n\u4eba\u6c14\u6392\u884c::https:\/\/v4api.zaimanhua.com\/app\/v1\/comic\/rank\/list?tag_id=0&by_time=3&rank_type=0&page=searchPage\n\u5410\u69fd\u6392\u884c::https:\/\/v4api.zaimanhua.com\/app\/v1\/comic\/rank\/list?tag_id=0&by_time=3&rank_type=1&page=searchPage\n\u8ba2\u9605\u6392\u884c::https:\/\/v4api.zaimanhua.com\/app\/v1\/comic\/rank\/list?tag_id=0&by_time=3&rank_type=2&page=searchPage","ruleIntroduce":"$.data.data.description","ruleSearchAuthor":"$.authors","ruleSearchCoverDecoder":"","ruleSearchCoverUrl":"$.cover","ruleSearchKind":"$.types","ruleSearchLastChapter":"$.last_name","ruleSearchList":"$.data.list||$.data","ruleSearchName":"$.title","ruleSearchNoteUrl":"$.id&&$.comic_id(function(result)\n{\nvar text = new String(result); \nvar length = text.length;\nif (text.startsWith(\"0\"))\n{ \n text=text.substring(1);\n} \nelse \n{\n text=text.substring(0, length - 1);\n} \nvar timestamp = new Date().getTime();\nreturn \"https:\/\/v4api.zaimanhua.com\/app\/v1\/comic\/detail\/\" + text + \"?platform=android×tamp=\" + timestamp + \"&_v=2.3.0&_c=101_01_01_000\";\n})(result);<\/js>@Header:{Authorization:\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE3NjQ3NjQwMTMsImlhdCI6MTc2MjE3MjAxMywianRpIjoidW5pcXVlX2lkIiwibmJmIjoxNzYyMTcyMDEzLCJzdWIiOiJrd2FmZjg3IiwidWlkIjoxOTAyNTMsInVzZXJfbGV2ZWwiOjJ9.gciya97PgYAEwEBou3l3OatF6fRPbfOOpRImJcCZb7c\",appversion:\"2.3.0\",channel=\"101_01_01_000\",buildnumber=\"1502206\",host=\"v4api.zaimanhua.com\"}","ruleSearchUrl":"https:\/\/v4api.zaimanhua.com\/app\/v1\/search\/index?keyword=searchKey&source=0&page=searchPage&size=20","ruleSearchUrlNext":"","serialNumber":1,"sourceRemark":"\u53ef\u80fd\u662fdmzj\u7684\u5e73\u66ff","weight":0},{"bookSourceGroup":"\u6f2b\u753b","bookSourceName":"\u5305\u5b50\u6f2b\u753bcn","bookSourceType":"\u6f2b\u753b","bookSourceUrl":"https:\/\/cn.bzmanga.com","enable":true,"httpUserAgent":"Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko\/20100101 Firefox\/34.0","lastUpdateTime":0,"loginUrl":"","loginUrlResult":"","ruleBookAuthor":"h2.comics-detail__author@text","ruleBookContent":"@js:\nlet list = [];\nlet doc = org.jsoup.Jsoup.parse(result);\nfor (;;) {\n let arr = doc.select('amp-state[id^=\"chapter\"] > script').toArray().map(e => String(e));\n for (let x = 0; x < arr.length; x++) {\n let text = arr[x];\n let u = JSON.parse(arr[x].match(\/(.*)<\\\/script>\/)[1].replace(\/baozicdn\/,'baozimh'));\n list.push(u.url);\n }\n nextNode = doc.select('#next-chapter');\n if (!String(nextNode.text()).match(\/\u4e0b\u4e00\u9875\/)) break;\n nextUrl = String(nextNode.attr('href'));\n doc = org.jsoup.Jsoup.connect(nextUrl).get();\n}\nlist;@Header:{Referer:\"https:\/\/cn.bzmanga.com\/\"}","ruleBookContentDecoder":"","ruleBookKind":".tag-list@span@text","ruleBookLastChapter":".supporting-text span>a@text","ruleBookName":"h1.comics-detail__title@text","ruleChapterId":"","ruleChapterList":"@js:\nvar doc = org.jsoup.Jsoup.parse(result);\n(function (){\n rule1 = doc.select(\".section-title:contains(\u7ae0\u8282\u76ee\u5f55)~div .comics-chapters__item\");\n if (rule1.size() > 0) return rule1;\n rule2 = doc.select(\".section-title:contains(\u6700\u65b0\u7ae0\u8282)~div .comics-chapters__item\")\n if (rule2.size() > 0) return rule2.toArray().reverse();\n return doc.select(\"div>span:contains(\u6700\u65b0\uff1a) a\");\n})()","ruleChapterName":"text","ruleChapterParentId":"","ruleChapterParentName":"","ruleChapterUrl":"","ruleChapterUrlNext":"","ruleContentUrl":"href","ruleContentUrlNext":"","ruleCoverUrl":".pure-u-1-1 amp-img@src","ruleFindUrl":"\u6700\u65b0\u4e0a\u67b6::https:\/\/cn.bzmanga.com\/list\/new\n\u4e2d\u56fd::https:\/\/cn.bzmanga.com\/classify?region=cn&page=searchPage\n\u65e5\u672c::https:\/\/cn.bzmanga.com\/classify?region=jp&page=searchPage\n\u6b27\u7f8e::https:\/\/cn.bzmanga.com\/classify?region=en&page=searchPage\n\u8fde\u8f7d\u4e2d::https:\/\/cn.bzmanga.com\/classify?state=serial&page=searchPage\n\u5df2\u5b8c\u7ed3::https:\/\/cn.bzmanga.com\/classify?state=pub&page=searchPage\n\u90fd\u5e02::https:\/\/cn.bzmanga.com\/classify?type=dushi&page=searchPage\n\u5192\u9669::https:\/\/cn.bzmanga.com\/classify?type=mouxian&page=searchPage\n\u70ed\u8840::https:\/\/cn.bzmanga.com\/classify?type=rexie&page=searchPage\n\u7231\u60c5::https:\/\/cn.bzmanga.com\/classify?type=aiqing&page=searchPage\n\u604b\u7231::https:\/\/cn.bzmanga.com\/classify?type=lianai&page=searchPage\n\u803d\u7f8e::https:\/\/cn.bzmanga.com\/classify?type=danmei&page=searchPage\n\u6b66\u4fa0::https:\/\/cn.bzmanga.com\/classify?type=wuxia&page=searchPage\n\u683c\u6597::https:\/\/cn.bzmanga.com\/classify?type=gedou&page=searchPage\n\u79d1\u5e7b::https:\/\/cn.bzmanga.com\/classify?type=kehuan&page=searchPage\n\u9b54\u5e7b::https:\/\/cn.bzmanga.com\/classify?type=mohuan&page=searchPage\n\u4fa6\u63a2::https:\/\/cn.bzmanga.com\/classify?type=zhentan&page=searchPage\n\u63a8\u7406::https:\/\/cn.bzmanga.com\/classify?type=tuili&page=searchPage\n\u7384\u5e7b::https:\/\/cn.bzmanga.com\/classify?type=xuanhuan&page=searchPage\n\u65e5\u5e38::https:\/\/cn.bzmanga.com\/classify?type=richang&page=searchPage\n\u751f\u6d3b::https:\/\/cn.bzmanga.com\/classify?type=shenghuo&page=searchPage\n\u641e\u7b11::https:\/\/cn.bzmanga.com\/classify?type=gaoxiao&page=searchPage\n\u6821\u56ed::https:\/\/cn.bzmanga.com\/classify?type=xiaoyuan&page=searchPage\n\u5947\u5e7b::https:\/\/cn.bzmanga.com\/classify?type=qihuan&page=searchPage\nABCD::https:\/\/cn.bzmanga.com\/classify?filter=ABCD&page=searchPage\nEFGH::https:\/\/cn.bzmanga.com\/classify?filter=EFGH&page=searchPage\nIJKL::https:\/\/cn.bzmanga.com\/classify?filter=IJKL&page=searchPage\nMNOP::https:\/\/cn.bzmanga.com\/classify?filter=MNOP&page=searchPage\nQRST::https:\/\/cn.bzmanga.com\/classify?filter=QRST&page=searchPage\nUVW::https:\/\/cn.bzmanga.com\/classify?filter=UVW&page=searchPage\nXYZ::https:\/\/cn.bzmanga.com\/classify?filter=XYZ&page=searchPage\n0-9::https:\/\/cn.bzmanga.com\/classify?filter=0-9&page=searchPage","ruleIntroduce":"p.comics-detail__desc@text","ruleSearchAuthor":".tags@text","ruleSearchCoverUrl":"amp-img@src","ruleSearchKind":"","ruleSearchLastChapter":"","ruleSearchList":".comics-card","ruleSearchName":".comics-card__title@text","ruleSearchNoteUrl":"tag.a.0@href","ruleSearchUrl":"https:\/\/cn.bzmanga.com\/search?q=searchKey","ruleSearchUrlNext":"","serialNumber":10090,"sourceRemark":"\u4fee\u590d\u76ee\u5f55\u95ee\u9898","weight":804},{"bookDelayTime":"","bookSingleThread":"\u5426","bookSourceGroup":"\u25ef \u6f2b\u753b","bookSourceName":"\u25ef 177\u6f2b\u753b","bookSourceType":"\u6f2b\u753b","bookSourceUrl":"https:\/\/www.177picyy.com","enable":false,"httpUserAgent":"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/116.0.0.0 Mobile Safari\/537.36","lastUpdateTime":0,"loginUrl":"","loginUrlResult":"","ruleBookAuthor":"","ruleBookContent":".single-content@img@data-lazy-src@Header:{Referer:host}","ruleBookContentDecoder":"","ruleBookKind":"","ruleBookLastChapter":"","ruleBookName":"","ruleBookUrlPattern":"","ruleChapterId":"","ruleChapterList":"@js:\nu = \/class=\"page-links\"[\\s\\S]*?<\\\/div>\/;\na = String(result).match(u)[0];\np = a.match(\/href=\".*?\"\/g);\nlist = [];\nlist.push({\"text\": 1, \"href\": baseUrl});\nfor(i = 1; i < p.length - 1; i++)\n{\n\t\tlist.push({\n\t\t\t\"text\": String(i + 1),\n\t\t\t\"href\": p[i].match(\/\"(.*?)\"\/)[1]\n });\n}\nlist;","ruleChapterName":"text","ruleChapterParentId":"","ruleChapterParentName":"","ruleChapterUrl":"","ruleChapterUrlNext":"","ruleContentUrl":"href","ruleContentUrlNext":"","ruleCoverDecoder":"","ruleCoverUrl":"","ruleFindUrl":"\u25ef \u4e2d\u6587::\/html\/category\/tt\/page\/searchPage\/\n\n\u26aa\ufe0e \u65e5\u6587::\/html\/category\/jj\/page\/searchPage\/\n\n\u26aa\ufe0e \u5168\u5f69\u4e2d\u6587::\/html\/category\/cg\/cg-cn\/page\/searchPage\/\n\n\u26aa\ufe0e \u5168\u5f69\u65e5\u6587::\/html\/category\/cg\/cg-jp\/page\/searchPage\/\n\n\u26aa\ufe0e \u5168\u5f69\u7eaf\u56fe::\/html\/category\/cg\/cg-no\/page\/searchPage\/","ruleIntroduce":"@js:\na = java.get(\"h2\");","ruleSearchAuthor":"","ruleSearchCoverDecoder":"","ruleSearchCoverUrl":"img@src\n@js:\na = String(result);\np = a.replace(\/w=(\\d+)\/, \"w=810\");\np = p.replace(\/h=(\\d+)\/, \"h=1440\");\np;","ruleSearchKind":"tag.span.1@text","ruleSearchLastChapter":"","ruleSearchList":"id.main@.picture-box||id.main@article","ruleSearchName":"h2@text\n@js:\njava.put(\"h2\", result);","ruleSearchNoteUrl":"a@href","ruleSearchUrl":"https:\/\/www.177picyy.com\/page\/searchPage\/?s=searchKey&cat=0","ruleSearchUrlNext":"","serialNumber":38,"sourceRemark":"\u8981\u9b54\u6cd5","weight":0},{"bookDelayTime":"","bookSingleThread":"\u5426","bookSourceGroup":"\u25ef \u6f2b\u753b","bookSourceName":"\u25ef 18H","bookSourceType":"\u6f2b\u753b","bookSourceUrl":"https:\/\/18h.mm-cg.com","enable":false,"httpUserAgent":"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/116.0.0.0 Mobile Safari\/537.36","lastUpdateTime":0,"loginUrl":"","loginUrlResult":"","ruleBookAuthor":"","ruleBookContent":"@js:\nimg = [];\n\np = \/Large\\_cgurl\\[(\\d+)\\]\\s=\\s\".*?\"\/g;\na = String(result).match(p);\nfor(i = 0; i < a.length; i++)\n{\n img.push(a[i].match(\/\"(.*?)\"\/)[1]);\n}\n\nimg@Header:{Referer:host}","ruleBookContentDecoder":"","ruleBookKind":".changetextval@text","ruleBookLastChapter":"","ruleBookName":"","ruleBookUrlPattern":"","ruleChapterId":"","ruleChapterList":"@js:\nlist = [{\"text\": \"1\", \"href\": baseUrl}];","ruleChapterName":"text","ruleChapterParentId":"","ruleChapterParentName":"","ruleChapterUrl":"","ruleChapterUrlNext":"","ruleContentUrl":"href","ruleContentUrlNext":"","ruleCoverDecoder":"","ruleCoverUrl":"","ruleFindUrl":"\u25ef \u9996\u9875::\/zh\/18H_list\/all\/searchPage.html\n\n\u26aa\ufe0e \u77ed\u7bc7::\/zh\/doujin_list\/all\/searchPage.html\n\n\u26aa\ufe0e \u968f\u673a::\/zh\/18H_random\/all\/index\/searchPage.html","ruleIntroduce":".archive-title!-1@tag.h1@text","ruleSearchAuthor":"","ruleSearchCoverDecoder":"","ruleSearchCoverUrl":"img@src","ruleSearchKind":"","ruleSearchLastChapter":"","ruleSearchList":".post","ruleSearchName":"tag.a.1@text","ruleSearchNoteUrl":"a@href","ruleSearchUrl":"https:\/\/18h.mm-cg.com\/zh\/18H_search\/all\/searchKey\/searchPage.html","ruleSearchUrlNext":"","serialNumber":27,"sourceRemark":"\u8981\u9b54\u6cd5","weight":0},{"bookSourceType":0,"bookSourceName":"kuronavi\u6f2b\u753braw","bookSourceUrl":"https:\/\/kuronavi.blog","bookSourceGroup":"\u6f2b\u753b; \u65e5\u6f2b; Raw","bookSourceRemark":"kuronavi\u6f2b\u753braw\u6e90\uff0c\u63d0\u4f9b\u65e5\u672c\u6f2b\u753braw\u8d44\u6e90","bookSingleThread":false,"bookDelayTime":0,"loginUrl":"","loginUrlResult":"","header":"{\"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36\"}","ruleFindUrl":"","ruleSearchUrl":"https:\/\/kuronavi.blog\/search\/manga?keyword=searchKey","ruleSearchList":".item","ruleSearchUrlNext":"","ruleSearchName":"figcaption h3 a@text","ruleSearchAuthor":".author@text||\u66f4\u65b0\u4e2d","ruleSearchCoverUrl":".image img@src","ruleSearchKind":".box_tooltip p:contains(\u30b8\u30e3\u30f3\u30eb) @text##\u30b8\u30e3\u30f3\u30eb\uff1a","ruleSearchLastChapter":".Chapter a:first@text","ruleSearchNoteUrl":"figcaption h3 a@href","ruleBookName":".title-detail@text","ruleBookAuthor":".author .col-xs-8@text##\u66f4\u65b0\u4e2d","ruleCoverUrl":".Col-image img@src","ruleIntroduce":".detail-content p@text","ruleBookKind":".kind .col-xs-8@text","ruleBookLastChapter":".list-chapter nav ul li:first-child .chapter a@text","ruleChapterList":"-.list-chapter nav ul li","ruleChapterUrl":"","ruleChapterUrlNext":"","ruleChapterParentId":"","ruleChapterParentName":"","ruleChapterName":".chapter a@text","ruleContentUrl":".chapter a@href","ruleChapterId":"","ruleBookContent":".page-chapter img@src@Header:{Referer:host}","ruleBookContentDecode":"","ruleContentUrlNext":""},{"bookDelayTime":"","bookSingleThread":"\u5426","bookSourceGroup":"","bookSourceName":"\u5df4\u5361\u6f2b\u753b","bookSourceType":"\u6f2b\u753b","bookSourceUrl":"https:\/\/bakamh.ru","enable":true,"httpUserAgent":"Mozilla\/5.0 (Linux; U; Android 16; zh-cn; 24129PN74C Build\/BP2A.250605.031.A3) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/135.0.7049.79 Mobile Safari\/537.36 XiaoMi\/MiuiBrowser\/20.7.61121","lastUpdateTime":0,"loginUrl":"https:\/\/bakamh.ru\/","loginUrlResult":"","ruleBookAuthor":"\/\/div[5]\/div[2]\/div\/a\/text()","ruleBookContent":"\/\/img[@class=\"wp-manga-chapter-img\"]\/@src","ruleBookContentDecoder":"","ruleBookKind":"\/\/div[8]\/div[2]\/div\/a\/text()","ruleBookLastChapter":"","ruleBookName":"\/\/h1\/text()","ruleBookUrlPattern":"","ruleChapterId":"","ruleChapterList":"-\/\/li[contains(@class, 'chapter-loveYou')]\/a","ruleChapterName":"text","ruleChapterParentId":"","ruleChapterParentName":"","ruleChapterUrl":"","ruleChapterUrlNext":"","ruleContentUrl":"chapter-data-url","ruleContentUrlNext":"text.\u4e0b\u4e00\u8bdd@href","ruleCoverDecoder":"","ruleCoverUrl":"\/\/div[2]\/div\/div\/div\/div[1]\/div\/div[1]\/div\/div[2]\/div\/div[1]\/a\/img\/@src@Header:{\"Accpt-Encoding\":\"gzip,deflate,br,zstd\";\"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7\";\"sec-ch-ua\":\"0\"}","ruleFindUrl":"\u97e9\u6f2b::manhwa\/page\/searchPage@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}\nBL\u6f2b\u753b::bl\/page\/searchPage@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}\nGL\u6f2b\u753b::gl\/page\/searchPage@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}\n\u5168\u5e74\u9f84\u6f2b\u753b::allages\/page\/searchPage@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}\n\u82f1\u6587\u6f2b\u753b::en-manga\/page\/searchPage@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}","ruleIntroduce":"\/\/div[11]\/div\/p\/text()","ruleSearchAuthor":"","ruleSearchCoverDecoder":"","ruleSearchCoverUrl":".img-responsive@src@Header:{\"Accpt-Encoding\":\"gzip,deflate,br,zstd\";\"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7\";\"sec-ch-ua\":\"0\"}","ruleSearchKind":"\/\/div[3]\/div[2]\/a\/text()","ruleSearchLastChapter":".chapter-item@text","ruleSearchList":"\/\/*[@id=\"loop-content\"]\/div","ruleSearchName":"\/\/h3\/a\/text()","ruleSearchNoteUrl":"\/\/h3\/a\/@href@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}","ruleSearchUrl":"https:\/\/bakamh.ru\/page\/searchPage\/?s=searchKey&post_type=wp-manga@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}","ruleSearchUrlNext":"","serialNumber":0,"sourceRemark":"\u53d1\u5e03\u9875\nhttps:\/\/bakamh.app\n \u5907\u7528\u57df\u540d\nhttps:\/\/bakamh.ru\nhttps:\/\/baka3.me\nhttps:\/\/baka1.my\nhttps:\/\/baka2.de\n\u9b54\u6cd5https:\/\/bakamh.com","weight":0}] \ No newline at end of file diff --git a/README.md b/README.md index 116921d..96471a2 100644 --- a/README.md +++ b/README.md @@ -1,159 +1,200 @@ - +# 书源调试器 (Legado Source Debugger) -
+一个用于调试和管理 Legado / 异次元 书源的桌面应用程序。 -

- Electron React Boilerplate uses Electron, React, React Router, Webpack and React Fast Refresh. -

+## 功能特性 -
+- **多格式支持**:同时支持 Legado 书源和异次元图源 +- **格式互转**:支持 Legado ↔ 异次元格式一键转换,转换后可在两种阅读器中使用 +- **可视化编辑**:提供文本、表格、可视化三种编辑模式 +- **规则调试**:支持搜索、发现、详情、目录、正文的完整调试流程 +- **AI 辅助**:集成 AI 助手,帮助分析和修复书源规则 +- **实时预览**:调试结果实时可视化展示 -
- -[![Build Status][github-actions-status]][github-actions-url] -[![Github Tag][github-tag-image]][github-tag-url] -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/Fjy3vfgy5q) - -[![OpenCollective](https://opencollective.com/electron-react-boilerplate-594/backers/badge.svg)](#backers) -[![OpenCollective](https://opencollective.com/electron-react-boilerplate-594/sponsors/badge.svg)](#sponsors) -[![StackOverflow][stackoverflow-img]][stackoverflow-url] - -
- -## Install - -Clone the repo and install dependencies: +## 安装 ```bash -git clone --depth 1 --branch main https://github.com/electron-react-boilerplate/electron-react-boilerplate.git your-project-name -cd your-project-name -npm install +# 克隆项目 +git clone +cd source + +# 安装依赖 +pnpm install ``` -**Having issues installing? See our [debugging guide](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/400)** - -## Starting Development - -Start the app in the `dev` environment: +## 开发 ```bash -npm start +# 启动开发环境 +pnpm start ``` -## Packaging for Production - -To package apps for the local platform: +## 打包 ```bash -npm run package +# 打包应用 +pnpm run package ``` -## Docs +## 使用指南 -See our [docs and guides here](https://electron-react-boilerplate.js.org/docs/installation) +### 1. 书源管理 -## Community +**导入书源** +- 点击左侧边栏底部的 📂 按钮导入 JSON 格式的书源文件 +- 支持单个书源或书源数组 -Join our Discord: https://discord.gg/Fjy3vfgy5q +**新建书源** +- 点击左侧边栏底部的 ➕ 按钮创建新书源 +- 支持创建 Legado 书源或异次元图源 -## Sponsors +**保存书源** +- `Ctrl+S`:保存当前编辑的书源 +- 点击「全部保存」按钮:保存所有书源到文件 - - - +### 2. 图源格式转换 -## Donations +支持 Legado 书源和异次元图源之间的双向转换: -**Donations will ensure the following:** +**使用方法** +- 点击工具栏的 🔄 转换按钮 +- 自动检测当前格式并转换为另一种格式 -- 🔨 Long term maintenance of the project -- 🛣 Progress on the [roadmap](https://electron-react-boilerplate.js.org/docs/roadmap) -- 🐛 Quick responses to bug reports and help requests +**转换规则** +| Legado 字段 | 异次元字段 | +|------------|-----------| +| `searchUrl` | `ruleSearchUrl` | +| `ruleSearch.bookList` | `ruleSearchList` | +| `ruleSearch.name` | `ruleSearchName` | +| `ruleSearch.bookUrl` | `ruleSearchNoteUrl` | +| `ruleBookInfo.name` | `ruleBookInfoName` | +| `ruleToc.chapterList` | `ruleChapterList` | +| `ruleContent.content` | `ruleContentUrlContent` | -## Backers +**特性** +- 转换是幂等的:多次转换结果一致 +- 保留 `@Header:{}` 后缀等特殊语法 +- 自动转换占位符:`{{key}}` ↔ `searchKey` -Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/electron-react-boilerplate-594#backer)] +### 3. 编辑模式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +**文本视图** +- 直接编辑书源 JSON 代码 +- 支持 `Ctrl+B` 格式化代码 +- 悬停字段名显示帮助文档 -## Sponsors +**表格视图** +- 表单化编辑书源字段 +- 按分类组织:基本信息、搜索规则、发现规则、详情规则、目录规则、正文规则 -Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/electron-react-boilerplate-594-594#sponsor)] +**可视化视图** +- 流程图展示书源解析流程 +- 规则树展示所有配置项及状态 +- 快速查看规则类型(JS/JSON/XPath/CSS) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +### 4. 规则测试器 -## Maintainers +**测试模式** +- **搜索**:输入关键词测试搜索功能 +- **发现**:选择发现分类测试发现功能 +- **详情**:输入书籍 URL 测试详情解析 +- **目录**:输入目录 URL 测试章节列表解析 +- **正文**:输入章节 URL 测试正文内容解析 -- [Amila Welihinda](https://github.com/amilajack) -- [John Tran](https://github.com/jooohhn) -- [C. T. Lin](https://github.com/chentsulin) -- [Jhen-Jie Hong](https://github.com/jhen0409) +**测试流程** +1. 选择测试模式 +2. 输入测试参数(关键词或 URL) +3. 点击「测试」按钮 +4. 查看结果:可视化 / 解析结果 / 原始响应 + +**快捷操作** +- 搜索结果点击书籍 → 自动跳转详情测试 +- 详情页点击「查看目录」→ 自动跳转目录测试 +- 目录点击章节 → 自动跳转正文测试 + +### 5. 调试控制台 + +- 查看请求日志、解析日志、错误信息 +- 支持按类别过滤日志 +- 支持清空日志 + +### 6. AI 助手 + +- 开启「AI」开关后,测试结果会附加到 AI 对话 +- AI 可以帮助分析规则问题并提供修复建议 +- 支持配置多个 AI 服务商(GitHub Copilot、DeepSeek、Kimi 等) +- 输入网址可自动分析页面结构生成规则 + +## 支持的规则语法 + +### Legado 书源 + +| 规则类型 | 语法示例 | +|---------|---------| +| JSONPath | `$.data.list[*]` | +| CSS 选择器 | `div.book-item` | +| XPath | `//div[@class='item']` | +| 正则表达式 | `:regex:pattern` | +| JavaScript | `@js:code` 或 `code` | +| 模板变量 | `{{key}}`, `{{page}}` | + +### 异次元图源 + +| 规则类型 | 语法示例 | +|---------|---------| +| JSONPath | `$.data[*]` | +| CSS/JSoup | `div.item@text` | +| 正则 | `regex:pattern` | +| JavaScript | `js:code` | + +## 项目结构 + +``` +src/ +├── main/ # Electron 主进程 +│ ├── debug/ # 书源调试核心 +│ │ ├── source-debugger.ts # Legado 调试器 +│ │ ├── yiciyuan-debugger.ts # 异次元调试器 +│ │ ├── rule-parser.ts # 规则解析器 +│ │ ├── analyze-url.ts # URL 分析器 +│ │ ├── http-client.ts # HTTP 请求客户端 +│ │ ├── cache-manager.ts # 缓存管理 +│ │ └── cookie-manager.ts # Cookie 管理 +│ ├── ai/ # AI 服务集成 +│ └── services/ # 服务层 +│ └── puppeteer-service.ts # Puppeteer 浏览器服务 +├── renderer/ # React 渲染进程 +│ ├── components/ # UI 组件 +│ ├── stores/ # 状态管理 +│ ├── utils/ # 工具函数 +│ │ └── sourceConverter.ts # 图源格式转换器 +│ └── types/ # 类型定义 +``` + +## 快捷键 + +| 快捷键 | 功能 | +|-------|------| +| `Ctrl+S` | 保存当前书源 | +| `Ctrl+B` | 格式化 JSON | +| `Ctrl+O` | 打开文件 | +| `Enter` | 执行测试(在输入框中) | + +## 技术栈 + +- **框架**:Electron + React + TypeScript +- **UI 库**:Mantine UI +- **状态管理**:Zustand +- **解析库**:Cheerio, JSONPath-Plus + +## 开源声明 + +本项目为**完全开源项目**,遵循 MIT 许可证。 + +- 源代码完全公开,可自由查看、修改和分发 +- 欢迎提交 Issue 和 Pull Request +- 可用于个人学习、商业项目等任何用途 ## License -MIT © [Electron React Boilerplate](https://github.com/electron-react-boilerplate) - -[github-actions-status]: https://github.com/electron-react-boilerplate/electron-react-boilerplate/workflows/Test/badge.svg -[github-actions-url]: https://github.com/electron-react-boilerplate/electron-react-boilerplate/actions -[github-tag-image]: https://img.shields.io/github/tag/electron-react-boilerplate/electron-react-boilerplate.svg?label=version -[github-tag-url]: https://github.com/electron-react-boilerplate/electron-react-boilerplate/releases/latest -[stackoverflow-img]: https://img.shields.io/badge/stackoverflow-electron_react_boilerplate-blue.svg -[stackoverflow-url]: https://stackoverflow.com/questions/tagged/electron-react-boilerplate +MIT diff --git a/analyze-results.ts b/analyze-results.ts new file mode 100644 index 0000000..bffbf0f --- /dev/null +++ b/analyze-results.ts @@ -0,0 +1,68 @@ +/** + * 分析测试结果 + */ +import * as fs from 'fs'; + +const results = JSON.parse(fs.readFileSync('test-results.json', 'utf8')); +const sources = JSON.parse(fs.readFileSync('shareBookSource(1).json', 'utf8')); + +// 网络错误关键词 +const networkErrors = ['ECONNRESET', 'ETIMEDOUT', 'ENOTFOUND', 'certificate', 'timeout', 'ECONNREFUSED']; + +// 分类 +const categories = { + success: [] as any[], + networkError: [] as any[], + apiEmpty: [] as any[], + parseError: [] as any[], + jsError: [] as any[], +}; + +for (const r of results) { + if (r.search && r.detail && r.toc && r.content) { + categories.success.push(r); + } else { + const error = r.searchError || r.detailError || r.tocError || r.contentError || ''; + + if (networkErrors.some(ne => error.toLowerCase().includes(ne.toLowerCase()))) { + categories.networkError.push(r); + } else if (error.includes('无搜索结果') || error.includes('无章节') || error.includes('无图片')) { + // 检查是否使用了复杂 JS 规则 + const source = sources[r.index - 1]; + const hasComplexJs = source?.searchUrl?.includes('') || + source?.ruleSearch?.bookList?.includes('') || + source?.searchUrl?.includes('@js:'); + if (hasComplexJs) { + categories.jsError.push({ ...r, reason: '复杂JS规则' }); + } else { + categories.apiEmpty.push(r); + } + } else if (error.includes('搜索失败') || error.includes('详情失败') || error.includes('正文失败')) { + categories.jsError.push({ ...r, reason: error }); + } else { + categories.parseError.push(r); + } + } +} + +console.log('=== 测试结果分析 ===\n'); + +console.log(`✅ 完全成功: ${categories.success.length}/${results.length}`); +categories.success.forEach(r => console.log(` [${r.index}] ${r.name}`)); + +console.log(`\n🌐 网络错误 (无法控制): ${categories.networkError.length}/${results.length}`); +categories.networkError.forEach(r => console.log(` [${r.index}] ${r.name} - ${r.searchError || r.detailError}`)); + +console.log(`\n📭 API返回空 (网站问题): ${categories.apiEmpty.length}/${results.length}`); +categories.apiEmpty.forEach(r => console.log(` [${r.index}] ${r.name}`)); + +console.log(`\n⚙️ JS规则问题 (需要完善): ${categories.jsError.length}/${results.length}`); +categories.jsError.forEach(r => console.log(` [${r.index}] ${r.name} - ${(r as any).reason || r.searchError}`)); + +console.log(`\n❓ 其他解析问题: ${categories.parseError.length}/${results.length}`); +categories.parseError.forEach(r => console.log(` [${r.index}] ${r.name} - ${r.searchError || r.detailError || r.tocError || r.contentError}`)); + +// 计算排除网络问题后的成功率 +const nonNetworkTotal = results.length - categories.networkError.length; +const successRate = (categories.success.length / nonNetworkTotal * 100).toFixed(1); +console.log(`\n📊 排除网络问题后的成功率: ${categories.success.length}/${nonNetworkTotal} (${successRate}%)`); diff --git a/assets/icon.icns b/assets/icon.icns deleted file mode 100644 index c2213ce890a3d807acf6eaebc03b783ea246ecfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111909 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%0DnZe&`x56GYq2ef!@%dNjOv(emfk>^ZaJ zgZa(r-{SJ#ldwGZP~*?Pkv59U>e`Rqe%qy!hFfM6I-N$vKQn*c`~A;nsm5?Q?WHgN zT+_4u4f(6Zb6}}0s6rcCW;FR8{O}ExS)xeE$Zf?d)fFpt`c(qpxRBO!F|_&P;h|+; zInn{vH7#pNEmyRt@^mK8OXz>Uf z0GAi+e@rEcV2yriqDo(jXhjJo`3^PDaGJ^suK_NwOwr*5S?D8 z;Ig{x^Opg}7k|-~24J8q?n>8bxKH1#)$!ssjCY$TjkavDn&*kkC0Zazue=ye^V0fH%}lu}bB|pF$Q~OHOZpaE(s9Bm~XFd8kvv4Ks-W}Phz;X(stsi{h!$lbx z&q_2W^W%sQ@y1zpe_4l7JqpWnK0Jz$24MN!vzAd<*08Gg>Wiv+S3qwAEa%TFksJ#l z24NJIrIR1RiY@_T_m{!h%or^58%!!Ht za8zKKe@lW@yyl6jG)8ZRU+R)b+88X;b3Qtr@~4`V_Z=7-tTv>B$y$6$G;cH^@&HfVrW-vgy<=gz`9mDd6wF(kC3olyQLz)YnQ?|nTVfZ2EcVDW>az)Wf%%-i!t1flqEfVq75{9@fh zYKSQr1!ht+L(})KV|4(#e;xzowVlWv*{z&s%Z-Hh&ays~5H^x3nghj+f_z8_6PQ*HoYhD9|!2FyRd?~lJ2 z1LpWYM8_$>e9!)OR|7D=_{ov`#(+5*Mg9Cy3~^>p-#!Y=#iM?!r0@Jz=$j`BpndEa z3!eMt`w#zBr1miB+^5EwbK zLYFWa?Dh@C^?$)RmXN-hjN#Mo*PtRrS|F#Oz z=+BqH;``6f$jFRuGDM-*e#}+%9gi#cUBx2=PYlxhkl*P$(y?DxF+Wy7G!*pYRJc^3FaGKDbqamaPp7X@=*>S}{sLw7 zlJ?)5W{hG4(+d4v|N5!z`4tR^C^T{VPZJ2-&^N$nh(b$$T7|FRCzat4jVwP+o~yV} z8J|(;=ZAlaKqL6*9YCyP2>ld+uHXfVI12rJr~bP{Blxqwjj~rVfZzAOb;1?g0}uu5 z75ZOp`)?Vp;=RAQMy_O_FZ^eTAi~PS;qb^3Z(=T?EH}j z$a^PV&mMkH@?HJ0IzY+YQ~wXSQibug=Y9ZQKnt(p&s!#ak6g)+p!;A9ey)>hMDdAl zW)lC6T*(l1d)pysrfcr=Q3pD_4p{F{2Iap$(An{SXx|9IRNp-pw^;871pXm%U;v-v ze#yAj>^gb=;@1~W?taC~{|X{6euP@dpd`gj`|Sf-j?@0*P9^f@N0~#?52XH>C}Y&u zvOtKywdcCe*M64NDSrDLtMZDk{cjbzCGglIwhr&SC!T$N&6XWIH@&v{g{S6w+d6|m zUq4Ee+pKcm>Nnq98$^j~-+J@q`PR0^_C08-%fGC>?-hL6;V-$j)amzl1EH`SnG*8* zyna{p-}fAxiSe5Gt;i>DN0aO|HGOOGA5eUi#~bPH>h1IPPVVdN>IMg5!|fB){`C*H zuX{AK8BK1v{Eqv{R~9a$9loxv-rkQZ6~tn+R2Z1dy$#y-eB$z1^(+pd3UaZR1)J#@DhZ(IEO{)5Hd za97W0mfrdEd&53^dsAI?RYgT*Rb6A7%^U8WH@~l2?n(igh_`O{&UJGB9S9w*`9Vbw?s{S3;l><0ty&FM1u_ z*t2KTqc1*U@v&Xfld=b7_01uLnrFyZj|@z46qc zFBiOmrY>8sU@^MI7KXgxo<3h)wxl;WO+mBMG!=XonN{xI-Y{f|I8>?gpIiOp%V^pY zPc2`&zB16&6%Kdzx+_c≷k#?Is6AKs(HK(~U}ygCrOrqM{qJb_E(ux@}l*7Qd7Dq%62pz(L( zqChAR@?}6a{a9&Mqs!zS%?E>EG#_L%y262Auok;#&Rm32W}z_Vy}>{zn8QMti+!}b z7#PgZkI}F@YBM=O+$giz3ZXkn>)3%RMdU2LP#_q{!4Ko~1t>*zdvORkLjFLch!L%$ zT&#w1deNMdmtz6tQnFitS1fF|8i62MGQoJV12ZcyV{(E)f5`O*)HQYHd^p2|Jg7Mo z@ORaKug?Ze;E*OkgiWC>qD(yQhFnoHn_VV|J2HsI?2@Y5>XHmScs)m}Xw#<%dZsMw z4}>~V9scD!lyWC}7Uu+l{zyB7?ASp#gz$SHrQ4K<>v-6$pDrk63{4frC>u#qZ{GEM|t77F@GU>6m%b&AO(8tUiUVS809 z4=n6y&eTgvhsQ~LQ^c%S*xK|~A(n^3MG@H_n~C2@Na=#$TqvMD=nHs^EYFWg94ASF z!^YcT_Lyig3i;tko~gZezNY|YXRFa>h?jU*J7>5iXbO0|^p2n}XhU;was-Wwy}u1y9)(_WHUI7DJIcu3w!3zYc+|cYa9(iZYWdlfWEQ{;~}z% z&JX$gfkM0;C5BOABFaLYP=wV!Dxyt{k+@pFRk8!OBr{*!)7Mq01jQNc(0vAhjxW0f2R*_dR~S9bSCdgkh( z=^XGe*1%O-c^JUJ%gT=vn9P75kd>iFw=VdO5ZVh<@ZKxc@ z_)&5UMz^{A-cShzNjBaFEteqi1tALr%(Fk!_@qRVd( zp&g(}B(4Dv0~8im+PMU4z#A+_Ywm*@XQS4DH&jdVwrdR-C$fbhGc>p?B}0|<7JqjS z^o>=DSHkfkGVcHs0EV^2>}a1jcq^C8lXIcgRx}Akdr?v}M)yLk16h=vgJc-W2_lz2 zT4`VkX9poh(B9M4zyWmV;h>?w=Ml`%qE^YVdnP)eyp`2(9qGfzJr%PH_-) zEYLnz?^LinBfh4}d^1GFDF-vTnoQmbOcjBXSdJ_WdHfyd9td%X!f2x1?+L&WNkwLb zZ!+{0C-`bAWPg{nHvtTT5Jb27WY4W$pFbE1cZ1mqrfW~cXR9wXK}dkU#t1H;G43g_ z!%mxhUZ3k;7!Gh?2nx`6ygsL%ky!`umxVj^0?TLB1|nbtcLm+nmKtxkr_p3KLi>WP zmXVoTSYFd4d%)h2dy~4nZDl5*LNDs=qvG4yc-imqThO2vC2T+i0Z*WrvW>F7Nv~)5 zg7#o?lh+n@E|wUcY@BTqJ;!F#4s#=k*vU#?Cq+ z6qIL*{k^WaMuufG!+BtDh-`5r>=K2L7^@e#%#hqQu}uDB*Qv_PGNslnh+$+|5jVuOka2P(ogr zHkk!!Yq}z>oah{#Ph&(rJ8TP0@)pB??wHN&pKd2Gl-c4NVF9Ev&_; z93tlEjP`C{4h7Q<@L>{JqCDvG&qWnbMinZ9GRg_o3S}g~yq5!p3*+R+vF30g%hp9A zbqvh239O;0s;bz?Di)8)uUKOdhrq*>#V0{jD_a>3{f`Hp!kNyVyXQLWu zokE4b6Zo?>j~)Ut753w}twcm6vz4%}2?Yw_gtmiE6nLrt zYQylZQSK0H>-M*zX~6vs)Z};jb9Jl@#!5Vdr*uL5t_;&uvOrh)7%=6l7*MhpuCXU< z4MvB0+U-ITS88_#WjMzPgD(*@h|CMy1(43h#IvNu>-Kek8csp2KDRHEa4OgzNn zdc2+B=1Gc0ZBRr8!O(VvHEnIC6s-bDI>BhHf_P=c@{zoufGZef=4?VdXt}$I7M0mE zmTvQlkj=p)(4^#Yd*yLHl+f;VdEvMv?O?2I4CAOK++31kmy|>TUK6m66_|oZz!{7U zK%6j`8F2zVH)w=W=t zoHFfX5;(GM0HjA!9BNkKr6RG`6pgLwfaNa)x)8%SfL;|a+PawY=H zsi?{4@@4Dnqb!N0YGuZ>g7#76VK6di7+o=(sHY z=BSN};i)>8opZ4<&T?gp+vp^U)@68IzE%|HM#+CfrCz7M1Q-KnJ986DRN5IhA7`C-LVD-fU{0Y$J@jRWa6zftX&hbfk( z9G}Bqp#}f6BKD1BV>?Y#ycyvB(!?M+WIXpfRY~Wc1lE5Vm_Bj{h zt|U1(8%tVi6!o_OqeNO;?00(0(cLg{YLVo1`s#Hy$_~QcKsI#ng-)NR5rS4*!&Vp@ z&NkY`B~r$+y1H`kL0h>L2CgKal~8%IQKo^lw#ETR0f4ntVO{BScyrK0ZWJ#emD}ZM zbBszpjVQPJ0zO})g_2z1YLX}OBiYITh~mLr9>svD6Bwz%>8O{W?Z`r(2vcDqqb+wU zE^z2dJC&eo@H)LB(m=a(p#NugyKNk4ACsHt2!Ju*4VtrHg{nl<%P>%#iebl1Vg+j? z;Ez}#z=1Zx45^?eMN~QAP85Z)gG!(~JTBJ^BmnMhMDZOSryJtM70y;B1{&9A^-c)p zmPNqU05^X|xKL45Cl>|h$+^iqSr+#Ae4cPQs2k&exkd(T(uplC{FvYlDv=NzF1Ph( zs2oQ2WK;(Yp09BMdzqO=cffw3*AvWW=xT=X0xH(v<(VKmoue9qiUAmGqM$vR+entB z3AVHo&JeH;+C{}_Gd)gkn;#|IgK~WiU$xdvIp~{M5*9*UZ>Xch5h~TdD1q2ie=W%c z*jqWWCZuo#n-@5iI~kJT3Y#hg2<33lZYn`j3SC!@eg+foU!jqmo(>2GP{f3Q!eWQd z)5IFRzM6t8Jsk5UiX)j6=Vxz$_6P*L-asG&TAj%9iiVP!QoRn2ODIAn!Qsv(=rjr4 z2d9nZpy^h(%WcrXB@ZqTb{fH33>1;&cbhZHYir7~MY7q>G6D8Rjw znSvP=V*hB-R36G9SU1dYal8?XRHJN3fT(23QA)5bsIrYrq_j0&ho=PH>POLcqx)rN zv_r46kFtwrbQKZMM43qjhBQeuc?9TBCK|$cWj@{{!u|lq$W%NW7m+Kpqa9<18Z)xX z=~kov2kW4}M4@Jn!wXfmlOD=S1Iy}2nGTr5LDY=1jq)-vlwN>S5e_DnXs_0SW_o~D zsinu^?wo+`hSkq)DAVh3w-SVt^nwB~L`|ef2dFTLzvf^SR0hVr-Uv*rbS%+UqlH8d za2f=zGRb5pFYxH7 z(2UBF45v5By>?Fvin=X?Vs3>ID?4NKz{O2EsW@6&8ZOlO=s2R@XHY5@OVL>zaEOE3 z0bsIrK~*5W1kR(l93BbX97aiSE>~&TN;MqGaKXd^lH`X=wJ@!@=y7DLM*>kOI!7Sg zFp0*ItTR^&lZOkalSp;3*Wr?HKvQAMV8S%SdmM0?igLEY4Hu$7%UA+6I?yqhPNAqa zH(b0z=Zi470fm)R1Ly=4;~{NC@|Z-~Xv&lXkZA&nZ*@Do)f!0hlJQEYuB(moQ^_#Q zTfGLVNYv3jrM86*CC11Dp)Mc{D6&hw4NZd0l>`XqpQoW5q?bt2QXMY4yAegl_o9^O@#D~4R(P+6<27Dj z7E82v4QfCDIBCOI)=L_hO45>*zGj0)LqN~LsT#@M0J`ggjv>^Q9=pTw02;plC8r>x z+iv$1rW0`d2BtZRU^~3ITD7cA(x`RDs+K}R3v<#`iqIIEy-nGSRt=ZP&_%u$h(jX% za2<_~P-OuNcL8i0%tzxIV&dRLk&EFp!j4sIg^}>ej__=PMOuf)iyq2BB|4wYC7$9 zYim^|sU~35PNaYppI_T9cfuJksI4C;lL;-^3PRZbipDKbDyenafh(aUY|vgQBnfqc zgLOK!hNOJtIEsQxb>NJZMy-Vwa_SN_wQifuWkkt~VFv(3C81n+ch_jNPMwE{hO-H> zE}9@=n8my{9H-6XA6rvYK?Hizx6C>h-xwH!@|x*cfm>2v~Z zBc;+=wGn95Xoy3L!0!n2_I|G(hbxFH^X-O&t$PJ50@0}*E{;ok(ECfx!jsBEr|KR|l)6KK+{@es;Atr~LM z-PIJZ^lBHwS*}Ssok~~kasX)))Eq^}twNK;1Zc(B0;k<-b$4W{)VeU#Ev%iWQ>PnS z-8QSuRX!Q6EQx&@O^%*|;^Givb6BkoR}}{b#GVG8nlxsvL;2(|qS$y8_bi$MF5B1y z^t%R^&1!X8iz%RdLOTWIB=S4qo6XhwHxwU-rbMp>rU@u9%kH$o*Ny@*U9HnSqMfXR z(senlE)dG$D4GHiu2Hxq#GyYnxS%Y%tD~4rPtz>ZPST{M(*;Mtz3Kxx4>(tn^H)_lozueO$VPk2}HLN(@C0>GV;pn+wHE=bi32pYPk(X!Q2=1F1q!%5S*A0g<>BnZFhn~ zD!Y8Z!RfHc9oDv+I)I;Z>=hE6&W^chNsu*RGa4V42!Se-)g`U)8K~tbIC}>J2tf^| z%Cc3VwzroNH-q;b4(Oqn%`nnql9Z6J#J@;$TRI(1*@5h`Ee4v)Cfg@E0M_KzO4C1- z%Om2FW4EI?xIrK;Io^tHiu=tReO_flb8AOOXJ`vB`tBdj@bAl_y8NKK%0~h3(_0RxI5==<|DIh3cD|gAaTZ>O z&%F2h{!QSv|K#;o;j*kuG->tjy@SI;$4IKGhcmf-L`LN=s1ub9UdASbPmN14h{_;m5+@-K0I__M;PPqRS3i1 z^dU-yVDob$d2G?9gTwN%Rt*s}^w`m%y>QdYB?$F9xgP!O3}lC^ch(*lIyO9bWbpXeGXtBR2{#s+;mRG@OZyqD zNd!}Vec;It4xc`E0{9Of9X_}op)(gSJ_IiP;ll?Y#C*;E;iE%G29BORv+repnR088 zWU_cOZnc2RfMum(_j9{Wojo>iWN3K!;9D49_}7KcUq?4X*$`*ayLb5L;E^LI&i23R z&Se?VWU)lxmVp~hBEw`^S06ZYa&Ta9c=!N>gF{K@UqMqLh-Dbv^~vDTp@D%DXFgqA z$}y4*&c-18lg*P1EK}IK<@CuT1A|8gw>MWFkuf;*p;QQkKR5(p9zVS~m_g}H;F`SN zp%2G3Mat;haPq{!z|ioaH!=PK+UW%}6@UFzKSEmuA?xs&Z2==S=7;*$rLVZt47A?y z(V3(DM}~&BOTRvh@kQ|IL$LT4`xfpS9_;Twb$GFvl;HgTzxnh{21@MOd*(?0k>P`I zdTKL-bfZZy7|!9B`iGD751o3wgw!j})9Zo(6zBXTqe$jHe*%geKJqr4QotCz`d9E# zj6WD08aRC7fDew#|A<%L1Pg>+r}|;QZ$|jti zhEi;^FXD|uhYua!UPu`f@2?VL@jb`Bfw62jdFb%aR@gyLejOb9HuFKe{z(79qdN;I z!;d=lCC2j6@k9NCAELuc%Dv#&uRC}Wuk7zXG_p)vE7x>_S6=b%N1K)VIHMt;28FI@Eu72}A|gfP=s0Pfzbb+m9SNbj+cJbGAyD07P^cjU1CXw`ML}2CO$*zH#xx zWx=dW$FP$5J0HJ+sE4W_*)5>YZYux-_aA5%dgsWYgD0126n~uJk~d0B%Uc7-j~^S@ zxNI&9$BY#hzeR+r1v^K5KXVc=Co8Kx;Gl^IIgQ=7ph)C*EGrSyLlF+J8)@VeBiM6+b^GZ5}!}u*Zz>UBBo-<9>@Spf{j3 zk6N|jm_J^Y5)9PyCn^Y|$!7kgfnhs$p6ul$i`l~FKQ;W-p-0Mj8usuQ()_}?4$3&@ z=$D0YdZK3F@S%YZ&|35h@br)SHO4Lb`wyIWUZ?-g({H3(&e;jG;_07eHZkJT&(>!N z2F|nl!tqrF(5^}a{y%$f9o9zr{eKVcg}PIBm))(RaSsVj71~mRdP^0rE7YN-rLIt; zUZ_!u6%Qc^E4cZ4g0lSY0MW{Ou`wN(F*^ z*y)RyK*YZravDi2%q#xT8S&S1qMpwNvP>QGUqIbcR#|w2<>=ZG^LJ*vJx_&!jCtq> zkqUZDDZd~M8HDN|L5ws8Vjc?fO7@T;wt_|dvA{1q4o<2g?C;7rQYOwXJIHiXhy8V& zX~*9%AU@m?_qV66D-a6vBN4PO7WX$mB9Ko7c_nXH*pejFBa~!2jIN7cJ>x`H(}~l-m*g z$Aa~=C#AX2DQ_V<5dPOjk*QfCe(6Cn_iOmyiLpK31NQg_J9c-W`uAa zSQ`pTOMMy8I(HzwPfFA^@IUfu81@{n?0bz9wC;~n z^9$}EC>2nE`^cMoUReaF3aCT&zV^Kx>{b=7!*Shro{9dLm0w<2QBYD^Q|nvfU){U1 zqJ&qRbu+|gDF@`+p>XE;RV-k|I(YyN@n~7D=rdxg<^lSri*k!#|9>YBFcSy@I+quA z{7rUgb!}};RbhU9iGY`x_T@`jW;S0`R8~<{Q&CY_S&|)ldCy`d&5nD1v0Z2J+HhY= zUFj>(&Za;I*{dQBw(#>rX)ahqOHBm)?7*e5)`aJk)<~+$1SzlYoXae#yuQeNA?%!W zTexJ|>W#Y&oV)chwNO-1Q(Ik@`RKqByAyyHs)+zUh(EC37xG1+2!!qppiLtSc*T#Y z5VOLH2P%MOw<{)JQkI|g`0Q>^7kgYlNqGXqEw}?Q2_RVQVA$Ee&JVepASkP@6=%g< zX45zh(BK_l0Ecw7gqMFGDaF8mD{w2tD?LfzbbtY%>$x*lTwfZSkn9Hg-B|W^o`TZC zjZ7FQ0ZzS`E6YRX(-#NcNGPbTDSUsxiNbME6$_ya4l$^hm;VXD9Yl0f@^cHfkvJF@ zFc5-~T=KF9VoBz;t&||48%+DK^Ycl0#YLLa5r^K+wDZM5LF-5q$Ms>K%W5kV4{%_! zC>HPZ2Zn*NQjjN1AAz9(`Y7^qhER~Rl!gWH`*S(eAig9mbP<)oSW~i%?r85w3n(i| zbObV>FUWALE-0@kf8t`tB5n`7lUrN$b_79KR6gN38sU@X5>5j+j``W!I7m7r6*XfQ<+v&9B;hD81 zkq&fw=+G)OfcBy&S9lC_*APWch@mfF0?2NlyMHq!#L;8i~ly zDY-_n>!1U;|(wcxJGlLb>bFm14nlEHX%|JZ%WxyV;2jqp+KU-BNy`0B%_mARz7t;ROS(J)L#BtY9lP zDXSm>JLoGpqF0CuSXqTU73CD~!>sIO>m=m3(zzHSz(|N9c<@Rx7qPLstO1PO@kQn3 z#mW0XQwz3>(@s^xW1q;E=Cl|lBYk@g(YHvripo_%0(Qi01w2taG89UmgT#q=g}VuM zDo6nKF4qK+>{XC}J^37;cD}s)EXBc}YvMpZ2@fobIu5km<@rLtd>x^%>M+#-XaOph9Z=>?cTmv+_Jl){bJ%zZVCjL52%j%VF@&M7 zizEnnBIq<~T!8lR0f`HtYp77>>wJF2dC*x2;A(y-6$a$%h>FtP>|l`V*@MtY+I@;M z#+~VMsLup$4465BSh^JVoLoU_ZwNJg7V?DHUSy0J&}Jq_5V^rXl)i|oP66{K{7V$G4aqMU;5cnEw!P|OY= zeF4YC=m9-0>3Dfg{xe!2N88TfbFnZ$q$4cIT7(e_dJwR;%ZMa$RRjTt_~@CcD?z!W zRe3yNq9$~M8OSqXc3}W)!Nvmpx@^j_Y!3?5e}J7K>y7whP{}$_6@YQ3V^7&zArSgO z>3Nl>;SvuQaUCx4$`>{`5yaMJeF?$CIKV&x7Ga|(NB9vjfQgEU+!1CMAH~5AZxu*j zhYw3+FyH}z3h`PFZB<@*BrZ9I4Bg3?Lyr&_3i9#<`IYxs{t!cldm>#fbz?Dj5X{!) zkhTdItHb@k6R_~R3$sP9kx?)VHz47{tm1Gygcwyk0V(Pg=;J%CUP@(fiN{Oxw^|2P ztfj#uG#CWi4t{|JrIM^un0gx|N&rDC_{rvEo&&XF0Dah$gh*_*P%#B8+~J}u;e7-L zMz$eGgjt36h!E1kLg;-#Pv*`WhoDpe@2(Sr9wUy2qEeocxj}XVAh$}$N&kgpJIn%; z;^;`hw17zW-%+8WbnR>|rNDESFPH$ffQ7$MlqI@=cmP{)2-(2T5yfI`fj?$|7!ofm z6bP%HP!^_FL=f#szT!;~$g&&ARRvz)=>^JXEWDYVbQ5wQaEO6Ih*x75HnvSj&Qc2G zCJ12qLrjbmU63U_glq*8APKPqt%p=+D*OREjoxfF;Y|@QFOOfcdSh{+4;h4e-hH42 z+aYj&hd={#=dheUiu3cu9~_w+ntT3s5(n@Q;zL%f4FFozyo0WR<=LST?GQ^Hh& zKup}Cr%xR_O&Guh3mi|If;@n+Fc5hGZ4qqC3R0Qq!-y;7PS# zU_g9)AcuUXgf9^AOYTE!5Fb1zfg(1ZeeCT)65TFP6{o~)5oHS!4kG$wUk$lU*>+;ycsTIfOQ$f(1=_a~D-~e*KAzmuWg;m(HtDx&Z2u)*=i4MUJ!d&n$ z7r>YGnYJgP*F<5&sG%#eB`-(#4rGlwpab%OG+}NOXSqOhC18^ql|Z%KU$vgh!Jq@` z+JXW;KfiDt6^h-=U*vxH%CUubI;R6VV2~f@X9*7@EPxKYkcnx0UhWEzyzVHM=(yIM zhTmM6waPp6>eUll7ZM*OfttlZzz!$@ypj@L5QzaYfm?+U`!{p&Ky_fQ8bOGU;tC~Y za}ZCMWKEFQf~+DC`S0Kk*mN?LLkzC?$R>hzz5lsuXU;cP;aH9GV6|_02 z1R`^>XK1+(krN0V1@tz67Ij$RXz$|TwRW|K3zL#^jL7K#5SaMug_*)z$aug7h>&g~ zhnKyS1Y`nMXfHM)tTvJe{ShAaSTqVQIu}3~e^x&z4=%D!PAeBVyE=1ObSe!L6F-LG z;Pip40DOSrki^gCZ$T`fR3}a3eO_kaVH=3Usvrb5F|r2kP=JZEV{p@7P(YxarB7Rc z=`I4o;mg(q{f{@1w(JfT0h6K1;wSe-2*4stLCy#>g|9nV1UB(%%|Sd|XjB*YRi)v0 zyC7g2=&s8kCj~_Eby&og*KqLneT*Q0EkKJYQ+OL0dKfX723z}i*@AUA_yYh5EJ9>; z5CQxLAi<8{UloAoVAD3;aSdGBg0XU5U9n}WfCS>w?3|ojPh>hgtXr7DJfB%`3sf>x zKmrRNULA;M?`3vpG zCm>t+*}NQg(7?io1YH&`q%e0G0RZX4k5JW@Y#~sj!V*}xfa(y?^?77*d8m)j9qt%*F?PhVUs##V0UrgDd@T zU=rY9tF`Y$2MAOa2BuIJ2zTR{DnNmOy9pwZ$)k{704VfF1|l1Cvoj0!*)aFg0x@#O zKJzumm%>b80`e)8qo*jrrO_N53#LzfI%wEm{=%d|=K@B7VY^k3m6dl8=?{#8fdTSV zkjYDPBQR8q0uy(*%Fmh=0P%n5{S=#3w}VJ@+{)yv9e5%OuD!l=JqFvxyEMR-siG9f z?09|##B#I@Lt*X2v?oGH=Vgc<5)T4}G>k@lUa-;{^jx4UCY@mIcH#bV8@Q|!7#9nl zuEgW07z9MMS}uqt!Z^if1l!2`j2xaj(g#R@UdVAlW@f=*D+YiHeP9+NJABCBO|-!i z2)5Sbm6u=cCxiM8-2gQ9J)h@4-ND8C+8E&2hl^f71JKo^0>gTjC@WKN72?{kxk@8U zM<02amzkaGZ9~V@M|&{HoZBVuj&EA!?R()>>~XFQ9USQaIS2^r9_D5~zjW$cbXGw) zouXzH==h}>yo}tBy%58m7^`50SbgDT@ROXOPhzYBgMwdsBOxs{@%7~`bZaUTSOq2n zk8=&Y6_@bo*~!JWREC;WATi?v8QIxxNKarDdLll#S?Pk83_xXoRWPB`@zxZsqaDc_ z2VHMJ-I&QB+uDEt1pt2l>_8>n6QyV6oj}Y~5@wp+kO)C$y67%}LJI_70mc%> zH-L0Z2e1$Ts;+?GP^omRgg~kZjb?ixKO<8RjTmY5(8iz#9X%vQkeQKx1xEp>VIM{~ zT*2rD8qF#+KO=+xt~X*B0gJZC!1s9>83h+@$uz(lZUf$6M59_A6=i1RCe1=jfM75| zW+&!mWaMAQlW1KC2I~;`3@@FHm|jB6G{%FfDn14K*i8zaPN5v?L>Op9d{{nw5MnK6 z$Y?D<7_=rKrU*4P7o2+vE%Y0NfsUi!2LE`O%ivSpFoZ$Z6kg$y_!;TKcuz|;!r%`K z0nKW`D^W&fZu$cFyZ&kj;|w+gFXn#8%S`8I2iOv69Sj4FY`yi1AOl7lIE!cj!!X7W zG+#%&fDdMiZg8z>v`&VBW=#(l@X}!j%z~mcjc0^f^rpk&?+bHoTF12i5Wy)?1!ao+GjJ2pr7`J|hT6^Tka zPw7FUk*uv955E`Xrl)7;#VO@@Ev>9^ zc!D2sFoA%xwz9M$*ewsd`XN^YpUTMLf4L4R>cFJV8)U8~qHnB)3_tuK2eY1@BM|XE z$6PwJW6ct0SlVQ=xz3AMZ#!`D(We}t5VMh;%S$*t8PNnT33!H|EfK^3_#nOI_mX-1 zoQyOmK2InT$o z?U$yNo|%>Hm(wphD>EI|4bwBTdHn38=sn{AH!y+qUF}3@bM0O2~nmW3=dIo-mx(0f>x;ol_Mm9hm!$Mwl8;}ic zH9Ub-S_@=DK2KPn60zwZ8(NAoQgd^V9u;+Helw5`k@?paz9_8`SJz4XXEvj>b%^=<${Kl7b8DMY8PwKOscdU)Zc@}#rPz)NhER49 zgux5ChQwc^@RuXGTU29O6%SsW_9psz!GAr8e71AV^foyDt)jb?|Ggwx-5r-&UQ*>dz3O_e0-+retrRAd>5vT3f&h zh;}IQo}Jz431JjiUGZb}=QuC-34NT?00;<_+|t@C$wZJE5Gawtn2<>&@a2zn&0tjl z9@M@K@p6WZOQ1ct0P>;vFBq^85*)fXa+plVRYzZfpk$k(v8AQC9+c}Kb<;D*+13-j zcBKXiP&6u0`Nt#fEC39Afn?|nsSWL!%*FfONYM5sMH5(l3Tcph(I?oqDv&8fjqoLf z5-q*97Np=IMym!HdcrG5Cd>0eKHA=>fPzbdw^wzL3{bmor7g`0c^fJ^xq!}faqB8g z&=ceoTg*y2i9AM_+NOgauY?U>(DAGZZQw1`B#v}-4H#I9{sN@8b{ih%U zhaOyx$`wsb1qcd#0YC;6{eU6`aEb~vZ57oCBBy^WPvA^j@&TMxG?z|7K33KP$bh2p zC{og*XlQDW;;{Z4WMEusZD~-nRC*$xDQh8GzBD=lqG=L1g5)^$RS2VO#ul*Hd@N)*e`QLL4PRu0* zZBn@+5v}%K4;;fLq#X^dS2Q%reJI~>46yOU@hiuGfEb4+P(1#s4fekF`cCwf)h$wm z?2a#r>;#Ho*PNF%NLf=ugYpmwWJ$kL3@pZ?^;_00wu4=+T_^_FOiI^cIdr8MDBBwq z(#C2C;}2N}6oU;?jbt`8)T1{^SWpq87+f3}dy?f!Wotv;&2=n0H#ZfDoqbz}rtW0gF9>ka zb6vn?c}4Qt{88=ZH=c|x3G@|u)y&;zbU=vigS7=~Ygn_cP zQP$ANN0O1@fG`-30hvsRT!Ox)bVV2#zUY3+0u{pG=EAhUg{CaFb7mi_M4KP4V8E28 zMi|J^(q$kn@D*WjAl`!NXt;r*hJ65G=!+yEg2sA96|ASjLR|;Kz|2mA*t;5Gp!w8D zwz$N$qoQ4Od$&%6fzFGgc0m}}j>6{p#!|!^RZ;c8TwH08Nzk)I&}8pG7@Sxel)elM zVF1YjH^6f0^HKDr8_TVeU|?>MuIfTCIFN$d>Kha=Q6i>5Fqk4&k^DwUOO86I@9&`J zOukkLF*-HDu#g303#U8!9iI=eOoZG3&B83 ze@ppFFwjr6wab(t^sfX1<$N-|3&B9yq-bc6KSt1j7{OqOL_sx5TGOztcbx=-Q`LE@ zi<)3ygelRQ&6m*Av<`xSy-wiPK`>xDK`C#P5=99z3o!tM0b=>Vl7{-$AW~O^fxSWw z)u%=nXklo3)p`cwI(nGafiO5{d$GD83|z`aMT1m!4MF?B5|Sp&qREQ7=A2)(0i2kd z72cfy1O22@S+jxR=1hBl?xsW10{|G9@q6e_T>u8^$F@2JABYzWV9-I4pDJZ_%1|Oi zsXFuvoalSxD>?uM+WywIhV2X$!0=wNhNT7=sL%IPy8sMizZQwC&Pxq2bVHH*vU+(r zY}fk=FgVcy8$gyu1u!tS%350YV#tmjC=d%uUAP?p110JZ1)FOi7^?ypa+@TISOm3K z0SwoWTt%JoA+ZaDwJp#6_k_p0cYSYtN+vqFi>tCz{>3a80-lb z+w0`TNMA$?7Gr_mu&b8UH*Uwsh)#fk2B#0H93hpF18jJra3J&AeF)-lO|Y#|4BJiU zB`QqCDu973!m4;Dzt9sh9yM;Z<}CBO6w4FKK?Y6H(z+k**;3OijtSr6VMnE5LQC{(YaylS zS8{<%IIFCcix9G!To_m`s{`rnujGOuh$T_E)z{CbR>5>^)+m>^)>i|aTU=URRoBo6 zx2I;9FlI|t+TEa~3<{fjZAn*dfkRp2E7h*DLr^U>w-6u!X>kY-c5(}Pj$A6!`v!KO zYp$#>OnH8_q6vMpc-i6wZf*+}xqEtT3p{bw7ctlbwiXcNB+ako4FEw_-}SSO2A zaSKr24;8g7A1EE%LO*+Z3Og`fj<(86KSTzuap77YY*pqtFrh8FgEkB7N`t*AY;LkV z{6(G=@*e7mM@e0UR{|vz>(pl z@NGB!;AY3f`yPA_PbZl>$iLDHPKEONTJNv)!mc`rLhzMdVAF4-idzea7`4l``I@!ezdf~FHw&fE=MKAaP z6~UoCLjH7k(3yzG9&Ay5r@}{cAj3t{{j!e>$+fp=V4f!j- zKzQ6%qj=C!8`1Kb)`x_z`~v9;n&3hK9RuJONT+2B?N}agKed_(69w=K3|RV7^9!^+ zt#Us_cgaf1>SZ8?0I5B^lh7JSfYHe>;3L|q<#9+X!~@?WuffPAd?&v^-i0RH(N+8c zePzpD8ue~_`(3gV#xKygn-3lFaipsF1-3_BlT_Bw&bPN)rREo4<6LB`Y!^ljsQCr_ z;g%ZN7sMT`Y(x@eH7&<+92LKiSG|C4kMRq1!5iF)npW`=;1~St2RhIKa+=!Pn?*+% zDu96s*$<8ekyoZmgB(AtRx9DgVM?W3CX=_KcNi*w;RG+g;R}eIcLEG}f29xrMS1cN=zt0_dNEC&JuBN(XuN_m5yT&JM{4aHDW zeR~R*b+COSwF65h`s2~PPqI4m>17cWSQztFy0}w-gLv6!GNbiAZ z6zH&+g?I5C6a)E$QeLCdP13TbZ&U=!wHw-k0P^7II1$jWy>3{-wJ4ucr%DFIFGk4Y*jfPAn`8YI(}qTxg+Q;*ABthfNe`YQ1Q zW>G8_8C63J>O#$7s?tE95*juUIv@tz^Hj)hgFy^jN?f~i15I7-A*H(9izMix+V;fQ ze1;lgAjI(~5DkP76h<3VNu(wHp-@w3xEi?+o~?!$$QvscV|&0ch=IPMR@S^n&0J8o zHa1}Hw(ZB*2wi*fZlx+hjX@0fCw!_JVjy|e)=7&@q1a(amaMwb7uNwX;NouCs38V> z!g;hton?2ElWej!f4!$+>=$c-omLk z226B;_$Gx4TP?jkC=93|rDCVW5p+F84KmP96t}>FmiQv3TF?nHfJ%b+DvqlH8OYGR zIza}u?WvZkhB$-*RsxYQSyj`kE+7Nxd79(lVrlJ57Y3vU$OVw0@Ds)Y4djqq0>i@h zEh4E%1_s&5i44kIT*B*Y3e**7x>(*TwEGohu)W<0h|t*NF;$Og`F9Pz9^=k;K?GI9fxoT8qZC(D3KYpSWQm$Z5Nv^4F3yib&@9BMGM2;|TJ z!8i4%-~WW zlYj}O|2ec6?ru1w&FEnQbhWQA1J;x4>ub<(0<0Pr-oTPz*fDLEBqTUNHVPFlVE|Vz z@Vsm$@*c*-U?ioXs`;4BSC}EaskUBH+q&rm`j&>l41^aoj%t{J^rB57l}cJ6l{p9h zHjxN0gDv}fW+;KCh8ZC5y`oww1ek#ZU8%D9p=}4uK-||Zm(-)_XNu8tb148bFcwOq z@hX^sa8Fqa3$MxtL=G2sp_E0!J05*|!_~GEX0W*gjT(nchx_McNPx6jmc#lLW(X;3 zsEg&SlFA<(^jSc`QEZN*TSx#i^y5%AG%D)q6wNT~IJg~kOIDnYKDXG0&ItmK3}9RI z$HppI7~%vhgAX#TOj297h5$+5)xrz}=M5`pwmX`tyf$5Y@E~m0V#51;Na+A91BZOD zrmd~^Fo8~{F?ToI4cX4IrD5EGnq?rnK}oQxu>s~dau=4tHlVSpUZ{gS$5;j% z~swr{FksBnqKXa+3p zt@GL?E(=`jfpehHS=8JcHowvgjs=oxi9dpeQr$I>-1^F<(^$k-O*7!5&pz16b(Qa@F+S1xzSK5`|_1$AUs4vZSB-F1JS$X z1`cQjT{g|l6BIrCRX77a`H{_6oPqF0A(p*DMgq?8GeWDXt!~(2+krFSqtV0QlnQ6S z9Yhb>s&EFH(|X9=h2ac@lxQ2k8G?b;AS|n{#YW~VcyuRpN0J)Ejn8aVyXyf&u)T#I z!r5UwgY8x2R$K?qz}d!Ofa-z{iOANF2^%EfCk%e z^tg>0Xdt|htpYFtfClC+kXujz4Wjeb?5{wBbCIN~Asm?i)WBc_;n#~B@7Z($4Q$&( z=mpzOpn;N5w+xQ~4FL-&ps0ZX4OB-l5KJ9F1Jn9^Q>CP26f!~uG>k@0Hb5;cBS2{? zu>}@>Bl-Z>0W{DUsWl!1I`g1Aq-9e94Uns>9*8SUZ9xSzI2G1cHrz*s4(SE1^+${a zlFFt>Hl08N#ib@y1vF3?Nz&D{Qyv5r&|q`Cg7XzKAqb4KM5OITJCUfrb0{-j<~jTwoBERMb{B+(iZ&0MO7wRXMT*HPFDa zIg0MLWvhS&iw#-wP&@@1SQiMdhP{9+V2TS2o0vv%UGaFNj|ylQj9pE{jmNAyfdxjN{sZ9)}8Ou#75YQq@2M(|Wh8s#1Cm83aIsp%IcKt*k9u)Cn}$ zoJRLsveiHXn{4Iv{0M<=ySAvx4@ZF9NSNvZ+iH{YkPYw*`#?m3YzIwT51VWu!6yI> zy%Bmvtyun!0D*g;ENIk3g_i{bF6%=Wc*{k1Uazu(u7hXXX--&cYeNBKg2kj-uBwmi z1RAWP8pSoWUPyny1^OTn(#p!FGZtTg1}C0;FTu(dkGHlYc}Jz5AQNCFGhkA!*CZ-F z`P<`stqg4JPB$fW0U9g=<&~AvCrEc~3}|?$Yk;Im#nqC{){rs=fCeUs`@AhDY`fQ{ z{kK!o!tAZ+kX#mk20U)_JBc{)-lc1CRZTZLfd&R{8JwMj-xnk=bil*z2%)UDLQ>$0 z?*JOexb;s2uxs~A)GmeBde;A zrO-(#paH}ea8_h{XAaTQhQ>UA@eCwu2uV|HEeV}G1BLKfUQt0#2m1avjngF);?70kl-0>_UmSLYBAI;#Z!5Zm~F3Q2{P^!ru*4Jc9|mvfgxrdHxx$1+Eikz*{hn@Z>dR6}7c5hJk26C(dAOfVgGW*Ho0( zDDp2YvbKb5M{1nG%F^WwPhMAEUR|H(jp!MJJcD63MBfO}J5dA+VdXXQ@~1mlmX-vt zK>1dl!H?1xeo3^lplymSlGm1(SJjtY1`@~sBN_&n=p&Bk6Y?vAM1wg1E4n7y$fP^P^|fL+8F{_n z*$Hn4f|Z4(wJi?sOEf1C@HW%xNt+=MHzNYZqp-GT?q??h7Y?!2>V}_9pW*!$m z3d(CGpb=1AU0Ep>SHf38F+fsRAxgaJ1=(T{gYKPVgMN1-jBGH(?F@UAkS&0H?xm%$ z?_Zdc7<18&u1aTN(8B=825pRNfb5TY-Fm=-kb!=`akJ)I%%0HS5F;D9o9cfh8-RH- zGV5uoA{%tO_3Un}2WhN;Y%tT((bLm6G%_|eGSt`8)6x0{ZP=trL}m2{iKu>`tl|It z=Ks~ew>6-lp@kiqni`NPT=fz%eSG_o@AeMt{h=vv2_#Iu?*TSc1`LMHb?^>6dFjTT zyEiYN-n-t(Vx+O^51N1M+kfMg>io1u*abypNq?J0N1prmkkeQ|p&-}PA6C!5bpcXX zA&4pdzy~0ButN#_5dcT(e>-yYG$x&(_rhHG&l>_O(Exv1h*@q2Na}Zq&)R{QQq@UG z1hX4f3IFzdyM7hyqJhtuDDt%VGG0@KXb;{Jyhkj3lMl>gBIEd*DH{tpfR zjhpRlXtfiTuI`^6(DT+b{#h!sZ%q6jZy+<7KU}8&p?wVv?fw6v<-7U>Rd4}r&;OAF z062&L>$>lBqP-P;)cqeh0Ey?W|7YgG4M=*~=N~wrpxMp4#92*^0)3GREI* z0u4>wi2tJJb#<;4jrlfJ-(UEm_4hI(b}jz@e%*>*)BAhFPz#b6{i{jmkDX~l5C5%+ zNDE=Nz&*r&f2i_={zbK`|D=gbF8MooEdRNG?Wok||LlVrnr3m|qxLa(+t4h~bo}cY z&_ecpFY}lKmvsL6zEl&TVjBm(*P%q+|GE!q^iBFcjjuic@t_{@+i6 zT0Q?pcKEKP{O_-oXo~so8bE7K-H)k$Yzk^){B~tRQ)knUs(!2o9)Z1!-yGWAqkl~A z$C^!vejM~$`;!WPRP|#GAhqn8=NkedI`-JY*^fHf(Y3nY%)wd)K|ikfRktDCAb#`f zq1`*`$2GsI1DJnfUuO(#Ciqdck9B~upT6k;x|Tm|^kZiUGk_h?s9z5aeU~5C`P2@q zGwjjJ@VK_beN81-$s{@uQ7YwIo{%HHxh zb^s-sJ-_GI-Uly?#$5i9_S?{y$);WH>kjq#fo%_`dUQmW;Rmq9KnDEEco}Bj0DLJoCHvfOfRPb#j+G z->kgh1?6WzlmGhA=sBDDU7khYvg}{PJ^ph9Nr~33w;B6?HNM&Ygy#s6&| zfCtWPxWAbAzO4(xNjUGy|Iz^^+OQixy~~2rxAuPb&UgwQsOSF-f>WY(+X*vG|M;r= zJLB*R4dbc!6~h0j29#*UM#4{Kf8RVfU^1DoAQ1(2_Fo_Eu-3PNFykMbJys(cM&k*b z2Pk~`UmkD@aV~_Z-TukhtD3}clr8l*(BJ>63c&xCOHBNDP#gZohn~3=d0o!Gssg~j zi*`_KhIa{d`~x?%`}{(3xY_hSW6*H&ZBG`E<_`EK)cFq_(Cjt=PuY?QRq#JF0`?`L zFO4vz`)@-1|G)u|{FqDPhQbDj-|e^gKe{Dmz3!qj$zmv$Q2KvAw9F>hk{4eCEDzf9 zZy!pq-Vn8djGx@|?_6>I(mlQYGl`UCHz8H>-)sie$Lb%frV@V{^zTky?U$zUkl94) z((`%H3I0zP)E_9i;z=XU8*cJ{U+w?$)I0yEWioUYk>cd{94Z0U?*D901T+!WPbG2t zT&cvlBmW4p>MZe}{?sxtpJ_{`FFp98R5cX96d3z@sNSi1hdA!|a?m&Vd8p~XZuoC~ z)HLWjelCH`ShzjneNnT@)^Gl4DgAU6(j<}y^C$K<`j2Y<8y|GK4VpL?N20LYyn`=1 zj?XHrlE@ny<@MFY*`J4b$aYPcC4l=V#SFBmP zc8#a|0!KSKnMAa;m^o$u>_h%OwmVA&ZTP-J$4#3x-^vz8P#t(%Ym3>_#}DggX7C?3 zdZ*3b{?yRcGcxVbr~kk~=H`P3_3zWe)JRYJdo=lP4gcmnY`Xn%`)+?@`~SWD|3wX~ zbe}p46zMr|GRCV|Lx-9e?!{K;dM)4Nvu@S8=|i!T?D)xqpPulx&q_~^4RDJJFX4Y} zJ@r$Ssk`@@4eGIvEinvt_gJu;17?QQeY2aqcJ+Wh2w!H(x)1y~d7? z;?-|3Ga4FS|3f{H5r~HEhGk1Od2g6Al(J+aYuSdO4$C%dTRXzhT1`T z6095@ZEZvYg)}u*RwNRu>woA1q?g7Y{#Nr3f2;NT-yTC$i<$W#B!PzH`$=@KY)RPn z=6sZ0@bG=}$JDt0#5lV*+THE;_AL)|dy4GY!KA8veP+gAeH&)^Zo&J=y91tvKFw_E z$$V@cbLDAWzW-3Y(uRq%E-sqZ+wiqh5oOB0IkOz=PYgJ382u)`Z9;e3!tetBPAT%3-9Fm zUR|j5@)y4({V(2a@0TaPe?8mo@uZnqMIPtwhj?7rK6U|b!Uo9`1%D}duKwAENpbv{ zi~ZgtuFPm^aeq3_GM>NLQj6DS=KIS?pBcru^9T07J|y|W)b|ZDYWxQ+rnk5Z-#vYI z#q^(TE(gp<<}MpEa!F)e7`dVwZgFtbYQHdfTg;9zYlJgbdp_bBCB68mWo1w0l*<`~ z=NHY=PipAz=0aTTuNAy2>DHxz@8e4ESj|1Rp~WwVdD2Js%jcTRxsO@Cf3o@W^jF3Yu8lS1YHhYX{xojd+mX(n^c%V@P4hhNGx+T? zx{Jm6T|D-?)Y$gj`VSi@zpy9n38Wi+eq~(Q-`scR>w?yMRxjS&o=ZycXkWRB)iNwL z=JX!h?(ggBJXUMxU9Qsdc|7&h?sGdMdSs1?9rkXF&FlwfiIYNULblGwV=htKQcouC z-qX#M^u_bb#05duN0;oAZkjSV!?=Rz^LhS7T*rcnlcmLWQRX-b?Q=qTe7Ua z^4fb%Eq{E;fLGg+9=p=do-CX+sAX)cWon#eTiW%qGjLXuA0&^q$`#y`gyJ3)8u;-| ztNVKom^Ea$U}Ju9m3#&s9-sa|M->5%UuwC&buHPQ%^iy=l340qKoym0L zmTDN!Lq^VYw`6(vh4i@;+cvf2vjgRGKB9MBK6m|M{D;r)n$M(IYq)TzoG)_5rn#K1zxLLU*YVbh0P3%B@<^>Ad@_x$nx+SZ9 z_6^xXPe5#vCQdlzRX3KYqvQNy!iZ5zSw5qAghAe+^IPVYhT2O#Usq~XT#a!vx|s3& z(QEt!&d(>j-bS|kvdm}4o>1Q}E(yCtvmaKyPT!wD%*i}6{qFen?SAe}$KOv3o|NQB zKl3qa&t@m)!JYOi(BW~01MIhsv``qOzI}c4$*ZGpKOeYHLCF!Hvilu)8zCL<^8Cj0 znNIx@6C*n#}Ge0}{#e|+yoQK=!DZ8axXZ1RDjXS=| zVvkX1Wxp8m*$wNi?a;kYwDDHejW@LyM^@1axVgv&$2;?8uCHBB+A&K!Wli^$;r=!< zhP#91weUV6Tkm zw_3y9#RfS^(bJwt_wCUew8Hk1Q_7bmJnI^*VE&U8JC{*gN=C+Nj+p4$JTUZqn1f$z zLqrQY{mLVHXfDdK*Z8<5C!n@xOAO=VQWh^HX+W!VXQGcYyIT5XEZ zB$HpRjT%|KRC~{e%QGK8kvYwpw|3{m+=k(yH~7axK9c9zj19T!Xq~3?8#{+M*`i%~ zZQYa`EkcD$ksz2zv#DZ*IM|5d(!7~c8lF7NvutF(bj=G#@n1++1655 zc6uNou({^dqx}qV5=WADbFVDreLv2uMeYtc!&3d4a_XG*;^*#s?Qitf^T1D&7FX^%>|2WqX%zu2k)iE$H^bk#YtKon$#2Gz#s7@OOSR)>=|iLJq8!?Wh?Z#8~LtYp5Y{g5}=W9jynV zsR6R!Zb!@5vUQDnj_6pKPb`3#A&-cf4TLT6cNce zHJ)rd{>;InZ!6mkgQkx@q_MRjHR`VYmqFRKN!w2E*f=jJV28EmQpx1HSvk0sQGzoO zuL^3nF=(`rl_^$ci#E;6kbHjkan7_mGUG>P>>d3|*F1fDY>n;({jvvd2e=K`oqH;; zE^EV+xPkPN)%s80`uM)sv#HO@J~4Y=Pu_FTld*5s%tcRoFD#f_tsu* zwFRna&+CFwqJE$4*EkR2Zng2JnC57IWX3)H9J6*udW58AB(H(!@$yt!S$jYnv*)0} z6K{<&+ci?z%e*Nk_W1aw&9_AFX0~pQ`?)Oh+1;2(eB}_t#NI#||1>HnY~{)s%l!-v zwJo{JTx>Y^w!C6<%(kPXq)`u7N%qVrGBDwFkDt5F`4{){<8DTJ=Z0=}<<9ar8J1Qa zRMzx#2XeUey>jT$64yifc)gr%&(D20_WUWQX&(~}Q+oCJtf*p(-kiM~{4pZcAvwY5 zSwPdM9tBM4sp0x=V@_HXvuW39mML*jZ?4Q;WOdSS*QgOU-VA!`k4xJ}&_18Pa7KFG z8o&1H(%v{t(*xo074B~-lk%op-{`KNC-G;|aIbdV3VEVsIU@lX`lUzVnJ2WqR|d{l zw#R3~`Z>;L)||QMam*@bx_9-o2NTXTi=Ycv9-G}W_os(~ep60f`Gs-mf|+OD$TN1r zfaT-*20SA&KWN=GlBKSjCpvOs&y>E@Q@KaG+crFEyRf8jk!P=hqHeuXLiwyS2bmMm zZN)X=J6;XqdS4v9Kh3ldx6a{l)RQ5zdtA6RWC2~cZT!7li#z+C)ypP(jv-r+{q7Ie zGK@Id`aCr!u<6W^wWkl9e&ki2HJtBt*dJHW*S!1tGOrjvy(Nb;Y?O3|<@RSn&Yi_S zT)5nRwHHo~o1$BBGP?gbm$i5AZ0z5lUpPK>p7|YFkl54X=Q$Hz=_%i@+xB>p(>b|o zna#fPc#W#*t92$`WbFyuG-Ttp&32!6?tJ|A9$QK}T)wE0SwynyeS756sR47Q?WOHD zFTFMJ!N|Uu+N&O2+B|rvG3j-mP+RwrGlYS$O=%;0*Q_0`Ir>tT!S+K7b7p&gF%Kcm zTq}&fRR1pVvF_P@l%r+&b9e4~di&6jQR6Z^o?fN&=8r#J@w&$z?mPP-`Qdt&hK81g zNEkh<-%PRp)TP2k)WtY0e4K04x-oYxXYS68VvH*}@~Y8maJ{^Vtf@b$e$S^Bv1i7N zkJ_mhzeCjBzh|QDnd8c}rnfAzPJ5RP>q*|ea^0aRdW2Dt{s$;ey5BQ9QosDtqD|L) z&Tez{JpA*G*GuNtYwhgrX_Dw?WPNTeQF9$o)=X4#XQdsjWb(dhE|alhc< zd->MUvO(AH-ng(LZ)UQ|&b{X8ANMA^&A2&x#%IYSxt+PD%gXorY8H%o zVY#lQ7Cq}C6NWB&ZTD!1t;xLV6FKXTdD>q=vAdB z7Eq3DY2Vb(@=9Rxg;w49!#+N+Fxv0BazS}`_?>>mhe?<3p0;p^Dl1(xxLa+)`BAgl z?>0tfx!PQtH#Yj>m>vF zTfdnI1m{r;r`37 zy^`MEb+0`@??atVcCu*c6Wz2h>d4oT`DuyIXT)wM`@IV&t>}L}*29lUA7am+(l)Y& z{g|H6q#1PJ%GDQTpTr(VQ=^(jAF*4$VfAkQh`COqU2hLMgN!%b^L%TP-p$;BDLFmc zhDDV3Lx=3F%C`u-ah00j_NBkq=bmQIJ;%>@zh%euqpdr%`)GcyU4Q*eqyO$Z@5Y_} z95&Ivx{5n8uSLwu*i%QcU|;mmtV@{q_{Ntzn!9?97+u$sSDzYP>ojNf`bWWoeHOTm zWHW;FV$X+W4r;1jJtgX)k{=lPkz$-^HZXSb;3L`1#{1oJ*VJ~K=4R^rzK`dqQ|leC zbl-h`)H}+9?i|AKaG#Hfp{(tq_>$I7$rZE2Oif(h`1EO}W+9tr@o%k9-0@(+)d$0D z+~2=AKQ_m`d(ohgk53S!ym#jD?i)s2>NA14xa#NR0}<61ADQ=hz^t0C*=7|z(B7ka zTEv5ptkFMBsh?guLz{4lYh!lR&E24|-=Onb=bJ7aT5G|yaEvug?RWM)t;}jI;Z1bp zr((@t$_(BP3X5KHuJ%Lzg;|Al2QL2<;`HV0Aiv2%Zl&ppm6vwvhkH5Zj(C9|FP*b@ zT;;+GXZQCD36DCIQnRO@Vpmy`*`uNDj*-@pFB!HMcLi%XWFe1qUY}B;{mL!dwGX+b z?zb?15xHbe|Krb^{jTxFsj*|zdVB~H9mVrdt)6cuUa-8;9My|?lASQ*v3Ym)7^Aq+ z5g#?!Eh%}V0_OA=p$Ck9N*FT#l;Q4|Pff&m`;OuaMka2YbpHJLtNVSm9>qi!b-RI! zjvG>7c#EYre9jJ`;*@7<*zL!1iSKWS-U$o_}F?n=+ zdBRkiRoia&&F}l{Y{sz>ypSt{*&Ux!XLuD4V)vGu znvv~(+sD_<@$^yeWS!+>u0Q4%#NRy|SNXogBK!U%%|}5$8C{q~Jfx8v(#?^DbC|De3AZcPy`Qk%z~Hf~ z^VRKJx9A-nEa0AKpS4DCC2!vL8sqUH&!et#Bun}Gqk4{FjZ9iGDRL+p|e#d60cjwaDEY}C!<=^hrwQ+1@Hz1u=g?b%fOG}tX-!$(e5#AEj;&1kzy z>8H|Djp*R<4{YylGj|v;Z`HszSC)1k_r91`P}k$mC)c5l)`^zsfghe88TW*0VQU^H zzm;lVy>LThS?$zi)UBoscIBofQNkC&!uC>GRq{`##68Y!Dm~FOt?W_wC;|88spu>v zZorhfZlf=S3RY4!Q%B23U&J@}J0#mc9=ABNvO3LPv}ReatRvS}+r3U+v&!j4*`_lm zUb&eKo7&KSOpm*bs|M^|w#L-QVr|W?GrfPBIg`T`zaICz@#d|7lo3Zh31?M2FEnz$ z+?s!L-y)a(y(@DG%ioN6vpX-7&2!7OG`hWU`%dHe{7=NHlLQfQy& zR9TGmmv>vaK|ioEV8n=r*GVn?HIwg1-{BvKp-ZRV8Ml4<-i67X~Z`*>o&+M4MihqG$R9{ET;OmYwIxS)FF&Snsf z_;kM?hfYAS^Oy6#B0SHoTbP8|j6!6Q2u#a1*f?YGqQ?C*EddgU{fGdI^(`<{A38fc zEE^Q;^GIRR7B|?Hw1b|5zJtJ~eTqd7eOx5JlO*rhUK>Y)_(gWnwHD`=47y_fHd%S$ z&SJuigmx$nF6CexU<+Zx0^I%Dz_bt(s!D=fi%V`&9GBM{2>=KnTqbKNB z{W-GDqhp2L_K#D*C050yPe$;R#p@f-r_sq~q~^WqxMF?57D-(n)JGX;t|z=<@NV-A zJbfmicWsaTq|xZRunVY{L%_&}i|{!!ZDb#3!OZOEGq23;`rC5xLJGXWB3naY zAyNm{aizXeOKvf=9~skw+pjLYu#!19@Ssja+bR&HIBs6bD+KjJ(Y@v!h;Q;VP&08| zpE3Z5if+y)nqL9Dr`@NfgJU;x{x6EAvRQGI6e@{H0V2hcz^%AS#u%ZCU*`96zrh#J z&$=kgeI7tBqON3S1i;hwPj2}&iW3R$RR{kpm@h|0BaepM?MiH@ApNteZWJ<@X=r`E|mQFiuIsDy$nQf?(4 z(M%#Hn36ir9#G`QaLk!Nz^f#8v93AZH>=zLsI#NQRV7hX7e~=$QXEENzPhY@yQ}>n ztR};);GXC8;fsmt!MF)XVdrpG(l4iWPM8WC^b7h%VAUFcdx_?umW=I2Vu#@@kqz)b z8Z(!oeU}o&Ey++NxYW?&yjKO6*O0)~^@d zJD&}3`HS)%fc#}JPaB+-x45xvs%JmvO$ook`z!-I0T6H^GuaD@&^j2`SRo2_?UWf*t5 zR1HkITl}I~6SFVN{!p10BE^r3GlW2mzwB`l$1|SQ$pp!O_}Cp6M2W)OPm+DM1@_t9 zIXmEFW8YN4LrcKz;1jzGOr3JR3rIu17^7_1r7f$(jr+BlZw$znC6ex0b6Qz3$9C9d z7w8ffB1_BomiJTA?h`GJ^3&rk(^>;hnIeiPfj0W? z=vKyGnh}m${1GQnN1$4J#@_i^z@z)sp8#@k;gI$bk{1_qT-BB13uy`B zq~x!`{}-}qd^|h{LKV;`DmQk{JsTB8|9-$wC`^b2CqvHmoRIy>cRd~ee zpC-7}kiTyHgz-8WRmxk4NHii$iLuyksh7B1fIgo;3i1l-5+v2QfU?ct;GA@6`^ zm6+}{7%ibf9`8JF8`dY?<@+@u4?nnrqpo{SyG3c%2n>cHP8lDXGJ2D;u(8t0z@u;Jye>A23ctaUD9SRUT@cn z=@Uu3L+|A*Z~u5oG7P>1dK8HgdW+KrR6i z#e+?RqI$G#1rnKJhRUubEAZoq+&0esyIP%}>{Etk8pbld>wELS#UBivUSsa`KJ;ha zFQ;n!s@lywU5YLgyAdZ*UwOQ!AMadIY3)!QDj}Te%vF@~SE8@A^>2Tz`lphFYOD)r zAM}3(kekT7bM(Yn&2Duge7Tb!>=nPEhxjn;pc0}Q8`nNoT#?t==sgHheZ*+~G}MNz zny%Dez!|qtZUw&F!8nwX+?CWSlu%;gDRR?fwMjw`5$t~wwq8oRFvPf*6@W`rZzquZ zd6c&YGxF*gtRyg-@OD5KXdHr!c%FAi#}X&$O#!?a=3Y9Od$6ujGvna_^QBd53w7BX zXg9r#gzi0{mx;nVwW6#5KonrHmCCmMZG$C!0ffD{02&mynI+eQ^(MXsGzS<6EN)e{zf4N_}k5R zMhM|tnW!I{4+zB7q*mnidu>UAtM(SOm`;irk;Yw|%}C9D=wgNL=TWFiNx$PGBD*B0 z53oWck<)Vqmwi88ZwmVB0}6k|zZ?hfi&AoK^z8U>NToNC&vW*id= z_vPt!xzFEt#Lg)PT!L9azCBD^$~4Uu0leDJaTf!9U<6$SYuwC1|mZ!doZe4Mk zYlpz6A7QHB(C0mBqk1336_;vcXt$zy+lc(V$6joDV|wEyd)@%iwyN{OpJ%0SQkiUp z1=x?rR;jSBl|Q!$Fft`3MA8|JtiM-I5Z3L;#IFjjD?IIHc=$1CU1dB>1Q$(=oSjMI z>_0^MT@CN#sX#qcg$gx(G% zcx-yVcR)Y3C*e8Wk=mlVb+U+d_S;+b+741|DYATzz8cs5ys$j{29+H%gdwuWc~}h* zs^!ZvBq%;e(C|F;d_?+u$#`EtB;9CFY4jcx4ok-&!p^+>8)+(3J0Ic??wlA;Y?8WV zog@TR6IDk`Y0O6}RKopLkBO8%d7NnvdD&KY>?Jd4OB8c`Q40`ec`SmsdxZq4sz25? z1H%S!K2JVZ$-cRECaIAPgX8!&O%vubk{}5zY~qv`88^@Z2WibcQm`T>VkcS_Oansm zg!=CoY2OHGEklX@SGqD`1Fz2u{{gAfske|A2Itz&dL=%a?7d6}h7gbIrN9rDnb1=N zWjX4fHZ?kHUs#sPU6I-#n`E+MrlNMJcPl`JMZB-tJp{Mfg*BeWWZ>BGx{cat!3gJ5 zYsMX>S3*3QKl*kd;nh*D#}0~Wr4PI@3u)5r+?ur`=ab4+b&c{;10DsPX=$e7id?Q& zBc$>A&(Z*uYTjv$j83}(P1^>6pU)?cya7C{l|jh%{~aWX=q(yvSwDdV6PXMG;2(LghV^W zdrIH8=6iTE(!NQ6WtNyHER{+E6`GJF=n4_m4u}Jw!ZDMrHd;*Lw6NL5={u`W@(2Wi z-6Lz)szvG+>fj1LBHUy@%IV0=Ggr8~%xtdH4yh9YLFC;==d|lfzI>94 z;Ld8$j;L*Jt8$Tvb`rvABl1GgjOWqK6~}2uCdS-3qY|-z!NBA(k3`kWL@>H|LS}5t z3`d>uRtpXV+FVbu;vEY3y*$Z&3-EC~nwk#%8BLnjHyg|NakoMfmXdvXQ>oGIsTZIL zFttlUzo~5Bzr`V;VnLc4atQY3dHLZ8uzM+G4>Jr(0A~=}AwD4Nm>1a7Kp!mp&EW-! zD*MQHT?14kNHK!@$aCI~`gXZXnd0^H_YB5hJQrK*QmJnb_ord&lM>NrLIHXPgXZ?} z>i3`iZ^6sah4F;=tW?-uDDG5pOWAw{n;r6{C{wX0)A==4zZh6Q4Z8;^FrR{O1$zkXOuK?JC zpXVgD@?DP*_XTi7eVhZ$3KrE*0!=JtyMoUkC|oN{N>04w?4m?Rmk22s{}1>X|RFb2ww$P0W%r zc$NWA>qz{e`|dHy3lPO`nTMSHxGLe4@I~|T;ZE&(_H+r+aqr?`*!{LTopCEeAGHD* z@4f9^CuveLufU&$?@#Tf#>27VzL8zL2CmR0q71-U$GRg_5|=|F1~(y%-i!4G+^obA$=B8g9VHSp4tClS^L?)&%*yt!uyZH^04!KN=4m>`o4-jew0>XwM*Tu^qlEImE9Q84Ne=W-aO|8A&Trh4Opc%w`pzb;y z?5Vd4QykWTGbUqkUO9rCybDfTL*@t=%Ov{WjB2xpm0~$)v*2zaCuEV#vc`p5TKwEn zV(agh$GvzmZOK4w2|iNBg=djnCikt-$nt{{$GLIHl%To37P5VL)zTi@{|ps3I~x6& zA&ff#))*L$ZSS63%lUkP9sBz0S7i3LPo1N4F`YsJ03)K&&G2!rN#|llaep99dXXsv zuCFEn?+w#t;D(!bC)zOFmZOXXebYJldwzGt2Pt}=K2F4;4jd<~A^5%tCaekxM8A`@ zMWChVSAN(_k^Pvwpyqou^1Jy_bvw0US_I4yI|AT4xTbd?ig*EWwegn?v?8|+zuIia z2>I^olgcbRnw2N}c3#Z$$$A!B&hC?XZ!P4WVn!48Lpmc~i2`Ab3gP83a zo2Md0YhUPp>z|_{pR*4|L6qEB8OED}fB%9gxz<&f`vO?*S>g>^T@${?QUwZ2=^#X4 zQe!IM8_v9~Byxr@x9wl#6frUf&U;XoQ4h^lB=%w~6PQU>_g4}^p{nvKJOT>N0@WQ!%1uQa&1>g$?)-Gj(kV0SM`GOzKGGlx z8XSkz7t{DDFY5_^{>qqFiXwoVS)Ay`4WbK3JTF={#s*qf)IC(qN*uj0mOr=IwX83G z-|JCRjl?fbI#aU?Aaz=$gWYF(VDLLDR1Y_Q*e{#M{Zy8o(gX$;E&I~epYn@&W}hnr zyM?QRm&e=b{|~p*<{xjT;NuE&GN0FS1Lau@Z4dIzXqkP?@G6feW-4ZK_OqFV(QdsC2KXPa5d?sA)r0PDXv+pg)x!rxtF5UpVb?pd_;T|PA`uC|CY9b!F#p4xlrx-f`l zYp~Gzo(@~`M&j05{eQSnRRJE|q>#$jS^&2U-g7a} zu5Q@8TZ4~AGh#Ybv8CeMgKG0}XI3hkVeBV4Xz z7FQNA7F{h1tP^$UQ=11KRr3l`pOF3-9uO?v&5vJzSH~oD{@$gI;xREJFxIw5fMeT+ zWq-S9#>FOjpvg{GK-p*ws23b`N?H=p?*QPsn|1MSf4do6vKT)dQ!SB4vD}^VIL&TB zp%fr!Ys<|8TGa#Vw0Obs;o37NU@Zf)!a?lR9T(F8inOZk+QIG}ww6{_vOMe(Gg*&&y{b;z= z?z5$@IGXKMMM=qmcU9fwDl(}rU*IAsQAVPV#B;6w=%qfX9`qzFFq}d?;+d7BdvhS3 z9LT=pdV3613-02o7HlOO`SG6tha-gQQ?8NGm^Kl`9SUlD%EK=90j~)EWbB28prh_0 zi}E+sbdr4-RL0%*l2#uXS9=HFtMg{nev0D=n!az7!h)`Z1 z^zj-+;BF&HL4D`2Th2b+e}d;})@kV9g`wO3?So16lMA_q3}8A}={dFzGdHgh3xzbTwjsg&Ry0 z(xpCX)m>3E55F7|9}I=08Lx+eH}BZKgoioZc2P0d2${Zr3C4$wY>ACd%L}zl_wq9n zhj3JM)|3uEJ0U+<{gU$TQS*@FnvgaE#Br6E#?X!bed1Hh`h#RK2OBY;!9XRe8Gql9 zAhn-UP|_aCNa=f~`xKKZ zZ|-+-*6OQB1@(xdDaY~!8%LW})Z9nN{-5X*+N?cbV5+J%+5qd=tQWNozov)6D%`PE z?F-{JOoM@J$FiwH_HZ<^4QJPEY@NQl+>S^*J!5S9q=?7Z);^2+e-BxoMx1SJB| z$$-1=_c5kmIc5&7wX$jxFxL=9U;=zeo*__$c7~q1S|OiyHBPV-UOd6w-5q(t>5rfJ z6NzmGy=cOl83FYSo=aq9*7b45@IfN_ua}UB#$9^53Rli{f)rD&3gxweIO^e zjLORJ7*WMGk0+*ZS>B+EGY+imRd94n0cN64|A|9SVunpHjY%;{X=p(dZ!c;pruXJ$ zgC-!cHlqmP0=lExKQgw@o)XpHDSF`nO=wM*bZuaUvZ}OK>-?+J(>1WT`#CXAh;p&F z*K?xj6>Ru835nrC`D1u|P>tq+wHwwt+uVJfot`LypX)1zBzLLhZ*#MV)4o30fl_~{ ze0w5L*tDVeof~LCfu~{hW=bG|HgbDOSrOXfl#S9H5IRo0azl+}BviSFZXn zOHy(-JOY_zp;Xb+p?}ivAD5i^8dUz9 z0^*lehlx}J$Iv#n4#OH`P&vUsZCjeKN3kCj$icXQc!36vErcQ%3HTHI9L!J*>E&B` z`-3y72kRM#$b>NuepJrDa=BJ+wDmyQAB~ODu_nJ392%V%58?xe=N@G5?+9<)G}_L= zIQ&a3VQ)9U5s_j1#^7g^PFILyJDck)aA zF?Xbq;>s4v<1Fz_FYQjnw%y$!FW{trp^!R9OT9oYvyN22yNnPX(rtysC!>&*W_dFO zjTq*=!@Ur;i~G@>Z0E*!^4Xr1aM_Um7M!txB`@dL4>j#9f+J*F3 zqYG8y&rj}OSbj?S?kceZZDZxlQhIVsmC5tO z#Q^cP!CP$rydDt;DdM~KZw`H&wS%2r-WN{CpZBQEgs9dw|4nne+KtQ%=|#1ic8AuG z>3C6@J@egHxR)t(-cg+UcPe7edl`@uqt}M4^Pz3 z!W_S3+&}&MW8aBJg##FuGSvQD@Vqd*|0x%cR1&l0>nty z@fN*9q~`7__;s9}L0{#vADqqxQOfUdVA`%e5+TXC4KEZk6{i*Atv_dDV&v zJUBSo!lKiq{W9{p1ubt;sv+Yp^y2)f*IT7=^I8s_Uf(v_U*w0RGdex+?0Y)U1?+OC z!+mT_qHR0Maa^8ebi2elH;6W!4xvwy6{u_eiffdnHY0xs9G6uth9U=bOcz;Zuda{1 zNIC$z8}v(F1R}&6ePRhH9Lt>IPj@<~E}h86+w=}PH`4OURc5e|S$X4#wT^HoLg4q!gx9aW6AGpKT6C*|ea3rDEg^B>}6eD6r(Wvy!$UR=|h7dr~6Ew;?)J59fjU+zy|*m0Bnv&sOLfS z*G<+oP-1QWP(O2-<<(U?l9!%X#g>}uM(PB#{rge9j=<)r?>eTV+N9M~N-?@p-?$4g zq0iJkB(vmh99sH4c)eRRCn|lvQGFz|;2o&rGCJb}`v7W)qdyqt53hdY5KK)czUeo(~=_%#p9<}J!r5QF0>a=*+fbM_?% z*Ev>|VX>_-7!ao}E#aswrkPkj8FpK=NuW^_bWq8*5w!~_Ki_{Oj!-< zhdh@aO6;U6SzgB0x#|C4@45K;$uzi+(G8JP)te!F=ZkKX_Gs1d(P3bdrw-%9w&r<>xH!y^*DDWcGt0Q<;WXx(2az(F z<7c^a>uGkR%~uXq%!Wg zd?Llhtg;m8{t9)RcB4Ai{R{AlSxIlu>**5{_UL1C3xAze(I};gKpaYcu8Xmo~rxEhY3gUT8%o( z+ADI{2C{q!XentoIThc(!pWkZFNafL{f1tCHY!EzD2bi7Nt4d;|C2l&sOY;|eQdpy?{e-l>XDimRCGc%!zS{e$- z9V^gs;4SMrS|J$aEpwPEfu~M@=k+!*N?PXxQ>+ADX=@T)Y$EXWn!j&;*Ef?R%$*dc9>=x0hQZj zekNZotPn?tAJ@I#QL6!Et@H0{RVm^HXG=r022&&b=%H996JNAJB5ZP76)O=p$ei=awk?$>fOAJ646U^=nWa3fA=oZ69NPkgRv-VW0|Y& z-A=hHK!^hUmS=9#MEA&L8ZVRPz}9}v#0r#r!V>rk^#ED6_ zp@;OQ+ynLj6Dl$xzs-T?loODxFgIrl%}EY3ngSe_5L*uzTXCtQB9knyei$xa5Tx^6 z5?gjqhdd34^g-5^!bF4QLZqp!9-e+UfGW@HltVFnsK%9Ymv>iYsKuJew77FeNBJ!idYKTHB^2(bM>N&VH&0FVK`{`GuLU%!z7#y>29R!b2gBz08A^K6CCmYP zIs!FBJ+;bY-P@%Iu%EOhmVF=qaGS<6&DN@~X1qHeX%=6#te`w)=ML4krr&6ZyskU6 zjzj4#B6I1+d`Hj9e0$VrhAm6eKXX5)PB@-t=zGe~>JE1;n#}}XjWj@ftZ7-yw3-Y* zC|2U$)E)tXSr#f%5PJcuE0rafH^B=SeFbQ9epVENo1=ZVgfnr26T9v;eHTE!>i*x{ zqd+*wF|K(EqM2=F{~Tcxlzw|oe2;X;Ui~ixbPq+Z6AV-&ofR0L<+}5`P_B|5bw4+j z4NlLMr{Gt-tmDpK-B2Hhbu03omMViKZ`Mr{8a zpGRGe>M4JeuD|`#;xpK?3K>-yY*V zq}zL`ieAXUXWVG}diwXrwn7Vuz+DQm-z$z%{lq|*52HJDS^*P_5GK}~OQGELz4fvDwqqbTI!+aAr$tgN8hEYY|SQ&MVl=_j`BKpd_>WtG(m%dwHeNj*8 zB7As9^au=G>vI*z)QZd#@M6n%ij>-eQLRHhvWnk=J(iWJV}WEgyZld$go+oxH7V!? zZ*lSHYC{>lFm*^*L0(6MjzgjufWX46Iv*h8&$;YI3zk8Wz2eHgF}I&36YnlYpMVWp z9AJDzO2UnfS*rd|KzbTChinP^8s?PSnIBbThE1fCF5%*2J6p}|co>z00r^v225z@c zK;Ez@r+X~93w8vGK1y?(N!g?%!R_DiKN=czi%9+V3jKs`T(>(|U&eDJrBr5{Z>Mr9w_sUsfUqc?|%$z#CSaaF*VVqO3EG?Ud!<#DX!HU6uU0twt z#tWTNEDHwia*`FZ)poxcC3TFMF$0VxoV|-$=M(>OBddu-+wlg{ zj3|oZQUw-)0K`CyFbp=<3hm!7HTh?X0D#317kUNoVr&yx7l%IDFG$z9oNl+3Rz+%>W0JNDvX8qeZxV7pNT72))H5V<(V0`O-PL09vq+;JSY)X8g; z7X55341%z9V$%(Vq2<_2;VkCT&6U^TxGt=W!iBtM&8S3a1A~u28=d3iuqRneV2I%5*iQjVgyEi%J)t^CD14n@aB%zkX=6$N&538 zfvHVDop#3GGUy?nRemo~-;&A@erd}p=I|_8D3FJVG&R&+IG~!cYll~yOQm}()QX(T ztOWV#$=#WLet82CF=HQ(`Z>i}4ZhF}BqrgoYiu&$qlfy*lG=K;i)oeUo^y(HR5xfI zeSHvYmzW^Xw}iHy6s~-5Vu$cbA2U34YBPM8)StPC8f4m!yxGXf?6PQ-05P z#iH)8$z5Z$$&zWIG|M33e~GooI*1b+G5ag@CT}>+rx`wPH~%38t=L~`4BBzo?q*u# zK4br8%xoc_Tzfgc!amHUXm3DhEi3t%YqJ>2gt}F2h;&i~Usb60-@TmsnwPl9J9ha= zA}TgD%X@$^*1f1cJWt`#)Qw&FPGRoZ04IqbvkQ-HSc!cPlG8~?V&kqbQ&gCf`+Ut( z*9R{IJ6bF)*axA)Fg;+}t_FozVacpr1Fw7jf^?A~s`J@Ch0GrlI&(aMwM zb!6YL6LpMNrmQ{3HQn5?D=nJIQf z*79m|C+zsMK8IQ#tv>;4jG=oZ5)&S%zO z&WS4`v&0K7m=#huF7l>NdO>#@FIU$7{7EZ5^8N91$N7?*yydg2Rp5Btxfwj)*$eh- zUD2X-@?i-gAh9mdM$T~IL*-pr!;(6^{W~Sv44$QlCC|UzH}wIxqS0SKC+>ia#F{uk zC>{2!u1jZ4*fzz@Vx!pdJwpNTeZ7TB7aDk&wyUUtn?xQ(<^jVmL_lF#+f*L>zZ$O2 zHD9wc6@TdFnz5(AOm9y|QA@;`O%(Ao(wj z?74Lb!#Z?Meca=HS{H!eDqms%Vl}CX%>OZFP(MqgYqF78Q9)DKg`DEBKFZL7=`D05 zB1zJUiQ<{J!oT+NT5C_FfDvy%EUQmprPY-v^kU9Om)HDoaaOz3b4;d_iN54xyvx&& z`1(GCu4@#~%}>w4vR+LhPjIo#?mm1kp@1K2rT}N*L^6r4Rf5c6TA`tMB}Zu{&n>ob zU>Jkz+-6-CGcY-^MIMf3dtVfbs2*B-zY{Hw&7B9Sdi`p;CR- z52a~6*~tcfxA|X98O9& z!Rz{n=~ew+8(DURnRknnsk6NlSo(~_`~0aFtfaXgKx4X^?j=9;97U#%#5ad?n&p!f z(uxSt#rM{Qm&Fn|JSek;*jRI9!{_V6tdfqdTAHk(QJVt`K!%Qi?}=|-kaIhi<-w|2 zg)kOahg8{2$QPL8nz_EP3$^bJL;Ikq>JnTkm;VRQl$_8$PW{s^^86$VK+my+D~KF1 z4#WpUem5qeMxC#6=l?%_8HD;0~Us~o$( z&%@Y)ejdcJ_5v5AF;9#Z5sqr#@smZO}I+mW3qwZi&q?q{SiPe z*#d!BE)6I$?WIO=$uOB-TKd#(fG%hpQdfbbj=dK9F&`*m^M9@p6lhrV0it*Fq~h}~ z4*;x-XE5_TiF-Cde4Jb^g*mYNKg&(6x06FY>7yibUOMLo6%DffGCj)o9m`#+3LXv zF&1zT_D_}=(s^p!#|rcD>CmRr8Qk;y&tbHf){=TeMt_&f8B7Jd8S-sV)*gHD#N5XA zg51g)@<_ct22)At?6(5SA-@93bwC2rEkQ|35A{DWEmtXfQ0l2+%8N9b*Jy$=;INfi zdE;FO0_c`7(5=6s7@-mC-BXs-*M}$dl?6Vhy1BeNlEGX-DMwriyLowzoH-b6uI-PMBk~N4U_6)fy-j)FHtw;%JP9xeQWu z9Bw5js!2am9L=rE+W7vo`%*)EHx==Xg;P8=YtRpTIfEq&&Xt9TFPYchfnRVEMNr!E zrefQOi*ra4|Me4ggX(MFXnXI$DupSIS6oWwfOJpjj(q4ivV;Dxo(N@_N#hhEmRyl z!xfuCA_YmB^uxxJVA#cWnlwuWD#8U_5xhkBrhEdq1~S=n+BCuG_DroiD)rS~lT;wAwpBZu02Lcj(ATlDLqOetyDB)+0j}kKll8)4qpAR$f!X zjceZINi#o|d?Yj&IEHPwqvw+q=6c_Yn}}*ZI;{N3`7nLd7eH_rTel*YaPz_ zcW1ceM4PwWY=9V@aq#zR!lLhn{FXD*t!-`;p?~b1le_>%|~`;`albN`0|Y zy8Zsb%Nm=yx`tLt#g6YfD#c{yR}JNi7_?RGl1D4Gnh+e54S-RMhsSDZJF&>OyCnOj zdRBP;{$67eM!?cA|9{P6Q)G{-77-H7L^dqv{(>r{_Z9y-ps&ik^rr0+yh&}qsVLI> z^4$E%NEW^7X*C|d>qhKQjpJd<198+TSpo}PS4Evr^<&LJ5*dC*j<@5W@NE)q`3R;rLI@uRA@uu zo;1K?B{BM%{xi~w@A%Ha0zIrfv38a+#G;cl+M{^DX?8=qeZAEgWQp*SSd=xe^T(4J zMNvT3H|bRj1+$r()bh5C_FI~MZ!4O{ggas%n+=v(0j!kGf&43)Y#%pHgfyG4fs;tQSGLse}gWAI&Yf<4$yyYqT$3}OvNSW-o_h? zBqY$Ik5sHEb0r=eBGvpS1tCY>W$_xEMpv8(5C47y-xqiWV|RK;rD1v|E|ZX^3#7%k zT&{sHyG&tKR+!INLy#RQ7bRziXAq)c^MS1|Hx9@~7=%ofi!+`8&anyZr9`VqVJdZ||1-^vjq=6?iq!w95tqo7dB9U|EBm75{T+9i4Sa0h3cx3K~yZuKR8Oc-j;w#ekT{<(OUldA`sg`+o5MU8; zLfrBJts>q**7bbXH7mQCF9#3%WsuOEfEkY2eng~NkiZQphop4je4Ed>f-7h)C9q)@ z5wdUHT|Cfom?{^lX#~=Zn^?Lp2E9gf;?{L|x5_uyRkPLyzN8zA0PHTrOvd!_DS`PC zVreh>%O96yLiju2!RkH$~^X}%sEKM^^JpKo{Gj?SV3s~5ESF7Ms@e?B+qbyADX>u>uU?J(g7mg9O zf7@NU6%JiFT`#rCg+&zU%0f0+M+JP^ROp>@xM0sphRv>4#$68w0ILpQLxw`()cqLC zbRKqD(PHCTpDA_$QEG|=FZdy-ARZIF=;HhL(>0lfFml#*3HFpkE;WPd=ztl11OpisFUO-Z?Hl~2_pD2E-~P3_ zx@D`K;Xq;LUFm*UhYw;)-34LYi#zal&O9d94QdJ0(H&^5$D$D))KM^eLRw{ryP3qL9KI`UG zTDlN(g9d%JFdf*!U}24d+$-N*=MF#6>8Q(DD1N9rW5+%;&~Ev8fd3O{Cj43IN2H(` zLx|v4^`#Uq-2V&NRgZdJJP3US4l=EJjhNS-WeG?et^3TbpqC#%D&@?7Pl4zp>GSGG zSSIFjPJ6J&ht5}pp?&dGK{Dr(W?ms=P{`a)s(H^n(v(51pvvpeqQd9D=t7*nT3;^uyxmwih`9uP$98$|n{woA+pC(mC)bH~%@n=5ADkRsEu zLrDIT={ePp{*b$HDv9s=9C)%@*7gdZ8m+pSz4Vlw>)HyWMN)0O`~yL4yzuZAIvDy` z>WK1BoW8NA3L5D&#@MG|McB>|&W#NX{VODdPQVz(RN$oo`fZae)gGR6Yp9GvgHHO% z3#ZJrYl{5?sp?<@{h!vK0{L0+c@xeo>BiWTr*Ad?f6xs*)Ntr)D1bS<#+v!N^qEEU z;6HD#SBb%dKkUOg_9FwL1GeFG0A33Kb#m{Y&zunWjX}-An;35@tYbt>5vZi#Kyq02y z^xziVP3)hKS-$thj4c)Ur86x~#<5ig=1{^JB^SPhj~FIRqPyj<@kOKKRXLtkJwA2( zf-+JX_&d3;Ipn-EpdrjSMB9@*Q`Yu=pFf-))^JCcUzC>}c=F>P@H~Kf{bY%uBK{H? zP@U^CLK|u)z?Vl@q(or3e955t6NO{-E7f=vCtOT?H|X?7GwTyc(DZO!=KGm`+pptS zKp$K--x%02VOiRg{_cXkT24jxKr=P@KOq({yy#txYYGByasb4Dy4XP;3-27`-Fd0FC{ z4d>(ze2Cj{ZjA$hr2`*NBNiY9xg6uJxrOpNM3iGm5uz#l6Wun2pWeQYqUL+i2hqCI z9t;$jb8P3jaTOu}CVgzE*AQ5QqNx?k!<%=O9DnO5NU``w2LsR#B3VYf!(vK0NRF1Q zgv22wj8O%{W$hsK)IL!KLw^caK_y-o1PfuEa!$XbHvc#@=cc@PQY9xQOF+O;4yx(c zfD5T>h-X%*stvZjLnsL%U;-iCTPJ7}gXO^@t9r?-wwBT6PeoM@o98Ro7C?i*4aG9M ztHujSk$z^QP(P%pHx+y=^Vo5pvA?>f7tZ%Fs}r}Jro6UkmDwhT1zkHW0rILmL?uAN}0EdENpj5JlWWa5MyGJQPz{L!i;*~0m>nG5w-~?5}0El2UQ)Y}g@R*O&0)`inP2P4q)sEx65w5EX2cGO18sjPARhf1KqXh0oK z=kiewcxJQ2{@3f|`DVFR9KjDbW#oAHWQAY^!CGt@7?|1GDThTha>upbxA#50W}Xr zBO&)iwwRo&u~9A^A9U&>gK$qu%7mB+yge)~T>I8}8Knv`TxT4u-O$z}ZD_)wm9fe2jeG(Z~L_CYtgqeSQuxJ8qFh9jmwcw~z z*>Fcu2kxreW11^hpjdPEaAG^Q(L5rgsZ7}_qay*Q$i%*@gYW68?S70VktP3BKgi4x zW?6XFd(?CyG3(1A2KzE^w3X9)T1`7Bc(%mZZyEI0megarNiBJqd zA@lVl%=nI4ut3=Yt%UOyQDUMFQ}|rsbm)fyWxCIouLHG`6{*(_?e^%<@?Ae!@sMxY zbbQjQe=Px;h`E|32zcfN$OkgD0;6h5kdHL%B#m+KJPqE|=c3OMfdq^Y{yBMm@f1 z0l57`$o&Y^Tq#gVpur{&WnDkaz5S#c*bp}NRP z%0qDUK%6UgCtVevh4*HYh$k`lB?;qBu1RPno{?A@BA4^QzGG;Q@zz~FhR2~=!vr0` z7awr4h;8*2wl3#Vkn(BvRH#CM1{KIiGVyyQd6m*VrHx8m+I2uF8%(evVMHDg^MSzc zcwFRZ<&9Yi?rq_ZnmvQ~zSI>;eF0SE0cY*Ulfj&f=lRg7nCk z<5`RRL3MJ6Z2o?K`sR&r|9nvP8eV)`J+20PYr1+=ja6#Ec?p3+Z@==BQwq`ByPys& zy%3blBanV)ZZb>8l4F3d-CKN@a#U4|XKOZggGChiS0#i*5fX_mWAk>Zl`~L` zypV9`cnr33T%6G!oS4yvf6}}_=n0t>Oo5{lKhCSB(C|v`iy~^nL=*MtH+xhACsol5 z=>jfTx_dzwbXMz%OcJ9&NA*H(m8FV5t*sK^Ao!E1K4g~fo)b7Pnz<#W4sNn~=d!rX z!(KIDaRB&2xA_C1LTYM#&Cq@4aorpjn2KU=!L&wgRp6A7wzjFFS=1y26daK&(#Lg+HdCxk`Fsjr76`QY}?gKHJDCPEIB7Se z9AtgiUL>$)j-i!}{#AiKPUFZi3tYiq7;4d|wwOxu2%p0d0n=_mg|OI_6ro^2Kf{)9 zXvx88ivcWR;lJCHM6%<&!cAqKc~bDJ2+)Rd6zeU|!QTf`El)OdPwtMp*U<+I|1RRh zUDePiXXq&~@nqLlW9h0qdvPDZS8bw!Ij$7`lm2!5B@^mWHi!m(IuS8%LCJU%yx{!Bw|tvlxu+?9bAlvG84;z(Df1k-tiJ(5S`clSxRf6EY@bQWidQ3uMywI7vKVq9`FK4is_?DiOXc3 zWgbwg=%ZFk(U@dkB$@1NNt%g5|GAL$l(}vqT2&BO+>cr^;^nSo~GI3yJp8AG5)@# z_W)6rlG8>Z!H3w$K1&7*iu|KVYXWB&l@pPBjUcp)-3M37>J*tpsS}IDKZvS7TWqtP zWUtd79{LtwSUO$VLT2uCPV`%*H8sYn5ooS#A9+m>Rsry4%T?k~&>$r-md7Y|AbUZ1zG z`|9gH`nu7>_VthZdc*y_R9{z8;PvM^H}@rPZQJbQPjpLnqv>9B zx5)ZkdRbx|wE`Ve;Kh zd|c}tpU|EvZ}k-nGOw!O#W4gzR+wI({x)TU()~k#PWQe<9xy0&`L^b&2Hqg+o3W0S zAi%-$o-0j#H^&)XB43<-U3%J>9Ev(_B7ggJTg0Q7#?x~|Bw#aKFC(TfPlB8I7P9|w z`U#J`IlKsWHkk{E^VT=!tS*M$?$HO&wQnEB@X92G(Nvl|$jIirM`iCrA~a9-71+M3 z%amTgh}Hb<@*Y^iwx4S+p^dR}mf@VUQ)Po|_0RMAzh%}zb{tJKnpNwi!kv0-i@I=* z%NdSCq9f0uS)1jn!CZ+q1a8NATaYw3-`bAVl(IGs33lIEiKxq=Hsi4qS5({)#NZN9 z?6*!NZBrye8wV!w}MphvgiQ~nkm`}5Y@ zO*UE|d?Y}58sQZm5XL7m{azG)ow6;U1F_;NL|C0&?rQgd^Zw?uXqo)vvPsD}u#m_& zS4`ea)~i{I`kHF`S2AF2K&))Vhy&?u!5qiGqi7b50&L6bCC6x6$cPSXlrAAu^e1c) z^F^rOVuDT4NBk!0}30rTfU#M%V*g2uCo6X<&?@aT6J6)oua19^Zp zltJ%sT#vvi_1>|`(3sumbD2*xBTqc~r3!dcfNgN#e|O(JTn_ppP$Tn+X)0tyK*g(4 z1;O4Gnq7EwtU!uC`#%O*gRi>@kLTfLgC@k%{gqX#w8SQq0Nz~m?r%Sv4JKF_M=c_5 zkTf7mK7-j`-WORXMDo02bJAZUE3OQtwAqN#L%k08%F%9EbaE9u#FG)Z@b(ZmQ6Rt3 zevBAOb=&?bdguf5Kost2^Xd<5eli0B{-%0E0j%HI!X>G%YM*DCLe8P|{j=lwwL!|1 zM&r+uc`Rm!4GcIyt9zQD;5x2(Ldmo}t?kHv*qJ1n~dhA^FEM-fMa?H3S2RBoGd>6Omh zUTN|8SvEDxjxcLUt7vuTB~E5C0H}cJ7^OI*1q|GVnStj$gysBq4Ne65Nw9tCM#VEx zoDLP`Q&xOY&gcmw_Mi#JnF#dVN#Rdx->x>g1UaE;hHp_GG>H)I@P$T2f6mqhYpg7d zTVpXJPO-~^E7UYr)3|>8?t~*b@M(Ik1ee{+)rFAUS&%imD1wtD8@EU!QU>u@5ainsu5u!$q9ck$+86{;F1pr(5 zxeP2Z7*!NMo;rrnaDH3WE)t=yI`e8%M}I_$aSPnHfTM14!L2edE~R~NQ`0=oHSD{q ztDE(z2P_~ZsRHWwq_<3TGb^Xpz}qb0uePppTe?Mpl&^aO=;N2eKQeW$ zYuJccMjV0U6|N<;UR4WxPW&$l>b+?{rOYZ$YUL)PaG*I-`XHQ&P@bb~&~O05!g8WK z)Q4DuZcUw}Zw}#A7XVVY>vcKvwVXY4`jQ(FF|*2QRNAjD?Cf)@F??_^sCIQZ$P%*L z*T)6en&Wj>!$CZ^m;2l?q0T^=511v?{sPmifm<>y6vd!zmcE9f5XPr}3IAK3D6c=z zRujP8g{y&wCf%e>#a=;5tO|-o^MI!Y7P*mEhT0)Sy5voazdMdn=EL56T z%Q=H7j`JA;+FTSzs7FTMS z+*10~rfjhLz z%>fIDy^Z=#W_()oDN*gN=Xr#4u>q2MRe3n*!9r*;7wvifgAOFM&~WGSawO`#>tzvf z3c)9Z>-d*Vbvylp-8QT=aSvJuGhvEMIiE~}Np;D*wxAxmlN9_d6Z@Gq&HQh+vQHT`>YVZ(*sca#B` zxy@sYO$Ls#6W_2Eh_=Qv-%X5@@tfTlB3TsYyW-mL8|4Jd zsYzg#p4Am`Gl$rz!j#!}(>qx~=pI%0Z~@6ecH$wW{gjFfjxIq?{JhjWvaA#tfm)>* zb{K(RKR>Ks`eihh{RSQo6C>-)`EI?2; zXNhn{@~j)|W`^u~Ex6<2%Vqy$r5u2nrxPPR{(dTWlT*SUO`a9t0*GAaheogAtSXI< zqCuLIbjquUAkG%9;I9N>AHELh@V_IMGWkZxNzJQzwKbQtT-$$v5id`Q422%CZGKrt zwe~o4RO4R1hREd_Z!+jgB`C)3BLp%9z?j8xgt^#&CTkt(tt}cuH9Qgp9}fvjc?N5< zI;M<@Fi0K7Hnn|^`J2^B8a{NK+RvUTM#o-Kz2>!d=P&(P2ywLeTFmtmj4gM2?OdES zaJ$It0b!HSi+_8>s81M#0pHGouIMU*Sudbwx|IKByYrsBGIcnf{42wf9IaS6QpXy1 z^-WHd5%5##2CHbrcu$tW*g&rPAHN&@8p%LKU~dU|6)Y25my@80clk_zkMmfLj1RP* zdwky&)N<_U;z=%wEBiVT%=|w6y}I#GXV|`gf_{Rx<|RLNiC%`IUQPJu->9}4?MT2q zRvG9l*kUZ6@SX1yE&?Afm_@bU^Ey8|L%Z!R0BFl>Q*Wv(2{F!*5ayYTm?7)ru<`2Ja!&8H{qG`JIYU zzysAu%#tB@>|PLEp3Wq~Fr)+kLW$o@rRt6t9_q=#`T^L0)0F0`<;jkiJ|#dTCWxf4 zU?pjTCDnP!FL5h{wVpgrvons_0ofYY~d9o@l2DM2?8m2^MKD1O1@n2g#U4xjfTRjrPRTgMA2|Q%tT! z`)6-Rv$YKyu85lXfdGw$NbKQU6MMdY?IET20u+f*UHU6_#4Ws75-@+eJ0i)ueajP}RqD|5+Oy$M{^? ztI;s_UsQEQnDTfJExF{ zLavtUDF1o%Sm}Pj?!Gtl7I)l%Y5}}t_jEFot3C!F2iJ?e(Qjx}YSF1p3EZJPhzM!U zL?!Ax-*d{``BRjNR}WH@flP<@sRJLqAsxu8m&Ao%#U0(_9FI1nQRkTyIk#gVW4}rO z6&-*zZQE$QN18$RUbRuM{=4lagH=1mlE%D>^B3+-pyCkC#$={EV z<8FjBRMcA*yctX@YyWVdp3!okM+B~_<-c1r$kD1S&aV>B3$W?k$F`^=F!Aq2(&&fm zwzOfF1oPR%(9s`~O{6Y%cH)j8o;h}(&gB!uQ;||B=|rMyz~@U>th4sXugAtZ!t8gL zJ8k2uK+=DqsVYg4QNU1r&{8;QOD|f{zV$_(V3g&LIdso}ELXsPcK|Tomxw7k7IO@F z`-vC0+(CC6HeyIKso_E)D4=Bt+=A2x=Od#+T^mYJR z8-<&2ZH5^AI7Uj|P*D`dGR4v`lbiLcz`;n@n4ofNPwQ{cwv~(XpoxP=Nn=Cljd8BC zys<8{$|sWSsky1kpG{*fakMy2ZlTieq4)dnU49enkhJ%Tk)*ZHvg(ZBt>t@;P$=%{ zw~gia&@@6XFE;cwdMT?7X!BQVwjyJm&0TN%Se|G_fir<>x(&_dIi7l#+Yqp=vyW;8 z@-~1ehBV_%yW1rF3WWOr@+}$n%Cxw z1mDz$p$k%87n`WC{wcLXjeHKA$C&*1Tq5?<1mRv`{}p9?XQ$i);!-$)`tpSr$i^dA zR1$dFQZNtw#7+?nUNaIQN}Zj{#48}F>n^qR^=#o{VQ9av5MD}9iuxasVJ4yMB)L30 z@sahebUK0|jVr}z8o8@dK4;72{cKce1f`L^H|Qy8uY79z#2bs(`Sy_y=|hsJS|(oP zlZxNE6rhPg<$Fmth$b;}aQ4v*aG6IBr-Fu2CQKVtTj^D(!M=WSo^JKV4O}%2ZT5Ns z^ZWlYVjM(CFo;nB42^?gG67ph`m&L6Bj@R{48tivLoBGZyXgcBz=yMn!x!Q~wkwWA z6m&A(4Xr%rXkr*rb+HO1ChMcYH+T=pO>A-=CRhzO?GmxfsyZCE>N0-P3VR{}R?-u; zUL0A9GFYp1b3O~hh|uGI1cpDf;`N{5qls8WS6}p6K9pGXWH=cjD3n_#6HE7HgLY+0 z)U^1L=9fM_0UiUEJP_%OWWKJ)>K!*ql!5q3J2(&tB8wkYQch=(oyQ5SD4Fz&QATy4 z(|Yl70fu(gD?*OQy%w6)uCBIhJI3aBuV(~+8na6tF}SEX+^}+0wU|IMVN+)lj_X<& z4MkZu+U3*?x?bz28HY%6I9@Um*#fx#TyL7W%`qr1EGC0@ZEfSxwDAO%|B^ zy&O)&I+>cKd#ZV?L_3fs0aXwBwq+sB8G$KlfWMHD@(ogNn` zy6+hA_OOO!mJ9Sv^p92k$+c(^(X9g;C%fvY=#zz3?zT`oItt*Gz6E#uCb9MC(ooIQ z_#H9s!gJO0eT0g2y%IHrLK#R_)v0xt9rn<52xp(u@eb2$)sA#$S;zjm>~IiSNT1Zy zUjIu-mk#iSHT^OD(*tM5op@46F;QzkstHDaKRQXiSPYM6Y)r_SkKb>h+|_F{azzHx zb>6|cUq^YbdbxlQpeyN@BirwYFd=q^EKm42M&-2RLcSDn^G=c|i<-)yMiZaDbI=y@aT-3VIXJC*DQeMoY*y}VIcHAMTb z;cM|XYP9?WeI^?A^v-iyGA>4N0O2)x?=Hf(!P8v z^EM#0d=@aY1kd(8x7LRzo8xC7bYeCWQQ}r8bxR9d#91#3xBC;eXca&(&bwmo|5g)r zxCTQv8n_6|SZv&P$R{zx6k!#$uk9hJ$uFlRROQ%}ZZjt%=5(%SL_S?T?suxYOhdv4 z<{B)mz{L=$-y*@7D-S%fsI>dxKuoE|Q4P)zAX65?V1`TfLlAx6Hj!+4JbQ@b`ij%f zZMjzEsWYGv9luzU3;wKhkk!@T=ud)tgsHM?wg~O6JD4GodsI}&|>nng&N#^5&lN&qn43HQ4~wcFpy z!@R3j$oJ0O1BnWOy_^xBntcg@A!<{ffcuFYHj?svOvB zbndc#rg99my`wd*6Gi@1new5K5gs6rX;d^SBlfS^T)I?>q|fnW32pE$v@rD70D=D= z6s9lDSvMg@!hd~Edg~Gjp3L3zrTZ=wpu<28=CeU=SHED5C71Q$e6I{)o$@%;ndWgD zq4UPTn;?8*VnTQ2u^LSb3sERosy-lMGV0-mbf2^e4)bR4!CFiM-z~0WLAGV0(M`YT zPsk_^ZJZF<>4N`nWNoSK2R~B$k+>#tVs6C!(g)4i9bf7yxcXI6W$t*ke>4_gbINCt zZ%ZpBi=v2j+%=J|(6OhBEOmEQgOj+-$|j=h0z?fOMScrWvO2KjfwKUM8@ysZ&4Fu3 z9k+MdV#wRI)Xix56o=y9$jxi|*Y;tpQqH<`U=gFCM8_p@nKs;Atr@#@&aTVjwKxp* z?tRbaW=p`kF%?EO^EK1_$#|FCr!s?j!-P&I`SM*(`a!z2DV#^mhIgi*i$J;D@JKy@ zj@(&TsSV5GAL!`xoyhRbI}y4o;}%qIjmEqRo`c=N;Fh+eM?KbcIrXf*@KILBG1pQ~ zJ;K}JcUG2)NsMzyfm*-2MYf_6GDiipYmsXl|3+)~pGp2+d*HkIqxjQufx1HfUtI9R zA_=8tlrSO$HYFM_DEK~Klk|Z91@rmxTG*tW0KyPn60GDuOsJQyyb8uozE2qcTwPQm z)&|_=gEnWoYtqw->2CC9@cYvYpeiF!c5V}i-rM3o1L_Bm1VE+xEW3}GPnn*uHL z#_g(;K%rl{YIg0QqTEMfSZW%i5+zJp_;Nwbw?kAKHuZ z7=={F&v<2pzsDH2R|EV^B(|W_^Q4=0MWLL3+K_nhO{(?n6Oo=rI=8$6Nx^(r>sMiu z6}afirFU2frQ;Y=i{0RLMkae2Wm>lvBCk^d^HM#M;NYkt8O>#!>FV9a(jSX!KBn=s zZDpHcI>>5AU+95HX@J7`z4Kh{82BXrE@3I(U#t=J`zlvpwp0w0CRro@Vkfu{HWJqN zx!;v4r$G~xpc&V%{v@p<0|hjD`a4u!$b*Wtvc7a$AxG0|s5qJ`BW0-wWH0uh%235p zk~O_XP+6q!@4H?feQ2{b#v$;tzrm@tBu4>fb|N$s^rXH=!gEy!E-NBr<}NG$U7wTr zHd@zC{7R*IgU8L@^E~1KAjV?UEmO^h2kb;xe@^^-z`kN5dT=Phx6FhV462F?FxJD(8R>DQWQX44E$gBezkG@Rg9zzZF|Cjo)&uXzgvrtd z7{sf#D!AMc63j4V%+{1zw%-3GwgjXJ2ONQZ+$2oN8lE<6Qfske9M;{d@L=kXU5*qCmb97cleTXC)_6th=+gYg)YgCLzf zK5#{H=xhot{1wAG(Qq0o@-9a^NgDaNKF-7HP!U2#}twAM^eNpqfQ- zcpy>wixj%WaAisRg`0>*@B&_&986ohB>EqH=;$ZJNYv~g#r{lrwUCb{^KT68Xr%@N zuKqlBi*5r-+E{)ZNLdaLS`EkS^?{X ze(fXW*==VHsH=?%>Ym}7`a`|C{p$~ZgqzjNAe~yLKobct{S-!URMwEngLahd;~{8i zE0Yt5!MVDt5Vw0GyF4c8*+V1ebjCEXfkx!zi>3@L+`0A3a)s?H*Vg!XlHX1eCl8JJ9f z;fhq*1e9hTp9l2n66}m!DqjM3)xmi|XIk?tU0PIiFM#703mjC;c|Y*4|goKe0rv}-C_rF-#ufjTzq9`tDgdb zyAE0KT$;hba?+JjN#PDc*$>K-z_=Q2fE2Gq6JCr^SWfSLM)rs`h4ahLV>jZC&2G$< zHF(zMF@Y-1ADcjS;k3EPxD5E^@i(XbaYfxvm(8>^nxom;35x*%w71NIR+ugy*iOs# z|AfOc^5%=YQXv`hCm`Ily#POzZlS#CWSZHzWXd3pIR1uMVNe*eN&pT0)Qm_zrf!JWg_jz^JP06#LHoIvfLX&9A8;F$PPg z@Y7>mf^L?-b`pcGcFo$=7=j*d6r4nJ$P(!mM>8;h1)$b`1Mb&`36SZo{JYNB<2tCG zmY_=9Sty91yrc_}Iuu4S*~Fvwp~igjN#2+^sTrP)OZPRJ19lUClX3N*3O1`kJ%~Mv@O-y#2pTK%=~QPtI9AH7d<7h zUCIa`LKB&FmLn$3-IQ%*GsA?{EgObyk3oZ%tL+rCv6v>HM69WBxyx=S#CaQC!cg6 zI~2`(jeF_U z;P6Md8?AzFyVPafn`=1YbSemASZ$ye~-D~;Ri z&q|^mtxG~H8z8O_nA4-#OP=o2Tx4KwLGm^XW(stcEzY-c!wiw|olliPOEg%6rUwWA zVnugAhcElE>q=Y6>0(DUz*D5SQJpqSd0NTh#h%Nr)`<)l)NMUrb@CEdw8mh54Wd~F zF1J;o+&|*&R@Ehd2q^iWc8^%CrTZPR*cNzrKXn?}ot|gK^NUj$W8PK2|sO@9yOr^nOed;lm zGt)XXAJ5FK%EsPmkS4Sb0Oj zF}U3nF;W$3n+bG)Tu%*k7mE6OIa7L>k2$z&D(epo2U&Q+j9)Xo_KGg2@Q#(;1!Y{b zkte9F4y>z(fDzxYg57dJHK&tvj+1fQ9xw>ABYD!Bm}HJCthp(=T^ui6SLwWTvrhaZ zvQ#i-kZltnI}Q=$B=`IJ`Xd;mpr&z0i8`4$ePw{rs7iE93bgXw81@$Nl<#)u*wg8M zLyR0e#z$lWC&C=+)qmQt>K_w-z!%8CkI?`>|K8 ztJNm2n^7B@UhH{xA|T&if@5;Oiu zu)q=d^8vDJ>Q^?RzPwo8MdPY&ojJDoj2I>8E4+{aAjZ&V?NHVFD>5RCMC1S+#Ip)H zC~S;!826!jJkD0zW7|TEM5jb8QVIUrRbH(vYq@iV)@&9u&ws_j~ zZv?{D!H#i8ajs+d;;CZImiAwikr%C~DFQukM>6u*RCNR+%mGT#_@d`{@5u?!ZB&ls zI_p)(P7OX&U(#PqVHuOV_D9Qd;?X?&wTqlThM0h0I*kGnMy%i=4zB#~?45kuyGK26 z@&kMoF)YJ{%Lqv_=kH0Pm84xauNt`X9~qT}o{p_1sC)QYiNR8Jhg;9*gJzW?PCl(r zmUl3U4YPTyL`m9I5s@;(i zxof2YeI*;E+*OvA+5=#LrIA6Jx6fyqO8vb2{8;IKy8`2FciI!q?b9;%v2{W6QZ9kF zsskW0FA{PDO%en;)HrkNv;@Q;2mFiz3eWm0vL;zCs9#_TN7~2vy|(`RgC)MUk1#5W zL@G+UMW8kMS`2>j-OKIkE&gI%r8J&0k{AyWEy84LfcoSM*1pvpF;`=)E zc{ygRt?B$ExceBbDFV#UI0#1m(IDr|#qR+Z)js;a-9^@eQiT+#)~menVpBXfwu|5M zLKson_B}SgI8FVEX{I)J*pX4>QO62BvR+`4O9Ui)jwyzwFiQw%OD^e1vGUJO#zfrI zVSpePCH>1YNp}t}~IjI`@nj*FKRs6DhEEWQ(l0%gXg{($$I;dZ&t(s$6T` zYYn=Atn49;j*=;G-4l~oW;^<)64^xg+#qgzX=%iA{!M$(*DMo}jRQ*Xn)`a)eTWJr zep*pPK8$X$SdkVsG`PTvGv|rqe>K!Rh2qXke{$b~PyTL#!&|-gQS9!I2;$!+?u9gL z7TA-5tJaJH_l3JI;7d|shvJ_SF;#Kh*9v_@-9aA;@*2Lol*`MF&;D;-!oYLkX)L>G z>+tZ6{M7(!VhFq zvmGe=V$hBR35zUVkT1M%q5>n?gPg&gc9xo}V7=;2i|{kJB^FQb5+Zs4%HqfiAu;hcE?R;nL?LbRd%iL>jMt=nAGDg4K(lAj|( z36>-8uRvT=5U0ZCj)d@tO>yB={ZoRiaUG$0+_e!({V&kVRnj?&5SlHiN$pZ`AaT9c z^|1YptA#J=i^xKBy&yV<-VV|Q!ROML zIlJ5Kt2xg|K9rT(@xo8q6MaCf+~0CgOaD%x-_saXEnYi`!Z^c`Lri&T%k6$g0EA|W|ly2(3Ce=16hjRhW`7X(kwC~4y(_{} zE#y449mmVVGr#A@k!H8b+e4jM>Z~ido6-u}BnUD^TH2dUsy^AB0dki<)CTzlVvyl3 ze|}axeAkrvemBGa){pQ)AsLT-^0rk`#9Fq1I@1 z$*c;47|>IC5Gd=feuO5TwQq?|#j+{E?v%gyvr$uJ8Z5GGo^GLMJCXJM7y09{OfjZ_ zoMPwUU`UAqa{o;NEW@3$`6J_=b9c_zkfW`S+Yp(B(Mx~K4) z`%E))>GevwoFqLNUV_Bqwa^nZEaV#9yu~b|DVPt~n7Qv!twRs&{V9HF3)a18x zboS(8TM@x2dj;ES?))$}S~~0>o&+geY_sl$oP3Nh6(MRb65CF|G1d{Q(~{O`;VDR^ zweht3id^H&&kwt+n-)q?D{+%X1PDSO!qH2=gYMvYovOr!ytm{tk`lc(vSAU-Kp(CS zwMeX4%C&~$2xx^K;)3I`XCHcg;=fB57l= z$)=ykxh-097Gzyb#In`N$NJ$FN$54@R@QF0Wn9~Uh&BAb(@)wzH4}<3LOP%wvNT{N zZ=7}2-O`!`zime4Hm5Y~nlZz>+RhXA;?7w=Px1a>e|I;VzCVppB~q z_4$CR82$-W|Z8VW*6MzKz+7j4{e81 zH!gW++Tn{IkCqRp^~boo-T*;p(V(gM+%`tzlo zaL`()WVjV3ZUCuhY?*L&JDtpJB5%~7{0gN`O9{xz))^jaX6z{6#m**j4|QFhzzD+6 zs2SdkN|%N8WB8m~u1Po&dSTZJ93oxUk%TgazX%*W1i#+XmablXp;g71J~o*We9loT-(POFlL z+`(Fz-Y-%oQc<5KGXGKwppOa7gQ$^$i>ZWFRHYZ&q%VRtc_rI@3z5MCw4OZ*mw=kyc2^$f`DId}YH#HBUM(EZ_eZA~ zyH}mb%MWlznIoX9v3YscJ80kB(#g*J1K$*i=h9?n@s#<5rEBrIP*>+j`}Ooz)G-P_ zktqQ&hs6^Yj0^2I_l{0WEv2I;$`h9(9gKRS8I=e3@#;y2+%ct4_BxmRhf>uxq{_=Qd#<6d*Qk&-sgdKE8(wr;P~^|3U*5yvT<)$2L*J`>g!HW&r-jx2XHAp-bl=KcsiL-=8jCa zk%BU;oiybWN%s~VFm>0RBQ#O*tt0qJ{v`E2gPlq!ky&3Or*>?imC5b6^2a27us;zt zxu4K3bl45m_8hn@88fHNmyv9W5Oz)N~6w&m6{X9D- zmJ^-x)Dy#BdV*R=5L&NA)xoX|jDzZo0_NV?{e{mGBIx(VnjzD=%G$=~ zv)VlWK7(pt3_6^~v#FBTQj%c$_hn!wrhQS=3m#0_RP()*|1neBBE8|W&(dq@%P}jz z)v-G5i=0b+4+U-A4ZdpgK^G|~M}igrK|sF0E~|=Jx_N@Ppc44Uz09)rAGUNsx1Uu! zD)ws#izasJIg5acU|q{`e_aO0q|4vCYGPsIVVa&LOCT&Cdc5|G#1|RqbO=( z+@M3N{R*#x&`^ai{`pP4TJ_)g7G^`p1`z3wJ7|{lOJPay*_QQ>bElGy&!btcBJ^Xp zpI(H8BWfk)@mU%*6J-K$8{rft?zwK#2EdhZ25r=DiS~ccZ#DZbK0JRn&d%k52+YIi zG&iX{+{e)d?xjQ4P-M-e9AO}nDVkp%Y5&Io+_)bz5?}`!@QMR7EqVB>{1I{2K zG47oN$ngsi^5;g9AAuP0n>X5qSBl>ZA>SP2<1Ez9KpHbqw)(TSLJ22}Q5PR;Y1M>J zl9sf;Guo%Z&Oi^}mJOs~e23C#*Vf7b%gFF6W$o^|d@Z^$Bl9wU4@xQQ3EZK1-5-bo zx?;lH8cB+bc0R~<>^8aqe%llo47*9IvGSe1rx8xGmRM-C#FV8rM@{1cbxbaHUN~F8 zHnoEO162Nxfrs6H@7YO~SN}hGJbzu1@EA^86?b;(?-{usge;=&8g#x{4X41j;pSH*!_RBsUSfn6tVC`R+Uj4!O|fStol)`G+_d> zX@gkqBVP}IpC?OvfQNxCd|~rR$JwR*;>w1?aG1Z_@Eey;t_MwZf+3jq(V^;;N6kOfN9E+s`}~_B zYY?^@FO?litBTKXyya-GHQg~hGLr#pTt}L1Mxmh;;3{7r(-QYgZIU+y1V1IdQhW<^ z8e%;GRNpV7W1eKEEDl;Y_^#T&5AS7H!lcH_>Rmo2d=0`-8KO)L1gz|D$IHpd)fGbV zVBLRkPY%YcS{gng{IYqQ&FLC5t5Zi`vtSp^mgpTZWt9pHM_TT><|n@zCx?YuOWdEg zQojquv;uO{^lSG+8F7(* zD$Z`poavv+N$Y~%i2M5h>QA0D%Aj=n&<+1>>2+?S+7hm``Ey$zmNoJq^=LEs7iA_>QaNLiF($B1Dc=B)=7 zC`1o06C9}a$(Qyta)=>Tf5Hdp?>sH503t--*@O&0tP8=M2o=_ih^OsATx~?|4v9*0 zL;Lw_Tc+ypj8Hg5;bxYq&E*7V-%elcpOSeS(#=hEA!pL^*)O$jI?i#vNAe@H3|?cHilIz4Xd?@XCD7< zy*XD|g#;b%hh;e6Ics_IqaW7vT{JHj9vy^g()Q(&4ea*psS=p4!+!WSIOI%86b+@5 z)A0_|Y^Rz(EY_0%XzPH0!=9H}l763;x&GcNIK9b?K*QnY$|Bnj6VHrvB+pBh9L%|m zI-!a5(OYdkX)@vgzxe#r?*dB7!e6H?%^hoULbabABtqQyh33oQ2+qb=cB<;I^>Yq* zb`0+xAXF*p?hn;ge{MvgN$DuO&M$06wPC|A@nWXH)m+`!iPUWSRfZ-c=?A7t{yl2? zd=2tV*1l1&S*!wC1}6Yztua~v8ZvI)3S$_tM>*9JS+Ss0r8j90YYN~P(oGRUW|%^` z>w)7r*@-U@(uoi*etc^<#VU-1CRe~_85atpD_9x+<6?;w+D7-Y>Hup(;1$|CBlElSa2&w3 z)o^F^+z+RT+py8s6E5*run}Ebp%62nh*9lA!IHb9#+l4OW?}@VoYqH?&a74FhCyWl zbYHrW{YFnWYR8xS`4agd<4@W#DoFBL`Pl&Fxid-_+53=rV+E^}bp^_1)4q{}Wm03& z0V5@&SMV?{kDKTphW|R2PHmHe5^!SqGeO%m(+W$)W1%zzadxGeS!4d*NkGvZl?l}V zu=AZKH9iD8Bu_s#jnuA0mcmQ@s*T*0ug^+oqzeo*s^Z~9ueO58{8{EHq)R!cTr5kv zd~5V!p0lVH@o*pk%3nYW?xiGg+_qIHP7j=leq%h}oYahh+x&~gmi`2jz@F>&>NI?K zPiscG;^I7d|6ubUTQ{vML^?By@eh?*49NgjB;aTNczq=TkS{MPyeI!rA>%kW8!fHP z85~(QuRG-v!+ar$Vn(EpWQz(lxo!$7Zwey1HkD!k+A<{XNLV_L*4ppE=>z`Qu)ti{ z=HSyZCIAv^$h4+#U%8;-a+dX$_!h6JDFX<UWqroX9rgas^@Pk{&F3Wy&9uq07RhLJx!XIt-+l5)iDbJ#-AQddsbov4~U z0LjxSHu$IkE}?c$3hdD3Wy5N6qvd}Ajx+k^_QWjw=@doU&>?uHjT4!iHi3!644I?U zSphkY;nW@fFn#B>7?$Mm)vb;X<}~GqWkc_0fq*ou*y)p$D$?OsC_K%=x)Znczpr& zwwy#@m@x_xsF#BDZNgZGcDxWpM0HtNfN|3$xdA{RXX?vpfE*2KPPImuG7Gs$^Y{XPZ-^gjh(iagSFaCz{n8xTK4Iw<7GgxS=vdiT-P+~rql(+9?{JkAn8`J$uq%w5@n3mXga@ty$;`fg^nk(HEZP{}Mi=Re*e?M87%H9a zA4`D-KzNecH>`W8-3$;Qa+JdTgE(QB>-Q}AMQ*KhZMS@oYxElSQK56L?QC?`4fC%vfqiO)5JKTJ*L{nzidtEUE_2f8qIVu|_IqZ9PoDg9 z;{|M|)*=e`1k-E=`Ntii`tjxr?`?ps&ae_V4cI0T2;2MqCn0XD;QqrfhLVpXlj>Wl z2U~f#Dwzy2^g5;9=HEjNYN#B(eu+x;jjhRu{L{2LmG|MK4S9~?`jAdl$gByl)xWfZ zmPj6i8Z*Ug-z%whkM}o_4uuNo0wAB|C+N$8Q{x&Bx&rJhb^IuN*tv`RLnM^Ja|+c# zX#=!b5;RVuea2I%i!FL6#A^w~w0XeHunS|GaEJ<`w|X;rH|pbdELhl^OranAP6;Ss z1@$Xr{+-nmK;(O1B%V7GO|>F(rgriS%eN0KzT6#$a+-{)@+(R|*eNAKd<%6GpS6kc z%1R6#W{=~6trJmH1?5y_Pxvo_50MiB78SBOCaKeR2(1t+;T6R#qYxZB84{ikNI8>P zrn_Q-o$6WdfJ`TL?CFP*VtQ+-iv2u!JV*113Ldr38O9()7U{#%z=c7Dzv_;uo;Zfn z6))Y5RnHhe!UYro)p`kzZ#YsQ_dMd)??{a^r_$H3YW9;Pp`9nIJ$-5T=7Cd>hr!8TO1ydj#P&+n_0%FF(C7-uYgCkY zC_t>8_7rL;-mJW7v^j%J99#vVk}#Dhj_y41{MtztatG75;Rz&kMtp-0GgJyGj}0SXed?m~g%+2y8M)ths0o#7h7szO#HF<{8 zrCfl@52K~Mp3inFp13t{wc4x-BhJRWM(f6MpK$VHB+v=9Qo~m@&V6;5mwUcb&LDS2 z*2efbweJSEl5ADvD7PJU;!jR z2_H+F1MvEO{K+Vp&`*4i_*cML`EvVf2a_|4>?7~zjJ*^E8BmU~8+o(I*(HzUE+ZVN zOQ0BqzK!If`W&-&-lc%rCO-qhjlWl*mLGm0nK2f4+wg~yZ4>QktQE002D49`Ht)`S zS>*u*UW-)>0hlL|kkcG$i19WAcLtd_5XyiZGJN?3xTk za)aDHaHmS~@HW1pJ^X_P-7np|i_h9k6Tv|gkY# zLqfvB=1UiUU}(YKENuLvLK&32d&Rj9Ea;RC6&SwwyCgWrd=jPqHrrD`=V)3@BfH0!L^0D$V;`_y%Nf)~8O@lKgi73xn?4SMeh-kDKL z>xxZ&I8SwcW5O!sF3}!z0*|p7u;1neN~evize`uM88))Rw?Sk-Yg%OE4c~w|y&jky zE-fx1q8dDJolHFRflUt#bl6fR6Ti5~30bvhce(RQX6DVA%MsazbXDW*0Ey!_^A~mq z`Zv+ca%lUg+mU0ChGVB8u3p8c+b3NmTy3_@DB#-+Zjcb4vsNlv1=RwMolhFwlqO^O zz+yOVIrcrTW>=Amh3b@M9QA_bX47I-mLx%EZgOF#f_;6{Dgh$v2FKYSWUb>j^^k(F zN5v@vJ?Do6!TqKH^)|?)kLb!66X&WlFk=WkW3M1}{{wHfZe%gMWc}}MSz)I<)uow7 z33TLm<|h*c{TpBce-wnSAU0q@Rv3?OT~xewNx+{A4{ZAL zW7Xn1x8MQ=jIWU>(=DXkKWKNu;}rFCqkJ)33eDNY9DLy)gPQq;TJl%CRVd2C2`<`% z^yUhEC3h8zJ8sRJ0~Wg3uT`u)M-Z6L?GiYC;s(g?$o?wq4%|j=Tk_U>?x38I2oH3bL>qXx0HMC42xJ_nS(m@Zk z2Wg&_25)%B#+J7K523tfXDbzw!wO~eY|ABJGcAno&oK)!%zV7+rso-ol4+0PltVWl zhyL?^PHr>1g_?PE1CINm?0nA`JWRgRiV@9l{QUZDT*UOWe^10AM3RVInEko+WP z#=`8qYy(7W!7>R*q=WHqoqQ?CXjke8nk8evf8^T;>+N$8sc}IWep|mPZ0a?WG8#55 zY>n+J1_uYM*@t{2lt9LK)hm9!BpzgZj0J%6_s7R@aIuqzXgY#SMfMOM6N$ixRgnSB zt1(r5zr(78iD)@8vKoaeU@hBvB?zt>4!QE*!`0ngqP)T)G^ZDnR`yecCJ?s5Yalk$ zA)Usme3DrnN?GQM6fw^Vh|uI0VVbUKz@ItQU_4(-DxTb!wA<;y9c~K4^(u-9FHchK z`h-%ut34)-ttwIgNiXp0_bTS;|4szJ#$N4!r-c@tf-3T=jN~{se>8Wloa5X1@CsHd z&~dsMlTAmR1P@f3FJ2kx1Sv<;{86&W!DJ0SErq|-B{+L%8*N8mnB!?_X`!7!wk4@i z-o!=*thUnY&bgWXzrCW#J9l<&@yhNiB(Vky4e9}D(xkvgF8|G}`XTO0=f&XsHS3F75?x|gyMX`e$Xmt&>U9wBe${~3MCU|R^v2nQibLZS?!}*m+W6z+k zfG^IbbK5%L5oR(RL8k4$^yPbUNAJJTYE&g(qau@)jCIgiOX1tpfT_#5tC4G;nEMI^ zn6&f9R5HK<1TY=(l0RG@r77~=>CMJ^!K?QSjx$R&vR6az*PFmizKo0|jw96N)N$Sg z`rS&?fXp|Xm!MvY%KI5*e=r7gay*f>j%%cldI7y4mK?j>m3AQ3t2BfF!g>G^R1UBR z$%(R`;zPbdvc@hED(|Iz^1h}(M>}uMcRsWK2u8O?aVKHb?^cSj)>1;=`7ytX5k~Ib0>c30`Z5MPu!QJ=56u z=cg^EQEG9Lk1DY!3OP0yp}3Y5?0Z_VDum}$PJ7DUGxA!twb!f|(rW3~WX3Z&^THRQ zNUBd#a&eB6i1=(;DNmPe{cG$EG-=1&PbtSH$m4m$i2o2y*3|Zh8`)b#v$qmC*=|To zPLF+dlEG_I5p}Q>zp5}aYiVeQa`Mt8n5LEoP7bfm4?$4F z?hs?@5}EF!NK$}vc9Dd=>4IiaHh}ofrILA@G{<`?L%grjUn48745~8Qvg@d8kq|T3 z3$(Lj`Qis+vv)M+6vlDNS7kE)K67ca{0h$?2pb<5f4^@r!#1}Fwd`s6N)h}gEPb~X zr0pv#X&^cz7JwUtERrZ8*!+WSgWjdPIk#Ngm&@cg3RatY@yQE~*+!fwkv%Iw6ldw( zXT^DJ!w!U^>U_W4L{%%O(7%!8iMD?AAI*{ueEE1rD`Y=Dh<+SEChYi0g)jOY@E%R1 z(Z{kVw6IxXKahMsci6W1l6o}WV*g&Yj;c$ljSi%PF6C0Lk@f~K-C1; z@8dCpKG*oiCvjx7Z>r>t^Pym-GNsTTXy?7aMM}bB(v~=Fe2G?z>CM)=0MCTlm+Ty2 zy;)~E{7|*rK~-loUFO6o{V$#u#nFo2*z>6WaA1Tge6o%~`q~o020$)ra|6K}HoE=_ zV-QK8015S~--9#ME3mLiwQ^OsK&l%b3KOInQ!^e6B}xz@-MF|Bm~Kw7y^dSmm)|x# zvKn}eyKb~BC|e=6Qu@&tQTRz2m9!ZcTc_r$ty3lBi?USjz?%yPq}^q zw$Tp_cz=~rZ>Te@B)ASg1?sX*?^`K7GWm}mHi9eb_8(2_5!VLcwbfgOeEZYx5TwG& z+&Its|AimM7j26AHL)iLe(ofgNCg`6I9I?iku!_jL~#TyNYEKg!d*7{3bpuMws@K6 z#irt`h$Pr>_6yUhTaNPx4zB}o!T}nX|1Jv9nFN4}FM$nZM~xM#R=a~mgL4Fv>E3l1 z51w9WoUZXAnjlR?BRt?QrlAAWOA+3xPl-1R)+>qV4C?l(B*fQ{J=#4n&0N%Xk)3A( z)rXz{k>bo1<@dMNskN1zaqh4Kw?>7q(T5tku-~Hhg@hom(eE3>zMOQs#r#H~@(@o% zW@gB;O0mzC2=`*~R;tBvRJp*VfF$TU7_f=JL}Cfv#@7y;58hm)W2MRox@L!V$m9@Ivf zsfeRWF>66-T58|ipo&-?#_2uCZleEwi1$pSmkl70?OriLzcN0>Vj1)V?`AY6QCfAm z#^L}@7P7mk)>oFW&ixxv2PdsrePe&;`=d#h%jda{@0;jrd}KG&olW1gLz3_|*jx{W zsx1Pjq_?BAYWi>(8D0V>0A{xM8L>qv6GQY$R?LW?1b=CLXUJ4A(E!*G+7p#-QA4;7 z_9ALVXytKMW)W!M%QJr`CpN%l9U74=PN;5Ru@**h{4&}}8`?Ny+#k$okf?0>*Txvo zH1Eh}u7Mp5o*kU>dbvJ6RtmF#s1@c78~1N0FSSfOGhyS{8dz#Adt;82!8jl4Iv7lZSYh4r$|01XVSCHdZ?AyukJ8Np9$9p-H*7 zQ(H^IEu@I(G!jqKaIEGmBKHyc5ctfn_x4a{{|P2O7~40sP=VZ~rQD!+-{B@rv>Q~4 ze@Cii7qW-m4qcIE&=9Yu>Vk+U<3-1{mk=y~eCVB?#!6P)vL!ZKaeegO4cATENRXrg z4L(-|m9D;(s8KG&WMsQgJjvT1*WV08GV(I2LYu6M343mE3tSug2mBRD<-g=v`darQ zvKQpa0}&JVCPs(Xb1x3om?e?G6uvrYA~Mfz?#g&%Jbd`%<_@g{7^;1|t} z?&9SIsR}SIecWwN!n<(r&+D@%`jYV79c!1ABow^Rt)7_Dtu)-Kb4mHTGEYM&#?^MiKj^7V-?q}pm_^0G4($!Q*mi%UhiU>0RLcbynCMA;~l921| zr3HpWr;)hIQLk|mLs!S+Fo}aYIEvjCm4FFJNyCO$rmd6gY9g}GME0Ll2)NOeZr$q6 zV4>Mk-1|sYFJnPAzdPyg(>3pmRdgvx=&&L)uP_2Hs;+)lEXHPxA2DxYLxJv{*9%vU z<#ZHx?L`*O03;A1rJ{PfJ?ImCL{-H%*}iHO;M+Cu(-_;Tl?)>kshHH}QM!T793%`Q zy(ah<`Y=mgCxw19Vi#WDf0IJ zKD_&01Ry_wCVpU;c6A|+#A&DmxDtJ7O9W5b*55Dn)&jO1*?31~IV=`okC20a8fn#^ zv%n$E97N9%q|cQ|B~h%rmg6gA#1*j3O0`!M4i-8y&YT~woWet)|5M&MgryxW<~5!M zMfaxehv4FW_m`T}0WLwX^S zEORa2C$vMfuj#Y2v74^BsZO}a%1F63*vUib(!7{aOf872jEHav&qVzmux;XOb9Ta2NuZ9g1M0eTvcA-TB3N*4vWoE#LD1W#!V?ou}8Ot8&`eWDCo4x);8Pt@YzOdO!OdTXX<*N%fzf$BU$_8 z=FBC$v<|_4CCz@^hExE1Uc90UEUa{QgeF(_Mhf_jPCsKqfwG6CjQ3Qgw&wF)jRR`k zO$aYvG$2sJ{p~Nx@zzqffP|A*+#Q~7XwR3|=4+-`E0j~J<&!x^gwO76&bQOQGTtXt zVcLCJ@UFUqwULY9P3%Q78NTkrV{_Wc9 zvxb!IWQEDu&@%eB1C$F9BnZEGGAN%S?RCa~ZQ2TDo7$Q!*HHR&bECLRc}0UpTNde9 zbeq@yU8jhi2}@->MOHZiXG9Id`)P(*aH{Sn_)Iy=>s90u&g+aff{J?X!n3OIoY0Ip z97Qzh(Y{vRd-RY}QG-rJG?9~j{_eHTR(%{9?17KpWRdg|6;UMRryCo=yyqrEEA*gh zaB5&EpSWHga@~;uuH2#N_B)J|$$e-ke%>2mvrV{@ndSfQtEd`)QHWv3HA`@3NKKn6uI_txJgIS z9bi0q%BEM0NVq3Wwy!TX0lGIbN&`vAxjTtQ-oF1Cm~t_D@N@y_>_B&)hneIKh#LBG z(7}B|E*OaIo0dg@pIq5^X+PeFx+``z zxU<1>H!YB4UwyAw2Y4TyKbGWaA*n=n_J_LF4k{8nHc?U(%b3sos9zXsV_gr*Rd3sv zye<|%rKQ9EJ4o#CM$5a;=T|8uA8vHa@lwQ}2J@x2AzKo3g{c+Y=q_f$5szZxVFA9G zcKkO5*Npv_m*zCH%|r|u)~8D-)-v1Bo^ zBDI7NE{nP$iN{@;6Q&KCY1ztKt6r(ilf#4q@SmPjk2Jl~Z}}3>@#$Ne(0w0-%cUCv zINUmkZI8(K7F}hmR;qfJvaCZqNvC?raAoO^np&`WuW(rqzjP1D;g)af7l#JDA{zs> zZ2{-Yjm)rzq}HL((7>~)z|QSeG}BOKeM~P<~K+4=FRRXoePpNCCM?jNXqxM)&nPtdToJ37*qn=w2x z$CWg!T1ijI^>8(o*%*@2nC~vzS|V{1HxI)d0>9Y%Mf(#S_`F=c`6dcZpoOj-o82=E zVkG=h39*ZB1Uv}GMtUH;iP<&?n$0IB|7;F>BQGQ#kK-FhEp6W4oNVvW=+$IOE|i$j za3>+}FZ21=kv+kn%H7TrcX~u7btwiS}%Uy~@ubl5*!7|1gmT?@RL^<0KPXl71LQQhUkOYxYlt zxQR9YBoI#b&)e%eUtv!DwWes4B31!MIKXuQL!LAaL9|f;bPU@y=^r^emccrbN?ajK zwDI>zl28`Ucg=VKZ^1p!%=l;p~`W#45fQSH`KkY8PGzYJpTq6Hr02@jiM@E71^Br_Y6G!*m!xo zdj-L58N6KxB)N42IbaO-F`bM&)xsM5DQz3#YORJ+%aEL?Z4UDc^ z0E{$)T&b43z@I)1o6=RS4|_!U=>fwQ4lW|ujNl>v6^pCdpBfzuWngMW8J=E*A_Dw) z7d5h}6DTxiC?I&=A;3HFo{3QV6h$Uz`s$KEOE> z8I&oVFU@yB3@NQac9?#d*jbVb1FZ!OxP60}cXhF6eLQJV|60jJTa0KkFwZ_DOK0~O z+WYmYL4=9UI{LLR136@c%sp|w)`xi!J9bq$kv*+FC<^5$Ea$ZqJw(owA!j~a?GU=foY`)Q4Ko>Bz`3RoxKk->>qqkt9+f--3H z#hAf1S8jA%K3kqvCfb2t3v)UNo3_4?h?90chHN`v+!nr-ye|ggy809$U~*=-a$J`x zcDH9Af!=NioF_%6Ik~~K1si0&JH_3uhtlI1Pn$(I5+NQZjpGc4g(DSB$A#r6zc0hX zI`<#<(5(B)=lChzwioLWmBhWb5cVlx@$+LZm9t;N)yuBS{!c`T@*A_PvOS|5INYRO zxxrZ;6iZTg-(N%6`BF?`vfZ0Z*Qf`_a(!5CQ}K%)pYi-r4`N8`op3D{Ad&z zP^a3;E9GohS{mEFp_IF9Iw*UYVED%f{N?$#lOA5gA=jW>9I~Z> zEb*xTG+v`gz$8h_HE&o?$BScSPevPeCA0*)<>0FrS4>tq-+P8L$ql&Ox{S_<0#eMfeY1Xrhv zls)mh3|rb|t*#r@b+7%AnZlJ|;Mj?W{ZWeD+9W`i!b%d^2fh82A(n58Gv-bN>zO7* z*zzx5`Fw8&t5n>gM$r`YLXfa-yczIIDc1cSm0|jEG0?!jxN{LV!bG&k1BN7W(gvB7 z4>kbxZ5>W6D^DNh`J;^Bsu$YtY(Gd zK1_q%#nCc;AlSXA(ys1Q8WRFV6ls4$(aGDxhmg=yE2y0Ck`cfQOYN*ydhk<=C&F ze^p~=D>Jl%B+k?mb>&s1>v2*KU(Cf!RJxwAwnlCG75`Q7({lcP`;U|E`LHPU$4TD5 zpnPPng+lw7&ZBh|=#yj`S+T zUPW9jYmx?rPp|naeam$APt#vZmxuRN(gK|a8kox-rlAxjWN)UhD$OR{zp>{|LDHH= z3wmEl!YFHq@}VCdb5xahXYO~KfCC#Ou|cu5|8U3mp9?`&)Por*^OCBWRmsbc0>Ax) zfJC#M2EF^k$^C#obq>_@qR`WCmhN$%BUI9=u}WnxyTzJ%3%KE;^`kSK@Ytm*y|~5t z5lhR}GGRS&^J#!1gEykEFcWyKoqX*iRU4J>&;x5zTpUupeYFC=PnBBar95@RkTC7f zuvO{p26oI>;yDNOMdKXkPx!U$Z2ft*PPW!6OGDmDxUFF*WF@=nEqFY{m&j4+ug28F|pRd**l8?V!i&XcfZt-CK6>)vge+XVqFP7~SW*{O$(LVD1I`={gv z;4J!eZGt;ySh+88s=?3xPR?NbX3>B;gwI_#76J`l9@{dhHP(9Hw>epx4eIfUr}UGIYuC6M(=K z9sA#Q&%0U2U4&1y8S#zFnpvM+D5^eap0i>?!#p;=$pQCnt%=kLQ(Z!LssAufh2S3I zR&djv9&CWXvmPHMD=fVWzC)Y15JGcc!!t{hE-pLizlL# za?6`k@nvhnPSEE!-!RJ2jjFTnu>G~N5`)avIrv9G`~iAnDD4+O78s5O-A*yIfUna*_Mm0zVg zP`jYCu{UP%=&Fom+E~IyxZQmhvdERjXyGc-VX3^}P0vlso)E!wiujdY8^^b&%dqL1 z2JL|85ZqiiFr-erXnoJ2HsABjs+4p&!<1=ihwO=>fwJHI#Jw@yGA-l63w z-$#1^2#7h==8!_;SL_N#C|k&cUc3GDz{NC+^<5zRH-SAcW~b$B<7JuxRpFMw;`BJ6 zN2NzCpP{Pi$WgqFfN0O!$0^{q-98aT!vcKW3TfS*EtZ}ai#2a=;-Zb~l~H$p70sLh z4E!F>Er7shg(b8@NFxs@kuVon=)7|$BKJ yy;kMF%Y-7ayVzP*K9-S8?i_H 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 E*=&X%`v3p{ diff --git a/assets/icon.ico b/assets/icon.ico index 98948ea682c47f298f588b92fd54bfbe30a653e5..5dec56a6099703d33559be52620a618cb1ef6159 100644 GIT binary patch literal 12655 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 E1KZu~M*si- literal 370070 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%0Ac{tp15`}K1EcXn`;VNH`g_M+Zx$3Me}I1 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


Gq$%jzd8n6e**YAz(E%q?3xJQdC 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 diff --git a/assets/icon.png b/assets/icon.png index 755a6e51d53e9252f90c19cdb4a373bebb80af98..7c781530d47d00286fc0770e6bbff343ddf1da68 100644 GIT binary patch literal 128110 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�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 - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + </> + diff --git a/batch-results.json b/batch-results.json new file mode 100644 index 0000000..043287e --- /dev/null +++ b/batch-results.json @@ -0,0 +1,407 @@ +[ + { + "index": 0, + "name": "笔趣漫画", + "url": "https://www.biqumh.com", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "pass" + }, + { + "index": 1, + "name": "🥝猕猴桃漫画", + "url": "https://www.mwwz.cc", + "search": "pass", + "detail": "fail", + "toc": "skip", + "content": "skip" + }, + { + "index": 2, + "name": "🎨禁漫天堂[国内]", + "url": "https://jmcomicqa.cc", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 3, + "name": "武芊漫画", + "url": "https://comic.mkzcdn.com", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "pass" + }, + { + "index": 4, + "name": "名著阅读(优)", + "url": "https://api.520diandu.com/", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 5, + "name": "🎨COLA漫画💓", + "url": "https://www.colamanga.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 6, + "name": "🎨Komiic漫画💓", + "url": "https://komiic.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 7, + "name": "🎨MYCOMIC💓", + "url": "https://mycomic.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 8, + "name": "🎨包子漫画💞", + "url": "https://www.baozimh.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 9, + "name": "🎨看漫画💓", + "url": "https://m.kanman.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 10, + "name": "🎨漫画台💓", + "url": "https://m.manhuatai.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 11, + "name": "🎨G站漫画💞", + "url": "https://godamanga.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 12, + "name": "🎨笔趣阁💞", + "url": "https://www.biqug.org", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 13, + "name": "🎨漫画屋💞", + "url": "https://www.mhua5.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 14, + "name": "🎨如漫画💓", + "url": "https://www.rumanhua.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 15, + "name": "🎨新新漫画💞", + "url": "https://www.77mh.nl", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 16, + "name": "🎨皮皮漫画💞", + "url": "http://www.pipimanhua.net", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 17, + "name": "G社漫画/包子漫画", + "url": "https://manhuafree.com", + "search": "pass", + "detail": "pass", + "toc": "fail", + "content": "skip" + }, + { + "index": 18, + "name": "🎨木马漫画💓", + "url": "https://www.muamh.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 19, + "name": "🌠 漫画吧网", + "url": "https://www.manhuaba.com/", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "pass" + }, + { + "index": 20, + "name": "🌈绅士漫画", + "url": "https://绅士漫画.luoyacheng.ip-ddns.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 21, + "name": "🎨禁漫天堂💞", + "url": "https://jmcomic.ltd", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 22, + "name": "好看漫画", + "url": "https://www.9comic.cn/", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "fail" + }, + { + "index": 23, + "name": "全免漫画(优)", + "url": "https://api-cdn.kaimanhua.com/", + "search": "pass", + "detail": "pass", + "toc": "fail", + "content": "skip" + }, + { + "index": 24, + "name": "彩绘漫画(优)", + "url": "https://m.kanman.com#Haxc1107", + "search": "pass", + "detail": "pass", + "toc": "fail", + "content": "skip" + }, + { + "index": 25, + "name": "看漫画吧(优)", + "url": "http://m.kanman.com/", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "pass" + }, + { + "index": 26, + "name": "知音漫客", + "url": "https://m.zymk.cn/", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "fail" + }, + { + "index": 27, + "name": "爱看漫画", + "url": "https://m.kanman.com/", + "search": "pass", + "detail": "pass", + "toc": "fail", + "content": "skip" + }, + { + "index": 28, + "name": "酸奶漫画", + "url": "https://m.1kkk.com/", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "pass" + }, + { + "index": 29, + "name": "星辰漫画", + "url": "https://m.gmh1234.com/", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 30, + "name": "全免漫画", + "url": "https://api-cdn.kaimanhua.com/##@遇知", + "search": "pass", + "detail": "pass", + "toc": "fail", + "content": "skip" + }, + { + "index": 31, + "name": "嘤嘤漫画(英文)", + "url": "https://mangaonlineteam.com/", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 32, + "name": "爱看漫画", + "url": "https://m.kanman.com已校验", + "search": "pass", + "detail": "pass", + "toc": "fail", + "content": "skip" + }, + { + "index": 33, + "name": "酸奶漫画", + "url": "https://m.1kkk.com", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "pass" + }, + { + "index": 34, + "name": "漫客栈子", + "url": "http://comic.mkzhan.com", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "fail" + }, + { + "index": 35, + "name": "爱看漫画", + "url": "http://m.kanman.com", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "pass" + }, + { + "index": 36, + "name": "知音漫客", + "url": "https://m.zymk.cn", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "fail" + }, + { + "index": 37, + "name": "全免漫画", + "url": "https://api-cdn.kaimanhua.com", + "search": "pass", + "detail": "pass", + "toc": "fail", + "content": "skip" + }, + { + "index": 38, + "name": "快看漫画", + "url": "http://m.kuaikanmanhua.com", + "search": "pass", + "detail": "fail", + "toc": "skip", + "content": "skip" + }, + { + "index": 39, + "name": "菠萝漫画", + "url": "https://api.sfacg.com#漫画", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + }, + { + "index": 40, + "name": "快看漫画", + "url": "https://m.kuaikanmanhua.com/", + "search": "pass", + "detail": "fail", + "toc": "skip", + "content": "skip" + }, + { + "index": 41, + "name": "漫客栈吧", + "url": "https://comic.mkzhan.com/", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "fail" + }, + { + "index": 42, + "name": "快看漫画", + "url": "http://m.kuaikanmanhua.com#Haxc1107", + "search": "pass", + "detail": "fail", + "toc": "skip", + "content": "skip" + }, + { + "index": 43, + "name": "漫客栈子", + "url": "https://www.mkzhan.com#♤Haxc", + "search": "pass", + "detail": "pass", + "toc": "pass", + "content": "fail" + }, + { + "index": 44, + "name": "快看漫画", + "url": "https://api.kkmh.com", + "search": "fail", + "detail": "skip", + "toc": "skip", + "content": "skip" + } +] \ No newline at end of file diff --git a/check-source.js b/check-source.js new file mode 100644 index 0000000..c03272d --- /dev/null +++ b/check-source.js @@ -0,0 +1,6 @@ +const fs = require('fs'); +const data = JSON.parse(fs.readFileSync('shareBookSource(1).json', 'utf8')); +const idx = parseInt(process.argv[2] || '22'); +console.log(`书源 ${idx}:`, data[idx].bookSourceName); +console.log('ruleBookInfo:', JSON.stringify(data[idx].ruleBookInfo, null, 2)); +console.log('ruleToc:', JSON.stringify(data[idx].ruleToc, null, 2)); diff --git a/package.json b/package.json index 0d00332..56ffbc5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "electron-react-boilerplate", - "description": "A foundation for scalable desktop apps", + "name": "source-debug", + "description": "书源调试器 - Legado/异次元书源调试工具", "keywords": [ "electron", "boilerplate", @@ -108,6 +108,7 @@ "@mantine/hooks": "^8.3.9", "@mantine/notifications": "^8.3.9", "@monaco-editor/react": "^4.7.0", + "@reactour/tour": "^3.8.0", "@tabler/icons-react": "^3.35.0", "@xmldom/xmldom": "^0.8.11", "allotment": "^1.20.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1db80b9..9ed7ea1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,9 @@ importers: '@monaco-editor/react': specifier: ^4.7.0 version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@reactour/tour': + specifier: ^3.8.0 + version: 3.8.0(react@19.2.0) '@tabler/icons-react': specifier: ^3.35.0 version: 3.35.0(react@19.2.0) @@ -1452,6 +1455,31 @@ packages: engines: {node: '>=18'} hasBin: true + '@reactour/mask@1.1.0': + resolution: {integrity: sha512-GkJMLuTs3vTsm4Ryq2uXcE4sMzRP1p4xSd6juSOMqbHa7IVD/UiLCLqJWHR9xGSQPbYhpZAZAORUG5cS0U5tBA==} + peerDependencies: + react: 16.x || 17.x || 18.x + + '@reactour/popover@1.2.0': + resolution: {integrity: sha512-1JMykZ+MmDmRlEVC5+DwlvK1exwV5bFHtiSFwVXnoPZmsSfwId6SLyjo9H6bybeuNtNEzviKdsF/ZBC1UQbDqg==} + peerDependencies: + react: 16.x || 17.x || 18.x + + '@reactour/tour@3.8.0': + resolution: {integrity: sha512-KZTFi1pAvoTVKKRdBN5+XCYxXBp4k4Ql/acZcXyPvec8VU24fkMSEeV+v8krfYQpoVcewxIu3gM6xWZZLjxi7w==} + peerDependencies: + react: 16.x || 17.x || 18.x || 19.x + + '@reactour/utils@0.5.0': + resolution: {integrity: sha512-yQs5Nm/Dg1xRM7d/S/UILBV5OInrTgrjGzgc81/RP5khqdO5KnpOaC46yF83kDtCalte8X3RCwp+F2YA509k1w==} + peerDependencies: + react: 16.x || 17.x || 18.x + + '@rooks/use-mutation-observer@4.11.2': + resolution: {integrity: sha512-vpsdrZdr6TkB1zZJcHx+fR1YC/pHs2BaqcuYiEGjBVbwY5xcC49+h0hAUtQKHth3oJqXfIX/Ng8S7s5HFHdM/A==} + peerDependencies: + react: '>=16.8.0' + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -6084,6 +6112,9 @@ packages: resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} engines: {node: '>=12', npm: '>=6'} + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -8753,6 +8784,33 @@ snapshots: - react-native-b4a - supports-color + '@reactour/mask@1.1.0(react@19.2.0)': + dependencies: + '@reactour/utils': 0.5.0(react@19.2.0) + react: 19.2.0 + + '@reactour/popover@1.2.0(react@19.2.0)': + dependencies: + '@reactour/utils': 0.5.0(react@19.2.0) + react: 19.2.0 + + '@reactour/tour@3.8.0(react@19.2.0)': + dependencies: + '@reactour/mask': 1.1.0(react@19.2.0) + '@reactour/popover': 1.2.0(react@19.2.0) + '@reactour/utils': 0.5.0(react@19.2.0) + react: 19.2.0 + + '@reactour/utils@0.5.0(react@19.2.0)': + dependencies: + '@rooks/use-mutation-observer': 4.11.2(react@19.2.0) + react: 19.2.0 + resize-observer-polyfill: 1.5.1 + + '@rooks/use-mutation-observer@4.11.2(react@19.2.0)': + dependencies: + react: 19.2.0 + '@rtsao/scc@1.1.0': {} '@sinclair/typebox@0.27.8': {} @@ -14166,6 +14224,8 @@ snapshots: dependencies: pe-library: 0.4.1 + resize-observer-polyfill@1.5.1: {} + resolve-alpn@1.2.1: {} resolve-cwd@3.0.0: diff --git a/release/app/package.json b/release/app/package.json index 7fa152e..8c74fa4 100644 --- a/release/app/package.json +++ b/release/app/package.json @@ -1,7 +1,7 @@ { - "name": "electron-react-boilerplate", - "version": "4.6.0", - "description": "A foundation for scalable desktop apps", + "name": "source-debug", + "version": "0.1.0", + "description": "书源调试器 - Legado/异次元书源调试工具", "license": "MIT", "author": { "name": "Electron React Boilerplate Maintainers", diff --git a/shareBookSource(1).json b/shareBookSource(1).json new file mode 100644 index 0000000..9d0cfd3 --- /dev/null +++ b/shareBookSource(1).json @@ -0,0 +1,2513 @@ +[ + { + "bookSourceComment": "// Error: 1233发现失效\n\n部分漫画封面无法显示,有兴趣的大佬帮忙完善一下\n[✅已验证]", + "bookSourceGroup": "漫画,发现失效", + "bookSourceName": "笔趣漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://www.biqumh.com", + "bookUrlPattern": "https://www.biqumh.com/index.php/comic/.*", + "customOrder": 0, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "@js:\nconst item = (title, url, basis = 0.2) => {\n return {\n title,\n url,\n style: {\n layout_flexGrow: 0,\n layout_flexBasisPercent: basis\n }\n };\n};\n\nconst tags = \"题材&全部$$热血$6$$冒险$7$$科幻$8$$霸总$9$$玄幻$10$$校园$11$$修真$12$$搞笑$13$$穿越$14$$后宫$15$$耽美$16$$恋爱$17$$悬疑$18$$恐怖$19$$战争$20$$动作$21$$同人$22$$竞技$23$$励志$24$$架空$25$$灵异$26$$百合$27$$古风$28$$生活$29&&进度&连载$1$$完结$2&&受众&少年$1$$少女$2$$青年$3$$少儿$4\"\n\nconst list = [];\n\nconst fl = {\n \"题材\": \"tags\",\n \"进度\": \"finish\",\n \"受众\": \"list\"\n}\n\nconst url = \"/index.php/api/data/comic?\";\nconst type = {\n tags: undefined,\n order: \"hits\",\n list: 0,\n pay: 0,\n finish: 0\n};\n\ntags.split(\"&&\").forEach(bigCat => {\n let [bigTitle, cat] = bigCat.split(\"&\");\n list.push(item(bigTitle, null, 1));\n cat.split(\"$$\").forEach(tag => {\n let [title, id] = tag.split(\"$\");\n let typeKey = fl[bigTitle];\n let queryType = Object.assign({}, type, {[typeKey]:id})\n let query = Object.entries(queryType)\n .filter(([_, v]) => v !== undefined)\n .map(([k, v]) => `type[${k}]=${v}`)\n .join(\"&\");\n\n list.push(item(title, url + query + \"&page={{page}}\"));\n });\n});\n\nJSON.stringify(list)", + "header": "{\n\t \"Accept\": \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"Referer\": \"https://www.biqumh.com/\"\n}", + "lastUpdateTime": 1765176029555, + "respondTime": 183379, + "ruleBookInfo": { + "author": ".comic-author .name@text", + "coverUrl": ".de-info__bg@style##url\\('(.*?)'\\)##$1###", + "intro": ".intro-total@text", + "kind": ".comic-status span a@text", + "name": ".j-comic-title@text" + }, + "ruleContent": { + "content": "@js:\nconst imgs = java.getElements(\".rd-article-wr img\")\nimgs.forEach(e => {\n e.attr(\"src\", e.attr(\"data-original\"))\n})\nimgs" + }, + "ruleExplore": { + "author": "$.author", + "bookList": "$.data", + "bookUrl": "$.url", + "coverUrl": "$.pic", + "intro": "$.content", + "kind": "$.serialize&&$.tags&&$.addtime", + "lastChapter": "$.chapter_name", + "name": "$.name" + }, + "ruleSearch": { + "bookList": ".common-comic-item", + "bookUrl": ".comic__title a@href", + "coverUrl": "img@data-original", + "intro": ".comic-feature@text", + "lastChapter": ".comic-update a@text##待浏览", + "name": ".comic__title a@text" + }, + "ruleToc": { + "chapterList": ".chapter__list-box li a", + "chapterName": "text", + "chapterUrl": "href" + }, + "searchUrl": "/index.php/search?key={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "// Error: json string can not be null or empty\n\n//2025.5.20 ◎夜泽川◎\n//2025.8.3 修复 ◎夜泽川◎\n//2025.8.21 添加账号登录,内置一个公共账号(输入框置空直接点击登陆即可) ◎夜泽川◎\n[⚠️详情解析失败]", + "bookSourceGroup": "自制,漫画,网站失效", + "bookSourceName": "🥝猕猴桃漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://www.mwwz.cc", + "customOrder": 1, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "@js:\nvar result = [];\nvar push = (title, tag, p, size) => result.push({\n title: title,\n url: `{{Url()}}/api${p}` + \",\" + JSON.stringify({\n \"body\": `{\\\"page\\\":{\\\"page\\\":{{page}},\\\"pageSize\\\":10},\\\"category\\\":\\\"comic\\\",\\\"sort\\\":0,\\\"comic\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"tag\\\":\\\"${tag}\\\"},\\\"video\\\":{\\\"year\\\":0,\\\"typeId\\\":0,\\\"typeId1\\\":0,\\\"area\\\":\\\"\\\",\\\"lang\\\":\\\"\\\",\\\"status\\\":-1,\\\"day\\\":0},\\\"novel\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"sortId\\\":0}}`,\n \"method\": \"POST\"\n}),\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: size\n }\n});\nvar tags = org.jsoup.Jsoup.parse(java.ajax(Url() + '/cate')).select('.tag-container').toArray().at(-1).select('a');\nfor (let i in tags) {\n\tlet size = i == 0 ? 1 : 0.25;\n\tpush(tags[i].text(), tags[i].attr('data-value'), tags[i].attr('href'), size);\n}\nJSON.stringify(result);", + "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\",\"Referer\":\"https://www.mhtmh.com\"}", + "jsLib": "function Url() {\n const { source, java } = this;\n var original = {\n \"sourceurl\": \"https://www.mhtmh.com\",\n \"Urls\": []\n };\n if (source.getVariable() == '') {\n source.setVariable(JSON.stringify(original, null, \"\\t\"));\n java.toast('已初始化');\n }\n return JSON.parse(source.getVariable()).sourceurl;\n}", + "lastUpdateTime": 1758445498807, + "loginUi": "[\n {\n \"name\": \"获取站源\",\n \"type\": \"button\",\n \"action\": \"getUrl()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"①\",\n \"type\": \"button\",\n \"action\": \"setUrl(0)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"②\",\n \"type\": \"button\",\n \"action\": \"setUrl(1)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"③\",\n \"type\": \"button\",\n \"action\": \"setUrl(2)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"④\",\n \"type\": \"button\",\n \"action\": \"setUrl(3)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"用户名(3-50个字符)\",\n \"type\": \"text\"\n },\n {\n \"name\": \"邮箱(注册填入)\",\n \"type\": \"text\"\n },\n {\n \"name\": \"密码(6-20个字符)\",\n \"type\": \"password\"\n },\n {\n \"name\": \"注册\",\n \"type\": \"button\",\n \"action\": \"register()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"登录\",\n \"type\": \"button\",\n \"action\": \"Login()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"登出\",\n \"type\": \"button\",\n \"action\": \"LoginOut()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n }\n]", + "loginUrl": "Url();\n\nfunction getUrl() {\n try {\n let urls = Array.from(org.jsoup.Jsoup.parse(java.get(\"https://www.manwaku.cc/\", {}).body()).select('.cards a'), x => x.attr('href'));\n if (urls.length === 0) throw new Error('未获取到站源');\n let data = JSON.parse(source.getVariable());\n data.Urls = urls;\n source.setVariable(JSON.stringify(data, null, \"\\t\"));\n java.toast(`获取到${urls.length}个站源\\n${urls.join('\\n')}`);\n } catch (e) {\n java.log(e.message)\n java.toast('获取失败,请检查网络');\n }\n}\n\nfunction setUrl(n) {\n let data = JSON.parse(source.getVariable());\n if (n + 1 > data.Urls.length) return java.toast(`暂时没有站源${n + 1}`);\n data.sourceurl = data.Urls[n];\n source.setVariable(JSON.stringify(data, null, \"\\t\"));\n java.toast(`当前站源已切换到:\\n${data.Urls[n]}`);\n}\n\nfunction login() {}\n\nfunction Login() {\n let username = String(result?.[\"用户名(3-50个字符)\"] ?? '') || \"axb\";\n let password = String(result?.[\"密码(6-20个字符)\"] ?? '') || \"123456789@\";\n let url = `${Url()}/api/user/login`;\n try {\n let response = JSON.parse(java.post(url, JSON.stringify({\n username,\n password\n }), {\n \"x-requested-with\": \"XMLHttpRequest\",\n \"Content-Type\": \"application/json\"\n }).body());\n if (!/successful/.test(response.msg)) return java.toast(response.msg);\n let token = response.data.token;\n source.putLoginHeader(JSON.stringify({\n \"Authorization\": \"Bearer \" + token,\n \"Cookie\": \"authToken=\" + token\n }));\n java.toast(`\\n用户:${username}\\n登录成功!`);\n } catch (e) {\n java.log(e.message);\n java.toast('请求失败,请检查网络状况!');\n }\n}\n\nfunction LoginOut() {\n source.removeLoginHeader();\n cookie.removeCookie(Url());\n java.toast('登出成功!');\n}\n\nfunction register() {\n let username = result?.[\"用户名(3-50个字符)\"] ?? '';\n let password = result?.[\"密码(6-20个字符)\"] ?? '';\n let email = result?.[\"邮箱(注册填入)\"] ?? '';\n if (!String(username) || !String(password) || !String(email)) return java.toast('请填入必要数据');\n if (String(username).length < 3 || String(username).length > 50) return java.toast('用户名不符合要求');\n if (String(password).length < 6 || String(password).length > 20) return java.toast('密码不符合要求');\n try {\n let url = `${Url()}/api/user/register`;\n let body = JSON.stringify({\n username,\n password,\n email,\n \"nickname\": username\n });\n let response = JSON.parse(java.post(url, body, {\n \"x-requested-with\": \"XMLHttpRequest\",\n \"Content-Type\": \"application/json\"\n }).body());\n if (!/successful/.test(response.msg)) return java.toast(response.msg);\n java.log(`\\n用户名:${username}\\n注册邮箱:${email}\\n密码:${password}`);\n let token = response.data.token;\n source.putLoginInfo(JSON.stringify(result));\n source.putLoginHeader(JSON.stringify({\n \"Authorization\": \"Bearer \" + token,\n \"Cookie\": \"authToken=\" + token\n }));\n java.toast(`\\n用户:${username}\\n注册并登录成功!\\n用户数据已打印至源日志`);\n } catch (e) {\n java.log(e.message);\n java.toast('请求失败,请检查网络状况!');\n }\n}", + "respondTime": 189096, + "ruleBookInfo": { + "author": "$.author", + "coverUrl": "$.cover", + "init": "$.data", + "intro": "@js:\nvar $ = result;\n`  当前站源:${JSON.parse(source.getVariable()).sourceurl}\\n上架时间:${java.timeFormat($.createTime * 1000)}\\n更新时间:${java.timeFormat($.editTime * 1000)}\\n简介:${$.intro}`;", + "kind": "@js:var $ = result;\n$.tags + ',' + java.timeFormat($.editTime * 1000);", + "name": "$.title", + "tocUrl": "{{Url()}}/comic/{{$.id}}" + }, + "ruleContent": { + "content": "@js:var imglist = JSON.parse(src).data.images\nresult = imglist.map(x => ``).join('\\n');", + "imageStyle": "FULL", + "nextContentUrl": "@js:var pageList = [];\nlet Data = JSON.parse(src).data.pagination;\nvar page = Math.ceil(Data.total / Data.page_size);\nfor (let i = 2;i <= page;i++) {\npageList.push(baseUrl.replace(\"page=1\",`page=${i}`));\n}\npageList;" + }, + "ruleExplore": { + "author": "$.author", + "bookList": "$.data.list[*]", + "bookUrl": "{{Url()}}/api/comic/{{$.url##[^\\d]}}", + "coverUrl": "$.pic", + "intro": "$.intro", + "kind": "$.tags", + "name": "$.title" + }, + "ruleSearch": { + "author": "$.author", + "bookList": "$.data.list[*]", + "bookUrl": "{{Url()}}/api/comic/{{$.id}}", + "coverUrl": "$.cover", + "intro": "$.description", + "kind": "@js:var $ = result;\n$.tags + ',' + java.timeFormat($.editTime * 1000);", + "name": "$.title" + }, + "ruleToc": { + "chapterList": "#chapter-grid-container a", + "chapterName": "[class$=\"name\"]@text", + "chapterUrl": "href##(\\d+)$##/api/comic/image/$1?page=1###", + "preUpdateJs": "var sourceUL = Url();\nif (!String(book.bookUrl).includes(sourceUL)) {\n book.bookUrl = String(book.bookUrl).replace(/https?:\\/\\/[^\\/]+/,sourceUL);\n book.tocUrl = String(book.tocUrl).replace(/https?:\\/\\/[^\\/]+/,sourceUL);\n java.toast(\"\\n检测到切换源站,已更新目录链接。\");\n java.refreshTocUrl();\n}", + "updateTime": "span@text##\\n##|" + }, + "searchUrl": "{{Url()}}/api/search?keyword={{key}}&type=mh&page={{page}}&pageSize=20", + "weight": 0 + }, + { + "bookSourceComment": "// Error: 发现失效, 搜索失效\n\n① 发布页:https://jmcomicqa.cc\n \n②❗❗❗需要在登录页面获取网址才能搜索❗❗❗\n③ 发现需要登录才会显示,登录后点击刷新\n \n④ 目录>章节URL规则,最后的数字可用1、2、3、4,代表站内分流线路\n⑤ 更改发现排列在登录切换\n[❌搜索失败]", + "bookSourceGroup": "发现失效,18漫画,搜索失效", + "bookSourceName": "🎨禁漫天堂[国内]", + "bookSourceType": 2, + "bookSourceUrl": "https://jmcomicqa.cc", + "customOrder": 7, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "@js:\neval(String(source.loginUrl));\n\nlet URL = $$$.url ? $$$.url.trim() : 'https://jmcomicqa.cc';\nlet list = [];\n\nfunction push(title, url, size) {\n list.push({\n \"title\": title,\n \"url\": url,\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": size\n }\n });\n}\n\npush(`[▶ ${$$$.name || '已登录'} ◀]`, '', 1);\n\nlet _list = [\n [\"最新\", \"albums?o=mr&page=\"], \n [\"COS\", \"albums/another/sub/cosplay?page=\"], \n [\"3D\", \"search/photos?search_query=3D&page=\"],\n [\"韩漫\", \"albums/hanman?page=\"], \n [\"热门\", \"albums?o=mv&page=\"], \n [\"单本\", \"albums/single?page=<,{{page}}>\"], \n [\"短篇\", \"albums/short?page=<,{{page}}>\"], \n [\"同人\", \"albums/doujin?page=<,{{page}}>\"], \n [\"其他\", \"albums/another?page=<,{{page}}>\"]\n];\nfor (let i = 0; i < _list.length; i++) {\n let t = _list[i][0];\n let u = _list[i][1];\n push(t, `${URL}/${u}{{page}}`, 0.25);\n}\n\npush('👁‍🗨阅读排行榜👁‍🗨', '', 1);\nlet typeList = [[\"日榜\", \"&t=t\"], [\"周榜\", \"&t=w\"], [\"月榜\", \"&t=m\"], [\"总榜\", \"\"]];\nfor (let i = 0; i < typeList.length; i++) {\n let t = typeList[i][0];\n let type = typeList[i][1];\n push(t, `${URL}/albums?o=mv${type}&page={{page}}`, 0.25);\n}\n\npush('♥️收藏排行榜♥️', '', 1);\nfor (let i = 0; i < typeList.length; i++) {\n let t = typeList[i][0];\n let type = typeList[i][1];\n push(t, `${URL}/albums?o=mo${type}&page={{page}}`, 0.25);\n}\n\nlet sorts1 = [\"無修正\",\"劇情向\",\"青年漫\",\"校服\",\"純愛\",\"人妻\",\"教師\",\"百合\",\"Yaoi\",\"性轉\",\"NTR\",\"女裝\",\"癡女\",\"全彩\",\"女性向\",\"完結\",\"純愛\",\"禁漫漢化組\"];\nlet sorts2 = [\"御姐\",\"熟女\",\"未成年\",\"巨乳\",\"貧乳\",\"女性支配\",\"教師\",\"女僕\",\"護士\",\"泳裝\",\"眼鏡\",\"連褲襪\",\"其他制服\",\"兔女郎\"];\nlet sorts3 = [\"群交\",\"足交\",\"束縛\",\"肛交\",\"阿黑顏\",\"藥物\",\"扶他\",\"調教\",\"野外露出\",\"催眠\",\"自慰\",\"觸手\",\"獸交\",\"亞人\",\"怪物女孩\",\"皮物\",\"附身\",\"ryona\",\"騎大車\"];\nlet sorts4 = [\"CG\",\"重口\",\"獵奇\",\"非H\",\"血腥暴力\",\"站長推薦\"];\nconst sortCriteria = [\n { label: '🏷️标签---按时间🏷️', sort: 'mr' },\n { label: '🏷️标签---按阅读🏷️', sort: 'mv' },\n { label: '🏷️标签---按收藏🏷️', sort: 'mo' }\n];\nlet currentTag = $$$.tag || 0;\ncurrentTag = currentTag < 0 || currentTag >= sortCriteria.length ? 0 : currentTag;\nlet sort = sortCriteria[currentTag].sort;\nlet label = sortCriteria[currentTag].label;\n\npush(label, '', 1);\n\npush('▶主题A漫◀', '', 1);\nfor (let i = 0; i < sorts1.length; i++) {\n let s = sorts1[i];\n let encodedS = encodeURIComponent(s);\n push(s, `${URL}/search/photos?search_query=${encodedS}&o=${sort}&page={{page}}`, 0.25);\n}\n\npush('▶角色/扮演◀', '', 1);\nfor (let i = 0; i < sorts2.length; i++) {\n let s = sorts2[i];\n let encodedS = encodeURIComponent(s);\n push(s, `${URL}/search/photos?search_query=${encodedS}&o=${sort}&page={{page}}`, 0.25);\n}\n\npush('▶特殊PLAY◀', '', 1);\nfor (let i = 0; i < sorts3.length; i++) {\n let s = sorts3[i];\n let encodedS = encodeURIComponent(s);\n push(s, `${URL}/search/photos?search_query=${encodedS}&o=${sort}&page={{page}}`, 0.25);\n}\n\npush('▶其他◀', '', 1);\nfor (let i = 0; i < sorts4.length; i++) {\n let s = sorts4[i];\n let encodedS = encodeURIComponent(s);\n push(s, `${URL}/search/photos?search_query=${encodedS}&o=${sort}&page={{page}}`, 0.25);\n}\n\nif (typeof source !== 'undefined' && source.putResult) {\n source.putResult(JSON.stringify(list));\n} else {\n result = JSON.stringify(list);\n}\n", + "header": "{\n\t\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0\",\n\t\"Referer\":\"https://18comic.vip/\"\n}", + "jsLib": "function Get(e) {\n const { java, source, cookie } = this;\n var get = JSON.parse(source.getVariable());\n return get[e];\n}", + "lastUpdateTime": 1759889084157, + "loginCheckJs": " var resultUrl = result.url();\n var resultCode = result.code();\n var resultBoDy = result.body();\n if (/_cf_|ge_ua|verify.php/ig.test(resultBoDy) ) {\n if (key) {\n url = baseUrl + java.ruleUrl;\n }\n cookie.removeCookie(baseUrl)\n result = java.startBrowserAwait(resultUrl, \n \t\"验证\", false);\n //java.log(result.body())\n //result = java.connect(resultUrl)\n }\nresult;", + "loginUi": "[ \n {\n \"name\": \"账号(直接点√不用输然后点刷新)\",\n \"type\": \"text\"\n },\n {\n \"name\": \"密码\",\n \"type\": \"password\"\n },\n { name: \"༺ˇ»`ʚ 点击切换排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"时间\", type: \"button\", action: \"tag(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"阅读\", type: \"button\", action: \"tag(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"收藏\", type: \"button\", action: \"tag(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n {\n \t \"name\": \"获取链接\",\n \t \"type\": \"button\",\n \"action\": \"url()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n \t}\n]", + "loginUrl": "original = {\n'url' : 'https://jmcomicqa.cc',\n'name' : '请刷新',\n'tag' : 0\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction log(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction login() {\n result = JSON.parse(source.getLoginInfo());\n var username = result['账号'];\n $$$.name = username;\n if($$$.name == '') {\n \t$$$.name = '123'\n }\n var password = result['密码'];\n var options = {\n\t body: `username=${username}&password=${password}&submit_login=1`,\n\t method: 'POST'\n\t}\n var urls = java.ajax(`https://jmcomicqa.cc`);\n var url = urls.match(/china\">(.*?)<\\/span>/)[1].trim();\n $$$.url = url;\n put($$$);\n\tjava.ajax(`${url}/login,${JSON.stringify(options)}`);\n}\n\nP = ['时间','阅读','收藏'];\nfunction typeP(e) {\n if (e == undefined) {\n e = 0;\n }\n return P[e];\n}\nfunction tag(e) {\n if (typeof tagVal === 'undefined') {\n tagVal = $$$.tag;\n }\n if (e == $$$.tag) {\n return log('【标签切换提示】' + n(2) + '已经选择此标签,无需更换');\n }\n log('【标签切换提示】' + n(2) + '已经切换到[' + typeP(e) + ']');\n $$$.tag = e;\n return put($$$);\n}\n\nfunction url() {\n var urls = java.ajax(`https://jmcomicqa.cc`);\n var url = urls.match(/china\">(.*?)<\\/span>/)[1].trim();\n if (url == $$$.url) {\n return log('【站点提示】' + n(2) + '站点无需更换');\n }\n log('站点变更:' + url);\n $$$.url = url;\n return put($$$);\n}\n", + "respondTime": 183935, + "ruleBookInfo": { + "author": ".tag-block.42@text", + "coverUrl": ".thumb-overlay.2@img@src", + "intro": " \n{{@@class.p-t-5 float-left@text##日期}} {{@@class.p-t-5 float-right@text##日期}}\n{{@@class.col-xs-12 col-lg-7 nav-tab-content@class.p-t-5 p-b-5@text##叙述:|敘述:}}", + "kind": "sapn.tags a@text", + "name": "id.book-name@text", + "tocUrl": "baseUrl" + }, + "ruleContent": { + "content": "{{@class.row thumb-overlay-albums@tag.img@data-original}}\n@js:result.split(\"\\n\").map(x=>'').join(\"\\n\")", + "imageDecode": "var Magua = new JavaImporter();\nMagua.importPackage(\n Packages.java.io,\n Packages.android.graphics\n);\nwith(Magua){\n let mac = src.match(/photos\\/(\\d+)?\\/(\\d+)?/);\n let bookId = mac[1];\n let imgId = mac[2];\n if( src.search(\"gif\")!=-1||bookId < \"0\" ){\n result;\n } else {\n if (Number(bookId) > 421925) {\n let md5 = java.md5Encode((bookId + imgId));\n let ascii = md5.substr(-1).charCodeAt(0);\n var num = (ascii % 8 + 1) * 2;\n } else if (Number(bookId) >= 268850) {\n let md5 = java.md5Encode((bookId + imgId));\n let ascii = md5.substr(-1).charCodeAt(0);\n var num = (ascii % 10 + 1) * 2;\n } else {\n var num = 10;\n }\nvar img = BitmapFactory.decodeByteArray(result, 0, result.length);\nvar height = img.getHeight();\nvar width = img.getWidth();\nvar y = Math.floor(height / num);\nvar remainder = height % num;\nvar newImg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);\n let canvas = new Canvas(newImg);\n for (let i = 1; i <= num; i++) {\n let h = i === num ? remainder : 0;\n canvas.drawBitmap(Bitmap.createBitmap(img, 0, y * (i - 1), width, y + h), 0, height - y * i - h, null);\n }\n var newbit = new ByteArrayOutputStream();\n newImg.compress(Bitmap.CompressFormat.PNG, 100, newbit);\n newbit.toByteArray();\n }\n}", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": ".title-truncate.1@text", + "bookList": ".p-b-15", + "bookUrl": "tag.a.0@href", + "coverUrl": "img@data-original||img@src", + "intro": ".video-title@text", + "kind": ".tag@text", + "name": ".video-title@text", + "wordCount": "span.0@text##^##👍🏻" + }, + "ruleToc": { + "chapterList": "class.btn-toolbar.0@tag.a||.reading", + "chapterName": "text", + "chapterUrl": "href##(.*)##$1/?shunt=1", + "updateTime": "span@text" + }, + "searchUrl": "{{Get('url')}}/search/photos?search_query={{key}}&search-type=photos&main_tag=0&page={{page}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[✅已验证]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "武芊漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://comic.mkzcdn.com", + "customOrder": 100, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "@js:\nlet url = 'https://comic.mkzcdn.com/search/filter/?audience=0&order=sort&page_num={{page}}&page_size=18&theme_id=class'\nlet class_name=\"全部&修真&霸总&恋爱&校园&冒险&搞笑&生活&热血&架空&后宫&玄幻&悬疑&恐怖&灵异&动作&科幻&战争&古风&穿越&竞技&励志&同人&真人\".split(\"&\");\nlet class_url=\"0&2&1&3&4&5&6&7&8&9&10&12&13&14&15&16&17&18&19&20&21&23&24&26\".split(\"&\")\n\nlet sort_name='推荐&最热&最新'.split(\"&\")\nlet sort_url='3&1&2'.split(\"&\")\nlet model = (title,url,num)=>{\n return {title:title,url:url,style:{layout_flexGroup:1,layout_flexBasisPercent:num}}\n}\n\ntop=[{\"title\":\"热门人气\",\"url\":\"https://comic.mkzcdn.com/search/filter/?order=1&page_num={{page}}&page_size=12\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"更新时间\",\"url\":\"https://comic.mkzcdn.com/search/filter/?order=2&page_num={{page}}&page_size=12\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}}]\n\n\n\nlet list = []\nlist=list.concat(top)\n\nfor (let i = 0; i < sort_name.length; i++) {\n list.push(model(sort_name[i],\"\",1))\n for (let j = 0; j < class_name.length; j++) {\n let t = url.replace(\"sort\",`${sort_url[i]}`).replace(\"class\",`${class_url[j]}`)\n list.push(model(class_name[j],t,0.15))\n }\n}\nJSON.stringify(list)", + "header": "", + "lastUpdateTime": 1734944444919, + "respondTime": 1335, + "ruleBookInfo": { + "init": "", + "intro": "$..content##^##
", + "kind": "$..theme_id\n@js:\nlet class_name=\"全部&修真&霸总&恋爱&校园&冒险&搞笑&生活&热血&架空&后宫&玄幻&悬疑&恐怖&灵异&动作&科幻&战争&古风&穿越&竞技&励志&同人&真人\".split(\"&\");\nlet class_url=\"0&2&1&3&4&5&6&7&8&9&10&12&13&14&15&16&17&18&19&20&21&23&24&26\".split(\"&\")\n\nlet res=Array.from(result)[0].split(\",\")\n\nfor(var i=0;i'').join(\"\\n\")" + }, + "ruleExplore": { + "author": "", + "bookList": "", + "bookUrl": "", + "coverUrl": "", + "intro": "", + "lastChapter": "", + "name": "" + }, + "ruleSearch": { + "author": "$.author_title", + "bookList": "$..list[*]", + "bookUrl": "https://comic.mkzcdn.com/comic/info/?comic_id={{$.comic_id}}", + "coverUrl": "$.cover", + "intro": "$.feature", + "lastChapter": "$.chapter_title", + "name": "$.title" + }, + "ruleToc": { + "chapterList": "$.data", + "chapterName": "$.title", + "chapterUrl": "https://comic.mkzcdn.com/chapter/content/?chapter_id={{$.chapter_id}}&comic_id=@get:{comic_id}", + "preUpdateJs": "", + "updateTime": "$..start_time\n@js:\"🕗 \"+java.timeFormat(result*1000)+\" \"+(new Date(result*1000)>new Date()?\"❗️未发布\":\"\")" + }, + "searchUrl": "https://comic.mkzcdn.com/search/keyword/?keyword={{key}}&page_num={{page}}&page_size=20", + "weight": 0 + }, + { + "bookSourceComment": "\n[❌搜索失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "名著阅读(优)", + "bookSourceType": 2, + "bookSourceUrl": "https://api.520diandu.com/", + "customOrder": 103, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "[{\"title\":\"📚全部书籍\",\"url\":\"https://api.520diandu.com/api/read/allReadBooks?uid=&key=&page={{page}}&cv=134&from=web\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}}]", + "lastUpdateTime": 1731614418286, + "respondTime": 1180, + "ruleBookInfo": { + "name": "" + }, + "ruleContent": { + "content": "@get:{img}@js:headers={\"headers\":{\"Referer\":baseUrl}};\nresult.split(\"\\n\").map(x=>'').join(\"\\n\")" + }, + "ruleExplore": {}, + "ruleSearch": { + "bookList": "$..books[*]", + "bookUrl": "https://api.520diandu.com/api/read/readAllPages?uid=&key=&cv=134&from=web&bid={{$.id}}", + "checkKeyWord": "封神", + "coverUrl": "$.famous", + "intro": "$.title", + "name": "$.book_name" + }, + "ruleToc": { + "chapterList": "$.data", + "chapterName": "$.page", + "chapterUrl": "$.pic@put:{img:pic}" + }, + "searchUrl": "https://api.520diandu.com/api/read/allReadBooks?uid=&key=&name={{key}}&page={{page}}&cv=134&from=app", + "weight": 0 + }, + { + "bookSourceComment": "// Error: org.mozilla.javascript.EcmaError: TypeError: 无法调用 undefined 的方法 “textNodes” (#2) in at line number 2\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,js失效,🎊 常用,🎨 漫画", + "bookSourceName": "🎨COLA漫画💓", + "bookSourceType": 2, + "bookSourceUrl": "https://www.colamanga.com", + "bookUrlPattern": "https://.*/manga-.*/", + "concurrentRate": "10/5000", + "customOrder": 121, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\nAccount = (cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0) ? cache.get(java.md5Encode16(Get('url') + \"Account_1\")) : Map('账号:');\nif(String(Account).length > 0) {\n if (cookie.getCookie(Get('url')).includes('user')) {\n login(Put(JSON.stringify('【登录提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + '\\n账号:' + Account + '\\n┋┋' + '\\n❤️登录成功❤️\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n } else {\n Login();\n }\n if(cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0) {\n exploreUrl.push(explore('✣【' + Account + '】✣', '', 1, 1, false));\n exploreUrl.push(explore('我的收藏', `{{Get('url')}}/dynamic/user/subscription?page={{page}}`, 1, 0.45, false));\n exploreUrl.push(explore('最近阅读', `{{Get('url')}}/dynamic/user/history?page={{page}}`, 1, 0.45, false));\n }\n}\ntitle = '✣      ✣ 榜  单 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nrank = [\n '月点击',\n '周点击',\n '日点击',\n '更新日'\n];\norderby = [\n '?orderBy=monthlyCount',\n '?orderBy=weeklyCount',\n '?orderBy=dailyCount',\n '?orderBy=update'\n];\nfor (i in rank) {\n url = `{{Get('url')}}/show${orderby[i]}&page={{page}}`;\n exploreUrl.push(explore(rank[i], url, 1, 0.2, false));\n}\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\ntype = [\n '全部','玄幻','热血','恋爱','都市','冒险','古风','穿越',\n '爆笑','校园','少年','修真','搞笑','生活','动作','霸总',\n '后宫','武侠','科幻','悬疑','恐怖','魔幻','少女','奇幻',\n '唯美','励志','总裁','复仇','美食','格斗','竞技','古装',\n '纯爱','推理','惊险','虐心','漫改','萌系','彩虹','日漫',\n '游戏','机甲','明星','灵异','仙侠','历史','战争','治愈',\n '日常','僵尸','宫斗','偶像','浪漫','震撼','权谋','战斗',\n '青春','神魔','脑洞','社会','萝莉','真人','美少女','运动',\n '恶搞','体育','暗黑','侦探','百合','惊奇','少男','逆袭',\n '系统','修仙','剧情','大女主','韩漫','欧风','怪物','其它'\n];\ncategoryId = [\n '','&mainCategoryId=10024','&mainCategoryId=10023','&mainCategoryId=10126','&mainCategoryId=10124','&mainCategoryId=10210','&mainCategoryId=10143','&mainCategoryId=10129',\n '&mainCategoryId=10201','&mainCategoryId=10131','&mainCategoryId=10321','&mainCategoryId=10133','&mainCategoryId=10122','&mainCategoryId=10142','&mainCategoryId=10125','&mainCategoryId=10127',\n '&mainCategoryId=10138','&mainCategoryId=10139','&mainCategoryId=10181','&mainCategoryId=10183','&mainCategoryId=10185','&mainCategoryId=10227','&mainCategoryId=10301','&mainCategoryId=10242',\n '&mainCategoryId=10221','&mainCategoryId=10207','&mainCategoryId=10306','&mainCategoryId=10206','&mainCategoryId=10208','&mainCategoryId=10202','&mainCategoryId=10223','&mainCategoryId=10302',\n '&mainCategoryId=10209','&mainCategoryId=10211','&mainCategoryId=10222','&mainCategoryId=10205','&mainCategoryId=10165','&mainCategoryId=10204','&mainCategoryId=10235','&mainCategoryId=10281',\n '&mainCategoryId=10162','&mainCategoryId=10232','&mainCategoryId=10203','&mainCategoryId=10231','&mainCategoryId=10303','&mainCategoryId=10163','&mainCategoryId=10184','&mainCategoryId=10234',\n '&mainCategoryId=10308','&mainCategoryId=10243','&mainCategoryId=10229','&mainCategoryId=10305','&mainCategoryId=10224','&mainCategoryId=10381','&mainCategoryId=10228','&mainCategoryId=10309',\n '&mainCategoryId=10230','&mainCategoryId=10304','&mainCategoryId=10226','&mainCategoryId=10239','&mainCategoryId=10166','&mainCategoryId=10361','&mainCategoryId=10307','&mainCategoryId=10233',\n '&mainCategoryId=10236','&mainCategoryId=10341','&mainCategoryId=10383','&mainCategoryId=10382','&mainCategoryId=10384','&mainCategoryId=10322','&mainCategoryId=10641','&mainCategoryId=10943',\n '&mainCategoryId=10722','&mainCategoryId=10453','&mainCategoryId=10480','&mainCategoryId=10706','&mainCategoryId=10494','&mainCategoryId=11423','&mainCategoryId=11022','&mainCategoryId=10261'\n];\nOrderBy = `{{get('orderBy',Get('o'))}}`;\nStatus = `{{get('status',Get('q'))}}`;\nCharCategoryId = `{{get('charCategoryId',Get('p'))}}`;\nfor (j in type) {\n url = `{{Get('url')}}/show${OrderBy}${Status}${CharCategoryId}${categoryId[j]}&page={{page}}`;\n exploreUrl.push(explore(type[j], url, 1, 0.2, false));\n}\nBID = (type.length % 4) < 1 ? 0 : (4 - (type.length % 4));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.2, false)); \n}\n//exploreUrl.splice(90, 0, explore('', '', 1, 0.2, false));\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"Dnt\": \"1\",\n \"Pragma\": \"no-cache\",\n \"Sec-Ch-Ua\": '\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"127\", \"Microsoft Edge\";v=\"127\"',\n \"Sec-Ch-Ua-Mobile\": \"?1\",\n \"Sec-Ch-Ua-Platform\": '\"Android\"',\n \"Upgrade-Insecure-Requests\": \"1\",\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 EdgA/127.0.0.0\",\n \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n \"Sec-Fetch-Site\": \"same-origin\",\n \"Sec-Fetch-Mode\": \"navigate\",\n \"Sec-Fetch-User\": \"?1\",\n \"Sec-Fetch-Dest\": \"document\",\n \"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\",\n \"Origin\": Get('url'),\n \"Referer\": Get('url'),\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function get(tag,num) {\n status = [\n '',\n '&status=1',\n '&status=2'\n ];\n orderBy = [\n '?orderBy=monthlyCount',\n '?orderBy=weeklyCount',\n '?orderBy=dailyCount',\n '?orderBy=update'\n ];\n charCategoryId = [\n '',\n '&charCategoryId=10182',\n '&charCategoryId=10081',\n '&charCategoryId=10134',\n '&charCategoryId=10001',\n '&charCategoryId=10238',\n '&charCategoryId=10161',\n '&charCategoryId=10225',\n '&charCategoryId=10137',\n '&charCategoryId=10284',\n '&charCategoryId=10141',\n '&charCategoryId=10283',\n '&charCategoryId=10132',\n '&charCategoryId=10136',\n '&charCategoryId=10130',\n '&charCategoryId=10282',\n '&charCategoryId=10262',\n '&charCategoryId=10164',\n '&charCategoryId=10240',\n '&charCategoryId=10121',\n '&charCategoryId=10123',\n '&charCategoryId=11184',\n '&charCategoryId=11483',\n '&charCategoryId=10135',\n '&charCategoryId=10061',\n '&charCategoryId=10082',\n '&charCategoryId=10128'\n ];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}", + "lastUpdateTime": 1743128100782, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n { name: \"账号:\", type: \"text\" },\n { name: \"密码:\", type: \"password\" },\n {\n name: \"💡登录账号💡\",\n type: \"button\",\n action: \"Login()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45}\n },\n {\n name: \"💡源站更新💡\",\n type: \"button\",\n action: \"update()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45}\n },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(-1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换进度 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"q(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"连载\", type: \"button\", action: \"q(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"完结\", type: \"button\", action: \"q(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"月点击\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"周点击\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"日点击\", type: \"button\", action: \"o(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"更新日\", type: \"button\", action: \"o(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n\n { name: \"༺ˇ»`ʚ 点击字母筛选 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全\", type: \"button\", action: \"p(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"A\", type: \"button\", action: \"p(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"B\", type: \"button\", action: \"p(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"C\", type: \"button\", action: \"p(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"D\", type: \"button\", action: \"p(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"E\", type: \"button\", action: \"p(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"F\", type: \"button\", action: \"p(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"G\", type: \"button\", action: \"p(7)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"H\", type: \"button\", action: \"p(8)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"I\", type: \"button\", action: \"p(9)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"J\", type: \"button\", action: \"p(10)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"K\", type: \"button\", action: \"p(11)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"L\", type: \"button\", action: \"p(12)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"M\", type: \"button\", action: \"p(13)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"N\", type: \"button\", action: \"p(14)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"O\", type: \"button\", action: \"p(15)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"P\", type: \"button\", action: \"p(16)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"Q\", type: \"button\", action: \"p(17)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"R\", type: \"button\", action: \"p(18)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"S\", type: \"button\", action: \"p(19)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"T\", type: \"button\", action: \"p(120\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"U\", type: \"button\", action: \"p(21)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"V\", type: \"button\", action: \"p(22)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"W\", type: \"button\", action: \"p(23)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"X\", type: \"button\", action: \"p(24)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"Y\", type: \"button\", action: \"p(25)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"Z\", type: \"button\", action: \"p(26)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n { name: \"\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.15} },\n\n { name: \"页数:\", type: \"text\" },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = 'https://www.acloudmerge.com';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'o': 0,\n 'p': 0,\n 'q': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://www.colamanga.com',\n 'urls': [\n 'https://www.colamanga.com'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == -1) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n if (e == 0) {\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0] + ',' + JSON.stringify(Option));\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0]);\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(0) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(4);\n time = new Date().getTime();\n html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n J = org.jsoup.Jsoup.parse(html);\n u = J.select('.website_href');\n for (i = 0; i < 1; i++) {\n host = String(u.attr('href').split(' ')[i]).replace(/http:/, 'https:').replace(/\\/+$/, '');\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].unshift(host);\n put($$$);\n $(0);\n } else {\n return test(1);\n }\n }\n}\nfunction name(e) {\n if (e == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nvar Page = /\\d+/.test(Map('页数:')) ? Map('页数:') : '5';\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '📚漫画排序:' + type($$$.o)) + '\\n┋┋' + ('\\n' + '⏲️漫画进度:' + type1($$$.q)) + '\\n┋┋' + ('\\n' + '📘字母筛选:' + type2($$$.p)) + '\\n┋┋' + ('\\n' + '📰评论页数:前' + Page + '页') + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci2)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci3)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'] + 1;\n $$$['ci2'] = $$$['ci1'] + 1;\n $$$['ci1'] = 1;\n put($$$);\n return test(e);\n}\nfunction f(e) {\n if (e == undefined) {\n e = result['页数:'];\n e = e > 0 ? e : '0';\n }\n if (e == $$$.f) {\n return login('【评论加载方案提示】' + n(2) + '正在使用此评论加载方案,无需更换');\n }\n login('【评论加载方案提示】' + n(2) + '已经设置评论加载前' + e + '页,请刷新详情');\n $$$.f = e;\n return put($$$);\n}\ny = ['月点击','周点击','日点击','更新日'];\nfunction type(e) {\n if (e == undefined) {\n e = 0;\n }\n return y[e];\n}\nfunction o(e) {\n if (o == undefined) {\n o = result.o;\n }\n if (e == $$$.o) {\n return login('【排序切换提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【排序切换提示】' + n(2) + '已经切换到[' + type(e) + ']排序');\n $$$.o = e;\n return put($$$);\n}\nw = ['全部','连载','完结'];\nfunction type1(e) {\n if (e == undefined) {\n e = 0;\n }\n return w[e];\n}\nfunction q(e) {\n if (q == undefined) {\n q = result.q;\n }\n if (e == $$$.q) {\n return login('【进度切换提示】' + n(2) + '已经选择此进度,无需更换');\n }\n login('【进度切换提示】' + n(2) + '已经切换到[' + type1(e) + ']进度');\n $$$.q = e;\n return put($$$);\n}\nz = ['全部','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];\nfunction type2(e) {\n if (e == undefined) {\n e = 1;\n }\n return z[e];\n}\nfunction p(e) {\n if (p == undefined) {\n p = result.p;\n }\n if (e == $$$.p) {\n return login('【筛选切换提示】' + n(2) + '已经选择此筛选,无需更换');\n }\n login('【筛选切换提示】' + n(2) + '已经切换到[' + type2(e) + ']筛选');\n $$$.p = e;\n return put($$$);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}\nvar result = typeof result !== 'undefined' ? result : {};\nfunction Login() {\n var Account = result['账号:'] || Map('账号:');\n var Password = result['密码:'] || Map('密码:');\n if (Account == '' && Password == '') {\n login((cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0) ? (Put(JSON.stringify('【登录提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + '\\n已退出账号:' + cache.get(java.md5Encode16(Get('url') + \"Account_1\")) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛'))) : ('【登录提示】' + '\\n\\n请输入账号和密码'));\n var headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace('\"Referer\":\"' + Get('url'), '\"Referer\":\"' + Get('url') + '/dynamic/user/'));\n var option = {\n \"method\": \"POST\",\n \"body\": '',\n \"headers\": headers\n };\n java.ajax(Get('url') + '/dynamic/user/dynamic/user/logout,' + JSON.stringify(option));\n cookie.removeCookie(Get('url'));\n java.webView('', Get('url') + '/user/login', '');\n cache.put(java.md5Encode16(Get('url') + \"Account_1\"),'');\n return;\n } else if (Account == '') {\n login('【登录提示】' + '\\n\\n请输入账号');\n return;\n } else if (Password == '') {\n login('【登录提示】' + '\\n\\n请输入密码');\n return;\n } else {\n cookie.removeCookie(Get('url'));\n java.webView('', Get('url') + '/user/login', '');\n var headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace('\"Referer\":\"' + Get('url'), '\"Referer\":\"' + Get('url') + '/dynamic/user/'));\n var option = {\n \"method\": \"GET\",\n \"headers\": headers\n };\n Code = java.getVerificationCode(Get('url') + '/dynamic/kaptcha,' + JSON.stringify(option));\n var requestBody = 'user_name=' + Account + '&user_pwd=' + Password + '&verifyCode=' + Code + '&remeberModule=30';\n var headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace('\"Referer\":\"' + Get('url'), '\"Referer\":\"' + Get('url') + '/user/login'));\n var option = {\n \"method\": \"POST\",\n \"body\": String(requestBody),\n \"headers\": headers\n };\n Response = java.ajax(Get('url') + '/user/loginHandle,' + JSON.stringify(option));\n if (Response.includes('Success') && Account) {\n let ck = cookie.getCookie(Get('url'));\n let na = ck.includes('user') ? 'Y' : 'N';\n let top = cookie.getKey(baseUrl, 'top_banner_counter_1500') > 0 ? parseInt(cookie.getKey(baseUrl, 'top_banner_counter_1500')) : 0;\n top += 1;\n cookie.setCookie(Get('url'), `${ck};_va=13;__na=${na};top_banner_counter_1500=${top}`);\n cache.put(java.md5Encode16(Get('url') + \"Account_1\"), Account);\n login(Put(JSON.stringify('【登录提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + '\\n账号:' + Account + '\\n┋┋' + '\\n❤️登录成功❤️\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n } else {\n cache.put(java.md5Encode16(Get('url') + \"Account_1\"),'');\n login('【登录提示】' + '\\n\\n♣️登录失败♣️\\n\\n请检查账号和密码');\n }\n }\n}", + "respondTime": 181535, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace('\"Referer\":\"' + Get('url'), '\"Referer\":\"' + baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n Account = (cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0) ? cache.get(java.md5Encode16(Get('url') + \"Account_1\")) : Map('账号:');\n if (!cookie.getCookie(baseUrl).includes('_ga=') && !String(Account).length > 0) {\n java.webView('', Get('url') + '/user/login', '');\n }\n if (!cookie.getCookie(baseUrl).includes('user') && String(Account).length > 0) {\n Login();\n }\n let ck = cookie.getCookie(baseUrl);\n let na = ck.includes('user') ? 'Y' : 'N';\n let top = cookie.getKey(baseUrl, 'top_banner_counter_1500') > 0 ? parseInt(cookie.getKey(baseUrl, 'top_banner_counter_1500')) : 0;\n top += 1;\n cookie.setCookie(baseUrl, `${ck};_va=13;__na=${na};top_banner_counter_1500=${top}`);\n var J = org.jsoup.Jsoup.parse(result);\n var $1 = element => String(java.getElements(element).attr('content'));\n var $2 = element => java.getElements(element);\n var $3 = element => String(J.select(element).attr('data-original'));\n url = baseUrl;\n a = String($2('.fed-col-md6')[0].text()).indexOf('别名') == -1 ? '1' : '0';\n s = '';\n k = String($2('.fed-col-md6')[1-a].text()).replace(/[状态中已]/g, '') + ',' + $1('[property=\"og:comic:category\"]').replace(/\\s/g, ',');\n t = String($2('.fed-col-md6')[3-a].text()).replace(/更新/, '');\n l = $1('[property=\"og:comic:latest_chapter_name\"]');\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[话話章回期](|\\s)第.*?[话話章回期]/, '$1').replace(/.*第(\\d+)[话話章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[话話章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[话話章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci1') == 0 ? '〖默认〗' : '〖更新〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n📚漫画排序:〖' + (Get('o') == 0 ? '默认' : '自选') + '〗' + y[Get('o')]) + ('\\n⏲️漫画进度:〖' + (Get('q') == 0 ? '默认' : '自选') + '〗' + w[Get('q')]) + ('\\n📘字母筛选:〖' + (Get('p') == 0 ? '默认' : '自选') + '〗' + z[Get('p')]) + ('\\n📰评论页数:〖' + (Page == 5 ? '默认' : '自选') + '〗前' + Page + '页') + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n var url1 = Get('url') + '/getcomment?';\n var id = $2('.fed-comm-info').attr('data-id');\n var result1 = '';\n var allresult1 = [];\n for(var c = 1; c <= Page; c++){\n var page = c;\n var url2 = `${url1}dataId=${id}&page=${page}`;\n var headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace('\"Referer\":\"' + Get('url'), '\"Referer\":\"' + baseUrl));\n var option = {\n \"method\": \"GET\",\n \"headers\": headers\n };\n var Url = url2 + ',' + JSON.stringify(option);\n result1 = java.ajax(Url);\n allresult1.push(result1);\n var total = org.jsoup.Jsoup.parse(result1).select('.show-page-jump').attr('data-total');\n if (page >= total) {\n break;\n }\n }\n var Result = allresult1.join('\\n');\n var JResult = org.jsoup.Jsoup.parse(Result);\n var list2 = JResult.select('.fed-comm-list li');\n intro1 = String($2('.fed-part-both').text()).replace(/(^)/g, '$1
');\n var intro2 = '';\n var intro3 = '';\n for (var i = 0; i < list2.length; i++) {\n if (!list2[i].select('.fed-part-tips')[0]) continue;\n var intro2_1 = '[' + list2[i].select('.fed-part-tips')[0].text() + ']';\n var intro2_2 = '⛄' + '【' + list2[i].select('.fed-text-line')[0].text() + '】:';\n var intro2_3 = String(list2[i].select('.fed-comm-cont')[0].text()).replace(/\\s回复.*/g, '');\n var list3 = list2[i].select('.fed-comm-reply');\n for (var j = 1; j < list3.length + 1; j++) {\n if (!list3[j]) continue;\n var intro2_1_1 = '[' + list2[i].select('.fed-part-tips')[j].text() + ']';\n var intro2_2_1 = '⛄' + '【' + list2[i].select('.fed-text-line')[j].text() + '】:';\n var intro2_3_1 = String(list2[i].select('.fed-comm-cont')[j].text()).replace(/\\s回复/g, '');\n intro3 = intro3 +'\\nㅤ ' + intro2_1_1 + '\\nㅤ ' + intro2_2_1 + '\\nㅤ ' + intro2_3_1;\n }\n intro2 = intro2 + '\\nㅤ\\n' + intro2_1 + '\\n' + intro2_2 + '\\n' + intro2_3 + intro3;\n intro3 = '';\n }\n cover = $3('.fed-list-pics');\n cache.put(java.md5Encode16('Cover' + baseUrl), cover);\n var Review = parseInt(Page) > 0 ? ('☕【评论】' + intro2) : '☕【评论】未启用';\n book = JSON.stringify({\n 'name': $2('.fed-font-xvi.fed-part-eone.0').text(),\n 'author': String($2('.fed-col-md6')[2-a].text()).replace(/作者/, '').replace(/.*:\\s/, \"\").replace(/\\+\\s/g, '/').replace(/[,,+&]/g, '/').replace(/(\\W)\\s+(\\W)/g, '$1/$2').replace(/\\s\\//g, '/').replace(/\\/\\s/g, '/').replace(/\\/x\\//g, '/').replace(/amp|;/g, '').replace(/\\/+/g, '/').replace(/(/g, '(').replace(/)/g, ')'),\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l + '〔' + t + '〕',\n 'intro': (t != '' ? ('更新时间:' + t + '\\nㅤ\\n') : '') + intro1 + changeLog + Review,\n 'cover': cover,\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\neval(String(source.loginUrl));\nAccount = (cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0) ? cache.get(java.md5Encode16(Get('url') + \"Account_1\")) : Map('账号:');\nif (!cookie.getCookie(baseUrl).includes('_ga=') && !String(Account).length > 0) {\n java.webView('', Get('url') + '/user/login', '');\n}\nif(String(Account).length > 0 && cookie.getCookie(baseUrl).includes('user')) {\n let pageId = result.replace(/.*dataPageId:\\s(\\d+)\\,.*/, '$1');\n let option = '{\"body\":\"pageId=' + pageId + '\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\"},\"method\": \"POST\"}';\n let url = Get('url') + '/counting,' + option;\n java.ajax(url);\n}\nlet ck = cookie.getCookie(baseUrl);\nlet bkm = cookie.getKey(baseUrl, '__cf__bkm');\nlet na = ck.includes('user') ? 'Y' : 'N';\nlet top = cookie.getKey(baseUrl, 'top_banner_counter_1500') > 0 ? parseInt(cookie.getKey(baseUrl, 'top_banner_counter_1500')) : 0;\ntop += 1;\nlet cpcv = cookie.getKey(baseUrl, 'cpcv_top_counter_15') > 0 ? parseInt(cookie.getKey(baseUrl, 'cpcv_top_counter_15')) : 0;\ncpcv += 1;\nlet cpm = cookie.getKey(baseUrl, 'cpm_popunder_counter_60') > 0 ? parseInt(cookie.getKey(baseUrl, 'cpm_popunder_counter_60')) : 0;\ncpm += 1;\nlet sb = '8c0a375d8544f78968ab9f8f99cb9fd7';\nlet count = cookie.getKey(baseUrl, `sb_count_${sb}`) > 0 ? parseInt(cookie.getKey(baseUrl, `sb_count_${sb}`)) : 0;\ncount += 1;\nlet page = cookie.getKey(baseUrl, `sb_page_${sb}`) > 0 ? parseInt(cookie.getKey(baseUrl, `sb_page_${sb}`)) : 0;\npage += 1;\ncookie.setCookie(baseUrl, `${ck};_va=13;__na=${na};top_banner_counter_1500=${top};cpcv_top_counter_15=${cpcv};cpm_popunder_counter_60=${cpm};sb_main_${sb}=1;sb_onpage_${sb}=1;sb_count_${sb}=${count};sb_page_${sb}=${page}`);\nck = cookie.getCookie(baseUrl);\nlet domain = String(Get('url')).split(\".\")[1];\nfunction addOptions(url, baseUrl, options) {\n let j = {\n \"Referer\": baseUrl.replace(/,[\\s\\S]+\\}/, \"\")\n };\n if (!url.includes(domain)) {\n j.Referer = \"\";\n }\n options = options || {};\n options.headers = Object.assign(options.headers || {}, j);\n return options ? `${url},${JSON.stringify(options)}` : url;\n}\nfunction arrayToImg(arr, func, baseUrl, options) {\n let result = [];\n for (let item of arr) {\n let imgUrl = addOptions(item, baseUrl, options);\n let imgTag = ``;\n if (typeof func === \"function\") {\n imgTag = func(imgUrl);\n }\n result.push(imgTag);\n }\n return result.join(\"\\n\");\n}\nfunction stringToImg(str, func, baseUrl, options) {\n let imgUrl = addOptions(str, baseUrl, options);\n let imgTag = ``;\n if (typeof func === \"function\") {\n imgTag = func(imgUrl);\n }\n return imgTag;\n}\nfunction load(Urls) {\n for (i = 0; i < Urls.length; i++) {\n if (!Urls[i].includes(\"coco_keys.json\")){\n url = Urls[i] + 'User_Activation.json';\n } else {\n url = Urls[i];\n }\n let response = '';\n try {\n response = java.get(url,{}).body();\n } catch {\n continue;\n }\n if (response && JSON.stringify(response).includes(\"qyyuapi\") || JSON.stringify(response).includes(\"C_DATA\")){\n return [response, Urls[i]];\n }\n }\n throw \"Error: 所有链接下载失败\";\n}\nfunction parseKeys() {\n let jsBaseUrls = [\n \"https://gcore.jsdelivr.net/gh/xiaohan231/decodeObfuscator@main/\",\n \"https://fastly.jsdelivr.net/gh/xiaohan231/decodeObfuscator@main/\",\n \"https://cdn.jsdelivr.net/gh/xiaohan231/decodeObfuscator@main/\",\n \"https://raw.githubusercontent.com/xiaohan231/decodeObfuscator/main/\",\n \"https://raw.gitmirror.com/xiaohan231/decodeObfuscator/main/\"\n ];\n let urls = [\n \"plugins/common.js\",\n \"plugins/cocomanhua.js\",\n \"tools/babel_asttool.js\",\n \"tools/config.js\",\n \"tools/decode.js\",\n \"tools/decodeOb.js\",\n \"tools/usefulPlugins.js\"\n ];\n let jsBaseUrl = cache.get(`cache_js`);\n let response = '';\n try {\n response = java.get(jsBaseUrl,{}).body();\n } catch {}\n if (!jsBaseUrl || response == '') {\n jsBaseUrl = load(jsBaseUrls)[1];\n java.toast('\\n\\n' + jsBaseUrl);\n cache.put(`cache_js`, jsBaseUrl);\n }\n function toAbsUrl(url) {\n return /^\\.\\/|^http|^content|^\\/sdcard|^\\/storage/.test(url) ? url : jsBaseUrl.concat(url);\n }\n function loadJS(urls) {\n let scripts = \"\";\n for (let url of urls) {\n let absoluteUrl = toAbsUrl(url);\n let content = java.ajax(absoluteUrl);\n let scriptTag = script(content);\n scripts += scriptTag;\n }\n return scripts;\n }\n function script(content) {\n return ``;\n }\n let html = `${loadJS(urls)}`;\n return java.webView(html, Get('url'), \"keys\");\n}\nfunction fetchRemoteKeys() {\n let remoteUrls = [\n \"https://gcore.jsdelivr.net/gh/xiaohan231/autoCI@cocokeys/coco_keys.json\",\n \"https://fastly.jsdelivr.net/gh/xiaohan231/autoCI@cocokeys/coco_keys.json\",\n \"https://cdn.jsdelivr.net/gh/xiaohan231/autoCI@cocokeys/coco_keys.json\",\n \"https://raw.githubusercontent.com/xiaohan231/autoCI/cocokeys/coco_keys.json\",\n \"https://raw.gitmirror.com/xiaohan231/autoCI/cocokeys/coco_keys.json\"\n ];\n remoteKeys = load(remoteUrls)[0];\n return remoteKeys;\n}\nif (String(book['author']) !== \"xiaohan231\") {\n if(String(Account).length > 0) {\n let dataId = String(cache.get(java.md5Encode16('Cover' + book.bookUrl))).replace(/.*comic\\/(\\d+)\\/.*/, '$1');\n let value = cache.get(java.md5Encode16('Value' + book.bookUrl));\n var SC = cache.get(java.md5Encode16(book.originName + Account + dataId)) ? cache.get(java.md5Encode16(book.originName + Account + dataId)) : '';\n var BN = book.name;\n var Bookname = BN.length >= 60 ? BN.substring(0, 14) + \"\\n\" + BN.substring(14, 29) + \"\\n\" + BN.substring(29, 44) + \"\\n\" + BN.substring(44, 59) + \"\\n\" + BN.substring(59) : (BN.length >= 45 ? BN.substring(0, 14) + \"\\n\" + BN.substring(14, 29) + \"\\n\" + BN.substring(29, 44) + \"\\n\" + BN.substring(59) : (BN.length >= 30 ? BN.substring(0, 14) + \"\\n\" + BN.substring(14, 29) + \"\\n\" + BN.substring(29) : (BN.length >= 15 ? BN.substring(0, 14) + \"\\n\" + BN.substring(14) : BN)));\n if (book.readConfig && book.group > 0 && SC.includes('y') && !/^✔\\,/.test(book.kind)) {\n book.kind = '✔,' + book.kind;\n }\n if (book.readConfig && book.group > 0 && !SC.includes('y') && /^✔\\,/.test(book.kind)) {\n cache.put(java.md5Encode16(book.originName + Account + dataId),'y');\n }\n if (book.readConfig && book.group > 0 && !SC.includes('y')) {\n let option = '{\"body\":\"dataId=' + dataId + '\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\"},\"method\": \"POST\"}';\n let url = Get('url') + '/dynamic/user/addToFav,' + option;\n if (!/^✔\\,/.test(book.kind)) {\n java.ajax(url);\n book.kind = '✔,' + book.kind;\n scurl = `{{Get('url')}}/dynamic/user/subscription?page=1`;\n scres = java.ajax(scurl);\n var J = org.jsoup.Jsoup.parse(scres);\n cache.put(java.md5Encode16('Value' + book.bookUrl), J.select('.fed-padding-x.fed-part-rows.fed-line-top')[0].select('.fed-form-comp').attr('value'));\n cache.put(java.md5Encode16(book.originName + Account + dataId),'y');\n login(Put(JSON.stringify('【收藏提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + Bookname + '\\n┋┋' + '\\n❤️已添加收藏❤️\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n }\n }\n if (book.readConfig && book.group < 1 && SC.includes('y') && value) {\n let option = '{\"body\":\"dataIds=' + value + '&type=1\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\"},\"method\": \"POST\"}';\n let url = Get('url') + '/dynamic/user/subscriptionHandle,' + option;\n if (/^✔\\,/.test(book.kind)) {\n java.ajax(url);\n book.kind = String(book.kind).replace(/^✔\\,/g,'');\n cache.put(java.md5Encode16(book.originName + Account + dataId),'n');\n login(Put(JSON.stringify('【收藏提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + Bookname + '\\n┋┋' + '\\n♣️已取消收藏♣️\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n }\n }\n }\n let DEBUG = 0;\n let local_keys = null;\n function base64Decode(base64) {\n return java.base64Decode(base64) + \"\";\n }\n let aes = {\n keys: null,\n retryNum: 2,\n saveKeys: function (keysString) {\n try {\n this.keys = JSON.parse(keysString);\n let localKeys = cache.get(java.md5Encode16('cache_keysString_' + Get('url')));\n if (localKeys !== keysString) {\n cache.put(java.md5Encode16('cache_keysString_' + Get('url')), keysString);\n return true;\n }\n } catch (e) {\n java.log(keysString);\n java.log(\"❎密钥解析错误!!\");\n }\n },\n _aesDecrypt: function (key, word) {\n return java.createSymmetricCrypto(\"aes/ecb/pkcs7padding\", key).decryptStr(word) + \"\";\n },\n decrypt: function (word, name) {\n if (this.keys && this.keys[name]) {\n for (let key of this.keys[name]) {\n try {\n return this._aesDecrypt(key, word);\n } catch {}\n }\n }\n if (this.retryNum-- > 0) {\n if ((this.retryNum == 2 && this.saveKeys(parseKeys())) || (this.retryNum == 1 && this.saveKeys(fetchRemoteKeys()))) {\n return this.decrypt(word, name);\n }\n }\n throw \"❎解密失败,无法获取密钥!!\";\n }\n };\n function decodeImage(src) {\n let C_DATA = src.match(/C_DATA\\s*=\\s*\\S([\\s\\S]+?)['\"]/);\n if (!C_DATA) {\n throw \"❎图片数据C_DATA获取失败!!\";\n }\n C_DATA = aes.decrypt(base64Decode(C_DATA[1]), \"C_DATA\");\n DEBUG && java.log(C_DATA);\n eval(C_DATA);\n let html = \"\";\n if (!image_info.img_type) {\n let path = mh_info.enc_code2 ? aes.decrypt(base64Decode(mh_info.enc_code2), \"enc_code2\") : mh_info.imgpath;\n let totalImageCount = mh_info.enc_code1 ? aes.decrypt(base64Decode(mh_info.enc_code1), \"enc_code1\") : mh_info.totalimg;\n let servers = [mh_info.domain];\n if (typeof __JS_READLINE !== \"undefined\") {\n if (__JS_READLINE.data && __JS_READLINE.data.length > 0) {\n servers.push(__JS_READLINE.data[0].domain);\n } else if (__JS_READLINE.domain) {\n servers.push(__JS_READLINE.domain);\n }\n }\n let server = mh_info.use_server === \"\" ? servers[0] : servers[0].replace(/^img/, `img${mh_info.use_server}`);\n let options = {};\n let suffix = \"jpg\";\n if (image_info.imgKey !== undefined && image_info.imgKey !== '' || image_info.keyType !== undefined && image_info.keyType !== '') {\n if (image_info.keyType === '0') {\n colakey = aes.decrypt(image_info.imgKey, \"C_DATA\");\n } else {\n let colajsonUrls = [\"https://qyyuapi.com/cola.json\"];\n for (let i = 0; i < colajsonUrls.length; i++) {\n try {\n let response = java.ajax(colajsonUrls[i]);\n colakey = JSON.parse(response)[image_info.keyType];\n break;\n } catch (e) {\n java.log(`❎加载${colajsonUrls[i]}密钥文件错误`);\n }\n };\n if (colakey == '' || colakey == null) {\n java.log(`❎远程密钥文件未更新,请30分钟后再试`);\n }\n }\n options = {\n \"key\": enc_webp_bytes_key = colakey,\n \"headers\": {\n \"Cookie\": `_tka_${mh_info.pageid}=${path};_tkb_${mh_info.pageid}=${totalImageCount};_va=13;__cf__bkm=${bkm}`,\n \"Origin\": Get('url')\n }\n };\n suffix = \"enc.webp\";\n } else {\n options = {\n \"headers\": {\n \"Cookie\": `_tka_${mh_info.pageid}=${path};_tkb_${mh_info.pageid}=${totalImageCount};_va=13;__cf__bkm=${bkm}`,\n \"Origin\": Get('url')\n }\n };\n }\n if (DEBUG) totalImageCount = 1;\n for (; mh_info.startimg <= totalImageCount; mh_info.startimg++) {\n let imgPath = `https://${server}/comic/${encodeURIComponent(path)}${String(mh_info.startimg).padStart(4, \"0\")}.${suffix}`;\n html += stringToImg(imgPath, null, baseUrl, options) + \"\\n\";\n }\n } else {\n options = {\n \"headers\": {\n \"Cookie\": `_tka_${mh_info.pageid}=${path};_tkb_${mh_info.pageid}=${totalImageCount};_va=13;__cf__bkm=${bkm}`,\n \"Origin\": Get('url')\n }\n };\n let urls__direct = base64Decode(image_info.urls__direct).split(\"|SEPARATER|\");\n if (DEBUG) urls__direct.splice(0, 1);\n if (image_info.img_type === 1) {\n html = arrayToImg(urls__direct, url => url + \".webp\", baseUrl, options);\n } else {\n html = arrayToImg(urls__direct, null, baseUrl, options);\n }\n }\n cookie.setCookie(baseUrl, `${ck}`);\n return html;\n }\n (function () {\n if (local_keys !== null && local_keys !== '') {\n aes.keys = local_keys;\n } else if (cache.get('keysString') !== null && cache.get('keysString') !== '') {\n aes.saveKeys(cache.get('keysString'));\n } else {\n !DEBUG && aes.saveKeys(parseKeys());\n aes.retryNum = 1;\n DEBUG && aes.saveKeys(fetchRemoteKeys());\n }\n cookie.setCookie(baseUrl, `${ck}`);\n return decodeImage(src);\n })();\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageDecode": "function decode(bytes, key){\n return java.createSymmetricCrypto(\"aes/cbc/pkcs7padding\", key,\"0\".repeat(16)).decrypt(bytes);\n}\nif (/enc.webp/.test(src)) {\n let key = src.match(/\"key\":\"(.+?)\"/)[1];\n decode(result, key);\n} else {\n result;\n}", + "imageStyle": "FULL", + "nextContentUrl": "", + "replaceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0xc451,_0x2892,User,Title,Link,Intro,data,Headers,Option;function UDG6q_(_0xc451,_0x2892,User){for(User=0x0;User<_0x2892;User++)_0xc451.push(_0xc451.shift());return _0xc451}function tmPhuH6(){}nRIgPr(_0xc451=UDG6q_([\"\\x4f\\x33\\x52\\x76\\x63\\x46\\x39\\x69\\x59\\x57\\x35\\x75\\x5a\\x58\\x4a\\x66\\x59\\x32\\x39\\x31\\x62\\x6e\\x52\\x6c\\x63\\x6c\\x38\\x78\\x4e\\x54\\x41\\x77\\x50\\x51\\x3d\\x3d\",\"\\x4c\\x33\\x56\\x7a\\x5a\\x58\\x49\\x76\\x63\\x33\\x56\\x69\\x63\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\\x61\\x57\\x39\\x75\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x77\\x59\\x57\\x52\\x6b\\x61\\x57\\x35\\x6e\\x4c\\x58\\x67\\x75\\x5a\\x6d\\x56\\x6b\\x4c\\x58\\x42\\x68\\x63\\x6e\\x51\\x74\\x63\\x6d\\x39\\x33\\x63\\x79\\x35\\x6d\\x5a\\x57\\x51\\x74\\x62\\x47\\x6c\\x75\\x5a\\x53\\x31\\x30\\x62\\x33\\x41\\x3d\",\"\\u0063\\u0032\\u0056\\u0073\\u005a\\u0057\\u004e\\u0030\",\"\\x63\\x33\\x42\\x68\\x62\\x67\\x3d\\x3d\",\"\\u0064\\u0047\\u0056\\u0034\\u0064\\u0041\\u003d\\u003d\",\"\\u0063\\u0048\\u0056\\u0030\",\"\\x56\\x6d\\x46\\x73\\x64\\x57\\x55\\x3d\",\"\\x59\\x58\\x52\\x30\\x63\\x67\\x3d\\x3d\",\"\\u0061\\u0048\\u004a\\u006c\\u005a\\u0067\\u003d\\u003d\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x6d\\x62\\x33\\x4a\\x74\\x4c\\x57\\x4e\\x76\\x62\\x58\\x41\\x3d\",\"\\u0064\\u006d\\u0046\\u0073\\u0064\\u0057\\u0055\\u003d\",\"\\u0051\\u0032\\u0039\\u0032\\u005a\\u0058\\u0049\\u003d\",\"\\x4c\\x33\\x56\\x7a\\x5a\\x58\\x49\\x76\\x61\\x47\\x6c\\x7a\\x64\\x47\\x39\\x79\\x65\\x51\\x3d\\x3d\",\"\\u0043\\u0075\\u004f\\u0046\\u0070\\u0041\\u0072\\u0069\\u006a\\u0037\\u0044\\u006d\\u006c\\u0037\\u0062\\u0070\\u006c\\u0037\\u0054\\u0076\\u0076\\u004a\\u006f\\u003d\",\"\\x43\\x76\\x43\\x66\\x6b\\x35\\x62\\x6f\\x70\\x34\\x4c\\x6e\\x6e\\x49\\x76\\x6f\\x68\\x37\\x50\\x76\\x76\\x4a\\x6f\\x3d\",\"\\u004c\\u006d\\u005a\\u006c\\u005a\\u0043\\u0031\\u0073\\u0061\\u0058\\u004e\\u0030\\u004c\\u0057\\u006c\\u0030\\u005a\\u0057\\u0031\\u0038\\u0066\\u0043\\u0035\\u006d\\u005a\\u0057\\u0051\\u0074\\u005a\\u0047\\u0056\\u0030\\u0059\\u0053\\u0031\\u0070\\u0062\\u006d\\u005a\\u0076\",\"\\u004c\\u006d\\u005a\\u006c\\u005a\\u0043\\u0031\\u0073\\u0061\\u0058\\u004e\\u0030\\u004c\\u0058\\u0052\\u0070\\u0064\\u0047\\u0078\\u006c\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x73\\x61\\x58\\x4e\\x30\\x4c\\x58\\x4a\\x6c\\x62\\x57\\x46\\x79\\x61\\x33\\x4d\\x3d\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x73\\x61\\x58\\x4e\\x30\\x4c\\x57\\x52\\x6c\\x63\\x32\\x4d\\x3d\",\"\\u004c\\u006d\\u005a\\u006c\\u005a\\u0043\\u0031\\u0073\\u0061\\u0058\\u004e\\u0030\\u004c\\u0058\\u0042\\u0070\\u0059\\u0033\\u004d\\u003d\",\"\\x5a\\x47\\x46\\x30\\x59\\x53\\x31\\x76\\x63\\x6d\\x6c\\x6e\\x61\\x57\\x35\\x68\\x62\\x41\\x3d\\x3d\",\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0054\\u0030\\u003d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\x61\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\u0053\\u006e\\u004e\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x73\\x61\\x58\\x4e\\x30\\x4c\\x57\\x6c\\x30\\x5a\\x57\\x30\\x73\\x49\\x43\\x35\\x6d\\x5a\\x57\\x51\\x74\\x5a\\x47\\x56\\x30\\x59\\x53\\x31\\x70\\x62\\x6d\\x5a\\x76\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\x64\\x58\\x4a\\x73\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\u0063\\u006d\\u0056\\u0077\\u0062\\u0047\\u0046\\u006a\\u005a\\u0051\\u003d\\u003d\",\"\\x49\\x6c\\x4a\\x6c\\x5a\\x6d\\x56\\x79\\x5a\\x58\\x49\\x69\\x4f\\x69\\x49\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\u0051\\u0057\\u004e\\u006a\\u0062\\u0033\\u0056\\u0075\\u0064\\u0046\\u0038\\u0078\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\x36\\x4c\\x53\\x6d\\x35\\x59\\x2b\\x33\\x37\\x37\\x79\\x61\",\"\\u005a\\u0032\\u0056\\u0030\\u0051\\u0032\\u0039\\u0076\\u0061\\u0032\\u006c\\u006c\",\"\\x61\\x57\\x35\\x6a\\x62\\x48\\x56\\x6b\\x5a\\x58\\x4d\\x3d\",\"\\u0058\\u0032\\u0064\\u0068\\u0050\\u0051\\u003d\\u003d\",\"\\x64\\x32\\x56\\x69\\x56\\x6d\\x6c\\x6c\\x64\\x77\\x3d\\x3d\",\"\\u004c\\u0033\\u0056\\u007a\\u005a\\u0058\\u0049\\u0076\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0034\\u003d\",\"\\x4c\\x33\\x56\\x7a\\x5a\\x58\\x49\\x76\",\"\\u0064\\u0058\\u004e\\u006c\\u0063\\u0067\\u003d\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\\u0053\\u0032\\u0056\\u0035\",\"\\u0064\\u0047\\u0039\\u0077\\u0058\\u0032\\u004a\\u0068\\u0062\\u006d\\u0035\\u006c\\u0063\\u006c\\u0039\\u006a\\u0062\\u0033\\u0056\\u0075\\u0064\\u0047\\u0056\\u0079\\u0058\\u007a\\u0045\\u0031\\u004d\\u0044\\u0041\\u003d\",\"\\x63\\x32\\x56\\x30\\x51\\x32\\x39\\x76\\x61\\x32\\x6c\\x6c\",\"\\u004f\\u0031\\u0039\\u0032\\u0059\\u0054\\u0030\\u0078\\u004d\\u007a\\u0074\\u0066\\u0058\\u0032\\u0035\\u0068\\u0050\\u0051\\u003d\\u003d\"],0x1d),_0x2892=function(User,Title){var Link,Intro;nRIgPr(User=User-0x0,Link=_0xc451[User]);if(_0x2892.iiNMXx===void 0x0){nRIgPr(function(){var User,Title;try{var Link=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\");User=Link()}catch(Intro){User=window}nRIgPr(Title=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",User.atob||(User.atob=function(User){var Link=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0xc451=0x0,_0x2892,data,Headers=0x0;data=Link.charAt(Headers++);~data&&(_0x2892=_0xc451%0x4?_0x2892*0x40+data:data,_0xc451++%0x4)?Intro+=String.fromCharCode(0xff&_0x2892>>(-0x2*_0xc451&0x6)):0x0)data=Title.indexOf(data);return Intro}))}(),_0x2892.kXOBCX=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0xc451=Title.length;Intro<_0xc451;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x2892.JyKMgG={},_0x2892.iiNMXx=!0x0)}nRIgPr(Intro=_0x2892.JyKMgG[User],Intro===void 0x0?(Link=_0x2892.kXOBCX(Link),_0x2892.JyKMgG[User]=Link):Link=Intro);return Link},eval(String(source[_0x2892(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x2892(\"\\u0030\\u0078\\u0031\")](cache_api+_0x2892(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x2892(\"\\u0030\\u0078\\u0033\")](cache[_0x2892(\"\\u0030\\u0078\\u0034\")](java[_0x2892(\"\\u0030\\u0078\\u0035\")](Get(_0x2892(\"\\x30\\x78\\x36\"))+_0x2892(\"\\u0030\\u0078\\u0037\")))[_0x2892(\"\\x30\\x78\\x38\")](_0x2892(\"\\x30\\x78\\x39\")+Get(_0x2892(\"\\x30\\x78\\x36\")),_0x2892(\"\\x30\\x78\\x39\")+baseUrl)),Option={method:_0x2892(\"\\x30\\x78\\x61\"),headers:Headers});if(!(\"\\x6d\\x49\\x32\\x42\\x47\\x51\" in tmPhuH6)&&User==!![]){Account=cache[_0x2892(\"\\u0030\\u0078\\u0034\")](java[_0x2892(\"\\x30\\x78\\x35\")](Get(_0x2892(\"\\x30\\x78\\x36\"))+_0x2892(\"\\x30\\x78\\x62\")))&&String(cache[_0x2892(\"\\x30\\x78\\x34\")](java[_0x2892(\"\\x30\\x78\\x35\")](Get(_0x2892(\"\\x30\\x78\\x36\"))+_0x2892(\"\\u0030\\u0078\\u0062\"))))[_0x2892(\"\\x30\\x78\\x63\")]>0x0?cache[_0x2892(\"\\x30\\x78\\x34\")](java[_0x2892(\"\\u0030\\u0078\\u0035\")](Get(_0x2892(\"\\x30\\x78\\x36\"))+_0x2892(\"\\x30\\x78\\x62\"))):Map(_0x2892(\"\\u0030\\u0078\\u0064\"));if(!(\"\\x58\\x4f\\x77\\x55\\x49\\x62\\x51\" in tmPhuH6)&&!cookie[_0x2892(\"\\u0030\\u0078\\u0065\")](baseUrl)[_0x2892(\"\\x30\\x78\\x66\")](_0x2892(\"\\u0030\\u0078\\u0031\\u0030\"))&&!String(Account)[_0x2892(\"\\x30\\x78\\x63\")]>0x0){java[_0x2892(\"\\u0030\\u0078\\u0031\\u0031\")](\"\",Get(_0x2892(\"\\x30\\x78\\x36\"))+_0x2892(\"\\u0030\\u0078\\u0031\\u0032\"),\"\")}if(!(\"\\u006d\\u006a\\u0066\\u0058\\u0058\\u0057\" in tmPhuH6)&&baseUrl[_0x2892(\"\\x30\\x78\\x66\")](_0x2892(\"\\u0030\\u0078\\u0031\\u0033\"))){if(!cookie[_0x2892(\"\\u0030\\u0078\\u0065\")](baseUrl)[_0x2892(\"\\u0030\\u0078\\u0066\")](_0x2892(\"\\u0030\\u0078\\u0031\\u0034\"))&&String(Account)[_0x2892(\"\\x30\\x78\\x63\")]>0x0){nRIgPr(eval(String(source[_0x2892(\"\\u0030\\u0078\\u0030\")])),Login())}}let ck=cookie[_0x2892(\"\\u0030\\u0078\\u0065\")](baseUrl),na=ck[_0x2892(\"\\x30\\x78\\x66\")](_0x2892(\"\\u0030\\u0078\\u0031\\u0034\"))?\"\\x59\":\"\\u004e\",top=cookie[_0x2892(\"\\u0030\\u0078\\u0031\\u0035\")](baseUrl,_0x2892(\"\\x30\\x78\\x31\\x36\"))>0x0?parseInt(cookie[_0x2892(\"\\u0030\\u0078\\u0031\\u0035\")](baseUrl,_0x2892(\"\\u0030\\u0078\\u0031\\u0036\"))):0x0;nRIgPr(top++,cookie[_0x2892(\"\\x30\\x78\\x31\\x37\")](baseUrl,ck+_0x2892(\"\\u0030\\u0078\\u0031\\u0038\")+na+_0x2892(\"\\x30\\x78\\x31\\x39\")+top));if(!(\"\\x44\\x52\\x67\\x4c\\x52\\x31\\x6c\" in tmPhuH6)&&baseUrl[_0x2892(\"\\u0030\\u0078\\u0066\")](_0x2892(\"\\u0030\\u0078\\u0031\\u0061\"))){var list=java[_0x2892(\"\\u0030\\u0078\\u0031\\u0062\")](_0x2892(\"\\u0030\\u0078\\u0031\\u0063\"));for(i=0x0;i", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x5ae9,_0x473b,User,Title,Link,Intro,data,Headers,Option;function vEv_O2w(_0x5ae9,_0x473b,User){for(User=0x0;User<_0x473b;User++)_0x5ae9.push(_0x5ae9.shift());return _0x5ae9}function uzck9iz(){}Igd_yn0(_0x5ae9=vEv_O2w([\"\\u0061\\u0057\\u0035\\u006b\\u005a\\u0058\\u0068\\u0050\\u005a\\u0067\\u003d\\u003d\",\"\\x64\\x47\\x56\\x34\\x64\\x45\\x35\\x76\\x5a\\x47\\x56\\x7a\",\"\\x4a\\x44\\x45\\x76\\x4a\\x44\\x49\\x3d\",\"\\u004c\\u006d\\u005a\\u006c\\u005a\\u0043\\u0031\\u006a\\u0062\\u0032\\u0077\\u0074\\u0062\\u0057\\u0051\\u0032\\u0049\\u0047\\u0045\\u003d\",\"\\u004c\\u006d\\u005a\\u006c\\u005a\\u0043\\u0031\\u0073\\u0061\\u0058\\u004e\\u0030\\u004c\\u0058\\u004a\\u006c\\u0062\\u0057\\u0046\\u0079\\u0061\\u0033\\u004d\\u003d\",\"\\u004c\\u006d\\u005a\\u006c\\u005a\\u0043\\u0031\\u0077\\u0059\\u0058\\u004a\\u0030\\u004c\\u0057\\u0056\\u007a\\u0059\\u0057\\u0034\\u003d\",\"\\u004c\\u006d\\u005a\\u006c\\u005a\\u0043\\u0031\\u0073\\u0061\\u0058\\u004e\\u0030\\u004c\\u0058\\u0042\\u0070\\u0059\\u0033\\u004d\\u003d\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\u005a\\u0047\\u0046\\u0030\\u0059\\u0053\\u0031\\u0076\\u0063\\u006d\\u006c\\u006e\\u0061\\u0057\\u0035\\u0068\\u0062\\u0041\\u003d\\u003d\",\"\\u0063\\u0048\\u0056\\u0030\",\"\\x51\\x32\\x39\\x32\\x5a\\x58\\x49\\x3d\",\"\\u004c\\u006d\\u005a\\u006c\\u005a\\u0043\\u0031\\u0077\\u0059\\u0058\\u004a\\u0030\\u004c\\u0057\\u0056\\u0076\\u0062\\u006d\\u0055\\u0067\\u0059\\u0051\\u003d\\u003d\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\x59\\x57\\x70\\x68\\x65\\x41\\x3d\\x3d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0054\\u0030\\u003d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\x61\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\x53\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\u0063\\u0032\\u0056\\u0068\\u0063\\u006d\\u004e\\u006f\\u0061\\u0032\\u0056\\u0035\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x73\\x61\\x58\\x4e\\x30\\x4c\\x57\\x6c\\x30\\x5a\\x57\\x30\\x73\\x49\\x43\\x35\\x6d\\x5a\\x57\\x51\\x74\\x5a\\x47\\x56\\x30\\x59\\x53\\x31\\x70\\x62\\x6d\\x5a\\x76\",\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\x5a\\x32\\x56\\x30\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0049\\u006c\\u004a\\u006c\\u005a\\u006d\\u0056\\u0079\\u005a\\u0058\\u0049\\u0069\\u004f\\u0069\\u0049\\u003d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x51\\x57\\x4e\\x6a\\x62\\x33\\x56\\x75\\x64\\x46\\x38\\x78\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\x36\\x4c\\x53\\x6d\\x35\\x59\\x2b\\x33\\x37\\x37\\x79\\x61\",\"\\u005a\\u0032\\u0056\\u0030\\u0051\\u0032\\u0039\\u0076\\u0061\\u0032\\u006c\\u006c\",\"\\u0061\\u0057\\u0035\\u006a\\u0062\\u0048\\u0056\\u006b\\u005a\\u0058\\u004d\\u003d\",\"\\x58\\x32\\x64\\x68\\x50\\x51\\x3d\\x3d\",\"\\u0064\\u0032\\u0056\\u0069\\u0056\\u006d\\u006c\\u006c\\u0064\\u0077\\u003d\\u003d\",\"\\x4c\\x33\\x56\\x7a\\x5a\\x58\\x49\\x76\\x62\\x47\\x39\\x6e\\x61\\x57\\x34\\x3d\",\"\\x64\\x58\\x4e\\x6c\\x63\\x67\\x3d\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\\u0053\\u0032\\u0056\\u0035\",\"\\x64\\x47\\x39\\x77\\x58\\x32\\x4a\\x68\\x62\\x6d\\x35\\x6c\\x63\\x6c\\x39\\x6a\\x62\\x33\\x56\\x75\\x64\\x47\\x56\\x79\\x58\\x7a\\x45\\x31\\x4d\\x44\\x41\\x3d\",\"\\u0063\\u0032\\u0056\\u0030\\u0051\\u0032\\u0039\\u0076\\u0061\\u0032\\u006c\\u006c\",\"\\u004f\\u0031\\u0039\\u0032\\u0059\\u0054\\u0030\\u0078\\u004d\\u007a\\u0074\\u0066\\u0058\\u0032\\u0035\\u0068\\u0050\\u0051\\u003d\\u003d\",\"\\x4f\\x33\\x52\\x76\\x63\\x46\\x39\\x69\\x59\\x57\\x35\\x75\\x5a\\x58\\x4a\\x66\\x59\\x32\\x39\\x31\\x62\\x6e\\x52\\x6c\\x63\\x6c\\x38\\x78\\x4e\\x54\\x41\\x77\\x50\\x51\\x3d\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x73\\x61\\x58\\x4e\\x30\\x4c\\x57\\x6c\\x30\\x5a\\x57\\x31\\x38\\x66\\x43\\x35\\x6d\\x5a\\x57\\x51\\x74\\x5a\\x47\\x56\\x30\\x59\\x53\\x31\\x70\\x62\\x6d\\x5a\\x76\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x6d\\x62\\x32\\x35\\x30\\x4c\\x58\\x68\\x32\\x61\\x53\\x35\\x6d\\x5a\\x57\\x51\\x74\\x63\\x47\\x46\\x79\\x64\\x43\\x31\\x6c\\x62\\x32\\x35\\x6c\",\"\\u0064\\u0047\\u0056\\u0034\\u0064\\u0041\\u003d\\u003d\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x77\\x59\\x58\\x4a\\x30\\x4c\\x58\\x4a\\x76\\x64\\x33\\x4d\\x67\\x62\\x47\\x6b\\x3d\"],0x15),_0x473b=function(User,Title){var Link,Intro;Igd_yn0(User=User-0x0,Link=_0x5ae9[User]);if(_0x473b.PzKFzN===void 0x0){Igd_yn0(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;Igd_yn0(Title=User(),Link=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x5ae9=0x0,_0x473b,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x473b=_0x5ae9%0x4?_0x473b*0x40+data:data,_0x5ae9++%0x4)?Intro+=String.fromCharCode(0xff&_0x473b>>(-0x2*_0x5ae9&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x473b.fRNVcM=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x5ae9=Title.length;Intro<_0x5ae9;Intro++)Link+=\"\\u0025\"+(\"\\x30\\x30\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x473b.wKPIIj={},_0x473b.PzKFzN=!0x0)}Igd_yn0(Intro=_0x473b.wKPIIj[User],Intro===void 0x0?(Link=_0x473b.fRNVcM(Link),_0x473b.wKPIIj[User]=Link):Link=Intro);return Link},eval(String(source[_0x473b(\"\\x30\\x78\\x30\")])),eval(String(java[_0x473b(\"\\u0030\\u0078\\u0031\")](cache_api+_0x473b(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x473b(\"\\u0030\\u0078\\u0033\")](cache[_0x473b(\"\\u0030\\u0078\\u0034\")](java[_0x473b(\"\\x30\\x78\\x35\")](Get(_0x473b(\"\\u0030\\u0078\\u0036\"))+_0x473b(\"\\u0030\\u0078\\u0037\")))[_0x473b(\"\\x30\\x78\\x38\")](_0x473b(\"\\x30\\x78\\x39\")+Get(_0x473b(\"\\u0030\\u0078\\u0036\")),_0x473b(\"\\u0030\\u0078\\u0039\")+baseUrl)),Option={method:_0x473b(\"\\x30\\x78\\x61\"),headers:Headers});if(!(\"\\u007a\\u0054\\u0079\\u006b\\u0033\\u0036\\u0074\" in uzck9iz)&&User==!![]){var list,next,next_1,searchkey;Account=cache[_0x473b(\"\\x30\\x78\\x34\")](java[_0x473b(\"\\u0030\\u0078\\u0035\")](Get(_0x473b(\"\\x30\\x78\\x36\"))+_0x473b(\"\\u0030\\u0078\\u0062\")))&&String(cache[_0x473b(\"\\x30\\x78\\x34\")](java[_0x473b(\"\\x30\\x78\\x35\")](Get(_0x473b(\"\\x30\\x78\\x36\"))+_0x473b(\"\\x30\\x78\\x62\"))))[_0x473b(\"\\x30\\x78\\x63\")]>0x0?cache[_0x473b(\"\\x30\\x78\\x34\")](java[_0x473b(\"\\u0030\\u0078\\u0035\")](Get(_0x473b(\"\\x30\\x78\\x36\"))+_0x473b(\"\\x30\\x78\\x62\"))):Map(_0x473b(\"\\x30\\x78\\x64\"));if(!(\"\\x46\\x56\\x63\\x4e\\x69\\x75\\x6a\" in uzck9iz)&&!cookie[_0x473b(\"\\x30\\x78\\x65\")](baseUrl)[_0x473b(\"\\u0030\\u0078\\u0066\")](_0x473b(\"\\x30\\x78\\x31\\x30\"))&&!String(Account)[_0x473b(\"\\x30\\x78\\x63\")]>0x0){java[_0x473b(\"\\x30\\x78\\x31\\x31\")](\"\",Get(_0x473b(\"\\x30\\x78\\x36\"))+_0x473b(\"\\u0030\\u0078\\u0031\\u0032\"),\"\")}let ck=cookie[_0x473b(\"\\u0030\\u0078\\u0065\")](baseUrl),na=ck[_0x473b(\"\\x30\\x78\\x66\")](_0x473b(\"\\u0030\\u0078\\u0031\\u0033\"))?\"\\u0059\":\"\\x4e\",top=cookie[_0x473b(\"\\u0030\\u0078\\u0031\\u0034\")](baseUrl,_0x473b(\"\\x30\\x78\\x31\\x35\"))>0x0?parseInt(cookie[_0x473b(\"\\u0030\\u0078\\u0031\\u0034\")](baseUrl,_0x473b(\"\\x30\\x78\\x31\\x35\"))):0x0;Igd_yn0(top++,cookie[_0x473b(\"\\x30\\x78\\x31\\x36\")](baseUrl,ck+_0x473b(\"\\u0030\\u0078\\u0031\\u0037\")+na+_0x473b(\"\\u0030\\u0078\\u0031\\u0038\")+top),list=java[_0x473b(\"\\u0030\\u0078\\u0031\\u0039\")](_0x473b(\"\\u0030\\u0078\\u0031\\u0061\")));for(i=0x0;i", + "bookUrl": "url", + "checkKeyWord": "妖神记", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x3ab7,_0x5c8d,User,Title,Link,Intro,data,Headers,Option;function DR1sz2b(_0x3ab7,_0x5c8d,User){for(User=0x0;User<_0x5c8d;User++)_0x3ab7.push(_0x3ab7.shift());return _0x3ab7}function JQ0SZD(){}y2Zkpf(_0x3ab7=DR1sz2b([\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\x65\\x33\\x74\\x48\\x5a\\x58\\x51\\x6f\\x4a\\x33\\x56\\x79\\x62\\x43\\x63\\x70\\x66\\x58\\x30\\x76\\x5a\\x48\\x6c\\x75\\x59\\x57\\x31\\x70\\x59\\x79\\x39\\x31\\x63\\x32\\x56\\x79\\x4c\\x33\\x4e\\x31\\x59\\x6e\\x4e\\x6a\\x63\\x6d\\x6c\\x77\\x64\\x47\\x6c\\x76\\x62\\x6a\\x39\\x77\\x59\\x57\\x64\\x6c\\x50\\x54\\x45\\x3d\",\"\\x61\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\x53\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\u0063\\u0032\\u0056\\u0073\\u005a\\u0057\\u004e\\u0030\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x77\\x59\\x57\\x52\\x6b\\x61\\x57\\x35\\x6e\\x4c\\x58\\x67\\x75\\x5a\\x6d\\x56\\x6b\\x4c\\x58\\x42\\x68\\x63\\x6e\\x51\\x74\\x63\\x6d\\x39\\x33\\x63\\x79\\x35\\x6d\\x5a\\x57\\x51\\x74\\x62\\x47\\x6c\\x75\\x5a\\x53\\x31\\x30\\x62\\x33\\x41\\x3d\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x6d\\x62\\x33\\x4a\\x74\\x4c\\x57\\x4e\\x76\\x62\\x58\\x41\\x3d\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\x64\\x6d\\x46\\x73\\x64\\x57\\x55\\x3d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\u0034\\u0034\\u0043\\u0051\\u0035\\u0070\\u0053\\u0032\\u0036\\u004a\\u0065\\u0050\\u0035\\u006f\\u002b\\u0051\\u0035\\u0036\\u0053\\u0036\\u0034\\u0034\\u0043\\u0052\\u0043\\u0067\\u0072\\u0069\\u006c\\u0049\\u002f\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u004a\\u004d\\u004b\\u0034\\u0070\\u0053\\u004c\\u0034\\u0070\\u0053\\u004c\\u0043\\u0067\\u003d\\u003d\",\"\\u0043\\u0075\\u004b\\u0055\\u0069\\u002b\\u004b\\u0055\\u0069\\u0077\\u003d\\u003d\",\"\\u0043\\u0075\\u004b\\u0064\\u0070\\u004f\\u002b\\u0034\\u006a\\u002b\\u0057\\u0033\\u0073\\u0075\\u0061\\u0033\\u0075\\u002b\\u0057\\u004b\\u006f\\u004f\\u0061\\u0055\\u0074\\u0075\\u0069\\u0058\\u006a\\u002b\\u004b\\u0064\\u0070\\u004f\\u002b\\u0034\\u006a\\u0077\\u0072\\u0069\\u006c\\u0049\\u0076\\u0069\\u006c\\u0049\\u0073\\u003d\",\"\\x43\\x75\\x4b\\x55\\x6c\\x2b\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x6d\\x77\\x3d\\x3d\",\"\\u0065\\u0079\\u004a\\u0069\\u0062\\u0032\\u0052\\u0035\\u0049\\u006a\\u006f\\u0069\\u005a\\u0047\\u0046\\u0030\\u0059\\u0055\\u006c\\u006b\\u0063\\u007a\\u0030\\u003d\",\"\\u004a\\u006e\\u0052\\u0035\\u0063\\u0047\\u0055\\u0039\\u004d\\u0053\\u0049\\u0073\\u0049\\u006d\\u0068\\u006c\\u0059\\u0057\\u0052\\u006c\\u0063\\u006e\\u004d\\u0069\\u004f\\u006e\\u0073\\u0069\\u0051\\u0032\\u0039\\u0075\\u0064\\u0047\\u0056\\u0075\\u0064\\u0043\\u0031\\u0055\\u0065\\u0058\\u0042\\u006c\\u0049\\u006a\\u006f\\u0069\\u0059\\u0058\\u0042\\u0077\\u0062\\u0047\\u006c\\u006a\\u0059\\u0058\\u0052\\u0070\\u0062\\u0032\\u0034\\u0076\\u0065\\u0043\\u0031\\u0033\\u0064\\u0033\\u0063\\u0074\\u005a\\u006d\\u0039\\u0079\\u0062\\u0053\\u0031\\u0031\\u0063\\u006d\\u0078\\u006c\\u0062\\u006d\\u004e\\u0076\\u005a\\u0047\\u0056\\u006b\\u0049\\u006e\\u0030\\u0073\\u0049\\u006d\\u0031\\u006c\\u0064\\u0047\\u0068\\u0076\\u005a\\u0043\\u0049\\u0036\\u0049\\u0043\\u004a\\u0051\\u0054\\u0031\\u004e\\u0055\\u0049\\u006e\\u0030\\u003d\",\"\\u004c\\u0032\\u0052\\u0035\\u0062\\u006d\\u0046\\u0074\\u0061\\u0057\\u004d\\u0076\\u0064\\u0058\\u004e\\u006c\\u0063\\u0069\\u0039\\u007a\\u0064\\u0057\\u004a\\u007a\\u0059\\u0033\\u004a\\u0070\\u0063\\u0048\\u0052\\u0070\\u0062\\u0032\\u0035\\u0049\\u0059\\u0057\\u0035\\u006b\\u0062\\u0047\\u0055\\u0073\",\"\\u0043\\u0075\\u004b\\u005a\\u006f\\u002b\\u002b\\u0034\\u006a\\u002b\\u0057\\u0033\\u0073\\u0075\\u0057\\u0050\\u006c\\u0075\\u0061\\u0032\\u0069\\u004f\\u0061\\u0055\\u0074\\u0075\\u0069\\u0058\\u006a\\u002b\\u004b\\u005a\\u006f\\u002b\\u002b\\u0034\\u006a\\u0077\\u0072\\u0069\\u006c\\u0049\\u0076\\u0069\\u006c\\u0049\\u0073\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x6a\\x62\\x32\\x77\\x74\\x65\\x48\\x4d\\x32\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x77\\x59\\x57\\x52\\x6b\\x61\\x57\\x35\\x6e\\x49\\x47\\x45\\x75\\x5a\\x6d\\x56\\x6b\\x4c\\x57\\x4a\\x30\\x62\\x6e\\x4d\\x74\\x61\\x57\\x35\\x6d\\x62\\x77\\x3d\\x3d\",\"\\x4c\\x6d\\x5a\\x6c\\x5a\\x43\\x31\\x6a\\x62\\x32\\x77\\x74\\x62\\x57\\x51\\x32\\x4c\\x6a\\x49\\x3d\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\u0062\\u0057\\u0046\\u0030\\u0059\\u0032\\u0067\\u003d\",\"\\x63\\x32\\x56\\x30\\x64\\x47\\x78\\x6c\",\"\\u004a\\u0044\\u0045\\u0067\",\"\\u0063\\u0047\\u0046\\u006b\\u0055\\u0033\\u0052\\u0068\\u0063\\u006e\\u0051\\u003d\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\x64\\x58\\x4a\\x73\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\x49\\x6c\\x4a\\x6c\\x5a\\x6d\\x56\\x79\\x5a\\x58\\x49\\x69\\x4f\\x69\\x49\\x3d\",\"\\x52\\x30\\x56\\x55\",\"\\u0059\\u0058\\u0056\\u0030\\u0061\\u0047\\u0039\\u0079\",\"\\x65\\x47\\x6c\\x68\\x62\\x32\\x68\\x68\\x62\\x6a\\x49\\x7a\\x4d\\x51\\x3d\\x3d\",\"\\u0051\\u0057\\u004e\\u006a\\u0062\\u0033\\u0056\\u0075\\u0064\\u0046\\u0038\\u0078\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\u0036\\u004c\\u0053\\u006d\\u0035\\u0059\\u002b\\u0033\\u0037\\u0037\\u0079\\u0061\",\"\\x5a\\x32\\x56\\x30\\x51\\x32\\x39\\x76\\x61\\x32\\x6c\\x6c\",\"\\x61\\x57\\x35\\x6a\\x62\\x48\\x56\\x6b\\x5a\\x58\\x4d\\x3d\",\"\\x58\\x32\\x64\\x68\\x50\\x51\\x3d\\x3d\",\"\\x64\\x32\\x56\\x69\\x56\\x6d\\x6c\\x6c\\x64\\x77\\x3d\\x3d\",\"\\u004c\\u0033\\u0056\\u007a\\u005a\\u0058\\u0049\\u0076\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0034\\u003d\",\"\\u0064\\u0058\\u004e\\u006c\\u0063\\u0067\\u003d\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\\u0053\\u0032\\u0056\\u0035\",\"\\u0064\\u0047\\u0039\\u0077\\u0058\\u0032\\u004a\\u0068\\u0062\\u006d\\u0035\\u006c\\u0063\\u006c\\u0039\\u006a\\u0062\\u0033\\u0056\\u0075\\u0064\\u0047\\u0056\\u0079\\u0058\\u007a\\u0045\\u0031\\u004d\\u0044\\u0041\\u003d\",\"\\u0063\\u0032\\u0056\\u0030\\u0051\\u0032\\u0039\\u0076\\u0061\\u0032\\u006c\\u006c\",\"\\u004f\\u0031\\u0039\\u0032\\u0059\\u0054\\u0030\\u0078\\u004d\\u007a\\u0074\\u0066\\u0058\\u0032\\u0035\\u0068\\u0050\\u0051\\u003d\\u003d\",\"\\u004f\\u0033\\u0052\\u0076\\u0063\\u0046\\u0039\\u0069\\u0059\\u0057\\u0035\\u0075\\u005a\\u0058\\u004a\\u0066\\u0059\\u0032\\u0039\\u0031\\u0062\\u006e\\u0052\\u006c\\u0063\\u006c\\u0038\\u0078\\u004e\\u0054\\u0041\\u0077\\u0050\\u0051\\u003d\\u003d\",\"\\x51\\x32\\x39\\x32\\x5a\\x58\\x49\\x3d\",\"\\x59\\x6d\\x39\\x76\\x61\\x31\\x56\\x79\\x62\\x41\\x3d\\x3d\",\"\\x56\\x6d\\x46\\x73\\x64\\x57\\x55\\x3d\",\"\\u0062\\u0033\\u004a\\u0070\\u005a\\u0032\\u006c\\u0075\\u0054\\u006d\\u0046\\u0074\\u005a\\u0051\\u003d\\u003d\",\"\\u0062\\u006d\\u0046\\u0074\\u005a\\u0051\\u003d\\u003d\",\"\\x63\\x33\\x56\\x69\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\",\"\\x63\\x6d\\x56\\x68\\x5a\\x45\\x4e\\x76\\x62\\x6d\\x5a\\x70\\x5a\\x77\\x3d\\x3d\",\"\\u005a\\u0033\\u004a\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\u0061\\u0032\\u006c\\u0075\\u005a\\u0041\\u003d\\u003d\",\"\\u0063\\u0048\\u0056\\u0030\",\"\\x65\\x79\\x4a\\x69\\x62\\x32\\x52\\x35\\x49\\x6a\\x6f\\x69\\x5a\\x47\\x46\\x30\\x59\\x55\\x6c\\x6b\\x50\\x51\\x3d\\x3d\",\"\\x49\\x69\\x77\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x44\\x62\\x32\\x35\\x30\\x5a\\x57\\x35\\x30\\x4c\\x56\\x52\\x35\\x63\\x47\\x55\\x69\\x4f\\x69\\x4a\\x68\\x63\\x48\\x42\\x73\\x61\\x57\\x4e\\x68\\x64\\x47\\x6c\\x76\\x62\\x69\\x39\\x34\\x4c\\x58\\x64\\x33\\x64\\x79\\x31\\x6d\\x62\\x33\\x4a\\x74\\x4c\\x58\\x56\\x79\\x62\\x47\\x56\\x75\\x59\\x32\\x39\\x6b\\x5a\\x57\\x51\\x69\\x66\\x53\\x77\\x69\\x62\\x57\\x56\\x30\\x61\\x47\\x39\\x6b\\x49\\x6a\\x6f\\x67\\x49\\x6c\\x42\\x50\\x55\\x31\\x51\\x69\\x66\\x51\\x3d\\x3d\",\"\\x4c\\x32\\x52\\x35\\x62\\x6d\\x46\\x74\\x61\\x57\\x4d\\x76\\x64\\x58\\x4e\\x6c\\x63\\x69\\x39\\x68\\x5a\\x47\\x52\\x55\\x62\\x30\\x5a\\x68\\x64\\x69\\x77\\x3d\"],0x1b),_0x5c8d=function(User,Title){var Link,Intro;y2Zkpf(User=User-0x0,Link=_0x3ab7[User]);if(_0x5c8d.RMWMTu===void 0x0){y2Zkpf(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;y2Zkpf(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x3ab7=0x0,_0x5c8d,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x5c8d=_0x3ab7%0x4?_0x5c8d*0x40+data:data,_0x3ab7++%0x4)?Intro+=String.fromCharCode(0xff&_0x5c8d>>(-0x2*_0x3ab7&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x5c8d.eaYmLt=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x3ab7=Title.length;Intro<_0x3ab7;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x5c8d.lOyiSO={},_0x5c8d.RMWMTu=!0x0)}y2Zkpf(Intro=_0x5c8d.lOyiSO[User],Intro===void 0x0?(Link=_0x5c8d.eaYmLt(Link),_0x5c8d.lOyiSO[User]=Link):Link=Intro);return Link},eval(String(source[_0x5c8d(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x5c8d(\"\\x30\\x78\\x31\")](cache_api+_0x5c8d(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x5c8d(\"\\x30\\x78\\x33\")](cache[_0x5c8d(\"\\x30\\x78\\x34\")](java[_0x5c8d(\"\\x30\\x78\\x35\")](Get(_0x5c8d(\"\\x30\\x78\\x36\"))+_0x5c8d(\"\\x30\\x78\\x37\")))[_0x5c8d(\"\\x30\\x78\\x38\")](_0x5c8d(\"\\u0030\\u0078\\u0039\")+Get(_0x5c8d(\"\\x30\\x78\\x36\")),_0x5c8d(\"\\x30\\x78\\x39\")+baseUrl)),Option={method:_0x5c8d(\"\\u0030\\u0078\\u0061\"),headers:Headers});if(!(\"\\u0043\\u0043\\u006c\\u0031\\u0062\\u0071\" in JQ0SZD)&&String(book[_0x5c8d(\"\\x30\\x78\\x62\")])!==_0x5c8d(\"\\u0030\\u0078\\u0063\")){var list,date;Account=cache[_0x5c8d(\"\\x30\\x78\\x34\")](java[_0x5c8d(\"\\u0030\\u0078\\u0035\")](Get(_0x5c8d(\"\\u0030\\u0078\\u0036\"))+_0x5c8d(\"\\u0030\\u0078\\u0064\")))&&String(cache[_0x5c8d(\"\\u0030\\u0078\\u0034\")](java[_0x5c8d(\"\\x30\\x78\\x35\")](Get(_0x5c8d(\"\\x30\\x78\\x36\"))+_0x5c8d(\"\\u0030\\u0078\\u0064\"))))[_0x5c8d(\"\\x30\\x78\\x65\")]>0x0?cache[_0x5c8d(\"\\u0030\\u0078\\u0034\")](java[_0x5c8d(\"\\u0030\\u0078\\u0035\")](Get(_0x5c8d(\"\\u0030\\u0078\\u0036\"))+_0x5c8d(\"\\x30\\x78\\x64\"))):Map(_0x5c8d(\"\\x30\\x78\\x66\"));if(!(\"\\x62\\x4f\\x72\\x69\\x44\\x44\" in JQ0SZD)&&!cookie[_0x5c8d(\"\\x30\\x78\\x31\\x30\")](baseUrl)[_0x5c8d(\"\\u0030\\u0078\\u0031\\u0031\")](_0x5c8d(\"\\x30\\x78\\x31\\x32\"))&&!String(Account)[_0x5c8d(\"\\u0030\\u0078\\u0065\")]>0x0){java[_0x5c8d(\"\\x30\\x78\\x31\\x33\")](\"\",Get(_0x5c8d(\"\\u0030\\u0078\\u0036\"))+_0x5c8d(\"\\u0030\\u0078\\u0031\\u0034\"),\"\")}if(!(\"\\u006f\\u006a\\u004f\\u0046\\u0072\\u0069\\u004c\" in JQ0SZD)&&!cookie[_0x5c8d(\"\\u0030\\u0078\\u0031\\u0030\")](baseUrl)[_0x5c8d(\"\\x30\\x78\\x31\\x31\")](_0x5c8d(\"\\x30\\x78\\x31\\x35\"))&&String(Account)[_0x5c8d(\"\\x30\\x78\\x65\")]>0x0){y2Zkpf(eval(String(source[_0x5c8d(\"\\u0030\\u0078\\u0030\")])),Login())}let ck=cookie[_0x5c8d(\"\\x30\\x78\\x31\\x30\")](baseUrl),na=ck[_0x5c8d(\"\\x30\\x78\\x31\\x31\")](_0x5c8d(\"\\u0030\\u0078\\u0031\\u0035\"))?\"\\x59\":\"\\u004e\",top=cookie[_0x5c8d(\"\\u0030\\u0078\\u0031\\u0036\")](baseUrl,_0x5c8d(\"\\u0030\\u0078\\u0031\\u0037\"))>0x0?parseInt(cookie[_0x5c8d(\"\\x30\\x78\\x31\\x36\")](baseUrl,_0x5c8d(\"\\u0030\\u0078\\u0031\\u0037\"))):0x0;y2Zkpf(top++,cookie[_0x5c8d(\"\\x30\\x78\\x31\\x38\")](baseUrl,ck+_0x5c8d(\"\\x30\\x78\\x31\\x39\")+na+_0x5c8d(\"\\u0030\\u0078\\u0031\\u0061\")+top));if(!(\"\\x79\\x5a\\x50\\x68\\x46\\x41\" in JQ0SZD)&&String(Account)[_0x5c8d(\"\\x30\\x78\\x65\")]>0x0){var SC,BN,Bookname;let dataId=String(cache[_0x5c8d(\"\\x30\\x78\\x34\")](java[_0x5c8d(\"\\u0030\\u0078\\u0035\")](_0x5c8d(\"\\u0030\\u0078\\u0031\\u0062\")+book[_0x5c8d(\"\\x30\\x78\\x31\\x63\")])))[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a\\u0063\\u006f\\u006d\\u0069\\u0063\\u005c\\u002f\\u0028\\u005c\\u0064\\u002b\\u0029\\u005c\\u002f\\u002e\\u002a\",\"\"),\"\\x24\\x31\"),value=cache[_0x5c8d(\"\\x30\\x78\\x34\")](java[_0x5c8d(\"\\x30\\x78\\x35\")](_0x5c8d(\"\\x30\\x78\\x31\\x64\")+book[_0x5c8d(\"\\u0030\\u0078\\u0031\\u0063\")]));y2Zkpf(SC=cache[_0x5c8d(\"\\x30\\x78\\x34\")](java[_0x5c8d(\"\\u0030\\u0078\\u0035\")](book[_0x5c8d(\"\\x30\\x78\\x31\\x65\")]+Account+dataId))?cache[_0x5c8d(\"\\x30\\x78\\x34\")](java[_0x5c8d(\"\\x30\\x78\\x35\")](book[_0x5c8d(\"\\u0030\\u0078\\u0031\\u0065\")]+Account+dataId)):\"\",BN=book[_0x5c8d(\"\\u0030\\u0078\\u0031\\u0066\")],Bookname=BN[_0x5c8d(\"\\u0030\\u0078\\u0065\")]>=0x3c?BN[_0x5c8d(\"\\x30\\x78\\x32\\x30\")](0x0,0xe)+\"\\x0a\"+BN[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0030\")](0xe,0x1d)+\"\\x0a\"+BN[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0030\")](0x1d,0x2c)+\"\\x0a\"+BN[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0030\")](0x2c,0x3b)+\"\\x0a\"+BN[_0x5c8d(\"\\x30\\x78\\x32\\x30\")](0x3b):BN[_0x5c8d(\"\\x30\\x78\\x65\")]>=0x2d?BN[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0030\")](0x0,0xe)+\"\\u000a\"+BN[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0030\")](0xe,0x1d)+\"\\x0a\"+BN[_0x5c8d(\"\\x30\\x78\\x32\\x30\")](0x1d,0x2c)+\"\\u000a\"+BN[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0030\")](0x3b):BN[_0x5c8d(\"\\u0030\\u0078\\u0065\")]>=0x1e?BN[_0x5c8d(\"\\x30\\x78\\x32\\x30\")](0x0,0xe)+\"\\x0a\"+BN[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0030\")](0xe,0x1d)+\"\\u000a\"+BN[_0x5c8d(\"\\x30\\x78\\x32\\x30\")](0x1d):BN[_0x5c8d(\"\\u0030\\u0078\\u0065\")]>=0xf?BN[_0x5c8d(\"\\x30\\x78\\x32\\x30\")](0x0,0xe)+\"\\x0a\"+BN[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0030\")](0xe):BN);if(book[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0031\")]&&book[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0032\")]>0x0&&SC[_0x5c8d(\"\\u0030\\u0078\\u0031\\u0031\")](\"\\x79\")&&!new RegExp(\"\\u005e✔\\u005c\\u002c\",\"\")[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0033\")](book[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0034\")])){book[_0x5c8d(\"\\x30\\x78\\x32\\x34\")]=\"✔\\x2c\"+book[_0x5c8d(\"\\x30\\x78\\x32\\x34\")]}if(book[_0x5c8d(\"\\x30\\x78\\x32\\x31\")]&&book[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0032\")]>0x0&&!SC[_0x5c8d(\"\\x30\\x78\\x31\\x31\")](\"\\x79\")&&new RegExp(\"\\u005e✔\\u005c\\u002c\",\"\")[_0x5c8d(\"\\x30\\x78\\x32\\x33\")](book[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0034\")])){cache[_0x5c8d(\"\\x30\\x78\\x32\\x35\")](java[_0x5c8d(\"\\x30\\x78\\x35\")](book[_0x5c8d(\"\\x30\\x78\\x31\\x65\")]+Account+dataId),\"\\x79\")}if(book[_0x5c8d(\"\\x30\\x78\\x32\\x31\")]&&book[_0x5c8d(\"\\x30\\x78\\x32\\x32\")]>0x0&&!SC[_0x5c8d(\"\\u0030\\u0078\\u0031\\u0031\")](\"\\x79\")){let option=_0x5c8d(\"\\x30\\x78\\x32\\x36\")+dataId+_0x5c8d(\"\\x30\\x78\\x32\\x37\"),url=Get(_0x5c8d(\"\\u0030\\u0078\\u0036\"))+_0x5c8d(\"\\u0030\\u0078\\u0032\\u0038\")+option;if(!new RegExp(\"\\x5e✔\\x5c\\x2c\",\"\")[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0033\")](book[_0x5c8d(\"\\x30\\x78\\x32\\x34\")])){var J;y2Zkpf(java[_0x5c8d(\"\\x30\\x78\\x32\\x39\")](url),book[_0x5c8d(\"\\x30\\x78\\x32\\x34\")]=\"✔\\x2c\"+book[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0034\")],scurl=_0x5c8d(\"\\u0030\\u0078\\u0032\\u0061\"),scres=java[_0x5c8d(\"\\x30\\x78\\x32\\x39\")](scurl),J=org[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0062\")][_0x5c8d(\"\\x30\\x78\\x32\\x63\")][_0x5c8d(\"\\x30\\x78\\x33\")](scres),cache[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0035\")](java[_0x5c8d(\"\\x30\\x78\\x35\")](_0x5c8d(\"\\x30\\x78\\x31\\x64\")+book[_0x5c8d(\"\\x30\\x78\\x31\\x63\")]),J[_0x5c8d(\"\\x30\\x78\\x32\\x64\")](_0x5c8d(\"\\x30\\x78\\x32\\x65\"))[0x0][_0x5c8d(\"\\x30\\x78\\x32\\x64\")](_0x5c8d(\"\\u0030\\u0078\\u0032\\u0066\"))[_0x5c8d(\"\\x30\\x78\\x33\\x30\")](_0x5c8d(\"\\u0030\\u0078\\u0033\\u0031\"))),cache[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0035\")](java[_0x5c8d(\"\\u0030\\u0078\\u0035\")](book[_0x5c8d(\"\\u0030\\u0078\\u0031\\u0065\")]+Account+dataId),\"\\u0079\"),login(Put(JSON[_0x5c8d(\"\\x30\\x78\\x33\\x32\")](_0x5c8d(\"\\u0030\\u0078\\u0033\\u0033\")+Bookname+_0x5c8d(\"\\x30\\x78\\x33\\x34\")+_0x5c8d(\"\\x30\\x78\\x33\\x35\")+_0x5c8d(\"\\u0030\\u0078\\u0033\\u0036\")))))}}if(book[_0x5c8d(\"\\x30\\x78\\x32\\x31\")]&&book[_0x5c8d(\"\\x30\\x78\\x32\\x32\")]<0x1&&SC[_0x5c8d(\"\\x30\\x78\\x31\\x31\")](\"\\u0079\")&&value){let option=_0x5c8d(\"\\u0030\\u0078\\u0033\\u0037\")+value+_0x5c8d(\"\\x30\\x78\\x33\\x38\"),url=Get(_0x5c8d(\"\\u0030\\u0078\\u0036\"))+_0x5c8d(\"\\u0030\\u0078\\u0033\\u0039\")+option;y2Zkpf(java[_0x5c8d(\"\\u0030\\u0078\\u0032\\u0039\")](url),cache[_0x5c8d(\"\\x30\\x78\\x32\\x35\")](java[_0x5c8d(\"\\u0030\\u0078\\u0035\")](book[_0x5c8d(\"\\x30\\x78\\x31\\x65\")]+Account+dataId),\"\\x6e\"),login(Put(JSON[_0x5c8d(\"\\x30\\x78\\x33\\x32\")](_0x5c8d(\"\\u0030\\u0078\\u0033\\u0033\")+Bookname+_0x5c8d(\"\\x30\\x78\\x33\\x34\")+_0x5c8d(\"\\u0030\\u0078\\u0033\\u0061\")+_0x5c8d(\"\\x30\\x78\\x33\\x36\")))))}}y2Zkpf(list=java[_0x5c8d(\"\\x30\\x78\\x33\\x62\")](_0x5c8d(\"\\x30\\x78\\x33\\x63\")),date=String(java[_0x5c8d(\"\\u0030\\u0078\\u0033\\u0062\")](_0x5c8d(\"\\x30\\x78\\x33\\x64\"))[_0x5c8d(\"\\u0030\\u0078\\u0033\\u0065\")]())[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"更新\",\"\"),\"\"));for(i=list[_0x5c8d(\"\\x30\\x78\\x65\")]-0x1;i>=0x0;i--){y2Zkpf(title=list[i][_0x5c8d(\"\\x30\\x78\\x33\\x65\")](),order=title[_0x5c8d(\"\\u0030\\u0078\\u0033\\u0066\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\")),title=Get(_0x5c8d(\"\\u0030\\u0078\\u0034\\u0030\"))==!![]?String(title)[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005c\\u0073\\u002d\\u005c\\u0073\\u007c\\u002d\",\"\\x67\"),\"\\x20\")[_0x5c8d(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x73\\x2b\",\"\"),\"\\x20\")[_0x5c8d(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x28\\x7c\\x5c\\x73\\x29第\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\x24\\x31\")[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005b\\u005e\\u005c\\u0073\\u005d\",\"\"),_0x5c8d(\"\\x30\\x78\\x34\\x31\"))[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\u0024\\u0031\")[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a第\\x2e\\x2a\\x28\\x5c\\x64\\x2b\\x29\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\x24\\x31\")[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\"),title[_0x5c8d(\"\\x30\\x78\\x33\\x66\")](new RegExp(\"\\u005c\\u0064\\u002b\",\"\"))?order[0x1][_0x5c8d(\"\\x30\\x78\\x34\\x32\")](0x3,\"\\u0030\"):\"\\u0024\\u0031\"):title,title=String(title)[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x28\\x2d\\x7c\\x5f\\x7c\\x5c\\x73\\x2d\\x5c\\x73\\x29\",\"\\u0067\"),\"\\u0020\")[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\\u0029\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\u0024\\u0031\")[_0x5c8d(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x5c\\x73\",\"\\u0067\"),\"\\x20\"),push(data,{title:i==0x0?title+\"〔\"+date+\"〕\":title,link:Get(_0x5c8d(\"\\x30\\x78\\x36\"))+list[i][_0x5c8d(\"\\u0030\\u0078\\u0033\\u0030\")](_0x5c8d(\"\\x30\\x78\\x34\\x33\"))+\"\\u002c\"+JSON[_0x5c8d(\"\\x30\\x78\\x33\\x32\")](Option)}))}data=JSON[_0x5c8d(\"\\x30\\x78\\x33\\x32\")](data)}else{data=Data1()}function y2Zkpf(){y2Zkpf=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "if (!String(book.bookUrl).includes(Get('url'))) {\n book.bookUrl = String(book.bookUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n book.tocUrl = String(book.tocUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n java.refreshTocUrl();\n}" + }, + "searchUrl": "\neval(String(source.loginUrl));\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n java.put(java.md5Encode16(Get('url') + \"searchkey\"), e);\n return Get('url') + '/search?type=1&searchString=' + e + '&page={{page}}';\n}(key));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画", + "bookSourceName": "🎨Komiic漫画💓", + "bookSourceType": 2, + "bookSourceUrl": "https://komiic.com", + "bookUrlPattern": "https://.*/api/query,.*comicById.*", + "concurrentRate": "10/5000", + "customOrder": 123, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\nAccount = (cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0) ? cache.get(java.md5Encode16(Get('url') + \"Account_1\")) : Map('账号:');\nif(String(Account).length > 0) {\n if (cache.get(java.md5Encode16(Get('url') + \"token\")) && String(cache.get(java.md5Encode16(Get('url') + \"token\"))).length !== 0 && ImageLimit() !== 'undefined') {\n let L = Login_1();\n login(Put(JSON.stringify('【登录提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + '\\n' + Account + '\\n┋┋' + '\\n❤️登录成功❤️\\n┋┋' + '\\n圖片讀取/上限:' + L[1] + '/' + L[0] + '\\n┋┋' + '\\n重置时间:' + secondsToHours(L[2]) + '後重置' + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n } else {\n Login();\n }\n if(cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0) {\n ImageLimit();\n var limit = json.usage + '/' + json.limit;\n exploreUrl.push(explore('✣【' + Account + '】✣', '', 1, 1, false));\n exploreUrl.push(explore(limit, '', 1, 0.25, false));\n //exploreUrl.push(explore('推荐漫画', `{{Get('url')}}/api/query@a{{page}}`, 1, 0.25, false));\n exploreUrl.push(explore('最近阅读', `{{Get('url')}}/api/query@b{{page}}`, 1, 0.25, false));\n exploreUrl.push(explore('✣ 收  藏 ✣', '', 1, 1, false));\n exploreUrl.push(explore('最新加入', `{{Get('url')}}/api/query@c{{page}}`, 1, 0.45, false));\n exploreUrl.push(explore('最近更新', `{{Get('url')}}/api/query@d{{page}}`, 1, 0.45, false));\n exploreUrl.push(explore('未看完', `{{Get('url')}}/api/query@e{{page}}`, 1, 0.25, false));\n exploreUrl.push(explore('未看', `{{Get('url')}}/api/query@f{{page}}`, 1, 0.2, false));\n exploreUrl.push(explore('已看完', `{{Get('url')}}/api/query@g{{page}}`, 1, 0.25, false));\n }\n}\ntype = [\n '最近更新',\n '热门排行',\n '爱心排行'\n];\nallCategory = [\n {\n \"id\": \"\",\n \"name\": \"全部\"\n },\n {\n \"id\": \"1\",\n \"name\": \"爱情\"\n },\n {\n \"id\": \"3\",\n \"name\": \"神鬼\"\n },\n {\n \"id\": \"4\",\n \"name\": \"校园\"\n },\n {\n \"id\": \"5\",\n \"name\": \"搞笑\"\n },\n {\n \"id\": \"6\",\n \"name\": \"生活\"\n },\n {\n \"id\": \"7\",\n \"name\": \"悬疑\"\n },\n {\n \"id\": \"8\",\n \"name\": \"冒险\"\n },\n {\n \"id\": \"10\",\n \"name\": \"职场\"\n },\n {\n \"id\": \"11\",\n \"name\": \"魔幻\"\n },\n {\n \"id\": \"2\",\n \"name\": \"后宫\"\n },\n {\n \"id\": \"12\",\n \"name\": \"魔法\"\n },\n {\n \"id\": \"13\",\n \"name\": \"格斗\"\n },\n {\n \"id\": \"14\",\n \"name\": \"宅男\"\n },\n {\n \"id\": \"15\",\n \"name\": \"励志\"\n },\n {\n \"id\": \"16\",\n \"name\": \"耽美\"\n },\n {\n \"id\": \"17\",\n \"name\": \"科幻\"\n },\n {\n \"id\": \"18\",\n \"name\": \"百合\"\n },\n {\n \"id\": \"19\",\n \"name\": \"治愈\"\n },\n {\n \"id\": \"20\",\n \"name\": \"萌系\"\n },\n {\n \"id\": \"21\",\n \"name\": \"热血\"\n },\n {\n \"id\": \"22\",\n \"name\": \"竞技\"\n },\n {\n \"id\": \"23\",\n \"name\": \"推理\"\n },\n {\n \"id\": \"24\",\n \"name\": \"杂志\"\n },\n {\n \"id\": \"25\",\n \"name\": \"侦探\"\n },\n {\n \"id\": \"26\",\n \"name\": \"伪娘\"\n },\n {\n \"id\": \"27\",\n \"name\": \"美食\"\n },\n {\n \"id\": \"9\",\n \"name\": \"恐怖\"\n },\n {\n \"id\": \"28\",\n \"name\": \"四格\"\n },\n {\n \"id\": \"31\",\n \"name\": \"社会\"\n },\n {\n \"id\": \"32\",\n \"name\": \"历史\"\n },\n {\n \"id\": \"33\",\n \"name\": \"战争\"\n },\n {\n \"id\": \"34\",\n \"name\": \"舞蹈\"\n },\n {\n \"id\": \"35\",\n \"name\": \"武俠\"\n },\n {\n \"id\": \"36\",\n \"name\": \"机战\"\n },\n {\n \"id\": \"37\",\n \"name\": \"音乐\"\n },\n {\n \"id\": \"40\",\n \"name\": \"体育\"\n },\n {\n \"id\": \"42\",\n \"name\": \"黑道\"\n },\n {\n \"id\": \"46\",\n \"name\": \"腐女\"\n }\n];\ntitle = '✣      ✣ 榜  单 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nOption = `{{get('option','0')}}`;\nOption1 = `{{get('option1','0')}}`;\nOption2 = `{{get('option2','0')}}`;\nOption3 = `{{get('option3','0')}}`;\nOption4 = `{{get('option4','0')}}`;\nStatus = `{{get('status',Get('q'))}}`;\nfor (i in type) {\n OrderBy = `{{get('orderBy',${i})}}`;\n url = `{{Get('url')}}/api/query,${Option}${Option1}{{30*(page-1)}}${Option2}${OrderBy}${Option3}${Status}${Option4}`;\n exploreUrl.push(explore(type[i], url, 1, 0.25, false));\n}\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nfor (j in allCategory) {\n OrderBy = `{{get('orderBy',Get('p'))}}`;\n Id = j == 0 ? '' : '\"' + allCategory[j].id + '\"';\n url = `{{Get('url')}}/api/query,${Option}${Id}${Option1}{{30*(page-1)}}${Option2}${OrderBy}${Option3}${Status}${Option4}`;\n exploreUrl.push(explore(allCategory[j].name, url, 1, 0.2, false));\n}\nBID = (allCategory.length % 4) < 1 ? 0 : (4 - (allCategory.length % 4));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.2, false)); \n}\n//exploreUrl.splice(60, 0, explore('', '', 1, 0.2, false));\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0\",\n \"Cookie\": cache.get(java.md5Encode16(Get('url') + \"token\")) || '',\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function get(tag,num) {\n var option = ['{\"body\":{\"operationName\":\"comicByCategories\",\"variables\":{\"categoryId\":\\['];\n var option1 = ['\\],\"pagination\":{\"limit\":30,\"offset\":'];\n var option2 = [',\"orderBy\":\"'];\n var option3 = ['\",\"asc\":false,\"status\":\"'];\n var option4 = ['\"}},\"query\":\"query comicByCategories($categoryId: [ID!]!, $pagination: Pagination!) {\\n comicByCategories(categoryId: $categoryId, pagination: $pagination) {\\n id\\n title\\n status\\n year\\n imageUrl\\n authors {\\n id\\n name\\n __typename\\n }\\n categories {\\n id\\n name\\n __typename\\n }\\n dateUpdated\\n monthViews\\n views\\n favoriteCount\\n lastBookUpdate\\n lastChapterUpdate\\n __typename\\n }\\n}\"},\"headers\":{\"Content-Type\":\"application/json\"},\"method\": \"POST\"}'];\n var hoption1 = ['{\"body\":{\"operationName\":\"comicByIds\",\"variables\":{\"comicIds\":'];\n var hoption2 = ['},\"query\":\"query comicByIds($comicIds: [ID]!) {\\n comicByIds(comicIds: $comicIds) {\\n id\\n title\\n status\\n year\\n imageUrl\\n authors {\\n id\\n name\\n __typename\\n }\\n categories {\\n id\\n name\\n __typename\\n }\\n dateUpdated\\n monthViews\\n views\\n favoriteCount\\n lastBookUpdate\\n lastChapterUpdate\\n __typename\\n }\\n}\"},\"headers\":{\"Content-Type\":\"application/json\"},\"method\": \"POST\"}'];\n orderBy = [\n 'DATE_UPDATED',\n 'VIEWS',\n 'FAVORITE_COUNT'\n ];\n status = [\n '',\n 'ONGOING',\n 'END'\n ];\n orderBy1 = [\n 'FAVORITE_ADDED',\n 'COMIC_DATE_UPDATED'\n ];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction Num(e) {\n e = String(e);\n var num = e.length > 8 ? (e.substring(0, e.length - 8) + \"亿\") : (e.length > 4 ? (e.substring(0, e.length - 4) + \"万\") : e);\n return num;\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}\nfunction secondsToHours(seconds) {\n var hours = Math.floor(seconds / 3600);\n var remainingSeconds = seconds % 3600;\n var minutes = Math.floor(remainingSeconds / 60);\n var remainingSeconds = remainingSeconds % 60;\n return hours + \" 小时 \" + minutes + \" 分钟 \" + remainingSeconds + \" 秒\";\n}", + "lastUpdateTime": 1743130857744, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n { name: \"账号:\", type: \"text\" },\n { name: \"密码:\", type: \"password\" },\n {\n name: \"💡登录账号💡\",\n type: \"button\",\n action: \"Login()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45}\n },\n {\n name: \"💡源站测试💡\",\n type: \"button\",\n action: \"test(1)\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45}\n },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(-1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换进度 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"q(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"连载\", type: \"button\", action: \"q(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"完结\", type: \"button\", action: \"q(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击收藏排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"最新加入\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"最近更新\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n { name: \"༺ˇ»`ʚ 点击标签排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"更新\", type: \"button\", action: \"p(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"爱心\", type: \"button\", action: \"p(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"热门\", type: \"button\", action: \"p(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = '';\nvar LX = '10';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'p': 0,\n 'o': 0,\n 'q': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://komiic.com',\n 'urls': [\n 'https://komiic.com'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == -1) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n if (e == 0) {\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0] + ',' + JSON.stringify(Option));\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫畫');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0]);\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫畫');\n logTime = '【' + name(0) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(original['urls'].length);\n time = new Date().getTime();\n html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n J = org.jsoup.Jsoup.parse(html);\n u = J.select('.jump');\n for (i = 0; i < 6; i++) {\n host = 'https://' + String(u.text().split(' ')[i]);\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].push(host);\n put($$$);\n }\n }\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看');\n}\nfunction name(e) {\n if (e == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '⏲️漫画进度:' + type1($$$.q)) + '\\n┋┋' + ('\\n' + '📚收藏排序:' + type3($$$.o)) + '\\n┋┋' + ('\\n' + '📚标签排序:' + type2($$$.p)) + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci2)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci3)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'];\n $$$['ci2'] = $$$['ci1'];\n $$$['ci1'] = $$$['ci0'];\n $$$['ci0'] = e;\n put($$$);\n test(e);\n}\nw = ['全部','连载','完结'];\nfunction type1(e) {\n if (e == undefined) {\n e = 0;\n }\n return w[e];\n}\nfunction q(e) {\n if (q == undefined) {\n q = result.q;\n }\n if (e == $$$.q) {\n return login('【进度切换提示】' + n(2) + '已经选择此进度,无需更换');\n }\n login('【进度切换提示】' + n(2) + '已经切换到[' + type1(e) + ']进度');\n $$$.q = e;\n return put($$$);\n}\ny = ['加入','更新'];\nfunction type3(e) {\n if (e == undefined) {\n e = 1;\n }\n return y[e];\n}\nfunction o(e) {\n if (o == undefined) {\n o = result.o;\n }\n if (e == $$$.o) {\n return login('【收藏排序提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【收藏排序提示】' + n(2) + '已经切换到[' + type3(e) + ']排序');\n $$$.o = e;\n return put($$$);\n}\nz = ['更新','爱心','热门'];\nfunction type2(e) {\n if (e == undefined) {\n e = 1;\n }\n return z[e];\n}\nfunction p(e) {\n if (p == undefined) {\n p = result.p;\n }\n if (e == $$$.p) {\n return login('【标签排序提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【标签排序提示】' + n(2) + '已经切换到[' + type2(e) + ']排序');\n $$$.p = e;\n return put($$$);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}\nvar imglist = [];\nfunction Login_1() {\n var requestBody = '{\"operationName\":\"getImageLimit\",\"variables\":{},\"query\":\"query getImageLimit {\\\\n getImageLimit {\\\\n limit\\\\n usage\\\\n resetInSeconds\\\\n __typename\\\\n }\\\\n}\"}';\n var headers = {\"Host\":Get('url').replace(/^(https?:)?(\\/\\/)?([^\\/]+).*/, \"$3\"),\"Content-Type\":\"application/json\"};\n var option = {\n \"method\": \"POST\",\n \"body\": String(requestBody),\n \"headers\": headers\n };\n Response = java.ajax(Get('url') + '/api/query,' + JSON.stringify(option));\n if (JSON.parse(Response).data) {\n var json = JSON.parse(Response).data.getImageLimit;\n return [json.limit,json.usage,json.resetInSeconds];\n } else {\n return [];\n }\n}\nvar result = typeof result !== 'undefined' ? result : {};\nfunction Login() {\n var Account = result['账号:'] || Map('账号:');\n var Password = result['密码:'] || Map('密码:');\n if (Account == '' && Password == '') {\n let L = Login_1();\n login((cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0 && L.length > 0) ? (Put(JSON.stringify('【登录提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + '\\n已退出账号:' + cache.get(java.md5Encode16(Get('url') + \"Account_1\")) + '\\n┋┋' + '\\n圖片讀取/上限:' + L[1] + '/' + L[0] + '\\n┋┋' + '\\n重置时间:' + secondsToHours(L[2]) + '後重置' + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛'))) : ('【登录提示】' + '\\n\\n请输入账号和密码'));\n cache.put(java.md5Encode16(Get('url') + \"Account_1\"), '');\n cache.put(java.md5Encode16(Get('url') + \"token\"), '');\n return;\n } else if (Account == '') {\n login('【登录提示】' + '\\n\\n请输入账号');\n return;\n } else if (Password == '') {\n login('【登录提示】' + '\\n\\n请输入密码');\n return;\n } else {\n if (Account.includes(\",\") && LX == '10') {\n var Accounts = Account.split(\",\");\n if (Accounts.length > LX) {\n login('【登录提示】' + '\\n\\n♣️账号数超过限制♣️\\n\\n轮询账号上限为' + LX + '个' + '\\n\\n请删除多余账号,适度使用');\n return;\n }\n for (i = 0; i < Accounts.length; i++) {\n var Account = Accounts[i].trim();\n var requestBody = {\"email\": Account,\"password\":Password};\n var headers = {\"Host\":Get('url').replace(/^(https?:)?(\\/\\/)?([^\\/]+).*/, \"$3\"),\"Content-Type\":\"application/json\"};\n var option = {\n \"method\": \"POST\",\n \"body\": requestBody,\n \"headers\": headers\n };\n Response = java.ajax(Get('url') + '/api/login,' + JSON.stringify(option));\n if (JSON.parse(Response).token) {\n cache.put(java.md5Encode16(Get('url') + \"Account_1\"),Account);\n cache.put(java.md5Encode16(Get('url') + \"token\"),\"komiic-access-token=\"+JSON.parse(Response).token);\n ImageLimit();\n let L = Login_1();\n if (L[0] - L[1] >= img_size) {\n login(Put(JSON.stringify('【登录提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + '\\n' + Account + '\\n┋┋' + '\\n❤️登录成功❤️\\n┋┋' + '\\n圖片讀取/上限:' + L[1] + '/' + L[0] + '\\n┋┋' + '\\n重置时间:' + secondsToHours(L[2]) + '後重置' + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n break;\n } else {\n login(Put(JSON.stringify('【登录提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + '\\n' + Account + '\\n┋┋' + '\\n❤️登录成功❤️\\n┋┋' + '\\n圖片讀取/上限:' + L[1] + '/' + L[0] + '\\n┋┋' + '\\n重置时间:' + secondsToHours(L[2]) + '後重置' + '\\n┋┋' + '\\n剩余圖片讀取数小于' + img_size + '\\n┋┋' + '\\n自动登录下一个账号' + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n if (i == Accounts.length - 1) {\n login('【登录提示】' + '\\n\\n♣️轮询结束♣️\\n\\n所有账号剩余图片读取数都小于' + img_size + '\\n\\n请添加新的账号,或等待重置后再试');\n }\n }\n } else {\n cache.put(java.md5Encode16(Get('url') + \"Account_1\"),'');\n login('【登录提示】' + '\\n\\n♣️登录失败♣️\\n\\n请检查账号:'+ Account);\n }\n }\n } else {\n var requestBody = {\"email\":Account,\"password\":Password};\n var headers = {\"Host\":Get('url').replace(/^(https?:)?(\\/\\/)?([^\\/]+).*/, \"$3\"),\"Content-Type\":\"application/json\"};\n var option = {\n \"method\": \"POST\",\n \"body\": requestBody,\n \"headers\": headers\n };\n Response = java.ajax(Get('url') + '/api/login,' + JSON.stringify(option));\n if (JSON.parse(Response).token) {\n cache.put(java.md5Encode16(Get('url') + \"Account_1\"),Account);\n cache.put(java.md5Encode16(Get('url') + \"token\"),\"komiic-access-token=\"+JSON.parse(Response).token);\n let L = Login_1();\n login(Put(JSON.stringify('【登录提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + '\\n' + Account + '\\n┋┋' + '\\n❤️登录成功❤️\\n┋┋' + '\\n圖片讀取/上限:' + L[1] + '/' + L[0] + '\\n┋┋' + '\\n重置时间:' + secondsToHours(L[2]) + '後重置' + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n } else {\n cache.put(java.md5Encode16(Get('url') + \"Account_1\"),'');\n login('【登录提示】' + '\\n\\n♣️登录失败♣️\\n\\n请检查账号和密码');\n }\n }\n }\n}\nfunction ImageLimit() {\n function Authorization() {\n var requestBody = '{\"operationName\":\"getImageLimit\",\"variables\":{},\"query\":\"query getImageLimit {\\\\n getImageLimit {\\\\n limit\\\\n usage\\\\n resetInSeconds\\\\n __typename\\\\n }\\\\n}\"}';\n var headers = {\"Host\":Get('url').replace(/^(https?:)?(\\/\\/)?([^\\/]+).*/, \"$3\"),\"Content-Type\":\"application/json\"};\n var option = {\n \"method\": \"POST\",\n \"body\": String(requestBody),\n \"headers\": headers\n };\n Response = java.ajax(Get('url') + '/api/query,' + JSON.stringify(option));\n }\n Authorization();\n if (JSON.parse(Response).data.getImageLimit.limit > 300) {\n json = JSON.parse(Response).data.getImageLimit;\n img_size = imglist.length;\n } else {\n if ((typeof result !== 'undefined' ? (result[\"账号:\"] ? result[\"账号:\"] : Map('账号:')) : Map('账号:')) == '') {\n cache.put(java.md5Encode16(Get('url') + \"token\"),\"\");\n json = JSON.parse(Response).data.getImageLimit;\n img_size = imglist.length;\n return 'undefined';\n }\n Login();\n Authorization();\n json = JSON.parse(Response).data.getImageLimit;\n img_size = imglist.length;\n }\n}", + "respondTime": 12043, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace(Get('url'), baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n Account = (cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0) ? cache.get(java.md5Encode16(Get('url') + \"Account_1\")) : Map('账号:');\n var J = org.jsoup.Jsoup.parse(result);\n var list = JSON.parse(result).data.comicById;\n var $2 = element => String(java.getElements(element).text());\n var $3 = element => String(J.select(element).attr('src'));\n url = '';\n var body = '{\"operationName\":\"chapterByComicId\",\"variables\":{\"comicId\":\"' + list.id + '\"},\"query\":\"query chapterByComicId($comicId: ID!) {\\n chaptersByComicId(comicId: $comicId) {\\n id\\n serial\\n type\\n dateCreated\\n dateUpdated\\n size\\n __typename\\n }\\n}\"}';\n var url = Get('url') + '/api/query,{\"body\":' + body + ',\"headers\":{\"Content-Type\":\"application/json\"},\"method\": \"POST\"}';\n var res = java.ajax(url);\n var list1 = JSON.parse(res).data.chaptersByComicId;\n var data1 = [];\n var data2 = [];\n for (i in list1) {\n title = String('第' + list1[i].serial + (list1[i].type == \"book\" ? '卷 (' : '話 (') + list1[i].size + 'p)');\n if (list1[i].type == \"book\") {\n if (data2.length >= 1) {\n data2[data2.length - 1].title = data2[data2.length - 1].title.replace(/〔.*/g, '');\n }\n data2.push({\n 'title': title,\n 'time': list1[i].dateUpdated.replace(/T/g, ' ').replace(/Z/g, '')\n });\n } else {\n data1.push({\n 'title': title,\n 'time': list1[i].dateUpdated.replace(/T/g, ' ').replace(/Z/g, '')\n });\n }\n }\n other = (data2.length > 0 && data1.length > 0) ? ('📋全部目录:\\n[0]章节〔' + data1.length + '话〕\\n[1]分卷〔' + data2.length + '卷〕\\nㅤ\\n') : '';\n var index = book.getVariable(\"custom\") > 0 ? book.getVariable(\"custom\") : '0';\n index = data1.length > 0 ? index : '1';\n var authors = [];\n var authorElements = list.authors;\n for (var j in authorElements) {\n authors.push(String(authorElements[j].name));\n }\n author = authors.join('/').replace(/\\s/g, '');\n var kinds = [];\n var kindElements = list.categories;\n for (var j in kindElements) {\n kinds.push(String(kindElements[j].name));\n }\n s = '✦ ' + Num(list.views) + ',' + '♥ ' + Num(list.favoriteCount);\n k = list.status.replace(/END/g, '完结').replace(/ONGOING/g, '连载') + ',' + list.year + ',' + kinds.join(',').replace(/\\s/g, '');\n t = (book.getVariable(\"custom\") > 0 || data1.length == 0) ? data2[data2.length - 1].time : data1[data1.length - 1].time;\n java.put(\"date\",t);\n t1 = list1[list1.length-1].dateUpdated.replace(/T/g, ' ').replace(/Z/g, '')\n l = (book.getVariable(\"custom\") > 0 || data1.length == 0) ? data2[data2.length - 1].title : data1[data1.length - 1].title;\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[章回期](|\\s)第.*?[章回期]/, '$1').replace(/.*第(\\d+)[章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci0') == 0 ? '〖默认〗' : '〖自选〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n⏲️漫画进度:〖' + (Get('q') == 0 ? '默认' : '自选') + '〗' + w[Get('q')]) + ('\\n📚收藏排序:〖' + (Get('o') == 0 ? '默认' : '自选') + '〗' + y[Get('o')]) + ('\\n📚标签排序:〖' + (Get('p') == 0 ? '默认' : '自选') + '〗' + z[Get('p')]) + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n ImageLimit();\n if (!cache.get(java.md5Encode16(Get('url') + \"token\")) || String(cache.get(java.md5Encode16(Get('url') + \"token\"))).length == 0 || ImageLimit() == 'undefined') {\n var intro1 = '当前帐号:未登录\\nㅤ\\n圖片讀取/上限:' + json.usage + '/' + json.limit + (json.limit <= json.usage ? '(已达限额)' : '') + '\\nㅤ\\n重置时间:' + secondsToHours(json.resetInSeconds) + '後重置';\n } else {\n var intro1 = '当前帐号:' + Account + '\\nㅤ\\n圖片讀取/上限:' + json.usage + '/' + json.limit + (json.limit <= json.usage ? '(已达限额)' : '') + '\\nㅤ\\n重置时间:' + secondsToHours(json.resetInSeconds) + '後重置';\n }\n book = JSON.stringify({\n 'name': list.title,\n 'author': author,\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l + '〔' + t + '〕',\n 'intro': (t != '' ? ('更新时间:' + t1 + '\\nㅤ\\n') : '') + other + intro1 + changeLog,\n 'cover': list.imageUrl,\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\nif (String(book['author']) !== \"xiaohan231\") {\n eval(String(source.loginUrl));\n var img_size = '0';\n imglist=JSON.parse(result).data.imagesByChapterId;\n if (cache.get(java.md5Encode16(Get('url') + \"token\")) && ImageLimit() !== 'undefined') {\n ImageLimit();\n if (json.limit - json.usage < img_size && Map('账号:').includes(\",\")) {\n Login();\n }\n if (json.limit - json.usage < 50 && !Map('账号:').includes(\",\")) {\n Login();\n }\n }\n Account = (cache.get(java.md5Encode16(Get('url') + \"Account_1\")) && String(cache.get(java.md5Encode16(Get('url') + \"Account_1\"))).length > 0) ? cache.get(java.md5Encode16(Get('url') + \"Account_1\")) : Map('账号:');\n comicId = baseUrl.substring(baseUrl.indexOf('comic/') + 6, baseUrl.lastIndexOf('/chapter'));\n chapterId = baseUrl.substring(baseUrl.indexOf('chapter/') + 8, baseUrl.lastIndexOf('/images'));\n if(String(Account).length > 0) {\n let dataId = comicId;\n var SC = cache.get(java.md5Encode16(book.originName + Account + dataId)) ? cache.get(java.md5Encode16(book.originName + Account + dataId)) : '';\n var BN = book.name;\n var Bookname = BN.length >= 60 ? BN.substring(0, 14) + \"\\n\" + BN.substring(14, 29) + \"\\n\" + BN.substring(29, 44) + \"\\n\" + BN.substring(44, 59) + \"\\n\" + BN.substring(59) : (BN.length >= 45 ? BN.substring(0, 14) + \"\\n\" + BN.substring(14, 29) + \"\\n\" + BN.substring(29, 44) + \"\\n\" + BN.substring(59) : (BN.length >= 30 ? BN.substring(0, 14) + \"\\n\" + BN.substring(14, 29) + \"\\n\" + BN.substring(29) : (BN.length >= 15 ? BN.substring(0, 14) + \"\\n\" + BN.substring(14) : BN)));\n if (book.readConfig && book.group > 0 && SC.includes('y') && !/^✔\\,/.test(book.kind)) {\n book.kind = '✔,' + book.kind;\n }\n if (book.readConfig && book.group > 0 && !SC.includes('y') && /^✔\\,/.test(book.kind)) {\n let option = '{\"body\":{\"operationName\":\"addFavorite\",\"variables\":{\"comicId\":\"' + dataId + '\"},\"query\":\"mutation addFavorite($comicId: ID!) {\\n addFavorite(comicId: $comicId) {\\n id\\n comicId\\n dateAdded\\n lastAccess\\n bookReadProgress\\n chapterReadProgress\\n __typename\\n }\\n}\"},\"headers\":{\"Content-Type\":\"application/json\"},\"method\": \"POST\"}';\n let url = Get('url') + '/api/query,' + option;\n java.ajax(url);\n cache.put(java.md5Encode16(book.originName + Account + dataId),'y');\n }\n if (book.readConfig && book.group > 0 && !SC.includes('y')) {\n let option = '{\"body\":{\"operationName\":\"addFavorite\",\"variables\":{\"comicId\":\"' + dataId + '\"},\"query\":\"mutation addFavorite($comicId: ID!) {\\n addFavorite(comicId: $comicId) {\\n id\\n comicId\\n dateAdded\\n lastAccess\\n bookReadProgress\\n chapterReadProgress\\n __typename\\n }\\n}\"},\"headers\":{\"Content-Type\":\"application/json\"},\"method\": \"POST\"}';\n let url = Get('url') + '/api/query,' + option;\n if (!/^✔\\,/.test(book.kind)) {\n java.ajax(url);\n book.kind = '✔,' + book.kind;\n cache.put(java.md5Encode16(book.originName + Account + dataId),'y');\n login(Put(JSON.stringify('【书架提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + Bookname + '\\n┋┋' + '\\n❤️已添加书架❤️\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n }\n }\n if (book.readConfig && book.group < 1 && SC.includes('y')) {\n let option = '{\"body\":{\"operationName\":\"removeFavorite\",\"variables\":{\"comicId\":\"' + dataId + '\"},\"query\":\"mutation removeFavorite($comicId: ID!) {\\n removeFavorite(comicId: $comicId)\\n}\"},\"headers\":{\"Content-Type\":\"application/json\"},\"method\": \"POST\"}';\n let url = Get('url') + '/api/query,' + option;\n if (/^✔\\,/.test(book.kind)) {\n java.ajax(url);\n book.kind = String(book.kind).replace(/^✔\\,/g,'');\n cache.put(java.md5Encode16(book.originName + Account + dataId),'n');\n login(Put(JSON.stringify('【书架提示】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + Bookname + '\\n┋┋' + '\\n♣️已取消书架♣️\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛')));\n }\n }\n }\n option = '{\"body\":{\"operationName\":\"addReadComicHistory\",\"variables\":{\"comicId\":\"' + comicId + '\",\"chapterId\":\"' + chapterId + '\",\"page\":1},\"query\":\"mutation addReadComicHistory($comicId: ID!, $chapterId: ID!, $page: Int!) {\\n addReadComicHistory(comicId: $comicId, chapterId: $chapterId, page: $page) {\\n id\\n comicId\\n chapters {\\n id\\n chapterId\\n page\\n __typename\\n }\\n startDate\\n lastDate\\n chapterType\\n __typename\\n }\\n}\"},\"headers\":{\"Content-Type\":\"application/json\"},\"method\": \"POST\"}';\n url = Get('url') + '/api/query,' + option;\n java.ajax(url);\n var result='';\n for (i in imglist) {\n result +='\\n'\n }\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageStyle": "FULL", + "nextContentUrl": "", + "replaceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0x2c21,_0x4730,User,Title,Link,Intro,data,json,Headers,G7n6GW,fZVQWyW;function soEQBhE(_0x2c21,_0x4730,User){for(User=0x0;User<_0x4730;User++)_0x2c21.push(_0x2c21.shift());return _0x2c21}function bZy19p6(){}mNBaKcs(_0x2c21=soEQBhE([\"\\x35\\x62\\x65\\x79\\x35\\x35\\x79\\x4c\\x35\\x61\\x36\\x4d\",\"\\u0059\\u0032\\u0046\\u0030\\u005a\\u0057\\u0064\\u0076\\u0063\\u006d\\u006c\\u006c\\u0063\\u0077\\u003d\\u003d\",\"\\u0064\\u006d\\u006c\\u006c\\u0064\\u0033\\u004d\\u003d\",\"\\u005a\\u006d\\u0046\\u0032\\u0062\\u0033\\u004a\\u0070\\u0064\\u0047\\u0056\\u0044\\u0062\\u0033\\u0056\\u0075\\u0064\\u0041\\u003d\\u003d\",\"\\x65\\x57\\x56\\x68\\x63\\x67\\x3d\\x3d\",\"\\x62\\x47\\x46\\x7a\\x64\\x45\\x4e\\x6f\\x59\\x58\\x42\\x30\\x5a\\x58\\x4a\\x56\\x63\\x47\\x52\\x68\\x64\\x47\\x55\\x3d\",\"\\x62\\x47\\x46\\x7a\\x64\\x45\\x4a\\x76\\x62\\x32\\x74\\x56\\x63\\x47\\x52\\x68\\x64\\x47\\x55\\x3d\",\"\\x5a\\x47\\x46\\x30\\x5a\\x56\\x56\\x77\\x5a\\x47\\x46\\x30\\x5a\\x57\\x51\\x3d\",\"\\u0065\\u0079\\u004a\\u0076\\u0063\\u0047\\u0056\\u0079\\u0059\\u0058\\u0052\\u0070\\u0062\\u0032\\u0035\\u004f\\u0059\\u0057\\u0031\\u006c\\u0049\\u006a\\u006f\\u0069\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0043\\u0065\\u0055\\u006c\\u006b\\u0049\\u0069\\u0077\\u0069\\u0064\\u006d\\u0046\\u0079\\u0061\\u0057\\u0046\\u0069\\u0062\\u0047\\u0056\\u007a\\u0049\\u006a\\u0070\\u0037\\u0049\\u006d\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u0053\\u0057\\u0051\\u0069\\u004f\\u0069\\u0049\\u003d\",\"\\x49\\x6e\\x30\\x73\\x49\\x6e\\x46\\x31\\x5a\\x58\\x4a\\x35\\x49\\x6a\\x6f\\x69\\x63\\x58\\x56\\x6c\\x63\\x6e\\x6b\\x67\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x43\\x65\\x55\\x6c\\x6b\\x4b\\x43\\x52\\x6a\\x62\\x32\\x31\\x70\\x59\\x30\\x6c\\x6b\\x4f\\x69\\x42\\x4a\\x52\\x43\\x45\\x70\\x49\\x48\\x73\\x4b\\x49\\x43\\x42\\x6a\\x62\\x32\\x31\\x70\\x59\\x30\\x4a\\x35\\x53\\x57\\x51\\x6f\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x4a\\x5a\\x44\\x6f\\x67\\x4a\\x47\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x53\\x57\\x51\\x70\\x49\\x48\\x73\\x4b\\x49\\x43\\x41\\x67\\x49\\x47\\x6c\\x6b\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x30\\x61\\x58\\x52\\x73\\x5a\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x63\\x33\\x52\\x68\\x64\\x48\\x56\\x7a\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x35\\x5a\\x57\\x46\\x79\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x70\\x62\\x57\\x46\\x6e\\x5a\\x56\\x56\\x79\\x62\\x41\\x6f\\x67\\x49\\x43\\x41\\x67\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\\x63\\x79\\x42\\x37\\x43\\x69\\x41\\x67\\x49\\x43\\x41\\x67\\x49\\x47\\x6c\\x6b\\x43\\x69\\x41\\x67\\x49\\x43\\x41\\x67\\x49\\x47\\x35\\x68\\x62\\x57\\x55\\x4b\\x49\\x43\\x41\\x67\\x49\\x43\\x41\\x67\\x58\\x31\\x39\\x30\\x65\\x58\\x42\\x6c\\x62\\x6d\\x46\\x74\\x5a\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x66\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x59\\x32\\x46\\x30\\x5a\\x57\\x64\\x76\\x63\\x6d\\x6c\\x6c\\x63\\x79\\x42\\x37\\x43\\x69\\x41\\x67\\x49\\x43\\x41\\x67\\x49\\x47\\x6c\\x6b\\x43\\x69\\x41\\x67\\x49\\x43\\x41\\x67\\x49\\x47\\x35\\x68\\x62\\x57\\x55\\x4b\\x49\\x43\\x41\\x67\\x49\\x43\\x41\\x67\\x58\\x31\\x39\\x30\\x65\\x58\\x42\\x6c\\x62\\x6d\\x46\\x74\\x5a\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x66\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x5a\\x47\\x46\\x30\\x5a\\x55\\x4e\\x79\\x5a\\x57\\x46\\x30\\x5a\\x57\\x51\\x4b\\x49\\x43\\x41\\x67\\x49\\x47\\x52\\x68\\x64\\x47\\x56\\x56\\x63\\x47\\x52\\x68\\x64\\x47\\x56\\x6b\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x32\\x61\\x57\\x56\\x33\\x63\\x77\\x6f\\x67\\x49\\x43\\x41\\x67\\x5a\\x6d\\x46\\x32\\x62\\x33\\x4a\\x70\\x64\\x47\\x56\\x44\\x62\\x33\\x56\\x75\\x64\\x41\\x6f\\x67\\x49\\x43\\x41\\x67\\x62\\x47\\x46\\x7a\\x64\\x45\\x4a\\x76\\x62\\x32\\x74\\x56\\x63\\x47\\x52\\x68\\x64\\x47\\x55\\x4b\\x49\\x43\\x41\\x67\\x49\\x47\\x78\\x68\\x63\\x33\\x52\\x44\\x61\\x47\\x46\\x77\\x64\\x47\\x56\\x79\\x56\\x58\\x42\\x6b\\x59\\x58\\x52\\x6c\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x66\\x58\\x33\\x52\\x35\\x63\\x47\\x56\\x75\\x59\\x57\\x31\\x6c\\x43\\x69\\x41\\x67\\x66\\x51\\x70\\x39\\x49\\x6e\\x30\\x3d\",\"\\x61\\x57\\x31\\x68\\x5a\\x32\\x56\\x56\\x63\\x6d\\x77\\x3d\",\"\\u004c\\u0032\\u0046\\u0077\\u0061\\u0053\\u0039\\u0078\\u0064\\u0057\\u0056\\u0079\\u0065\\u0053\\u0078\\u0037\\u0049\\u006d\\u004a\\u0076\\u005a\\u0048\\u006b\\u0069\\u004f\\u0067\\u003d\\u003d\",\"\\x4c\\x43\\x4a\\x6f\\x5a\\x57\\x46\\x6b\\x5a\\x58\\x4a\\x7a\\x49\\x6a\\x70\\x37\\x49\\x6b\\x4e\\x76\\x62\\x6e\\x52\\x6c\\x62\\x6e\\x51\\x74\\x56\\x48\\x6c\\x77\\x5a\\x53\\x49\\x36\\x49\\x6d\\x46\\x77\\x63\\x47\\x78\\x70\\x59\\x32\\x46\\x30\\x61\\x57\\x39\\x75\\x4c\\x32\\x70\\x7a\\x62\\x32\\x34\\x69\\x66\\x53\\x77\\x69\\x62\\x57\\x56\\x30\\x61\\x47\\x39\\x6b\\x49\\x6a\\x6f\\x67\\x49\\x6c\\x42\\x50\\x55\\x31\\x51\\x69\\x66\\x51\\x3d\\x3d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\x5a\\x32\\x56\\x30\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\x52\\x30\\x56\\x55\",\"\\u0061\\u0057\\u0035\\u006a\\u0062\\u0048\\u0056\\u006b\\u005a\\u0058\\u004d\\u003d\",\"\\x65\\x79\\x4a\\x69\\x62\\x32\\x52\\x35\\x49\\x6a\\x70\\x37\\x49\\x6d\\x39\\x77\\x5a\\x58\\x4a\\x68\\x64\\x47\\x6c\\x76\\x62\\x6b\\x35\\x68\\x62\\x57\\x55\\x69\\x4f\\x69\\x4a\\x79\\x5a\\x57\\x4e\\x76\\x62\\x57\\x31\\x6c\\x62\\x6d\\x52\\x44\\x62\\x32\\x31\\x70\\x59\\x30\\x6c\\x6b\\x63\\x79\\x49\\x73\\x49\\x6e\\x5a\\x68\\x63\\x6d\\x6c\\x68\\x59\\x6d\\x78\\x6c\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x77\\x59\\x57\\x64\\x70\\x62\\x6d\\x46\\x30\\x61\\x57\\x39\\x75\\x49\\x6a\\x70\\x37\\x49\\x6d\\x78\\x70\\x62\\x57\\x6c\\x30\\x49\\x6a\\x6f\\x7a\\x4d\\x43\\x77\\x69\\x62\\x32\\x5a\\x6d\\x63\\x32\\x56\\x30\\x49\\x6a\\x6f\\x3d\",\"\\x4c\\x43\\x4a\\x76\\x63\\x6d\\x52\\x6c\\x63\\x6b\\x4a\\x35\\x49\\x6a\\x6f\\x69\\x52\\x45\\x46\\x55\\x52\\x56\\x39\\x56\\x55\\x45\\x52\\x42\\x56\\x45\\x56\\x45\\x49\\x69\\x77\\x69\\x59\\x58\\x4e\\x6a\\x49\\x6a\\x70\\x30\\x63\\x6e\\x56\\x6c\\x66\\x53\\x77\\x69\\x59\\x32\\x46\\x30\\x5a\\x57\\x64\\x76\\x63\\x6e\\x6b\\x69\\x4f\\x69\\x49\\x69\\x66\\x53\\x77\\x69\\x63\\x58\\x56\\x6c\\x63\\x6e\\x6b\\x69\\x4f\\x69\\x4a\\x78\\x64\\x57\\x56\\x79\\x65\\x53\\x42\\x79\\x5a\\x57\\x4e\\x76\\x62\\x57\\x31\\x6c\\x62\\x6d\\x52\\x44\\x62\\x32\\x31\\x70\\x59\\x30\\x6c\\x6b\\x63\\x79\\x67\\x6b\\x59\\x32\\x46\\x30\\x5a\\x57\\x64\\x76\\x63\\x6e\\x6b\\x36\\x49\\x46\\x4e\\x30\\x63\\x6d\\x6c\\x75\\x5a\\x79\\x77\\x67\\x4a\\x48\\x42\\x68\\x5a\\x32\\x6c\\x75\\x59\\x58\\x52\\x70\\x62\\x32\\x34\\x36\\x49\\x46\\x42\\x68\\x5a\\x32\\x6c\\x75\\x59\\x58\\x52\\x70\\x62\\x32\\x34\\x68\\x4b\\x53\\x42\\x37\\x43\\x69\\x41\\x67\\x63\\x6d\\x56\\x6a\\x62\\x32\\x31\\x74\\x5a\\x57\\x35\\x6b\\x51\\x32\\x39\\x74\\x61\\x57\\x4e\\x4a\\x5a\\x48\\x4d\\x6f\\x59\\x32\\x46\\x30\\x5a\\x57\\x64\\x76\\x63\\x6e\\x6b\\x36\\x49\\x43\\x52\\x6a\\x59\\x58\\x52\\x6c\\x5a\\x32\\x39\\x79\\x65\\x53\\x77\\x67\\x63\\x47\\x46\\x6e\\x61\\x57\\x35\\x68\\x64\\x47\\x6c\\x76\\x62\\x6a\\x6f\\x67\\x4a\\x48\\x42\\x68\\x5a\\x32\\x6c\\x75\\x59\\x58\\x52\\x70\\x62\\x32\\x34\\x70\\x43\\x6e\\x30\\x69\\x66\\x53\\x77\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x44\\x62\\x32\\x35\\x30\\x5a\\x57\\x35\\x30\\x4c\\x56\\x52\\x35\\x63\\x47\\x55\\x69\\x4f\\x69\\x4a\\x68\\x63\\x48\\x42\\x73\\x61\\x57\\x4e\\x68\\x64\\x47\\x6c\\x76\\x62\\x69\\x39\\x71\\x63\\x32\\x39\\x75\\x49\\x6e\\x30\\x73\\x49\\x6d\\x31\\x6c\\x64\\x47\\x68\\x76\\x5a\\x43\\x49\\x36\\x49\\x43\\x4a\\x51\\x54\\x31\\x4e\\x55\\x49\\x6e\\x30\\x3d\",\"\\x4c\\x32\\x46\\x77\\x61\\x53\\x39\\x78\\x64\\x57\\x56\\x79\\x65\\x53\\x77\\x3d\",\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\x5a\\x47\\x46\\x30\\x59\\x51\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x6a\\x62\\x32\\x31\\x74\\x5a\\x57\\x35\\x6b\\x51\\x32\\x39\\x74\\x61\\x57\\x4e\\x4a\\x5a\\x48\\x4d\\x3d\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\u0063\\u0048\\u0056\\u007a\\u0061\\u0041\\u003d\\u003d\",\"\\x61\\x6d\\x39\\x70\\x62\\x67\\x3d\\x3d\",\"\\x49\\x69\\x77\\x69\",\"\\u0061\\u0047\\u0039\\u0077\\u0064\\u0047\\u006c\\u0076\\u0062\\u006a\\u0045\\u003d\",\"\\u0061\\u0047\\u0039\\u0077\\u0064\\u0047\\u006c\\u0076\\u0062\\u006a\\u0049\\u003d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0043\\u0065\\u0055\\u006c\\u006b\\u0063\\u0077\\u003d\\u003d\",\"\\u0065\\u0079\\u004a\\u0069\\u0062\\u0032\\u0052\\u0035\\u0049\\u006a\\u0070\\u0037\\u0049\\u006d\\u0039\\u0077\\u005a\\u0058\\u004a\\u0068\\u0064\\u0047\\u006c\\u0076\\u0062\\u006b\\u0035\\u0068\\u0062\\u0057\\u0055\\u0069\\u004f\\u0069\\u004a\\u0079\\u005a\\u0057\\u0046\\u006b\\u0051\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0049\\u0061\\u0058\\u004e\\u0030\\u0062\\u0033\\u004a\\u0035\\u0049\\u0069\\u0077\\u0069\\u0064\\u006d\\u0046\\u0079\\u0061\\u0057\\u0046\\u0069\\u0062\\u0047\\u0056\\u007a\\u0049\\u006a\\u0070\\u0037\\u0049\\u006e\\u0042\\u0068\\u005a\\u0032\\u006c\\u0075\\u0059\\u0058\\u0052\\u0070\\u0062\\u0032\\u0034\\u0069\\u004f\\u006e\\u0073\\u0069\\u0062\\u0047\\u006c\\u0074\\u0061\\u0058\\u0051\\u0069\\u004f\\u006a\\u004d\\u0077\\u004c\\u0043\\u004a\\u0076\\u005a\\u006d\\u005a\\u007a\\u005a\\u0058\\u0051\\u0069\\u004f\\u0067\\u003d\\u003d\",\"\\x4c\\x43\\x4a\\x76\\x63\\x6d\\x52\\x6c\\x63\\x6b\\x4a\\x35\\x49\\x6a\\x6f\\x69\\x52\\x45\\x46\\x55\\x52\\x56\\x39\\x56\\x55\\x45\\x52\\x42\\x56\\x45\\x56\\x45\\x49\\x69\\x77\\x69\\x59\\x58\\x4e\\x6a\\x49\\x6a\\x70\\x30\\x63\\x6e\\x56\\x6c\\x66\\x58\\x30\\x73\\x49\\x6e\\x46\\x31\\x5a\\x58\\x4a\\x35\\x49\\x6a\\x6f\\x69\\x63\\x58\\x56\\x6c\\x63\\x6e\\x6b\\x67\\x63\\x6d\\x56\\x68\\x5a\\x45\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x53\\x47\\x6c\\x7a\\x64\\x47\\x39\\x79\\x65\\x53\\x67\\x6b\\x63\\x47\\x46\\x6e\\x61\\x57\\x35\\x68\\x64\\x47\\x6c\\x76\\x62\\x6a\\x6f\\x67\\x55\\x47\\x46\\x6e\\x61\\x57\\x35\\x68\\x64\\x47\\x6c\\x76\\x62\\x69\\x45\\x70\\x49\\x48\\x73\\x4b\\x49\\x43\\x42\\x79\\x5a\\x57\\x46\\x6b\\x51\\x32\\x39\\x74\\x61\\x57\\x4e\\x49\\x61\\x58\\x4e\\x30\\x62\\x33\\x4a\\x35\\x4b\\x48\\x42\\x68\\x5a\\x32\\x6c\\x75\\x59\\x58\\x52\\x70\\x62\\x32\\x34\\x36\\x49\\x43\\x52\\x77\\x59\\x57\\x64\\x70\\x62\\x6d\\x46\\x30\\x61\\x57\\x39\\x75\\x4b\\x53\\x42\\x37\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x70\\x5a\\x41\\x6f\\x67\\x49\\x43\\x41\\x67\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x4a\\x5a\\x41\\x6f\\x67\\x49\\x43\\x41\\x67\\x59\\x32\\x68\\x68\\x63\\x48\\x52\\x6c\\x63\\x6e\\x4d\\x67\\x65\\x77\\x6f\\x67\\x49\\x43\\x41\\x67\\x49\\x43\\x42\\x70\\x5a\\x41\\x6f\\x67\\x49\\x43\\x41\\x67\\x49\\x43\\x42\\x6a\\x61\\x47\\x46\\x77\\x64\\x47\\x56\\x79\\x53\\x57\\x51\\x4b\\x49\\x43\\x41\\x67\\x49\\x43\\x41\\x67\\x63\\x47\\x46\\x6e\\x5a\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x49\\x43\\x42\\x66\\x58\\x33\\x52\\x35\\x63\\x47\\x56\\x75\\x59\\x57\\x31\\x6c\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x39\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x7a\\x64\\x47\\x46\\x79\\x64\\x45\\x52\\x68\\x64\\x47\\x55\\x4b\\x49\\x43\\x41\\x67\\x49\\x47\\x78\\x68\\x63\\x33\\x52\\x45\\x59\\x58\\x52\\x6c\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x6a\\x61\\x47\\x46\\x77\\x64\\x47\\x56\\x79\\x56\\x48\\x6c\\x77\\x5a\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x58\\x31\\x39\\x30\\x65\\x58\\x42\\x6c\\x62\\x6d\\x46\\x74\\x5a\\x51\\x6f\\x67\\x49\\x48\\x30\\x4b\\x66\\x53\\x4a\\x39\\x4c\\x43\\x4a\\x6f\\x5a\\x57\\x46\\x6b\\x5a\\x58\\x4a\\x7a\\x49\\x6a\\x70\\x37\\x49\\x6b\\x4e\\x76\\x62\\x6e\\x52\\x6c\\x62\\x6e\\x51\\x74\\x56\\x48\\x6c\\x77\\x5a\\x53\\x49\\x36\\x49\\x6d\\x46\\x77\\x63\\x47\\x78\\x70\\x59\\x32\\x46\\x30\\x61\\x57\\x39\\x75\\x4c\\x32\\x70\\x7a\\x62\\x32\\x34\\x69\\x66\\x53\\x77\\x69\\x62\\x57\\x56\\x30\\x61\\x47\\x39\\x6b\\x49\\x6a\\x6f\\x67\\x49\\x6c\\x42\\x50\\x55\\x31\\x51\\x69\\x66\\x51\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x68\\x5a\\x45\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x53\\x47\\x6c\\x7a\\x64\\x47\\x39\\x79\\x65\\x51\\x3d\\x3d\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x4a\\x5a\\x41\\x3d\\x3d\",\"\\u0065\\u0079\\u004a\\u0069\\u0062\\u0032\\u0052\\u0035\\u0049\\u006a\\u0070\\u0037\\u0049\\u006d\\u0039\\u0077\\u005a\\u0058\\u004a\\u0068\\u0064\\u0047\\u006c\\u0076\\u0062\\u006b\\u0035\\u0068\\u0062\\u0057\\u0055\\u0069\\u004f\\u0069\\u004a\\u006d\\u0059\\u0058\\u005a\\u0076\\u0063\\u006d\\u006c\\u0030\\u005a\\u0058\\u004e\\u0052\\u0064\\u0057\\u0056\\u0079\\u0065\\u0053\\u0049\\u0073\\u0049\\u006e\\u005a\\u0068\\u0063\\u006d\\u006c\\u0068\\u0059\\u006d\\u0078\\u006c\\u0063\\u0079\\u0049\\u0036\\u0065\\u0079\\u004a\\u0077\\u0059\\u0057\\u0064\\u0070\\u0062\\u006d\\u0046\\u0030\\u0061\\u0057\\u0039\\u0075\\u0049\\u006a\\u0070\\u0037\\u0049\\u006d\\u0078\\u0070\\u0062\\u0057\\u006c\\u0030\\u0049\\u006a\\u006f\\u007a\\u004d\\u0043\\u0077\\u0069\\u0062\\u0032\\u005a\\u006d\\u0063\\u0032\\u0056\\u0030\\u0049\\u006a\\u006f\\u003d\",\"\\x4c\\x43\\x4a\\x76\\x63\\x6d\\x52\\x6c\\x63\\x6b\\x4a\\x35\\x49\\x6a\\x6f\\x69\",\"\\u0049\\u0069\\u0077\\u0069\\u0063\\u0033\\u0052\\u0068\\u0064\\u0048\\u0056\\u007a\\u0049\\u006a\\u006f\\u0069\",\"\\u0049\\u0069\\u0077\\u0069\\u0059\\u0058\\u004e\\u006a\\u0049\\u006a\\u0070\\u0030\\u0063\\u006e\\u0056\\u006c\\u004c\\u0043\\u004a\\u0079\\u005a\\u0057\\u0046\\u006b\\u0055\\u0048\\u004a\\u0076\\u005a\\u0033\\u004a\\u006c\\u0063\\u0033\\u004d\\u0069\\u004f\\u0069\\u0049\\u003d\",\"\\x49\\x6e\\x31\\x39\\x4c\\x43\\x4a\\x78\\x64\\x57\\x56\\x79\\x65\\x53\\x49\\x36\\x49\\x6e\\x46\\x31\\x5a\\x58\\x4a\\x35\\x49\\x47\\x5a\\x68\\x64\\x6d\\x39\\x79\\x61\\x58\\x52\\x6c\\x63\\x31\\x46\\x31\\x5a\\x58\\x4a\\x35\\x4b\\x43\\x52\\x77\\x59\\x57\\x64\\x70\\x62\\x6d\\x46\\x30\\x61\\x57\\x39\\x75\\x4f\\x69\\x42\\x51\\x59\\x57\\x64\\x70\\x62\\x6d\\x46\\x30\\x61\\x57\\x39\\x75\\x49\\x53\\x6b\\x67\\x65\\x77\\x6f\\x67\\x49\\x47\\x64\\x6c\\x64\\x45\\x78\\x68\\x64\\x47\\x56\\x7a\\x64\\x46\\x56\\x77\\x5a\\x47\\x46\\x30\\x5a\\x57\\x52\\x45\\x59\\x58\\x52\\x6c\\x53\\x57\\x35\\x47\\x59\\x58\\x5a\\x76\\x63\\x6d\\x6c\\x30\\x5a\\x51\\x6f\\x67\\x49\\x47\\x5a\\x68\\x64\\x6d\\x39\\x79\\x61\\x58\\x52\\x6c\\x63\\x31\\x59\\x79\\x4b\\x48\\x42\\x68\\x5a\\x32\\x6c\\x75\\x59\\x58\\x52\\x70\\x62\\x32\\x34\\x36\\x49\\x43\\x52\\x77\\x59\\x57\\x64\\x70\\x62\\x6d\\x46\\x30\\x61\\x57\\x39\\x75\\x4b\\x53\\x42\\x37\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x70\\x5a\\x41\\x6f\\x67\\x49\\x43\\x41\\x67\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x4a\\x5a\\x41\\x6f\\x67\\x49\\x43\\x41\\x67\\x5a\\x47\\x46\\x30\\x5a\\x55\\x46\\x6b\\x5a\\x47\\x56\\x6b\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x73\\x59\\x58\\x4e\\x30\\x51\\x57\\x4e\\x6a\\x5a\\x58\\x4e\\x7a\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x69\\x62\\x32\\x39\\x72\\x55\\x6d\\x56\\x68\\x5a\\x46\\x42\\x79\\x62\\x32\\x64\\x79\\x5a\\x58\\x4e\\x7a\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x6a\\x61\\x47\\x46\\x77\\x64\\x47\\x56\\x79\\x55\\x6d\\x56\\x68\\x5a\\x46\\x42\\x79\\x62\\x32\\x64\\x79\\x5a\\x58\\x4e\\x7a\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x66\\x58\\x33\\x52\\x35\\x63\\x47\\x56\\x75\\x59\\x57\\x31\\x6c\\x43\\x69\\x41\\x67\\x66\\x51\\x70\\x39\\x49\\x6e\\x30\\x73\\x49\\x6d\\x68\\x6c\\x59\\x57\\x52\\x6c\\x63\\x6e\\x4d\\x69\\x4f\\x6e\\x73\\x69\\x51\\x32\\x39\\x75\\x64\\x47\\x56\\x75\\x64\\x43\\x31\\x55\\x65\\x58\\x42\\x6c\\x49\\x6a\\x6f\\x69\\x59\\x58\\x42\\x77\\x62\\x47\\x6c\\x6a\\x59\\x58\\x52\\x70\\x62\\x32\\x34\\x76\\x61\\x6e\\x4e\\x76\\x62\\x69\\x4a\\x39\\x4c\\x43\\x4a\\x74\\x5a\\x58\\x52\\x6f\\x62\\x32\\x51\\x69\\x4f\\x69\\x41\\x69\\x55\\x45\\x39\\x54\\x56\\x43\\x4a\\x39\",\"\\u0052\\u006b\\u0046\\u0057\\u0054\\u0031\\u004a\\u004a\\u0056\\u0045\\u0056\\u0066\\u0051\\u0055\\u0052\\u0045\\u0052\\u0055\\u0051\\u003d\",\"\\u0063\\u0033\\u0052\\u0068\\u0064\\u0048\\u0056\\u007a\",\"\\x51\\x55\\x78\\x4d\",\"\\x5a\\x6d\\x46\\x32\\x62\\x33\\x4a\\x70\\x64\\x47\\x56\\x7a\\x56\\x6a\\x49\\x3d\",\"\\u0051\\u0030\\u0039\\u004e\\u0053\\u0055\\u004e\\u0066\\u0052\\u0045\\u0046\\u0055\\u0052\\u0056\\u0039\\u0056\\u0055\\u0045\\u0052\\u0042\\u0056\\u0045\\u0056\\u0045\",\"\\x62\\x33\\x4a\\x6b\\x5a\\x58\\x4a\\x43\\x65\\x54\\x45\\x3d\",\"\\x55\\x31\\x52\\x42\\x55\\x6c\\x52\\x46\\x52\\x41\\x3d\\x3d\",\"\\u0056\\u0055\\u0035\\u0053\\u0052\\u0055\\u0046\\u0045\",\"\\x51\\x30\\x39\\x4e\\x55\\x45\\x78\\x46\\x56\\x45\\x56\\x45\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x43\\x65\\x55\\x4e\\x68\\x64\\x47\\x56\\x6e\\x62\\x33\\x4a\\x70\\x5a\\x58\\x4d\\x3d\",\"\\x64\\x47\\x6c\\x30\\x62\\x47\\x55\\x3d\",\"\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\\x63\\x77\\x3d\\x3d\",\"\\u0062\\u006d\\u0046\\u0074\\u005a\\u0051\\u003d\\u003d\",\"\\u0059\\u0032\\u0068\\u0068\\u0063\\u0048\\u0052\\u006c\\u0063\\u006c\\u004a\\u006c\\u0059\\u0057\\u0052\\u0051\\u0063\\u006d\\u0039\\u006e\\u0063\\u006d\\u0056\\u007a\\u0063\\u0077\\u003d\\u003d\",\"\\u0035\\u0070\\u0079\\u0071\\u0035\\u0035\\u0079\\u004c\\u0035\\u0061\\u0036\\u004d\"],0xe),_0x4730=function(User,Title){var Link,Intro;mNBaKcs(User=User-0x0,Link=_0x2c21[User]);if(_0x4730.ZELgUN===void 0x0){mNBaKcs(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;mNBaKcs(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x2c21=0x0,_0x4730,data,json=0x0;data=Title.charAt(json++);~data&&(_0x4730=_0x2c21%0x4?_0x4730*0x40+data:data,_0x2c21++%0x4)?Intro+=String.fromCharCode(0xff&_0x4730>>(-0x2*_0x2c21&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x4730.LSZDWD=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x2c21=Title.length;Intro<_0x2c21;Intro++)Link+=\"\\x25\"+(\"\\x30\\x30\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x4730.JPhLbL={},_0x4730.ZELgUN=!0x0)}mNBaKcs(Intro=_0x4730.JPhLbL[User],Intro===void 0x0?(Link=_0x4730.LSZDWD(Link),_0x4730.JPhLbL[User]=Link):Link=Intro);return Link},eval(String(source[_0x4730(\"\\x30\\x78\\x30\")])),eval(String(java[_0x4730(\"\\u0030\\u0078\\u0031\")](cache_api+_0x4730(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],json=[],Headers=JSON[_0x4730(\"\\u0030\\u0078\\u0033\")](cache[_0x4730(\"\\x30\\x78\\x34\")](java[_0x4730(\"\\u0030\\u0078\\u0035\")](Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\x30\\x78\\x37\")))[_0x4730(\"\\u0030\\u0078\\u0038\")](Get(_0x4730(\"\\u0030\\u0078\\u0036\")),baseUrl)),G7n6GW=_0x4730(\"\\u0030\\u0078\\u0039\"),fZVQWyW=Headers);if(!(\"\\u0041\\u0041\\u0075\\u006b\\u0055\\u006f\" in bZy19p6)&&User==!![]){var comicIds,next;if(!(\"\\x53\\x69\\x73\\x68\\x58\\x6b\" in bZy19p6)&&baseUrl[_0x4730(\"\\x30\\x78\\x61\")](\"\\u0040\")){mNBaKcs(eval(String(source[_0x4730(\"\\x30\\x78\\x30\")])),ImageLimit())}comicIds=[];if(!(\"\\u0074\\u0065\\u0049\\u0039\\u0078\\u0035\" in bZy19p6)&&baseUrl[_0x4730(\"\\u0030\\u0078\\u0061\")](\"\\x40\\x61\")){var page=baseUrl[_0x4730(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a\\u0040\\u0061\",\"\"),\"\");mNBaKcs(option=_0x4730(\"\\x30\\x78\\x62\")+0x1e*(page-0x1)+_0x4730(\"\\x30\\x78\\x63\"),url=Get(_0x4730(\"\\u0030\\u0078\\u0036\"))+_0x4730(\"\\u0030\\u0078\\u0064\")+option,result=java[_0x4730(\"\\u0030\\u0078\\u0065\")](url),json=JSON[_0x4730(\"\\x30\\x78\\x33\")](result)[_0x4730(\"\\u0030\\u0078\\u0066\")][_0x4730(\"\\u0030\\u0078\\u0031\\u0030\")]);if(json[_0x4730(\"\\x30\\x78\\x31\\x31\")]>0x0){var i,strcomicIds,list;for(i in json)comicIds[_0x4730(\"\\u0030\\u0078\\u0031\\u0032\")](String(json[i]));strcomicIds=\"\\x5b\\x22\"+comicIds[_0x4730(\"\\u0030\\u0078\\u0031\\u0033\")](_0x4730(\"\\u0030\\u0078\\u0031\\u0034\"))+\"\\u0022\\u005d\";let url1=Get(_0x4730(\"\\u0030\\u0078\\u0036\"))+_0x4730(\"\\x30\\x78\\x64\")+get(_0x4730(\"\\x30\\x78\\x31\\x35\"),\"\\u0030\")+strcomicIds+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0036\"),\"\\x30\");mNBaKcs(result=java[_0x4730(\"\\u0030\\u0078\\u0065\")](url1),list=JSON[_0x4730(\"\\x30\\x78\\x33\")](result)[_0x4730(\"\\x30\\x78\\x66\")][_0x4730(\"\\x30\\x78\\x31\\x37\")],json=[])}else{var list=[]}}if(!(\"\\x59\\x55\\x79\\x52\\x6d\\x64\\x45\" in bZy19p6)&&baseUrl[_0x4730(\"\\u0030\\u0078\\u0061\")](\"\\u0040\\u0062\")){var page=baseUrl[_0x4730(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a\\x40\\x62\",\"\"),\"\");mNBaKcs(option=_0x4730(\"\\u0030\\u0078\\u0031\\u0038\")+0x1e*(page-0x1)+_0x4730(\"\\x30\\x78\\x31\\x39\"),url=Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\x30\\x78\\x64\")+option,result=java[_0x4730(\"\\u0030\\u0078\\u0065\")](url),json=JSON[_0x4730(\"\\u0030\\u0078\\u0033\")](result)[_0x4730(\"\\u0030\\u0078\\u0066\")][_0x4730(\"\\u0030\\u0078\\u0031\\u0061\")]);if(json[_0x4730(\"\\x30\\x78\\x31\\x31\")]>0x0){var i,strcomicIds,list;for(i in json)comicIds[_0x4730(\"\\x30\\x78\\x31\\x32\")](String(json[i][_0x4730(\"\\x30\\x78\\x31\\x62\")]));strcomicIds=\"\\x5b\\x22\"+comicIds[_0x4730(\"\\x30\\x78\\x31\\x33\")](_0x4730(\"\\x30\\x78\\x31\\x34\"))+\"\\x22\\x5d\";let url1=Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\x30\\x78\\x64\")+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0035\"),\"\\u0030\")+strcomicIds+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0036\"),\"\\u0030\");mNBaKcs(result=java[_0x4730(\"\\u0030\\u0078\\u0065\")](url1),list=JSON[_0x4730(\"\\u0030\\u0078\\u0033\")](result)[_0x4730(\"\\u0030\\u0078\\u0066\")][_0x4730(\"\\u0030\\u0078\\u0031\\u0037\")],json=[])}else{var list=[]}}mNBaKcs(option1=_0x4730(\"\\x30\\x78\\x31\\x63\"),option2=_0x4730(\"\\x30\\x78\\x31\\x64\"),option3=_0x4730(\"\\u0030\\u0078\\u0031\\u0065\"),option4=_0x4730(\"\\x30\\x78\\x31\\x66\"),option5=_0x4730(\"\\u0030\\u0078\\u0032\\u0030\"));if(!(\"\\u0044\\u006a\\u0074\\u004d\\u004f\\u0070\\u0038\" in bZy19p6)&&baseUrl[_0x4730(\"\\u0030\\u0078\\u0061\")](\"\\u0040\\u0063\")){var page=baseUrl[_0x4730(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a\\x40\\x63\",\"\"),\"\");mNBaKcs(option=option1+0x1e*(page-0x1)+option2+_0x4730(\"\\u0030\\u0078\\u0032\\u0031\")+option3+get(_0x4730(\"\\u0030\\u0078\\u0032\\u0032\"),Get(\"\\u0071\"))+option4+_0x4730(\"\\x30\\x78\\x32\\x33\")+option5,url=Get(_0x4730(\"\\u0030\\u0078\\u0036\"))+_0x4730(\"\\u0030\\u0078\\u0064\")+option,result=java[_0x4730(\"\\x30\\x78\\x65\")](url),json=JSON[_0x4730(\"\\u0030\\u0078\\u0033\")](result)[_0x4730(\"\\u0030\\u0078\\u0066\")][_0x4730(\"\\u0030\\u0078\\u0032\\u0034\")]);if(json[_0x4730(\"\\u0030\\u0078\\u0031\\u0031\")]>0x0){var i,strcomicIds,list;for(i in json)comicIds[_0x4730(\"\\x30\\x78\\x31\\x32\")](String(json[i][_0x4730(\"\\u0030\\u0078\\u0031\\u0062\")]));strcomicIds=\"\\x5b\\x22\"+comicIds[_0x4730(\"\\x30\\x78\\x31\\x33\")](_0x4730(\"\\u0030\\u0078\\u0031\\u0034\"))+\"\\u0022\\u005d\";let url1=Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\x30\\x78\\x64\")+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0035\"),\"\\u0030\")+strcomicIds+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0036\"),\"\\x30\");mNBaKcs(result=java[_0x4730(\"\\x30\\x78\\x65\")](url1),list=JSON[_0x4730(\"\\x30\\x78\\x33\")](result)[_0x4730(\"\\u0030\\u0078\\u0066\")][_0x4730(\"\\x30\\x78\\x31\\x37\")])}else{var list=[]}}if(!(\"\\u0072\\u0063\\u007a\\u0036\\u0036\\u006e\\u0044\" in bZy19p6)&&baseUrl[_0x4730(\"\\u0030\\u0078\\u0061\")](\"\\u0040\\u0064\")){var page=baseUrl[_0x4730(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a\\x40\\x64\",\"\"),\"\");mNBaKcs(option=option1+0x1e*(page-0x1)+option2+_0x4730(\"\\u0030\\u0078\\u0032\\u0035\")+option3+get(_0x4730(\"\\x30\\x78\\x32\\x32\"),Get(\"\\u0071\"))+option4+_0x4730(\"\\x30\\x78\\x32\\x33\")+option5,url=Get(_0x4730(\"\\u0030\\u0078\\u0036\"))+_0x4730(\"\\x30\\x78\\x64\")+option,result=java[_0x4730(\"\\x30\\x78\\x65\")](url),json=JSON[_0x4730(\"\\x30\\x78\\x33\")](result)[_0x4730(\"\\u0030\\u0078\\u0066\")][_0x4730(\"\\x30\\x78\\x32\\x34\")]);if(json[_0x4730(\"\\x30\\x78\\x31\\x31\")]>0x0){var i,strcomicIds,list;for(i in json)comicIds[_0x4730(\"\\x30\\x78\\x31\\x32\")](String(json[i][_0x4730(\"\\u0030\\u0078\\u0031\\u0062\")]));strcomicIds=\"\\x5b\\x22\"+comicIds[_0x4730(\"\\x30\\x78\\x31\\x33\")](_0x4730(\"\\u0030\\u0078\\u0031\\u0034\"))+\"\\u0022\\u005d\";let url1=Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\u0030\\u0078\\u0064\")+get(_0x4730(\"\\x30\\x78\\x31\\x35\"),\"\\u0030\")+strcomicIds+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0036\"),\"\\u0030\");mNBaKcs(result=java[_0x4730(\"\\x30\\x78\\x65\")](url1),list=JSON[_0x4730(\"\\u0030\\u0078\\u0033\")](result)[_0x4730(\"\\x30\\x78\\x66\")][_0x4730(\"\\u0030\\u0078\\u0031\\u0037\")])}else{var list=[]}}if(!(\"\\u0063\\u0072\\u004d\\u0073\\u0067\\u0075\\u0051\" in bZy19p6)&&baseUrl[_0x4730(\"\\x30\\x78\\x61\")](\"\\x40\\x65\")){var page=baseUrl[_0x4730(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a\\u0040\\u0065\",\"\"),\"\");mNBaKcs(option=option1+0x1e*(page-0x1)+option2+get(_0x4730(\"\\x30\\x78\\x32\\x36\"),Get(\"\\u006f\"))+option3+get(_0x4730(\"\\u0030\\u0078\\u0032\\u0032\"),Get(\"\\u0071\"))+option4+_0x4730(\"\\u0030\\u0078\\u0032\\u0037\")+option5,url=Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\x30\\x78\\x64\")+option,result=java[_0x4730(\"\\u0030\\u0078\\u0065\")](url),json=JSON[_0x4730(\"\\u0030\\u0078\\u0033\")](result)[_0x4730(\"\\x30\\x78\\x66\")][_0x4730(\"\\x30\\x78\\x32\\x34\")]);if(json[_0x4730(\"\\x30\\x78\\x31\\x31\")]>0x0){var i,strcomicIds,list;for(i in json)comicIds[_0x4730(\"\\u0030\\u0078\\u0031\\u0032\")](String(json[i][_0x4730(\"\\x30\\x78\\x31\\x62\")]));strcomicIds=\"\\u005b\\u0022\"+comicIds[_0x4730(\"\\x30\\x78\\x31\\x33\")](_0x4730(\"\\u0030\\u0078\\u0031\\u0034\"))+\"\\x22\\x5d\";let url1=Get(_0x4730(\"\\u0030\\u0078\\u0036\"))+_0x4730(\"\\u0030\\u0078\\u0064\")+get(_0x4730(\"\\x30\\x78\\x31\\x35\"),\"\\x30\")+strcomicIds+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0036\"),\"\\x30\");mNBaKcs(result=java[_0x4730(\"\\x30\\x78\\x65\")](url1),list=JSON[_0x4730(\"\\x30\\x78\\x33\")](result)[_0x4730(\"\\u0030\\u0078\\u0066\")][_0x4730(\"\\x30\\x78\\x31\\x37\")])}else{var list=[]}}if(baseUrl[_0x4730(\"\\u0030\\u0078\\u0061\")](\"\\u0040\\u0066\")){var page=baseUrl[_0x4730(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a\\x40\\x66\",\"\"),\"\");mNBaKcs(option=option1+0x1e*(page-0x1)+option2+get(_0x4730(\"\\x30\\x78\\x32\\x36\"),Get(\"\\x6f\"))+option3+get(_0x4730(\"\\u0030\\u0078\\u0032\\u0032\"),Get(\"\\u0071\"))+option4+_0x4730(\"\\x30\\x78\\x32\\x38\")+option5,url=Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\x30\\x78\\x64\")+option,result=java[_0x4730(\"\\x30\\x78\\x65\")](url),json=JSON[_0x4730(\"\\x30\\x78\\x33\")](result)[_0x4730(\"\\x30\\x78\\x66\")][_0x4730(\"\\x30\\x78\\x32\\x34\")]);if(json[_0x4730(\"\\u0030\\u0078\\u0031\\u0031\")]>0x0){var i,strcomicIds,list;for(i in json)comicIds[_0x4730(\"\\u0030\\u0078\\u0031\\u0032\")](String(json[i][_0x4730(\"\\x30\\x78\\x31\\x62\")]));strcomicIds=\"\\u005b\\u0022\"+comicIds[_0x4730(\"\\x30\\x78\\x31\\x33\")](_0x4730(\"\\u0030\\u0078\\u0031\\u0034\"))+\"\\x22\\x5d\";let url1=Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\u0030\\u0078\\u0064\")+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0035\"),\"\\x30\")+strcomicIds+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0036\"),\"\\u0030\");mNBaKcs(result=java[_0x4730(\"\\u0030\\u0078\\u0065\")](url1),list=JSON[_0x4730(\"\\u0030\\u0078\\u0033\")](result)[_0x4730(\"\\x30\\x78\\x66\")][_0x4730(\"\\u0030\\u0078\\u0031\\u0037\")])}else{var list=[]}}if(!(\"\\u006c\\u006f\\u007a\\u0032\\u006c\\u004e\" in bZy19p6)&&baseUrl[_0x4730(\"\\u0030\\u0078\\u0061\")](\"\\u0040\\u0067\")){var page=baseUrl[_0x4730(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a\\u0040\\u0067\",\"\"),\"\");mNBaKcs(option=option1+0x1e*(page-0x1)+option2+get(_0x4730(\"\\x30\\x78\\x32\\x36\"),Get(\"\\u006f\"))+option3+get(_0x4730(\"\\x30\\x78\\x32\\x32\"),Get(\"\\u0071\"))+option4+_0x4730(\"\\u0030\\u0078\\u0032\\u0039\")+option5,url=Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\x30\\x78\\x64\")+option,result=java[_0x4730(\"\\x30\\x78\\x65\")](url),json=JSON[_0x4730(\"\\u0030\\u0078\\u0033\")](result)[_0x4730(\"\\u0030\\u0078\\u0066\")][_0x4730(\"\\x30\\x78\\x32\\x34\")]);if(json[_0x4730(\"\\x30\\x78\\x31\\x31\")]>0x0){var i,strcomicIds,list;for(i in json)comicIds[_0x4730(\"\\x30\\x78\\x31\\x32\")](String(json[i][_0x4730(\"\\u0030\\u0078\\u0031\\u0062\")]));strcomicIds=\"\\x5b\\x22\"+comicIds[_0x4730(\"\\u0030\\u0078\\u0031\\u0033\")](_0x4730(\"\\x30\\x78\\x31\\x34\"))+\"\\x22\\x5d\";let url1=Get(_0x4730(\"\\x30\\x78\\x36\"))+_0x4730(\"\\u0030\\u0078\\u0064\")+get(_0x4730(\"\\x30\\x78\\x31\\x35\"),\"\\u0030\")+strcomicIds+get(_0x4730(\"\\u0030\\u0078\\u0031\\u0036\"),\"\\x30\");mNBaKcs(result=java[_0x4730(\"\\x30\\x78\\x65\")](url1),list=JSON[_0x4730(\"\\u0030\\u0078\\u0033\")](result)[_0x4730(\"\\x30\\x78\\x66\")][_0x4730(\"\\x30\\x78\\x31\\x37\")])}else{var list=[]}}if(!(\"\\u0068\\u0038\\u0071\\u006e\\u0061\\u007a\\u006c\" in bZy19p6)&&!baseUrl[_0x4730(\"\\x30\\x78\\x61\")](\"\\x40\")){var list=JSON[_0x4730(\"\\x30\\x78\\x33\")](result)[_0x4730(\"\\u0030\\u0078\\u0066\")][_0x4730(\"\\x30\\x78\\x32\\x61\")]}for(i=0x0;i", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x1ccf,_0x1ab9,User,Title,Link,Intro,data,Headers,H7yFTR,vm0SYR;function A2CwOVY(_0x1ccf,_0x1ab9,User){for(User=0x0;User<_0x1ab9;User++)_0x1ccf.push(_0x1ccf.shift());return _0x1ccf}function zD7cjQv(){}JKrzBX(_0x1ccf=A2CwOVY([\"\\u0063\\u0033\\u0052\\u0068\\u0064\\u0048\\u0056\\u007a\",\"\\u0065\\u0057\\u0056\\u0068\\u0063\\u0067\\u003d\\u003d\",\"\\x62\\x47\\x46\\x7a\\x64\\x45\\x4e\\x6f\\x59\\x58\\x42\\x30\\x5a\\x58\\x4a\\x56\\x63\\x47\\x52\\x68\\x64\\x47\\x55\\x3d\",\"\\x62\\x47\\x46\\x7a\\x64\\x45\\x4a\\x76\\x62\\x32\\x74\\x56\\x63\\x47\\x52\\x68\\x64\\x47\\x55\\x3d\",\"\\x5a\\x47\\x46\\x30\\x5a\\x56\\x56\\x77\\x5a\\x47\\x46\\x30\\x5a\\x57\\x51\\x3d\",\"\\u0065\\u0079\\u004a\\u0076\\u0063\\u0047\\u0056\\u0079\\u0059\\u0058\\u0052\\u0070\\u0062\\u0032\\u0035\\u004f\\u0059\\u0057\\u0031\\u006c\\u0049\\u006a\\u006f\\u0069\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0043\\u0065\\u0055\\u006c\\u006b\\u0049\\u0069\\u0077\\u0069\\u0064\\u006d\\u0046\\u0079\\u0061\\u0057\\u0046\\u0069\\u0062\\u0047\\u0056\\u007a\\u0049\\u006a\\u0070\\u0037\\u0049\\u006d\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u0053\\u0057\\u0051\\u0069\\u004f\\u0069\\u0049\\u003d\",\"\\x49\\x6e\\x30\\x73\\x49\\x6e\\x46\\x31\\x5a\\x58\\x4a\\x35\\x49\\x6a\\x6f\\x69\\x63\\x58\\x56\\x6c\\x63\\x6e\\x6b\\x67\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x43\\x65\\x55\\x6c\\x6b\\x4b\\x43\\x52\\x6a\\x62\\x32\\x31\\x70\\x59\\x30\\x6c\\x6b\\x4f\\x69\\x42\\x4a\\x52\\x43\\x45\\x70\\x49\\x48\\x73\\x4b\\x49\\x43\\x42\\x6a\\x62\\x32\\x31\\x70\\x59\\x30\\x4a\\x35\\x53\\x57\\x51\\x6f\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x4a\\x5a\\x44\\x6f\\x67\\x4a\\x47\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x53\\x57\\x51\\x70\\x49\\x48\\x73\\x4b\\x49\\x43\\x41\\x67\\x49\\x47\\x6c\\x6b\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x30\\x61\\x58\\x52\\x73\\x5a\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x63\\x33\\x52\\x68\\x64\\x48\\x56\\x7a\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x35\\x5a\\x57\\x46\\x79\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x70\\x62\\x57\\x46\\x6e\\x5a\\x56\\x56\\x79\\x62\\x41\\x6f\\x67\\x49\\x43\\x41\\x67\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\\x63\\x79\\x42\\x37\\x43\\x69\\x41\\x67\\x49\\x43\\x41\\x67\\x49\\x47\\x6c\\x6b\\x43\\x69\\x41\\x67\\x49\\x43\\x41\\x67\\x49\\x47\\x35\\x68\\x62\\x57\\x55\\x4b\\x49\\x43\\x41\\x67\\x49\\x43\\x41\\x67\\x58\\x31\\x39\\x30\\x65\\x58\\x42\\x6c\\x62\\x6d\\x46\\x74\\x5a\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x66\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x59\\x32\\x46\\x30\\x5a\\x57\\x64\\x76\\x63\\x6d\\x6c\\x6c\\x63\\x79\\x42\\x37\\x43\\x69\\x41\\x67\\x49\\x43\\x41\\x67\\x49\\x47\\x6c\\x6b\\x43\\x69\\x41\\x67\\x49\\x43\\x41\\x67\\x49\\x47\\x35\\x68\\x62\\x57\\x55\\x4b\\x49\\x43\\x41\\x67\\x49\\x43\\x41\\x67\\x58\\x31\\x39\\x30\\x65\\x58\\x42\\x6c\\x62\\x6d\\x46\\x74\\x5a\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x66\\x51\\x6f\\x67\\x49\\x43\\x41\\x67\\x5a\\x47\\x46\\x30\\x5a\\x55\\x4e\\x79\\x5a\\x57\\x46\\x30\\x5a\\x57\\x51\\x4b\\x49\\x43\\x41\\x67\\x49\\x47\\x52\\x68\\x64\\x47\\x56\\x56\\x63\\x47\\x52\\x68\\x64\\x47\\x56\\x6b\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x32\\x61\\x57\\x56\\x33\\x63\\x77\\x6f\\x67\\x49\\x43\\x41\\x67\\x5a\\x6d\\x46\\x32\\x62\\x33\\x4a\\x70\\x64\\x47\\x56\\x44\\x62\\x33\\x56\\x75\\x64\\x41\\x6f\\x67\\x49\\x43\\x41\\x67\\x62\\x47\\x46\\x7a\\x64\\x45\\x4a\\x76\\x62\\x32\\x74\\x56\\x63\\x47\\x52\\x68\\x64\\x47\\x55\\x4b\\x49\\x43\\x41\\x67\\x49\\x47\\x78\\x68\\x63\\x33\\x52\\x44\\x61\\x47\\x46\\x77\\x64\\x47\\x56\\x79\\x56\\x58\\x42\\x6b\\x59\\x58\\x52\\x6c\\x43\\x69\\x41\\x67\\x49\\x43\\x42\\x66\\x58\\x33\\x52\\x35\\x63\\x47\\x56\\x75\\x59\\x57\\x31\\x6c\\x43\\x69\\x41\\x67\\x66\\x51\\x70\\x39\\x49\\x6e\\x30\\x3d\",\"\\u0061\\u0057\\u0031\\u0068\\u005a\\u0032\\u0056\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u004c\\u0032\\u0046\\u0077\\u0061\\u0053\\u0039\\u0078\\u0064\\u0057\\u0056\\u0079\\u0065\\u0053\\u0078\\u0037\\u0049\\u006d\\u004a\\u0076\\u005a\\u0048\\u006b\\u0069\\u004f\\u0067\\u003d\\u003d\",\"\\x4c\\x43\\x4a\\x6f\\x5a\\x57\\x46\\x6b\\x5a\\x58\\x4a\\x7a\\x49\\x6a\\x70\\x37\\x49\\x6b\\x4e\\x76\\x62\\x6e\\x52\\x6c\\x62\\x6e\\x51\\x74\\x56\\x48\\x6c\\x77\\x5a\\x53\\x49\\x36\\x49\\x6d\\x46\\x77\\x63\\x47\\x78\\x70\\x59\\x32\\x46\\x30\\x61\\x57\\x39\\x75\\x4c\\x32\\x70\\x7a\\x62\\x32\\x34\\x69\\x66\\x53\\x77\\x69\\x62\\x57\\x56\\x30\\x61\\x47\\x39\\x6b\\x49\\x6a\\x6f\\x67\\x49\\x6c\\x42\\x50\\x55\\x31\\x51\\x69\\x66\\x51\\x3d\\x3d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\u005a\\u0047\\u0046\\u0030\\u0059\\u0051\\u003d\\u003d\",\"\\u0063\\u0032\\u0056\\u0068\\u0063\\u006d\\u004e\\u006f\\u0051\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u007a\\u0051\\u0057\\u0035\\u006b\\u0051\\u0058\\u0056\\u0030\\u0061\\u0047\\u0039\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x7a\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\u0064\\u0047\\u006c\\u0030\\u0062\\u0047\\u0055\\u003d\",\"\\u0059\\u0058\\u0056\\u0030\\u0061\\u0047\\u0039\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\u0063\\u0048\\u0056\\u007a\\u0061\\u0041\\u003d\\u003d\",\"\\u0062\\u006d\\u0046\\u0074\\u005a\\u0051\\u003d\\u003d\",\"\\u0061\\u006d\\u0039\\u0070\\u0062\\u0067\\u003d\\u003d\",\"\\x59\\x32\\x46\\x30\\x5a\\x57\\x64\\x76\\x63\\x6d\\x6c\\x6c\\x63\\x77\\x3d\\x3d\",\"\\x64\\x6d\\x6c\\x6c\\x64\\x33\\x4d\\x3d\",\"\\x5a\\x6d\\x46\\x32\\x62\\x33\\x4a\\x70\\x64\\x47\\x56\\x44\\x62\\x33\\x56\\x75\\x64\\x41\\x3d\\x3d\"],0xb),_0x1ab9=function(User,Title){var Link,Intro;JKrzBX(User=User-0x0,Link=_0x1ccf[User]);if(_0x1ab9.wvqaDL===void 0x0){JKrzBX(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;JKrzBX(Title=User(),Link=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x1ccf=0x0,_0x1ab9,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x1ab9=_0x1ccf%0x4?_0x1ab9*0x40+data:data,_0x1ccf++%0x4)?Intro+=String.fromCharCode(0xff&_0x1ab9>>(-0x2*_0x1ccf&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x1ab9.NdZywC=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x1ccf=Title.length;Intro<_0x1ccf;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x1ab9.CYMrfz={},_0x1ab9.wvqaDL=!0x0)}JKrzBX(Intro=_0x1ab9.CYMrfz[User],Intro===void 0x0?(Link=_0x1ab9.NdZywC(Link),_0x1ab9.CYMrfz[User]=Link):Link=Intro);return Link},eval(String(source[_0x1ab9(\"\\x30\\x78\\x30\")])),eval(String(java[_0x1ab9(\"\\u0030\\u0078\\u0031\")](cache_api+_0x1ab9(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x1ab9(\"\\u0030\\u0078\\u0033\")](cache[_0x1ab9(\"\\u0030\\u0078\\u0034\")](java[_0x1ab9(\"\\x30\\x78\\x35\")](Get(_0x1ab9(\"\\u0030\\u0078\\u0036\"))+_0x1ab9(\"\\x30\\x78\\x37\")))[_0x1ab9(\"\\x30\\x78\\x38\")](Get(_0x1ab9(\"\\x30\\x78\\x36\")),baseUrl)),H7yFTR=_0x1ab9(\"\\x30\\x78\\x39\"),vm0SYR=Headers);if(!(\"\\u0044\\u005f\\u0066\\u0031\\u006f\\u0048\" in zD7cjQv)&&User==!![]){var list=JSON[_0x1ab9(\"\\u0030\\u0078\\u0033\")](result)[_0x1ab9(\"\\x30\\x78\\x61\")][_0x1ab9(\"\\x30\\x78\\x62\")][_0x1ab9(\"\\u0030\\u0078\\u0063\")];for(i=0x0;i", + "bookUrl": "url", + "checkKeyWord": "鬼畜英雄", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x582c,_0x4da6,User,Title,Link,Intro,data,data1,data2,Headers,emH8Kc,GQGGOH;function C9FOi1(_0x582c,_0x4da6,User){for(User=0x0;User<_0x4da6;User++)_0x582c.push(_0x582c.shift());return _0x582c}function hAcYGm(){}x2vDIfw(_0x582c=C9FOi1([\"\\u0035\\u0059\\u0032\\u0033\\u0049\\u0043\\u0067\\u003d\",\"\\x36\\x4b\\x6d\\x78\\x49\\x43\\x67\\x3d\",\"\\u0063\\u0032\\u006c\\u0036\\u005a\\u0051\\u003d\\u003d\",\"\\x62\\x57\\x46\\x30\\x59\\x32\\x67\\x3d\",\"\\u0063\\u0032\\u0056\\u0030\\u0064\\u0047\\u0078\\u006c\",\"\\x4a\\x44\\x45\\x67\",\"\\u0063\\u0047\\u0046\\u006b\\u0055\\u0033\\u0052\\u0068\\u0063\\u006e\\u0051\\u003d\",\"\\u0065\\u0079\\u004a\\u0076\\u0063\\u0047\\u0056\\u0079\\u0059\\u0058\\u0052\\u0070\\u0062\\u0032\\u0035\\u004f\\u0059\\u0057\\u0031\\u006c\\u0049\\u006a\\u006f\\u0069\\u0061\\u0057\\u0031\\u0068\\u005a\\u0032\\u0056\\u007a\\u0051\\u006e\\u006c\\u0044\\u0061\\u0047\\u0046\\u0077\\u0064\\u0047\\u0056\\u0079\\u0053\\u0057\\u0051\\u0069\\u004c\\u0043\\u004a\\u0032\\u0059\\u0058\\u004a\\u0070\\u0059\\u0057\\u004a\\u0073\\u005a\\u0058\\u004d\\u0069\\u004f\\u006e\\u0073\\u0069\\u0059\\u0032\\u0068\\u0068\\u0063\\u0048\\u0052\\u006c\\u0063\\u006b\\u006c\\u006b\\u0049\\u006a\\u006f\\u0069\",\"\\u0049\\u006e\\u0030\\u0073\\u0049\\u006e\\u0046\\u0031\\u005a\\u0058\\u004a\\u0035\\u0049\\u006a\\u006f\\u0069\\u0063\\u0058\\u0056\\u006c\\u0063\\u006e\\u006b\\u0067\\u0061\\u0057\\u0031\\u0068\\u005a\\u0032\\u0056\\u007a\\u0051\\u006e\\u006c\\u0044\\u0061\\u0047\\u0046\\u0077\\u0064\\u0047\\u0056\\u0079\\u0053\\u0057\\u0051\\u006f\\u004a\\u0047\\u004e\\u006f\\u0059\\u0058\\u0042\\u0030\\u005a\\u0058\\u004a\\u004a\\u005a\\u0044\\u006f\\u0067\\u0053\\u0055\\u0051\\u0068\\u004b\\u0053\\u0042\\u0037\\u0043\\u0069\\u0041\\u0067\\u0061\\u0057\\u0031\\u0068\\u005a\\u0032\\u0056\\u007a\\u0051\\u006e\\u006c\\u0044\\u0061\\u0047\\u0046\\u0077\\u0064\\u0047\\u0056\\u0079\\u0053\\u0057\\u0051\\u006f\\u0059\\u0032\\u0068\\u0068\\u0063\\u0048\\u0052\\u006c\\u0063\\u006b\\u006c\\u006b\\u004f\\u0069\\u0041\\u006b\\u0059\\u0032\\u0068\\u0068\\u0063\\u0048\\u0052\\u006c\\u0063\\u006b\\u006c\\u006b\\u004b\\u0053\\u0042\\u0037\\u0043\\u0069\\u0041\\u0067\\u0049\\u0043\\u0042\\u0070\\u005a\\u0041\\u006f\\u0067\\u0049\\u0043\\u0041\\u0067\\u0061\\u0032\\u006c\\u006b\\u0043\\u0069\\u0041\\u0067\\u0049\\u0043\\u0042\\u006f\\u005a\\u0057\\u006c\\u006e\\u0061\\u0048\\u0051\\u004b\\u0049\\u0043\\u0041\\u0067\\u0049\\u0048\\u0064\\u0070\\u005a\\u0048\\u0052\\u006f\\u0043\\u0069\\u0041\\u0067\\u0049\\u0043\\u0042\\u0066\\u0058\\u0033\\u0052\\u0035\\u0063\\u0047\\u0056\\u0075\\u0059\\u0057\\u0031\\u006c\\u0043\\u0069\\u0041\\u0067\\u0066\\u0051\\u0070\\u0039\\u0049\\u006e\\u0030\\u003d\",\"\\x64\\x47\\x6c\\x30\\x62\\x47\\x55\\x3d\",\"\\x4c\\x32\\x46\\x77\\x61\\x53\\x39\\x78\\x64\\x57\\x56\\x79\\x65\\x53\\x78\\x37\\x49\\x6d\\x4a\\x76\\x5a\\x48\\x6b\\x69\\x4f\\x67\\x3d\\x3d\",\"\\u004c\\u0043\\u004a\\u006f\\u005a\\u0057\\u0046\\u006b\\u005a\\u0058\\u004a\\u007a\\u0049\\u006a\\u0070\\u0037\\u0049\\u006c\\u004a\\u006c\\u005a\\u006d\\u0056\\u0079\\u005a\\u0058\\u0049\\u0069\\u004f\\u0069\\u0049\\u003d\",\"\\u004c\\u0032\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0077\\u003d\\u003d\",\"\\u004c\\u0032\\u004e\\u006f\\u0059\\u0058\\u0042\\u0030\\u005a\\u0058\\u0049\\u0076\",\"\\u004c\\u0032\\u006c\\u0074\\u0059\\u0057\\u0064\\u006c\\u0063\\u0079\\u0039\\u0068\\u0062\\u0047\\u0077\\u002f\\u0063\\u0047\\u0046\\u006e\\u005a\\u0054\\u0030\\u0078\\u0049\\u0069\\u0077\\u0069\\u0051\\u0032\\u0039\\u0075\\u0064\\u0047\\u0056\\u0075\\u0064\\u0043\\u0031\\u0055\\u0065\\u0058\\u0042\\u006c\\u0049\\u006a\\u006f\\u0069\\u0059\\u0058\\u0042\\u0077\\u0062\\u0047\\u006c\\u006a\\u0059\\u0058\\u0052\\u0070\\u0062\\u0032\\u0034\\u0076\\u0061\\u006e\\u004e\\u0076\\u0062\\u0069\\u004a\\u0039\\u004c\\u0043\\u004a\\u0074\\u005a\\u0058\\u0052\\u006f\\u0062\\u0032\\u0051\\u0069\\u004f\\u0069\\u0041\\u0069\\u0055\\u0045\\u0039\\u0054\\u0056\\u0043\\u004a\\u0039\",\"\\u005a\\u0032\\u0056\\u0030\\u0056\\u006d\\u0046\\u0079\\u0061\\u0057\\u0046\\u0069\\u0062\\u0047\\u0055\\u003d\",\"\\x59\\x33\\x56\\x7a\\x64\\x47\\x39\\x74\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\x64\\x58\\x4a\\x73\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\x52\\x30\\x56\\x55\",\"\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\",\"\\u0065\\u0047\\u006c\\u0068\\u0062\\u0032\\u0068\\u0068\\u0062\\u006a\\u0049\\u007a\\u004d\\u0051\\u003d\\u003d\",\"\\u0051\\u0057\\u004e\\u006a\\u0062\\u0033\\u0056\\u0075\\u0064\\u0046\\u0038\\u0078\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\x36\\x4c\\x53\\x6d\\x35\\x59\\x2b\\x33\\x37\\x37\\x79\\x61\",\"\\x5a\\x47\\x46\\x30\\x59\\x51\\x3d\\x3d\",\"\\x59\\x32\\x68\\x68\\x63\\x48\\x52\\x6c\\x63\\x6e\\x4e\\x43\\x65\\x55\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x53\\x57\\x51\\x3d\",\"\\x63\\x33\\x56\\x69\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\",\"\\x61\\x57\\x35\\x6b\\x5a\\x58\\x68\\x50\\x5a\\x67\\x3d\\x3d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u004a\\u005a\\u0043\\u0049\\u0036\",\"\\u0062\\u0047\\u0046\\u007a\\u0064\\u0045\\u006c\\u0075\\u005a\\u0047\\u0056\\u0034\\u0054\\u0032\\u0059\\u003d\",\"\\u0049\\u006e\\u0046\\u0031\\u005a\\u0058\\u004a\\u0035\\u0049\\u0067\\u003d\\u003d\",\"\\u0062\\u0033\\u004a\\u0070\\u005a\\u0032\\u006c\\u0075\\u0054\\u006d\\u0046\\u0074\\u005a\\u0051\\u003d\\u003d\",\"\\x62\\x6d\\x46\\x74\\x5a\\x51\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x68\\x5a\\x45\\x4e\\x76\\x62\\x6d\\x5a\\x70\\x5a\\x77\\x3d\\x3d\",\"\\u005a\\u0033\\u004a\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\u0061\\u0057\\u0035\\u006a\\u0062\\u0048\\u0056\\u006b\\u005a\\u0058\\u004d\\u003d\",\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\u0061\\u0032\\u006c\\u0075\\u005a\\u0041\\u003d\\u003d\",\"\\u0065\\u0079\\u004a\\u0069\\u0062\\u0032\\u0052\\u0035\\u0049\\u006a\\u0070\\u0037\\u0049\\u006d\\u0039\\u0077\\u005a\\u0058\\u004a\\u0068\\u0064\\u0047\\u006c\\u0076\\u0062\\u006b\\u0035\\u0068\\u0062\\u0057\\u0055\\u0069\\u004f\\u0069\\u004a\\u0068\\u005a\\u0047\\u0052\\u0047\\u0059\\u0058\\u005a\\u0076\\u0063\\u006d\\u006c\\u0030\\u005a\\u0053\\u0049\\u0073\\u0049\\u006e\\u005a\\u0068\\u0063\\u006d\\u006c\\u0068\\u0059\\u006d\\u0078\\u006c\\u0063\\u0079\\u0049\\u0036\\u0065\\u0079\\u004a\\u006a\\u0062\\u0032\\u0031\\u0070\\u0059\\u0030\\u006c\\u006b\\u0049\\u006a\\u006f\\u0069\",\"\\u0049\\u006e\\u0030\\u0073\\u0049\\u006e\\u0046\\u0031\\u005a\\u0058\\u004a\\u0035\\u0049\\u006a\\u006f\\u0069\\u0062\\u0058\\u0056\\u0030\\u0059\\u0058\\u0052\\u0070\\u0062\\u0032\\u0034\\u0067\\u0059\\u0057\\u0052\\u006b\\u0052\\u006d\\u0046\\u0032\\u0062\\u0033\\u004a\\u0070\\u0064\\u0047\\u0055\\u006f\\u004a\\u0047\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u0053\\u0057\\u0051\\u0036\\u0049\\u0045\\u006c\\u0045\\u0049\\u0053\\u006b\\u0067\\u0065\\u0077\\u006f\\u0067\\u0049\\u0047\\u0046\\u006b\\u005a\\u0045\\u005a\\u0068\\u0064\\u006d\\u0039\\u0079\\u0061\\u0058\\u0052\\u006c\\u004b\\u0047\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u0053\\u0057\\u0051\\u0036\\u0049\\u0043\\u0052\\u006a\\u0062\\u0032\\u0031\\u0070\\u0059\\u0030\\u006c\\u006b\\u004b\\u0053\\u0042\\u0037\\u0043\\u0069\\u0041\\u0067\\u0049\\u0043\\u0042\\u0070\\u005a\\u0041\\u006f\\u0067\\u0049\\u0043\\u0041\\u0067\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u004a\\u005a\\u0041\\u006f\\u0067\\u0049\\u0043\\u0041\\u0067\\u005a\\u0047\\u0046\\u0030\\u005a\\u0055\\u0046\\u006b\\u005a\\u0047\\u0056\\u006b\\u0043\\u0069\\u0041\\u0067\\u0049\\u0043\\u0042\\u0073\\u0059\\u0058\\u004e\\u0030\\u0051\\u0057\\u004e\\u006a\\u005a\\u0058\\u004e\\u007a\\u0043\\u0069\\u0041\\u0067\\u0049\\u0043\\u0042\\u0069\\u0062\\u0032\\u0039\\u0072\\u0055\\u006d\\u0056\\u0068\\u005a\\u0046\\u0042\\u0079\\u0062\\u0032\\u0064\\u0079\\u005a\\u0058\\u004e\\u007a\\u0043\\u0069\\u0041\\u0067\\u0049\\u0043\\u0042\\u006a\\u0061\\u0047\\u0046\\u0077\\u0064\\u0047\\u0056\\u0079\\u0055\\u006d\\u0056\\u0068\\u005a\\u0046\\u0042\\u0079\\u0062\\u0032\\u0064\\u0079\\u005a\\u0058\\u004e\\u007a\\u0043\\u0069\\u0041\\u0067\\u0049\\u0043\\u0042\\u0066\\u0058\\u0033\\u0052\\u0035\\u0063\\u0047\\u0056\\u0075\\u0059\\u0057\\u0031\\u006c\\u0043\\u0069\\u0041\\u0067\\u0066\\u0051\\u0070\\u0039\\u0049\\u006e\\u0030\\u0073\\u0049\\u006d\\u0068\\u006c\\u0059\\u0057\\u0052\\u006c\\u0063\\u006e\\u004d\\u0069\\u004f\\u006e\\u0073\\u0069\\u0051\\u0032\\u0039\\u0075\\u0064\\u0047\\u0056\\u0075\\u0064\\u0043\\u0031\\u0055\\u0065\\u0058\\u0042\\u006c\\u0049\\u006a\\u006f\\u0069\\u0059\\u0058\\u0042\\u0077\\u0062\\u0047\\u006c\\u006a\\u0059\\u0058\\u0052\\u0070\\u0062\\u0032\\u0034\\u0076\\u0061\\u006e\\u004e\\u0076\\u0062\\u0069\\u004a\\u0039\\u004c\\u0043\\u004a\\u0074\\u005a\\u0058\\u0052\\u006f\\u0062\\u0032\\u0051\\u0069\\u004f\\u0069\\u0041\\u0069\\u0055\\u0045\\u0039\\u0054\\u0056\\u0043\\u004a\\u0039\",\"\\u004c\\u0032\\u0046\\u0077\\u0061\\u0053\\u0039\\u0078\\u0064\\u0057\\u0056\\u0079\\u0065\\u0053\\u0077\\u003d\",\"\\x59\\x57\\x70\\x68\\x65\\x41\\x3d\\x3d\",\"\\u0063\\u0048\\u0056\\u0030\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0034\\u0034\\u0043\\u0051\\u0035\\u0070\\u0053\\u0032\\u0036\\u004a\\u0065\\u0050\\u0035\\u006f\\u002b\\u0051\\u0035\\u0036\\u0053\\u0036\\u0034\\u0034\\u0043\\u0052\\u0043\\u0067\\u0072\\u0069\\u006c\\u0049\\u002f\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u0049\\u0048\\u0069\\u006c\\u0049\\u0058\\u0069\\u006c\\u004a\\u004d\\u004b\\u0034\\u0070\\u0053\\u004c\\u0034\\u0070\\u0053\\u004c\\u0043\\u0067\\u003d\\u003d\",\"\\u0043\\u0075\\u004b\\u0055\\u0069\\u002b\\u004b\\u0055\\u0069\\u0077\\u003d\\u003d\",\"\\u0043\\u0075\\u004b\\u0064\\u0070\\u004f\\u002b\\u0034\\u006a\\u002b\\u0057\\u0033\\u0073\\u0075\\u0061\\u0033\\u0075\\u002b\\u0057\\u004b\\u006f\\u004f\\u0061\\u0055\\u0074\\u0075\\u0069\\u0058\\u006a\\u002b\\u004b\\u0064\\u0070\\u004f\\u002b\\u0034\\u006a\\u0077\\u0072\\u0069\\u006c\\u0049\\u0076\\u0069\\u006c\\u0049\\u0073\\u003d\",\"\\x43\\x75\\x4b\\x55\\x6c\\x2b\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x67\\x65\\x4b\\x55\\x68\\x65\\x4b\\x55\\x6d\\x77\\x3d\\x3d\",\"\\x65\\x79\\x4a\\x69\\x62\\x32\\x52\\x35\\x49\\x6a\\x70\\x37\\x49\\x6d\\x39\\x77\\x5a\\x58\\x4a\\x68\\x64\\x47\\x6c\\x76\\x62\\x6b\\x35\\x68\\x62\\x57\\x55\\x69\\x4f\\x69\\x4a\\x79\\x5a\\x57\\x31\\x76\\x64\\x6d\\x56\\x47\\x59\\x58\\x5a\\x76\\x63\\x6d\\x6c\\x30\\x5a\\x53\\x49\\x73\\x49\\x6e\\x5a\\x68\\x63\\x6d\\x6c\\x68\\x59\\x6d\\x78\\x6c\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x6a\\x62\\x32\\x31\\x70\\x59\\x30\\x6c\\x6b\\x49\\x6a\\x6f\\x69\",\"\\x49\\x6e\\x30\\x73\\x49\\x6e\\x46\\x31\\x5a\\x58\\x4a\\x35\\x49\\x6a\\x6f\\x69\\x62\\x58\\x56\\x30\\x59\\x58\\x52\\x70\\x62\\x32\\x34\\x67\\x63\\x6d\\x56\\x74\\x62\\x33\\x5a\\x6c\\x52\\x6d\\x46\\x32\\x62\\x33\\x4a\\x70\\x64\\x47\\x55\\x6f\\x4a\\x47\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x53\\x57\\x51\\x36\\x49\\x45\\x6c\\x45\\x49\\x53\\x6b\\x67\\x65\\x77\\x6f\\x67\\x49\\x48\\x4a\\x6c\\x62\\x57\\x39\\x32\\x5a\\x55\\x5a\\x68\\x64\\x6d\\x39\\x79\\x61\\x58\\x52\\x6c\\x4b\\x47\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x53\\x57\\x51\\x36\\x49\\x43\\x52\\x6a\\x62\\x32\\x31\\x70\\x59\\x30\\x6c\\x6b\\x4b\\x51\\x70\\x39\\x49\\x6e\\x30\\x73\\x49\\x6d\\x68\\x6c\\x59\\x57\\x52\\x6c\\x63\\x6e\\x4d\\x69\\x4f\\x6e\\x73\\x69\\x51\\x32\\x39\\x75\\x64\\x47\\x56\\x75\\x64\\x43\\x31\\x55\\x65\\x58\\x42\\x6c\\x49\\x6a\\x6f\\x69\\x59\\x58\\x42\\x77\\x62\\x47\\x6c\\x6a\\x59\\x58\\x52\\x70\\x62\\x32\\x34\\x76\\x61\\x6e\\x4e\\x76\\x62\\x69\\x4a\\x39\\x4c\\x43\\x4a\\x74\\x5a\\x58\\x52\\x6f\\x62\\x32\\x51\\x69\\x4f\\x69\\x41\\x69\\x55\\x45\\x39\\x54\\x56\\x43\\x4a\\x39\",\"\\x43\\x75\\x4b\\x5a\\x6f\\x2b\\x2b\\x34\\x6a\\x2b\\x57\\x33\\x73\\x75\\x57\\x50\\x6c\\x75\\x61\\x32\\x69\\x4f\\x61\\x55\\x74\\x75\\x69\\x58\\x6a\\x2b\\x4b\\x5a\\x6f\\x2b\\x2b\\x34\\x6a\\x77\\x72\\x69\\x6c\\x49\\x76\\x69\\x6c\\x49\\x73\\x3d\",\"\\u005a\\u0047\\u0046\\u0030\\u005a\\u0051\\u003d\\u003d\",\"\\x5a\\x47\\x46\\x30\\x5a\\x56\\x56\\x77\\x5a\\x47\\x46\\x30\\x5a\\x57\\x51\\x3d\",\"\\u0063\\u0032\\u0056\\u0079\\u0061\\u0057\\u0046\\u0073\",\"\\u0064\\u0048\\u006c\\u0077\\u005a\\u0051\\u003d\\u003d\",\"\\u0059\\u006d\\u0039\\u0076\\u0061\\u0077\\u003d\\u003d\"],0x11),_0x4da6=function(User,Title){var Link,Intro;x2vDIfw(User=User-0x0,Link=_0x582c[User]);if(_0x4da6.USdbXu===void 0x0){x2vDIfw(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;x2vDIfw(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x582c=0x0,_0x4da6,data,data1=0x0;data=Title.charAt(data1++);~data&&(_0x4da6=_0x582c%0x4?_0x4da6*0x40+data:data,_0x582c++%0x4)?Intro+=String.fromCharCode(0xff&_0x4da6>>(-0x2*_0x582c&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x4da6.qqFELB=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x582c=Title.length;Intro<_0x582c;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x4da6.roeuHW={},_0x4da6.USdbXu=!0x0)}x2vDIfw(Intro=_0x4da6.roeuHW[User],Intro===void 0x0?(Link=_0x4da6.qqFELB(Link),_0x4da6.roeuHW[User]=Link):Link=Intro);return Link},eval(String(source[_0x4da6(\"\\x30\\x78\\x30\")])),eval(String(java[_0x4da6(\"\\x30\\x78\\x31\")](cache_api+_0x4da6(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],data1=[],data2=[],Headers=JSON[_0x4da6(\"\\u0030\\u0078\\u0033\")](cache[_0x4da6(\"\\x30\\x78\\x34\")](java[_0x4da6(\"\\u0030\\u0078\\u0035\")](Get(_0x4da6(\"\\x30\\x78\\x36\"))+_0x4da6(\"\\u0030\\u0078\\u0037\")))[_0x4da6(\"\\x30\\x78\\x38\")](Get(_0x4da6(\"\\u0030\\u0078\\u0036\")),baseUrl)),emH8Kc=_0x4da6(\"\\x30\\x78\\x39\"),GQGGOH=Headers);if(!(\"\\u006f\\u0031\\u0072\\u0038\\u0045\\u0031\\u0072\" in hAcYGm)&&String(book[_0x4da6(\"\\u0030\\u0078\\u0061\")])!==_0x4da6(\"\\x30\\x78\\x62\")){var list,index;x2vDIfw(Account=cache[_0x4da6(\"\\x30\\x78\\x34\")](java[_0x4da6(\"\\x30\\x78\\x35\")](Get(_0x4da6(\"\\u0030\\u0078\\u0036\"))+_0x4da6(\"\\x30\\x78\\x63\")))&&String(cache[_0x4da6(\"\\x30\\x78\\x34\")](java[_0x4da6(\"\\u0030\\u0078\\u0035\")](Get(_0x4da6(\"\\x30\\x78\\x36\"))+_0x4da6(\"\\x30\\x78\\x63\"))))[_0x4da6(\"\\u0030\\u0078\\u0064\")]>0x0?cache[_0x4da6(\"\\x30\\x78\\x34\")](java[_0x4da6(\"\\x30\\x78\\x35\")](Get(_0x4da6(\"\\x30\\x78\\x36\"))+_0x4da6(\"\\x30\\x78\\x63\"))):Map(_0x4da6(\"\\u0030\\u0078\\u0065\")),list=JSON[_0x4da6(\"\\x30\\x78\\x33\")](result)[_0x4da6(\"\\u0030\\u0078\\u0066\")][_0x4da6(\"\\x30\\x78\\x31\\x30\")],comicId=baseUrl[_0x4da6(\"\\x30\\x78\\x31\\x31\")](baseUrl[_0x4da6(\"\\u0030\\u0078\\u0031\\u0032\")](_0x4da6(\"\\x30\\x78\\x31\\x33\"))+0xa,baseUrl[_0x4da6(\"\\u0030\\u0078\\u0031\\u0034\")](_0x4da6(\"\\u0030\\u0078\\u0031\\u0035\"))-0x3));if(!(\"\\x6c\\x63\\x6d\\x54\\x31\\x35\\x64\" in hAcYGm)&&String(Account)[_0x4da6(\"\\u0030\\u0078\\u0064\")]>0x0&&list[_0x4da6(\"\\x30\\x78\\x64\")]>0x0){var SC,BN,Bookname;let dataId=comicId;x2vDIfw(SC=cache[_0x4da6(\"\\x30\\x78\\x34\")](java[_0x4da6(\"\\x30\\x78\\x35\")](book[_0x4da6(\"\\x30\\x78\\x31\\x36\")]+Account+dataId))?cache[_0x4da6(\"\\x30\\x78\\x34\")](java[_0x4da6(\"\\u0030\\u0078\\u0035\")](book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0036\")]+Account+dataId)):\"\",BN=book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0037\")],Bookname=BN[_0x4da6(\"\\u0030\\u0078\\u0064\")]>=0x3c?BN[_0x4da6(\"\\x30\\x78\\x31\\x31\")](0x0,0xe)+\"\\u000a\"+BN[_0x4da6(\"\\u0030\\u0078\\u0031\\u0031\")](0xe,0x1d)+\"\\x0a\"+BN[_0x4da6(\"\\x30\\x78\\x31\\x31\")](0x1d,0x2c)+\"\\x0a\"+BN[_0x4da6(\"\\x30\\x78\\x31\\x31\")](0x2c,0x3b)+\"\\x0a\"+BN[_0x4da6(\"\\x30\\x78\\x31\\x31\")](0x3b):BN[_0x4da6(\"\\x30\\x78\\x64\")]>=0x2d?BN[_0x4da6(\"\\u0030\\u0078\\u0031\\u0031\")](0x0,0xe)+\"\\x0a\"+BN[_0x4da6(\"\\u0030\\u0078\\u0031\\u0031\")](0xe,0x1d)+\"\\x0a\"+BN[_0x4da6(\"\\u0030\\u0078\\u0031\\u0031\")](0x1d,0x2c)+\"\\u000a\"+BN[_0x4da6(\"\\u0030\\u0078\\u0031\\u0031\")](0x3b):BN[_0x4da6(\"\\u0030\\u0078\\u0064\")]>=0x1e?BN[_0x4da6(\"\\u0030\\u0078\\u0031\\u0031\")](0x0,0xe)+\"\\u000a\"+BN[_0x4da6(\"\\u0030\\u0078\\u0031\\u0031\")](0xe,0x1d)+\"\\u000a\"+BN[_0x4da6(\"\\x30\\x78\\x31\\x31\")](0x1d):BN[_0x4da6(\"\\x30\\x78\\x64\")]>=0xf?BN[_0x4da6(\"\\u0030\\u0078\\u0031\\u0031\")](0x0,0xe)+\"\\u000a\"+BN[_0x4da6(\"\\x30\\x78\\x31\\x31\")](0xe):BN);if(book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0038\")]&&book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0039\")]>0x0&&SC[_0x4da6(\"\\u0030\\u0078\\u0031\\u0061\")](\"\\u0079\")&&!new RegExp(\"\\x5e✔\\x5c\\x2c\",\"\")[_0x4da6(\"\\u0030\\u0078\\u0031\\u0062\")](book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0063\")])){book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0063\")]=\"✔\\x2c\"+book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0063\")]}if(book[_0x4da6(\"\\x30\\x78\\x31\\x38\")]&&book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0039\")]>0x0&&!SC[_0x4da6(\"\\u0030\\u0078\\u0031\\u0061\")](\"\\u0079\")&&new RegExp(\"\\x5e✔\\x5c\\x2c\",\"\")[_0x4da6(\"\\u0030\\u0078\\u0031\\u0062\")](book[_0x4da6(\"\\x30\\x78\\x31\\x63\")])){let option=_0x4da6(\"\\x30\\x78\\x31\\x64\")+dataId+_0x4da6(\"\\u0030\\u0078\\u0031\\u0065\"),url=Get(_0x4da6(\"\\x30\\x78\\x36\"))+_0x4da6(\"\\u0030\\u0078\\u0031\\u0066\")+option;x2vDIfw(java[_0x4da6(\"\\x30\\x78\\x32\\x30\")](url),cache[_0x4da6(\"\\x30\\x78\\x32\\x31\")](java[_0x4da6(\"\\x30\\x78\\x35\")](book[_0x4da6(\"\\x30\\x78\\x31\\x36\")]+Account+dataId),\"\\x79\"))}if(book[_0x4da6(\"\\x30\\x78\\x31\\x38\")]&&book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0039\")]>0x0&&!SC[_0x4da6(\"\\x30\\x78\\x31\\x61\")](\"\\u0079\")){let option=_0x4da6(\"\\u0030\\u0078\\u0031\\u0064\")+dataId+_0x4da6(\"\\u0030\\u0078\\u0031\\u0065\"),url=Get(_0x4da6(\"\\u0030\\u0078\\u0036\"))+_0x4da6(\"\\u0030\\u0078\\u0031\\u0066\")+option;if(!new RegExp(\"\\u005e✔\\u005c\\u002c\",\"\")[_0x4da6(\"\\u0030\\u0078\\u0031\\u0062\")](book[_0x4da6(\"\\x30\\x78\\x31\\x63\")])){x2vDIfw(java[_0x4da6(\"\\u0030\\u0078\\u0032\\u0030\")](url),book[_0x4da6(\"\\x30\\x78\\x31\\x63\")]=\"✔\\x2c\"+book[_0x4da6(\"\\u0030\\u0078\\u0031\\u0063\")],cache[_0x4da6(\"\\u0030\\u0078\\u0032\\u0031\")](java[_0x4da6(\"\\x30\\x78\\x35\")](book[_0x4da6(\"\\x30\\x78\\x31\\x36\")]+Account+dataId),\"\\x79\"),login(Put(JSON[_0x4da6(\"\\x30\\x78\\x32\\x32\")](_0x4da6(\"\\u0030\\u0078\\u0032\\u0033\")+Bookname+_0x4da6(\"\\x30\\x78\\x32\\x34\")+_0x4da6(\"\\x30\\x78\\x32\\x35\")+_0x4da6(\"\\x30\\x78\\x32\\x36\")))))}}if(book[_0x4da6(\"\\x30\\x78\\x31\\x38\")]&&book[_0x4da6(\"\\x30\\x78\\x31\\x39\")]<0x1&&SC[_0x4da6(\"\\u0030\\u0078\\u0031\\u0061\")](\"\\u0079\")){let option=_0x4da6(\"\\x30\\x78\\x32\\x37\")+dataId+_0x4da6(\"\\x30\\x78\\x32\\x38\"),url=Get(_0x4da6(\"\\u0030\\u0078\\u0036\"))+_0x4da6(\"\\x30\\x78\\x31\\x66\")+option;x2vDIfw(java[_0x4da6(\"\\u0030\\u0078\\u0032\\u0030\")](url),cache[_0x4da6(\"\\u0030\\u0078\\u0032\\u0031\")](java[_0x4da6(\"\\u0030\\u0078\\u0035\")](book[_0x4da6(\"\\x30\\x78\\x31\\x36\")]+Account+dataId),\"\\u006e\"),login(Put(JSON[_0x4da6(\"\\u0030\\u0078\\u0032\\u0032\")](_0x4da6(\"\\u0030\\u0078\\u0032\\u0033\")+Bookname+_0x4da6(\"\\u0030\\u0078\\u0032\\u0034\")+_0x4da6(\"\\x30\\x78\\x32\\x39\")+_0x4da6(\"\\u0030\\u0078\\u0032\\u0036\")))))}}date=java[_0x4da6(\"\\x30\\x78\\x34\")](_0x4da6(\"\\u0030\\u0078\\u0032\\u0061\"));for(i in list){var body;x2vDIfw(date1=list[i][_0x4da6(\"\\u0030\\u0078\\u0032\\u0062\")][_0x4da6(\"\\x30\\x78\\x38\")](new RegExp(\"\\u0054\",\"\\u0067\"),\"\\x20\")[_0x4da6(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005a\",\"\\u0067\"),\"\"),title=String(\"第\"+list[i][_0x4da6(\"\\u0030\\u0078\\u0032\\u0063\")]+(list[i][_0x4da6(\"\\x30\\x78\\x32\\x64\")]==_0x4da6(\"\\x30\\x78\\x32\\x65\")?_0x4da6(\"\\x30\\x78\\x32\\x66\"):_0x4da6(\"\\u0030\\u0078\\u0033\\u0030\"))+list[i][_0x4da6(\"\\u0030\\u0078\\u0033\\u0031\")]+\"\\x70\\x29\"),order=title[_0x4da6(\"\\x30\\x78\\x33\\x32\")](new RegExp(\"\\x28\\x5c\\x64\\x2b\\x29\",\"\")),title=Get(_0x4da6(\"\\x30\\x78\\x33\\x33\"))==!![]?String(title)[_0x4da6(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x2d\\x5c\\x73\\x7c\\x2d\",\"\\x67\"),\"\\u0020\")[_0x4da6(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x2b\",\"\"),\"\\x20\")[_0x4da6(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b章回期\\u005d\\u0028\\u007c\\u005c\\u0073\\u0029第\\u002e\\u002a\\u003f\\u005b章回期\\u005d\",\"\"),\"\\u0024\\u0031\")[_0x4da6(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b章回期\\u005d\\u005b\\u005e\\u005c\\u0073\\u005d\",\"\"),_0x4da6(\"\\x30\\x78\\x33\\x34\"))[_0x4da6(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b章回期\\u005d\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\u0024\\u0031\")[_0x4da6(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u002e\\u002a\\u0028\\u005c\\u0064\\u002b\\u0029\\u002e\\u002a\\u003f\\u005b章回期\\u005d\",\"\"),\"\\u0024\\u0031\")[_0x4da6(\"\\x30\\x78\\x38\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\"),title[_0x4da6(\"\\u0030\\u0078\\u0033\\u0032\")](new RegExp(\"\\u005c\\u0064\\u002b\",\"\"))?order[0x1][_0x4da6(\"\\x30\\x78\\x33\\x35\")](0x3,\"\\x30\"):\"\\x24\\x31\"):title,body=_0x4da6(\"\\u0030\\u0078\\u0033\\u0036\")+list[i].id+_0x4da6(\"\\u0030\\u0078\\u0033\\u0037\"));if(list[i][_0x4da6(\"\\u0030\\u0078\\u0032\\u0064\")]==_0x4da6(\"\\u0030\\u0078\\u0032\\u0065\")){if(data2[_0x4da6(\"\\u0030\\u0078\\u0064\")]>=0x1){data2[data2[_0x4da6(\"\\u0030\\u0078\\u0064\")]-0x1][_0x4da6(\"\\x30\\x78\\x33\\x38\")]=data2[data2[_0x4da6(\"\\u0030\\u0078\\u0064\")]-0x1][_0x4da6(\"\\x30\\x78\\x33\\x38\")][_0x4da6(\"\\u0030\\u0078\\u0038\")](new RegExp(\"〔\\x2e\\x2a\",\"\\u0067\"),\"\")}push(data2,{title:date[_0x4da6(\"\\x30\\x78\\x31\\x61\")](date1)?title+\"〔\"+date1+\"〕\":title,link:Get(_0x4da6(\"\\u0030\\u0078\\u0036\"))+_0x4da6(\"\\u0030\\u0078\\u0033\\u0039\")+body+_0x4da6(\"\\u0030\\u0078\\u0033\\u0061\")+Get(_0x4da6(\"\\x30\\x78\\x36\"))+_0x4da6(\"\\x30\\x78\\x33\\x62\")+comicId+_0x4da6(\"\\u0030\\u0078\\u0033\\u0063\")+list[i].id+_0x4da6(\"\\u0030\\u0078\\u0033\\u0064\"),time:list[i][_0x4da6(\"\\x30\\x78\\x32\\x62\")][_0x4da6(\"\\x30\\x78\\x38\")](new RegExp(\"\\x54\",\"\\u0067\"),\"\\x20\")[_0x4da6(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005a\",\"\\x67\"),\"\")})}else{if(data1[_0x4da6(\"\\x30\\x78\\x64\")]>=0x1){data1[data1[_0x4da6(\"\\u0030\\u0078\\u0064\")]-0x1][_0x4da6(\"\\u0030\\u0078\\u0033\\u0038\")]=data1[data1[_0x4da6(\"\\x30\\x78\\x64\")]-0x1][_0x4da6(\"\\x30\\x78\\x33\\x38\")][_0x4da6(\"\\x30\\x78\\x38\")](new RegExp(\"〔\\u002e\\u002a\",\"\\u0067\"),\"\")}push(data1,{title:date[_0x4da6(\"\\u0030\\u0078\\u0031\\u0061\")](date1)?title+\"〔\"+date1+\"〕\":title,link:Get(_0x4da6(\"\\x30\\x78\\x36\"))+_0x4da6(\"\\u0030\\u0078\\u0033\\u0039\")+body+_0x4da6(\"\\x30\\x78\\x33\\x61\")+Get(_0x4da6(\"\\x30\\x78\\x36\"))+_0x4da6(\"\\u0030\\u0078\\u0033\\u0062\")+comicId+_0x4da6(\"\\x30\\x78\\x33\\x63\")+list[i].id+_0x4da6(\"\\u0030\\u0078\\u0033\\u0064\"),time:list[i][_0x4da6(\"\\x30\\x78\\x32\\x62\")][_0x4da6(\"\\x30\\x78\\x38\")](new RegExp(\"\\u0054\",\"\\u0067\"),\"\\x20\")[_0x4da6(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5a\",\"\\x67\"),\"\")})}}x2vDIfw(index=book[_0x4da6(\"\\u0030\\u0078\\u0033\\u0065\")](_0x4da6(\"\\x30\\x78\\x33\\x66\"))>0x0?book[_0x4da6(\"\\x30\\x78\\x33\\x65\")](_0x4da6(\"\\x30\\x78\\x33\\x66\")):\"\\x30\",index=data1[_0x4da6(\"\\u0030\\u0078\\u0064\")]>0x0?index:\"\\u0031\",data=index>0x0?data2:data1,data=JSON[_0x4da6(\"\\x30\\x78\\x32\\x32\")](data))}else{data=Data1()}function x2vDIfw(){x2vDIfw=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "isVolume": "vol", + "preUpdateJs": "", + "updateTime": "time" + }, + "searchUrl": "\neval(String(source.loginUrl));\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n var body = '{\"operationName\":\"searchComicAndAuthorQuery\",\"variables\":{\"keyword\":\"' + e + '\"},\"query\":\"query searchComicAndAuthorQuery($keyword: String!) {\\n searchComicsAndAuthors(keyword: $keyword) {\\n comics {\\n id\\n title\\n status\\n year\\n imageUrl\\n authors {\\n id\\n name\\n __typename\\n }\\n categories {\\n id\\n name\\n __typename\\n }\\n dateUpdated\\n monthViews\\n views\\n favoriteCount\\n lastBookUpdate\\n lastChapterUpdate\\n __typename\\n }\\n authors {\\n id\\n name\\n chName\\n enName\\n wikiLink\\n comicCount\\n views\\n __typename\\n }\\n __typename\\n }\\n}\"}';\n return Get('url') + '/api/query,{\"body\":' + body + ',\"headers\":{\"Content-Type\":\"application/json\"},\"method\":\"POST\"}';\n}(key));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画", + "bookSourceName": "🎨MYCOMIC💓", + "bookSourceType": 2, + "bookSourceUrl": "https://mycomic.com", + "bookUrlPattern": "https://.*/comics/\\d+", + "concurrentRate": "", + "customOrder": 124, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nvar Url = Get('url') + '/comics';\nvar J = org.jsoup.Jsoup.parse(java.ajax(Url));\nvar list = J.select('.pl-7')[2] ? J.select('.pl-7')[2].select('a') : [];\nO1 = `{{get('o1',Get('o'))}}`;\nP1 = `{{get('p1',Get('p'))}}`;\nQ1 = `{{get('q1',Get('q'))}}`;\nR1 = `{{get('r1',Get('r'))}}`;\nT1 = `{{get('t1',Get('t'))}}`;\nfor (i in list) {\n var kind = String(list[i].select('a').attr('href')).replace(/.*comics\\??/, '');\n kind = kind == '' ? '' : (kind + '&');\n url = `{{Get('url')}}/comics?${O1}${P1}${kind}${T1}${Q1}${R1}page={{page}}`;\n exploreUrl.push(explore(list[i].text(), url, 1, 0.25, false));\n}\nBID = (kind % 3) < 1 ? 0 : (3 - (kind % 3));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.25, false)); \n}\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function get(tag,num) {\n o1 = [\n '',\n 'filter%5Baudience%5D=shaonv&',\n 'filter%5Baudience%5D=shaonian&',\n 'filter%5Baudience%5D=qingnian&',\n 'filter%5Baudience%5D=ertong&',\n 'filter%5Baudience%5D=tongyong&'\n ];\n p1 = [\n '',\n 'filter%5Bcountry%5D=japan&',\n 'filter%5Bcountry%5D=hongkong&',\n 'filter%5Bcountry%5D=europe&',\n 'filter%5Bcountry%5D=china&',\n 'filter%5Bcountry%5D=korea&',\n 'filter%5Bcountry%5D=other&'\n ];\n q1 = [\n '',\n 'filter%5Bend%5D=0&',\n 'filter%5Bend%5D=1&'\n ];\n r1 = [\n '',\n 'sort=-update&',\n 'sort=-views&'\n ];\n t1 = [\n '',\n 'filter%5Byear%5D=2025&',\n 'filter%5Byear%5D=2024&',\n 'filter%5Byear%5D=2023&',\n 'filter%5Byear%5D=2022&',\n 'filter%5Byear%5D=2021&',\n 'filter%5Byear%5D=2020&',\n 'filter%5Byear%5D=2019&',\n 'filter%5Byear%5D=2018&',\n 'filter%5Byear%5D=2017&',\n 'filter%5Byear%5D=2016&',\n 'filter%5Byear%5D=2015&',\n 'filter%5Byear%5D=2014&',\n 'filter%5Byear%5D=2013&',\n 'filter%5Byear%5D=2012&',\n 'filter%5Byear%5D=2011&',\n 'filter%5Byear%5D=2010&',\n 'filter%5Byear%5D=200x&',\n 'filter%5Byear%5D=199x&',\n 'filter%5Byear%5D=198x&',\n 'filter%5Byear%5D=197x&'\n ];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction Num(e) {\n e = String(e);\n var num = e.length > 8 ? (e.substring(0, e.length - 8) + \"亿\") : (e.length > 4 ? (e.substring(0, e.length - 4) + \"万\") : e);\n return num;\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}", + "lastUpdateTime": 1743131245126, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n {\n name: \"💡   源   站   测   试   💡\",\n type: \"button\",\n action: \"test(1)\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(-1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换受众 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"少女\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"少年\", type: \"button\", action: \"o(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"青年\", type: \"button\", action: \"o(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"儿童\", type: \"button\", action: \"o(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"通用\", type: \"button\", action: \"o(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换地区 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"p(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"日本\", type: \"button\", action: \"p(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"港台\", type: \"button\", action: \"p(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"欧美\", type: \"button\", action: \"p(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"内地\", type: \"button\", action: \"p(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"韩国\", type: \"button\", action: \"p(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"其他\", type: \"button\", action: \"p(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换进度 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"q(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"连载\", type: \"button\", action: \"q(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"完结\", type: \"button\", action: \"q(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击标签排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"上架\", type: \"button\", action: \"r(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"更新\", type: \"button\", action: \"r(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"人气\", type: \"button\", action: \"r(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换年份 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"t(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2025\", type: \"button\", action: \"t(20)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2024\", type: \"button\", action: \"t(19)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2023\", type: \"button\", action: \"t(18)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2022\", type: \"button\", action: \"t(17)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2021\", type: \"button\", action: \"t(16)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2020\", type: \"button\", action: \"t(15)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2019\", type: \"button\", action: \"t(14)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2018\", type: \"button\", action: \"t(13)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2017\", type: \"button\", action: \"t(12)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2016\", type: \"button\", action: \"t(11)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2015\", type: \"button\", action: \"t(10)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2014\", type: \"button\", action: \"t(9)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2013\", type: \"button\", action: \"t(8)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2012\", type: \"button\", action: \"t(7)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2011\", type: \"button\", action: \"t(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"2010\", type: \"button\", action: \"t(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"00年代\", type: \"button\", action: \"t(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"90年代\", type: \"button\", action: \"t(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"80年代\", type: \"button\", action: \"t(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"更早\", type: \"button\", action: \"t(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = '';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'o': 0,\n 'p': 0,\n 'q': 0,\n 'r': 0,\n 't': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://mycomic.com',\n 'urls': [\n 'https://mycomic.com'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == -1) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n if (e == 0) {\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0] + ',' + JSON.stringify(Option));\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0]);\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('我的');\n logTime = '【' + name(0) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(4);\n time = new Date().getTime();\n host = java.get(fburl + '?t=' + time, Headers).header('location');\n host = java.get(host, Headers).header('location');\n host = String(host).replace(/\\/[^\\/]*$/, '');\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].unshift(host);\n put($$$);\n $(0);\n } else {\n return test(1);\n }\n}\nfunction name(e) {\n if (e == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '📚当前排序:' + typeR($$$.r)) + '\\n┋┋' + ('\\n' + '🗺当前地区:' + typeP($$$.p)) + '\\n┋┋' + ('\\n' + '🎯当前受众:' + typeO($$$.o)) + '\\n┋┋' + ('\\n' + '📅当前年份:' + typeT($$$.t)) + '\\n┋┋' + ('\\n' + '⏲️漫画进度:' + typeQ($$$.q)) + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci2)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci3)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'] + 1;\n $$$['ci2'] = $$$['ci1'] + 1;\n $$$['ci1'] = 1;\n put($$$);\n return test(e);\n}\nO = ['全部','少女','少年','青年','儿童','通用'];\nfunction typeO(e) {\n if (e == undefined) {\n e = 0;\n }\n return O[e];\n}\nfunction o(e) {\n if (o == undefined) {\n o = result.o;\n }\n if (e == $$$.o) {\n return login('【受众切换提示】' + n(2) + '已经选择此受众,无需更换');\n }\n login('【受众切换提示】' + n(2) + '已经切换到[' + typeO(e) + ']受众');\n $$$.o = e;\n return put($$$);\n}\nP = ['全部','日本','港台','欧美','内地','韩国','其他'];\nfunction typeP(e) {\n if (e == undefined) {\n e = 0;\n }\n return P[e];\n}\nfunction p(e) {\n if (p == undefined) {\n p = result.p;\n }\n if (e == $$$.p) {\n return login('【地区切换提示】' + n(2) + '已经选择此地区,无需更换');\n }\n login('【地区切换提示】' + n(2) + '已经切换到[' + typeP(e) + ']地区');\n $$$.p = e;\n return put($$$);\n}\nQ = ['全部','连载','完结'];\nfunction typeQ(e) {\n if (e == undefined) {\n e = 0;\n }\n return Q[e];\n}\nfunction q(e) {\n if (q == undefined) {\n q = result.q;\n }\n if (e == $$$.q) {\n return login('【进度切换提示】' + n(2) + '已经选择此进度,无需更换');\n }\n login('【进度切换提示】' + n(2) + '已经切换到[' + typeQ(e) + ']进度');\n $$$.q = e;\n return put($$$);\n}\nR = ['上架','更新','人气'];\nfunction typeR(e) {\n if (e == undefined) {\n e = 0;\n }\n return R[e];\n}\nfunction r(e) {\n if (r == undefined) {\n r = result.r;\n }\n if (e == $$$.r) {\n return login('【排序切换提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【排序切换提示】' + n(2) + '已经切换到[' + typeR(e) + ']排序');\n $$$.r = e;\n return put($$$);\n}\nT = ['全部','更早','80年代','90年代','00年代','2010年','2011年','2012年','2013年','2014年','2015年','2016年','2017年','2018年','2019年','2020年','2021年','2022年','2023年','2024年','2025年'];\nfunction typeT(e) {\n if (e == undefined) {\n e = 0;\n }\n return T[e];\n}\nfunction t(e) {\n if (t == undefined) {\n t = result.t;\n }\n if (e == $$$.t) {\n return login('【年份切换提示】' + n(2) + '已经选择此年份,无需更换');\n }\n login('【年份切换提示】' + n(2) + '已经切换到[' + typeT(e) + ']');\n $$$.t = e;\n return put($$$);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}", + "respondTime": 7440, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace(Get('url'), baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n var J = org.jsoup.Jsoup.parse(result);\n var $2 = element => String(java.getElements(element).text());\n var $3 = element => String(J.select(element).attr('src'));\n url = baseUrl;\n var others = [];\n var others1 = [];\n var regex = /chapters:\\s?(\\[[\\s\\S]+?\\])/g;\n var klist = [];\n let match;\n while ((match = regex.exec(result)) !== null) {\n klist.push(match[1]);\n }\n var vlist = J.select('.mt-8.mb-4');\n for (i in vlist) {\n others.push(String('\\n[' + i + ']' + vlist[i].select('div')[1].text() + '〔' + eval(String(klist[i])).length + '章〕'));\n others1.push(vlist[i].select('div')[1].text());\n }\n other = others.length > 1 ? ('📋全部目录:' + others.join(' ') + '\\nㅤ\\n') : '';\n var index = book.getVariable(\"custom\") > 0 ? book.getVariable(\"custom\") : '0';\n s = '';\n k = String(J.select('[data-flux-badge=\"data-flux-badge\"]').text()).replace(/[中已]/, '') + ',' + $2('.my-4 span.3') + ',' + $2('.my-4 span.2') + ',' + String(J.select('[data-flux-subheading]')[0].text()).replace(/(\\d+).*/, '$1');\n t = $2('.my-4 span.1');\n l = eval(String(klist[0]))[0].title;\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[话話章回期](|\\s)第.*?[话話章回期]/, '$1').replace(/.*第(\\d+)[话話章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[话話章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[话話章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci1') == 0 ? '〖默认〗' : '〖更新〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n📚当前排序:〖' + (Get('r') == 0 ? '默认' : '自选') + '〗' + R[Get('r')]) + ('\\n🗺当前地区:〖' + (Get('p') == 0 ? '默认' : '自选') + '〗' + P[Get('p')]) + ('\\n🎯当前受众:〖' + (Get('o') == 0 ? '默认' : '自选') + '〗' + O[Get('o')]) + ('\\n📅当前年份:〖' + (Get('t') == 0 ? '默认' : '自选') + '〗' + T[Get('t')]) + ('\\n⏲️漫画进度:〖' + (Get('q') == 0 ? '默认' : '自选') + '〗' + Q[Get('q')]) + ('\\n📒当前目录:〖' + (index == 0 ? '默认' : '自选') + '〗' + others1[index]) + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n intro = java.getElements('[x-show=\"show\"]') ? java.getElements('[x-show=\"show\"]').text() : '';\n intro = String(intro).length > 0 ? intro : java.getElements('[name=\"description\"]').attr('content');\n book = JSON.stringify({\n 'name': String(J.select('[data-flux-heading]')[0].text()),\n 'author': $2('.my-4 span.0').replace(/\\,/g, '/'),\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l + '〔' + t + '〕',\n 'intro': (t != '' ? ('更新时间:' + t + '\\nㅤ\\n') : '') + other + '\\n' + String(intro).replace(/(^)/g, '$1
') + changeLog,\n 'cover': $3('.object-cover') + ',{\"headers\":{\"Referer\": \"' + Get('url') + '/\"}}',\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\nif (String(book['author']) !== \"xiaohan231\") {\n '
' + java.getElements('.-mx-6 img');\n var data = [];\n var list = java.getElements('.-mx-6 img');\n for (i in list) {\n var img = /\\/\\d+\\/.+/.test(list[i].attr('src')) ? list[i].attr('src') : list[i].attr('data-src');\n var pic = img + ',{\"headers\":{\"Referer\": \"' + Get('url') + '/\"}}';\n data.push('
');\n }\n String(data).replace(/>,/g, '>');\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageStyle": "FULL", + "nextContentUrl": "text.下一页@href", + "replaceRegex": "", + "sourceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0x22f2,_0x34dd,User,Title,Link,Intro,data,Headers,Option;function At52lmC(_0x22f2,_0x34dd,User){for(User=0x0;User<_0x34dd;User++)_0x22f2.push(_0x22f2.shift());return _0x22f2}function j9vt6a(){}DANm2g(_0x22f2=At52lmC([\"\\u004c\\u006e\\u0052\\u006c\\u0065\\u0048\\u0051\\u0074\\u0059\\u0032\\u0056\\u0075\\u0064\\u0047\\u0056\\u0079\",\"\\u0064\\u0047\\u0056\\u0034\\u0064\\u0041\\u003d\\u003d\",\"\\u004c\\u006e\\u0042\\u0069\\u004c\\u0054\\u004d\\u003d\",\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\x61\\x57\\x31\\x6e\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\u0063\\u0033\\u004a\\u006a\",\"\\u005a\\u0047\\u0046\\u0030\\u0059\\u0053\\u0031\\u007a\\u0063\\u006d\\u004d\\u003d\",\"\\x4c\\x48\\x73\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x53\\x5a\\x57\\x5a\\x6c\\x63\\x6d\\x56\\x79\\x49\\x6a\\x6f\\x67\\x49\\x67\\x3d\\x3d\",\"\\x4c\\x79\\x4a\\x39\\x66\\x51\\x3d\\x3d\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\x63\\x47\\x46\\x6e\\x5a\\x53\\x38\\x3d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\u0061\\u006e\\u004e\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\u0053\\u006e\\u004e\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\x52\\x30\\x56\\x55\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\u004c\\u006d\\u0064\\u0079\\u0062\\u0033\\u0056\\u0077\\u004c\\u006e\\u004a\\u006c\\u0062\\u0047\\u0046\\u0030\\u0061\\u0058\\u005a\\u006c\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\"],0x10),_0x34dd=function(User,Title){var Link,Intro;DANm2g(User=User-0x0,Link=_0x22f2[User]);if(_0x34dd.EmItex===void 0x0){DANm2g(function(){var User,Title;try{var Link=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\");User=Link()}catch(Intro){User=window}DANm2g(Title=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",User.atob||(User.atob=function(User){var Link=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x22f2=0x0,_0x34dd,data,Headers=0x0;data=Link.charAt(Headers++);~data&&(_0x34dd=_0x22f2%0x4?_0x34dd*0x40+data:data,_0x22f2++%0x4)?Intro+=String.fromCharCode(0xff&_0x34dd>>(-0x2*_0x22f2&0x6)):0x0)data=Title.indexOf(data);return Intro}))}(),_0x34dd.mWLasX=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x22f2=Title.length;Intro<_0x22f2;Intro++)Link+=\"\\x25\"+(\"\\x30\\x30\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x34dd.uEOqfk={},_0x34dd.EmItex=!0x0)}DANm2g(Intro=_0x34dd.uEOqfk[User],Intro===void 0x0?(Link=_0x34dd.mWLasX(Link),_0x34dd.uEOqfk[User]=Link):Link=Intro);return Link},eval(String(source[_0x34dd(\"\\x30\\x78\\x30\")])),eval(String(java[_0x34dd(\"\\x30\\x78\\x31\")](cache_api+_0x34dd(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x34dd(\"\\u0030\\u0078\\u0033\")](cache[_0x34dd(\"\\x30\\x78\\x34\")](java[_0x34dd(\"\\u0030\\u0078\\u0035\")](Get(_0x34dd(\"\\u0030\\u0078\\u0036\"))+_0x34dd(\"\\x30\\x78\\x37\")))[_0x34dd(\"\\u0030\\u0078\\u0038\")](Get(_0x34dd(\"\\x30\\x78\\x36\")),baseUrl)),Option={method:_0x34dd(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\u006d\\u006d\\u006c\\u0046\\u0066\\u004b\\u004a\" in j9vt6a)&&User==!![]){var list=java[_0x34dd(\"\\x30\\x78\\x61\")](_0x34dd(\"\\x30\\x78\\x62\")),next,next_1;for(i in list){DANm2g(name=list[i][_0x34dd(\"\\x30\\x78\\x63\")](_0x34dd(\"\\u0030\\u0078\\u0064\"))[_0x34dd(\"\\u0030\\u0078\\u0065\")](),latest=list[i][_0x34dd(\"\\x30\\x78\\x63\")](_0x34dd(\"\\u0030\\u0078\\u0066\"))[_0x34dd(\"\\u0030\\u0078\\u0065\")](),cover=new RegExp(\"\\u0068\\u0074\\u0074\\u0070\",\"\")[_0x34dd(\"\\x30\\x78\\x31\\x30\")](list[i][_0x34dd(\"\\u0030\\u0078\\u0063\")](_0x34dd(\"\\x30\\x78\\x31\\x31\"))[_0x34dd(\"\\x30\\x78\\x31\\x32\")](_0x34dd(\"\\u0030\\u0078\\u0031\\u0033\")))?list[i][_0x34dd(\"\\u0030\\u0078\\u0063\")](_0x34dd(\"\\u0030\\u0078\\u0031\\u0031\"))[_0x34dd(\"\\x30\\x78\\x31\\x32\")](_0x34dd(\"\\u0030\\u0078\\u0031\\u0033\")):list[i][_0x34dd(\"\\u0030\\u0078\\u0063\")](_0x34dd(\"\\x30\\x78\\x31\\x31\"))[_0x34dd(\"\\u0030\\u0078\\u0031\\u0032\")](_0x34dd(\"\\u0030\\u0078\\u0031\\u0034\")),push(data,{name:name,author:\"\",kind:\"\",word:\"\",latest:latest,intro:\"\",cover:cover+_0x34dd(\"\\u0030\\u0078\\u0031\\u0035\")+Get(_0x34dd(\"\\x30\\x78\\x36\"))+_0x34dd(\"\\u0030\\u0078\\u0031\\u0036\"),url:list[i][_0x34dd(\"\\u0030\\u0078\\u0063\")](\"\\x61\")[_0x34dd(\"\\x30\\x78\\x31\\x32\")](_0x34dd(\"\\x30\\x78\\x31\\x37\"))}))}DANm2g(next=java[_0x34dd(\"\\u0030\\u0078\\u0031\\u0038\")](baseUrl[_0x34dd(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0070\\u0061\\u0067\\u0065\\u005c\\u002f\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\"),function(_0x22f2,User){return _0x34dd(\"\\x30\\x78\\x31\\x39\")+(parseInt(User)+0x1)})+\"\\x2c\"+JSON[_0x34dd(\"\\u0030\\u0078\\u0031\\u0061\")](Option)),next_1=org[_0x34dd(\"\\u0030\\u0078\\u0031\\u0062\")][_0x34dd(\"\\u0030\\u0078\\u0031\\u0063\")][_0x34dd(\"\\x30\\x78\\x33\")](next));if(!(\"\\x57\\x54\\x4d\\x56\\x6d\\x4f\\x46\" in j9vt6a)&&(!list[0x0]||!next_1[_0x34dd(\"\\u0030\\u0078\\u0063\")](_0x34dd(\"\\u0030\\u0078\\u0062\"))[0x0])){Data()}data=JSON[_0x34dd(\"\\u0030\\u0078\\u0031\\u0061\")](data)}else{data=Data()}function DANm2g(){DANm2g=function(){}}Put(data);\n", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x3492,_0x50cf,User,Title,Link,Intro,data,Headers,Option;function y_uVfVj(_0x3492,_0x50cf,User){for(User=0x0;User<_0x50cf;User++)_0x3492.push(_0x3492.shift());return _0x3492}function pqooyF(){}ATdmo7G(_0x3492=y_uVfVj([\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\u0061\\u0057\\u0031\\u006e\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\x63\\x33\\x4a\\x6a\",\"\\x5a\\x47\\x46\\x30\\x59\\x53\\x31\\x7a\\x63\\x6d\\x4d\\x3d\",\"\\x4c\\x48\\x73\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x53\\x5a\\x57\\x5a\\x6c\\x63\\x6d\\x56\\x79\\x49\\x6a\\x6f\\x67\\x49\\x67\\x3d\\x3d\",\"\\x4c\\x79\\x4a\\x39\\x66\\x51\\x3d\\x3d\",\"\\u0061\\u0048\\u004a\\u006c\\u005a\\u0067\\u003d\\u003d\",\"\\x59\\x57\\x70\\x68\\x65\\x41\\x3d\\x3d\",\"\\x63\\x47\\x46\\x6e\\x5a\\x53\\x38\\x3d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0061\\u006e\\u004e\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\x53\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\u0063\\u0032\\u0056\\u0068\\u0063\\u006d\\u004e\\u006f\\u0061\\u0032\\u0056\\u0035\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\x52\\x30\\x56\\x55\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\x4c\\x6d\\x64\\x79\\x62\\x33\\x56\\x77\\x4c\\x6e\\x4a\\x6c\\x62\\x47\\x46\\x30\\x61\\x58\\x5a\\x6c\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\",\"\\u004c\\u006e\\u0052\\u006c\\u0065\\u0048\\u0051\\u0074\\u0059\\u0032\\u0056\\u0075\\u0064\\u0047\\u0056\\u0079\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\u004c\\u006e\\u0042\\u0069\\u004c\\u0054\\u004d\\u003d\"],0xe),_0x50cf=function(User,Title){var Link,Intro;ATdmo7G(User=User-0x0,Link=_0x3492[User]);if(_0x50cf.wvSPAh===void 0x0){ATdmo7G(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;ATdmo7G(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x3492=0x0,_0x50cf,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x50cf=_0x3492%0x4?_0x50cf*0x40+data:data,_0x3492++%0x4)?Intro+=String.fromCharCode(0xff&_0x50cf>>(-0x2*_0x3492&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x50cf.XSFCPu=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x3492=Title.length;Intro<_0x3492;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x50cf.LPxgis={},_0x50cf.wvSPAh=!0x0)}ATdmo7G(Intro=_0x50cf.LPxgis[User],Intro===void 0x0?(Link=_0x50cf.XSFCPu(Link),_0x50cf.LPxgis[User]=Link):Link=Intro);return Link},eval(String(source[_0x50cf(\"\\x30\\x78\\x30\")])),eval(String(java[_0x50cf(\"\\u0030\\u0078\\u0031\")](cache_api+_0x50cf(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x50cf(\"\\x30\\x78\\x33\")](cache[_0x50cf(\"\\u0030\\u0078\\u0034\")](java[_0x50cf(\"\\x30\\x78\\x35\")](Get(_0x50cf(\"\\x30\\x78\\x36\"))+_0x50cf(\"\\u0030\\u0078\\u0037\")))[_0x50cf(\"\\x30\\x78\\x38\")](Get(_0x50cf(\"\\u0030\\u0078\\u0036\")),baseUrl)),Option={method:_0x50cf(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\x44\\x69\\x45\\x63\\x54\\x51\" in pqooyF)&&User==!![]){var list=java[_0x50cf(\"\\x30\\x78\\x61\")](_0x50cf(\"\\u0030\\u0078\\u0062\")),next,next_1,searchkey;for(i in list){ATdmo7G(name=list[i][_0x50cf(\"\\x30\\x78\\x63\")](_0x50cf(\"\\x30\\x78\\x64\"))[_0x50cf(\"\\x30\\x78\\x65\")](),latest=list[i][_0x50cf(\"\\u0030\\u0078\\u0063\")](_0x50cf(\"\\u0030\\u0078\\u0066\"))[_0x50cf(\"\\x30\\x78\\x65\")](),cover=new RegExp(\"\\x68\\x74\\x74\\x70\",\"\")[_0x50cf(\"\\u0030\\u0078\\u0031\\u0030\")](list[i][_0x50cf(\"\\u0030\\u0078\\u0063\")](_0x50cf(\"\\u0030\\u0078\\u0031\\u0031\"))[_0x50cf(\"\\x30\\x78\\x31\\x32\")](_0x50cf(\"\\u0030\\u0078\\u0031\\u0033\")))?list[i][_0x50cf(\"\\u0030\\u0078\\u0063\")](_0x50cf(\"\\u0030\\u0078\\u0031\\u0031\"))[_0x50cf(\"\\x30\\x78\\x31\\x32\")](_0x50cf(\"\\u0030\\u0078\\u0031\\u0033\")):list[i][_0x50cf(\"\\u0030\\u0078\\u0063\")](_0x50cf(\"\\x30\\x78\\x31\\x31\"))[_0x50cf(\"\\u0030\\u0078\\u0031\\u0032\")](_0x50cf(\"\\u0030\\u0078\\u0031\\u0034\")),push(data,{name:name,author:\"\",kind:\"\",word:\"\",latest:latest,intro:\"\",cover:cover+_0x50cf(\"\\u0030\\u0078\\u0031\\u0035\")+Get(_0x50cf(\"\\x30\\x78\\x36\"))+_0x50cf(\"\\u0030\\u0078\\u0031\\u0036\"),url:list[i][_0x50cf(\"\\x30\\x78\\x63\")](\"\\x61\")[_0x50cf(\"\\u0030\\u0078\\u0031\\u0032\")](_0x50cf(\"\\u0030\\u0078\\u0031\\u0037\"))}))}ATdmo7G(next=java[_0x50cf(\"\\x30\\x78\\x31\\x38\")](baseUrl[_0x50cf(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0070\\u0061\\u0067\\u0065\\u005c\\u002f\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\"),function(_0x3492,User){return _0x50cf(\"\\x30\\x78\\x31\\x39\")+(parseInt(User)+0x1)})+\"\\u002c\"+JSON[_0x50cf(\"\\u0030\\u0078\\u0031\\u0061\")](Option)),next_1=org[_0x50cf(\"\\x30\\x78\\x31\\x62\")][_0x50cf(\"\\x30\\x78\\x31\\x63\")][_0x50cf(\"\\x30\\x78\\x33\")](next),searchkey=java[_0x50cf(\"\\u0030\\u0078\\u0034\")](java[_0x50cf(\"\\u0030\\u0078\\u0035\")](Get(_0x50cf(\"\\u0030\\u0078\\u0036\"))+_0x50cf(\"\\u0030\\u0078\\u0031\\u0064\"))));if(!(\"\\x50\\x61\\x58\\x62\\x43\\x43\" in pqooyF)&&(!list[0x0]||!next_1[_0x50cf(\"\\u0030\\u0078\\u0063\")](_0x50cf(\"\\x30\\x78\\x62\"))[0x0]||new RegExp(\"书源\\u007c使用\\u007c说明\\u007c書源\\u007c說明\",\"\")[_0x50cf(\"\\u0030\\u0078\\u0031\\u0030\")](searchkey))){Data()}data=JSON[_0x50cf(\"\\u0030\\u0078\\u0031\\u0061\")](data)}else{data=Data()}function ATdmo7G(){ATdmo7G=function(){}}Put(data);\n", + "bookUrl": "url", + "checkKeyWord": "妖神记", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x1a3e,_0x3376,User,Title,Link,Intro,data,Headers,wnygMgR,oJw_GM3;function yN8X37d(_0x1a3e,_0x3376,User){for(User=0x0;User<_0x3376;User++)_0x1a3e.push(_0x1a3e.shift());return _0x1a3e}function oNi6D6(){}je58D51(_0x1a3e=yN8X37d([\"\\u0059\\u0058\\u0056\\u0030\\u0061\\u0047\\u0039\\u0079\",\"\\x65\\x47\\x6c\\x68\\x62\\x32\\x68\\x68\\x62\\x6a\\x49\\x7a\\x4d\\x51\\x3d\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\\u0056\\u006d\\u0046\\u0079\\u0061\\u0057\\u0046\\u0069\\u0062\\u0047\\u0055\\u003d\",\"\\x59\\x33\\x56\\x7a\\x64\\x47\\x39\\x74\",\"\\x5a\\x58\\x68\\x6c\\x59\\x77\\x3d\\x3d\",\"\\u0063\\u0048\\u0056\\u007a\\u0061\\u0041\\u003d\\u003d\",\"\\u0063\\u006d\\u0056\\u0032\\u005a\\u0058\\u004a\\u007a\\u005a\\u0051\\u003d\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\u004c\\u006d\\u0031\\u0035\\u004c\\u0054\\u0051\\u0067\\u0063\\u0033\\u0042\\u0068\\u0062\\u0069\\u0034\\u0078\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\x64\\x47\\x6c\\x30\\x62\\x47\\x55\\x3d\",\"\\x62\\x57\\x46\\x30\\x59\\x32\\x67\\x3d\",\"\\x63\\x32\\x56\\x30\\x64\\x47\\x78\\x6c\",\"\\u004a\\u0044\\u0045\\u0067\",\"\\x63\\x47\\x46\\x6b\\x55\\x33\\x52\\x68\\x63\\x6e\\x51\\x3d\",\"\\x64\\x44\\x4a\\x7a\",\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\x62\\x47\\x46\\x30\\x5a\\x58\\x4e\\x30\\x51\\x32\\x68\\x68\\x63\\x48\\x52\\x6c\\x63\\x6c\\x52\\x70\\x64\\x47\\x78\\x6c\",\"\\x4c\\x32\\x4e\\x6f\\x59\\x58\\x42\\x30\\x5a\\x58\\x4a\\x7a\\x4c\\x77\\x3d\\x3d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\x64\\x58\\x4a\\x73\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\x52\\x30\\x56\\x55\"],0x14),_0x3376=function(User,Title){var Link,Intro;je58D51(User=User-0x0,Link=_0x1a3e[User]);if(_0x3376.gYdHLg===void 0x0){je58D51(function(){var User,Title;try{var Link=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\");User=Link()}catch(Intro){User=window}je58D51(Title=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",User.atob||(User.atob=function(User){var Link=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x1a3e=0x0,_0x3376,data,Headers=0x0;data=Link.charAt(Headers++);~data&&(_0x3376=_0x1a3e%0x4?_0x3376*0x40+data:data,_0x1a3e++%0x4)?Intro+=String.fromCharCode(0xff&_0x3376>>(-0x2*_0x1a3e&0x6)):0x0)data=Title.indexOf(data);return Intro}))}(),_0x3376.btzrVY=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x1a3e=Title.length;Intro<_0x1a3e;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x3376.gcFZZs={},_0x3376.gYdHLg=!0x0)}je58D51(Intro=_0x3376.gcFZZs[User],Intro===void 0x0?(Link=_0x3376.btzrVY(Link),_0x3376.gcFZZs[User]=Link):Link=Intro);return Link},eval(String(source[_0x3376(\"\\x30\\x78\\x30\")])),eval(String(java[_0x3376(\"\\u0030\\u0078\\u0031\")](cache_api+_0x3376(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x3376(\"\\u0030\\u0078\\u0033\")](cache[_0x3376(\"\\x30\\x78\\x34\")](java[_0x3376(\"\\u0030\\u0078\\u0035\")](Get(_0x3376(\"\\u0030\\u0078\\u0036\"))+_0x3376(\"\\x30\\x78\\x37\")))[_0x3376(\"\\u0030\\u0078\\u0038\")](Get(_0x3376(\"\\x30\\x78\\x36\")),baseUrl)),wnygMgR=_0x3376(\"\\x30\\x78\\x39\"),oJw_GM3=Headers);if(!(\"\\u005f\\u004e\\u0078\\u0070\\u0034\\u0036\\u0036\" in oNi6D6)&&String(book[_0x3376(\"\\x30\\x78\\x61\")])!==_0x3376(\"\\x30\\x78\\x62\")){var index=book[_0x3376(\"\\u0030\\u0078\\u0063\")](_0x3376(\"\\u0030\\u0078\\u0064\"))>0x0?book[_0x3376(\"\\u0030\\u0078\\u0063\")](_0x3376(\"\\x30\\x78\\x64\")):\"\\x30\",others,others1,regex,klist,list;je58D51(others=[],others1=[],regex=new RegExp(\"\\x63\\x68\\x61\\x70\\x74\\x65\\x72\\x73\\x3a\\x5c\\x73\\x3f\\x28\\x5c\\x5b\\x5b\\x5c\\x73\\x5c\\x53\\x5d\\x2b\\x3f\\x5c\\x5d\\x29\",\"\\x67\"),klist=[]);let match;while((match=regex[_0x3376(\"\\x30\\x78\\x65\")](result))!==null)klist[_0x3376(\"\\u0030\\u0078\\u0066\")](match[0x1]);je58D51(list=eval(String(klist[index]))[_0x3376(\"\\x30\\x78\\x31\\x30\")](),date=String(java[_0x3376(\"\\x30\\x78\\x31\\x31\")](_0x3376(\"\\u0030\\u0078\\u0031\\u0032\"))[_0x3376(\"\\u0030\\u0078\\u0031\\u0033\")]()));for(i in list){je58D51(title=list[i][_0x3376(\"\\x30\\x78\\x31\\x34\")],order=title[_0x3376(\"\\x30\\x78\\x31\\x35\")](new RegExp(\"\\x28\\x5c\\x64\\x2b\\x29\",\"\")),title=Get(_0x3376(\"\\x30\\x78\\x31\\x36\"))==!![]?String(title)[_0x3376(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u002d\\u007c\\u005f\\u007c\\u005c\\u0073\\u002d\\u005c\\u0073\\u0029\",\"\\u0067\"),\"\\u0020\")[_0x3376(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x73\\x2d\\x5c\\x73\\x7c\\x2d\",\"\\u0067\"),\"\\u0020\")[_0x3376(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005c\\u0073\\u002b\",\"\"),\"\\u0020\")[_0x3376(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x28\\x7c\\x5c\\x73\\x29第\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\x24\\x31\")[_0x3376(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005b\\u005e\\u005c\\u0073\\u005d\",\"\"),_0x3376(\"\\x30\\x78\\x31\\x37\"))[_0x3376(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\x24\\x31\")[_0x3376(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a第\\x2e\\x2a\\x28\\x5c\\x64\\x2b\\x29\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\x24\\x31\")[_0x3376(\"\\x30\\x78\\x38\")](new RegExp(\"\\x28\\x5c\\x64\\x2b\\x29\",\"\"),title[_0x3376(\"\\x30\\x78\\x31\\x35\")](new RegExp(\"\\u005c\\u0064\\u002b\",\"\"))?order[0x1][_0x3376(\"\\x30\\x78\\x31\\x38\")](0x3,\"\\x30\"):\"\\u0024\\u0031\"):title,push(data,{title:new RegExp(java[_0x3376(\"\\x30\\x78\\x31\\x39\")](title))[_0x3376(\"\\x30\\x78\\x31\\x61\")](java[_0x3376(\"\\x30\\x78\\x31\\x39\")](book[_0x3376(\"\\u0030\\u0078\\u0031\\u0062\")]))?title+\"〔\"+date+\"〕\":title,link:Get(_0x3376(\"\\u0030\\u0078\\u0036\"))+_0x3376(\"\\u0030\\u0078\\u0031\\u0063\")+list[i].id}))}data=JSON[_0x3376(\"\\x30\\x78\\x31\\x64\")](data)}else{data=Data1()}function je58D51(){je58D51=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "if (!String(book.bookUrl).includes(Get('url'))) {\n book.bookUrl = String(book.bookUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n book.tocUrl = String(book.tocUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n java.refreshTocUrl();\n}", + "updateTime": "" + }, + "searchUrl": "\neval(String(source.loginUrl));\nO1 = `{{get('o1',Get('o'))}}`;\nP1 = `{{get('p1',Get('p'))}}`;\nQ1 = `{{get('q1',Get('q'))}}`;\nR1 = `{{get('r1',Get('r'))}}`;\nT1 = `{{get('t1',Get('t'))}}`;\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n java.put(java.md5Encode16(Get('url') + \"searchkey\"), e);\n return `{{Get('url')}}/comics?q=${e}&${O1}${P1}${T1}${Q1}${R1}page={{page}}`;\n}(key));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画", + "bookSourceName": "🎨包子漫画💞", + "bookSourceType": 2, + "bookSourceUrl": "https://www.baozimh.com", + "bookUrlPattern": "https://.*/comic/.*", + "concurrentRate": "", + "customOrder": 126, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "\neval(String(Reload('https://qyyuapi.com/sy/js/包子漫画/exploreUrl.js')));\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 EdgA/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "{\"包子漫画\":\"https://qyyuapi.com/sy/js/包子漫画/jsLib.js\"}", + "lastUpdateTime": 1744443128063, + "loginCheckJs": "var res = result;\nurl = java.ruleUrl;\nif(res.body().includes('cf_chl')){\n cookie.removeCookie(Get('url'));\n result = java.startBrowserAwait(url,\"验证\");\n}\nresult;", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换源站 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"①包子漫画✈️\", type: \"button\", action: \"$(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"②包子漫画🐰\", type: \"button\", action: \"$(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"③包子漫画✈️\", type: \"button\", action: \"$(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"④包子漫画🐰\", type: \"button\", action: \"$(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑤包子漫画✈️\", type: \"button\", action: \"$(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑥包子漫画🐰\", type: \"button\", action: \"$(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑦包子漫画✈️\", type: \"button\", action: \"$(7)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑧包子漫画🐰\", type: \"button\", action: \"$(8)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n { name: \"༺ˇ»`ʚ 点击切换地区 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"国漫\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"日本\", type: \"button\", action: \"o(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"韩国\", type: \"button\", action: \"o(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"欧美\", type: \"button\", action: \"o(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换进度 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"q(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"连载\", type: \"button\", action: \"q(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"完结\", type: \"button\", action: \"q(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击字母筛选 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"p(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"ABCD\", type: \"button\", action: \"p(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"EFGH\", type: \"button\", action: \"p(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"IJKL\", type: \"button\", action: \"p(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"MNOP\", type: \"button\", action: \"p(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"QRST\", type: \"button\", action: \"p(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"UVW\", type: \"button\", action: \"p(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"XYZ\", type: \"button\", action: \"p(7)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"0-9\", type: \"button\", action: \"p(8)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n {\n name: \"清除网站Cookie缓存\",\n type: \"button\",\n action: \"deleteCookie()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n\n { name: \"清除远程代码标识\", type: \"button\", action: \"DeleteYckey()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "eval(String(Reload('https://qyyuapi.com/sy/js/包子漫画/loginUrl.js')));", + "respondTime": 39526, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(Reload('https://qyyuapi.com/sy/js/包子漫画/ruleBookInfo.js')));\n", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\neval(String(Reload('https://qyyuapi.com/sy/js/包子漫画/ruleContent.js')));\n", + "imageStyle": "FULL", + "nextContentUrl": "@css:a:contains(下一页), a:contains(下一頁)@href", + "replaceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\neval(String(Reload('https://qyyuapi.com/sy/js/包子漫画/ruleExplore.js')));\n", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\neval(String(Reload('https://qyyuapi.com/sy/js/包子漫画/ruleSearch.js')));\n", + "bookUrl": "url", + "checkKeyWord": "妖神记", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\neval(String(Reload('https://qyyuapi.com/sy/js/包子漫画/ruleToc.js')));\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "if (!String(book.bookUrl).includes(Get('url'))) {\n book.bookUrl = String(book.bookUrl).replace(/.*\\/\\/[^\\/]+/, Get('url'));\n book.tocUrl = String(book.tocUrl).replace(/.*\\/\\/[^\\/]+/, Get('url'));\n java.refreshTocUrl();\n}" + }, + "searchUrl": "\neval(String(Reload('https://qyyuapi.com/sy/js/包子漫画/searchUrl.js')));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画", + "bookSourceName": "🎨看漫画💓", + "bookSourceType": 2, + "bookSourceUrl": "https://m.kanman.com", + "bookUrlPattern": "https://.*/comic-api/v2/comic/getcomicmaindata?comic_id=\\d+&young_mode=0&from_page=other&platformname=android&productname=kmh,.*", + "concurrentRate": "20/5000", + "customOrder": 127, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\ntitle = '✣      ✣ 榜  单 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nrank = [\n '人气',\n '更新',\n '评分',\n '收藏'\n];\norderby = [\n '&orderby=click',\n '&orderby=date',\n '&orderby=score',\n '&orderby=shoucang'\n];\nfor (i in rank) {\n url = `{{Get('url')}}/api/getsortlist/?comic_sort=${orderby[i]}&search_type=&search_key=&page={{page}}&size=48`;\n exploreUrl.push(explore(rank[i], url, 1, 0.2, false));\n}\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nkind = [\n '全部','热血','机战','运动','推理','冒险','搞笑','战争',\n '神魔','忍者','竞技','悬疑','社会','恋爱','宠物','吸血',\n '萝莉','后宫','御姐','霸总','玄幻','古风','历史','漫改',\n '游戏','穿越','恐怖','真人','科幻','都市','武侠','修真',\n '生活','动作'\n];\nlink = [\n '','rexue','jizhan','yundong','tuili','maoxian','gaoxiao','zhanzhen',\n 'shenmo','renzhe','jingji','xuanyi','shehui','lianai','chongwu','xixue',\n 'luoli','hougong','yujie','bazong','xuanhuan','gufeng','lishi','mangai',\n 'youxi','chuanyue','kongbu','zhenren','kehuan','dushi','wuxia','xiuzhen',\n 'shenghuo','dongzuo'\n];\nOrderBy = `{{get('orderBy',Get('o'))}}`;\nfor (j in kind) {\n url = `{{Get('url')}}/api/getsortlist/?comic_sort=${link[j]}${OrderBy}&search_type=&search_key=&page={{page}}&size=48`;\n exploreUrl.push(explore(kind[j], url, 1, 0.2, false));\n}\nBID = (kind.length % 4) < 1 ? 0 : (4 - (kind.length % 4));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.2, false)); \n}\n//exploreUrl.splice(40, 0, explore('', '', 1, 0.2, false));\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 EdgA/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function get(tag,num) {\n orderBy = [\n '&orderby=click',\n '&orderby=date',\n '&orderby=score',\n '&orderby=shoucang'\n ];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction Num(e) {\n e = String(e);\n var num = e.length > 8 ? (e.substring(0, e.length - 8) + \"亿\") : (e.length > 4 ? (e.substring(0, e.length - 4) + \"万\") : e);\n return num;\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}", + "lastUpdateTime": 1743132462006, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n {\n name: \"💡   源   站   测   试   💡\",\n type: \"button\",\n action: \"test(1)\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(-1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"人气\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"更新\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"评分\", type: \"button\", action: \"o(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"收藏\", type: \"button\", action: \"o(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = '';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'o': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://m.kanman.com',\n 'urls': [\n 'https://m.kanman.com'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == -1) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n if (e == 0) {\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0] + ',' + JSON.stringify(Option));\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0]);\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(0) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(4);\n time = new Date().getTime();\n html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n J = org.jsoup.Jsoup.parse(html);\n u = J.select('.website_href');\n for (i = 0; i < 1; i++) {\n host = String(u.attr('href').split(' ')[i]).replace(/http:/g, 'https:').replace(/\\/+$/, '');\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].unshift(host);\n put($$$);\n $(0);\n } else {\n return test(1);\n }\n }\n}\nfunction name(e) {\n if (e == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '📚当前排序:' + type($$$.o)) + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci0)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci2)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'];\n $$$['ci2'] = $$$['ci1'];\n $$$['ci1'] = $$$['ci0'];\n $$$['ci0'] = e;\n put($$$);\n test(e);\n}\ny = ['人气','更新','评分','收藏'];\nfunction type(e) {\n if (e == undefined) {\n e = 0;\n }\n return y[e];\n}\nfunction o(e) {\n if (o == undefined) {\n o = result.o;\n }\n if (e == $$$.o) {\n return login('【排序切换提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【排序切换提示】' + n(2) + '已经切换到[' + type(e) + ']排序');\n $$$.o = e;\n return put($$$);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}", + "respondTime": 5974, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace(Get('url'), baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n var list = JSON.parse(result).data;\n var $2 = element => String(java.getElements(element).text());\n var $3 = element => java.getElements(element);\n url = baseUrl;\n s = '✦ ' + Num(list.renqi) + ',' + '♥ ' + Num(list.shoucang);\n k = (list.comic_status < 2 ? '连载,' : '完结,') + Object.values(list.comic_type).join(',');\n t = String(java.timeFormat(list.update_time*1000)).replace(/\\//g, '-');\n l = list.last_chapter_name;\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[话話章回期](|\\s)第.*?[话話章回期]/, '$1').replace(/.*第(\\d+)[话話章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[话話章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[话話章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci0') == 0 ? '〖默认〗' : '〖自选〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n📚当前排序:〖' + (Get('o') == 0 ? '默认' : '自选') + '〗' + y[Get('o')]) + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n book = JSON.stringify({\n 'name': list.comic_name,\n 'author': list.comic_author,\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l + '〔' + t + '〕',\n 'intro': (t != '' ? ('更新时间:' + t + '\\nㅤ\\n') : '') + list.comic_desc.replace(/(^)/g, '$1
') + changeLog,\n 'cover': list.cover_list[0],\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\nif (String(book['author']) !== \"xiaohan231\") {\n imglist=JSON.parse(result).data.current_chapter.chapter_img_list;\n if (String(java.ajax(imglist[0])).includes('MISS')) {\n var time = new Date().getTime();\n var url = baseUrl + '&t=' + time;\n result= java.ajax(url);\n imglist=JSON.parse(result).data.current_chapter.chapter_img_list;\n }\n var result='';\n for (i in imglist) {\n result +='\\n'\n }\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageDecode": "", + "imageStyle": "FULL", + "nextContentUrl": "", + "replaceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0x5b8f,_0x1547,User,Title,Link,Intro,data,Headers,Option;function MrtDDuk(_0x5b8f,_0x1547,User){for(User=0x0;User<_0x1547;User++)_0x5b8f.push(_0x5b8f.shift());return _0x5b8f}function pOTW8DR(){}vPxZF6(_0x5b8f=MrtDDuk([\"\\u0062\\u0047\\u0046\\u007a\\u0064\\u0046\\u0039\\u006a\\u0061\\u0047\\u0046\\u0077\\u0064\\u0047\\u0056\\u0079\\u0058\\u0032\\u0035\\u0068\\u0062\\u0057\\u0055\\u003d\",\"\\u0064\\u0047\\u006c\\u0074\\u005a\\u0055\\u005a\\u0076\\u0063\\u006d\\u0031\\u0068\\u0064\\u0041\\u003d\\u003d\",\"\\x64\\x58\\x42\\x6b\\x59\\x58\\x52\\x6c\\x58\\x33\\x52\\x70\\x62\\x57\\x55\\x3d\",\"\\x59\\x32\\x46\\x79\\x64\\x47\\x39\\x76\\x62\\x6c\\x39\\x6b\\x5a\\x58\\x4e\\x6a\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\",\"\\u004c\\u0032\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0057\\u0046\\u0077\\u0061\\u0053\\u0039\\u0032\\u004d\\u0069\\u0039\\u006a\\u0062\\u0032\\u0031\\u0070\\u0059\\u0079\\u0039\\u006e\\u005a\\u0058\\u0052\\u006a\\u0062\\u0032\\u0031\\u0070\\u0059\\u0032\\u0031\\u0068\\u0061\\u0057\\u0035\\u006b\\u0059\\u0058\\u0052\\u0068\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0061\\u0057\\u0051\\u0039\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0061\\u0057\\u0051\\u003d\",\"\\u004a\\u006e\\u006c\\u0076\\u0064\\u0057\\u0035\\u006e\\u0058\\u0032\\u0031\\u0076\\u005a\\u0047\\u0055\\u0039\\u004d\\u0043\\u005a\\u006d\\u0063\\u006d\\u0039\\u0074\\u0058\\u0033\\u0042\\u0068\\u005a\\u0032\\u0055\\u0039\\u0062\\u0033\\u0052\\u006f\\u005a\\u0058\\u0049\\u006d\\u0063\\u0047\\u0078\\u0068\\u0064\\u0047\\u005a\\u0076\\u0063\\u006d\\u0031\\u0075\\u0059\\u0057\\u0031\\u006c\\u0050\\u0057\\u0046\\u0075\\u005a\\u0048\\u004a\\u0076\\u0061\\u0057\\u0051\\u006d\\u0063\\u0048\\u004a\\u0076\\u005a\\u0048\\u0056\\u006a\\u0064\\u0047\\u0035\\u0068\\u0062\\u0057\\u0055\\u0039\\u0061\\u0032\\u0031\\u006f\\u005a\\u0058\\u004a\\u006a\\u0061\\u0058\\u006c\\u0031\\u0059\\u0057\\u0034\\u0079\\u004d\\u0044\\u0049\\u0077\",\"\\x59\\x32\\x39\\x32\\x5a\\x58\\x4a\\x66\\x61\\x57\\x31\\x6e\",\"\\x61\\x48\\x52\\x30\\x63\\x48\\x4d\\x36\\x4c\\x79\\x39\\x68\\x63\\x47\\x6b\\x74\\x59\\x32\\x52\\x75\\x4c\\x6d\\x74\\x68\\x61\\x57\\x31\\x68\\x62\\x6d\\x68\\x31\\x59\\x53\\x35\\x6a\\x62\\x32\\x30\\x76\\x59\\x32\\x39\\x74\\x61\\x57\\x4d\\x74\\x59\\x58\\x42\\x70\\x4c\\x33\\x59\\x79\\x4c\\x32\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x4c\\x32\\x64\\x6c\\x64\\x47\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x62\\x57\\x46\\x70\\x62\\x6d\\x52\\x68\\x64\\x47\\x45\\x2f\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x61\\x57\\x51\\x39\",\"\\x4a\\x6e\\x6c\\x76\\x64\\x57\\x35\\x6e\\x58\\x32\\x31\\x76\\x5a\\x47\\x55\\x39\\x4d\\x43\\x5a\\x6d\\x63\\x6d\\x39\\x74\\x58\\x33\\x42\\x68\\x5a\\x32\\x55\\x39\\x62\\x33\\x52\\x6f\\x5a\\x58\\x49\\x6d\\x63\\x47\\x78\\x68\\x64\\x47\\x5a\\x76\\x63\\x6d\\x31\\x75\\x59\\x57\\x31\\x6c\\x50\\x57\\x46\\x75\\x5a\\x48\\x4a\\x76\\x61\\x57\\x51\\x6d\\x63\\x48\\x4a\\x76\\x5a\\x48\\x56\\x6a\\x64\\x47\\x35\\x68\\x62\\x57\\x55\\x39\\x61\\x32\\x31\\x6f\\x4c\\x48\\x73\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x74\\x4c\\x58\\x4a\\x6c\\x63\\x58\\x56\\x6c\\x63\\x33\\x51\\x74\\x61\\x57\\x51\\x69\\x4f\\x69\\x49\\x3d\",\"\\x49\\x6e\\x31\\x39\",\"\\x63\\x47\\x46\\x6e\\x5a\\x51\\x3d\\x3d\",\"\\x59\\x57\\x70\\x68\\x65\\x41\\x3d\\x3d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0054\\u0030\\u003d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\x52\\x30\\x56\\x55\",\"\\x5a\\x47\\x46\\x30\\x59\\x51\\x3d\\x3d\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0062\\u006d\\u0046\\u0074\\u005a\\u0051\\u003d\\u003d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0059\\u0058\\u0056\\u0030\\u0061\\u0047\\u0039\\u0079\",\"\\x4a\\x44\\x45\\x76\\x4a\\x44\\x49\\x3d\",\"\\x63\\x6d\\x56\\x75\\x63\\x57\\x6b\\x3d\",\"\\x63\\x32\\x68\\x76\\x64\\x57\\x4e\\x68\\x62\\x6d\\x63\\x3d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u005a\\u0033\\u004a\\u0068\\u005a\\u0047\\u0055\\u003d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0064\\u0048\\u006c\\u0077\\u005a\\u0051\\u003d\\u003d\",\"\\x61\\x57\\x35\\x6a\\x62\\x48\\x56\\x6b\\x5a\\x58\\x4d\\x3d\",\"\\x63\\x32\\x39\\x79\\x64\\x44\\x30\\x6d\",\"\\u0050\\u0057\\u0052\\u0068\\u0064\\u0047\\u0055\\u003d\"],0x10),_0x1547=function(User,Title){var Link,Intro;vPxZF6(User=User-0x0,Link=_0x5b8f[User]);if(_0x1547.DGnDDb===void 0x0){vPxZF6(function(){var User,Title;try{var Link=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\");User=Link()}catch(Intro){User=window}vPxZF6(Title=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",User.atob||(User.atob=function(User){var Link=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x5b8f=0x0,_0x1547,data,Headers=0x0;data=Link.charAt(Headers++);~data&&(_0x1547=_0x5b8f%0x4?_0x1547*0x40+data:data,_0x5b8f++%0x4)?Intro+=String.fromCharCode(0xff&_0x1547>>(-0x2*_0x5b8f&0x6)):0x0)data=Title.indexOf(data);return Intro}))}(),_0x1547.ooEiMt=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x5b8f=Title.length;Intro<_0x5b8f;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x1547.mYlvtW={},_0x1547.DGnDDb=!0x0)}vPxZF6(Intro=_0x1547.mYlvtW[User],Intro===void 0x0?(Link=_0x1547.ooEiMt(Link),_0x1547.mYlvtW[User]=Link):Link=Intro);return Link},eval(String(source[_0x1547(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x1547(\"\\x30\\x78\\x31\")](cache_api+_0x1547(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x1547(\"\\x30\\x78\\x33\")](cache[_0x1547(\"\\x30\\x78\\x34\")](java[_0x1547(\"\\x30\\x78\\x35\")](Get(_0x1547(\"\\x30\\x78\\x36\"))+_0x1547(\"\\x30\\x78\\x37\")))[_0x1547(\"\\u0030\\u0078\\u0038\")](Get(_0x1547(\"\\u0030\\u0078\\u0036\")),baseUrl)),Option={method:_0x1547(\"\\u0030\\u0078\\u0039\"),headers:Headers});if(!(\"\\u0072\\u0057\\u0048\\u007a\\u0036\\u0047\" in pOTW8DR)&&User==!![]){var list=JSON[_0x1547(\"\\u0030\\u0078\\u0033\")](result)[_0x1547(\"\\u0030\\u0078\\u0061\")][_0x1547(\"\\x30\\x78\\x61\")];for(i=0x0;i", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x5b5d,_0x1ee0,User,Title,Link,Intro,data,Headers,Option;function qORXSKr(_0x5b5d,_0x1ee0,User){for(User=0x0;User<_0x1ee0;User++)_0x5b5d.push(_0x5b5d.shift());return _0x5b5d}function Ji8xDn(){}py7jCi(_0x5b5d=qORXSKr([\"\\x64\\x47\\x6c\\x74\\x5a\\x55\\x5a\\x76\\x63\\x6d\\x31\\x68\\x64\\x41\\x3d\\x3d\",\"\\u0064\\u0058\\u0042\\u006b\\u0059\\u0058\\u0052\\u006c\\u0058\\u0033\\u0052\\u0070\\u0062\\u0057\\u0055\\u003d\",\"\\x59\\x32\\x46\\x79\\x64\\x47\\x39\\x76\\x62\\x6c\\x39\\x6b\\x5a\\x58\\x4e\\x6a\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\",\"\\x4c\\x32\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x4c\\x57\\x46\\x77\\x61\\x53\\x39\\x32\\x4d\\x69\\x39\\x6a\\x62\\x32\\x31\\x70\\x59\\x79\\x39\\x6e\\x5a\\x58\\x52\\x6a\\x62\\x32\\x31\\x70\\x59\\x32\\x31\\x68\\x61\\x57\\x35\\x6b\\x59\\x58\\x52\\x68\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x61\\x57\\x51\\x39\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0061\\u0057\\u0051\\u003d\",\"\\u004a\\u006e\\u006c\\u0076\\u0064\\u0057\\u0035\\u006e\\u0058\\u0032\\u0031\\u0076\\u005a\\u0047\\u0055\\u0039\\u004d\\u0043\\u005a\\u006d\\u0063\\u006d\\u0039\\u0074\\u0058\\u0033\\u0042\\u0068\\u005a\\u0032\\u0055\\u0039\\u0062\\u0033\\u0052\\u006f\\u005a\\u0058\\u0049\\u006d\\u0063\\u0047\\u0078\\u0068\\u0064\\u0047\\u005a\\u0076\\u0063\\u006d\\u0031\\u0075\\u0059\\u0057\\u0031\\u006c\\u0050\\u0057\\u0046\\u0075\\u005a\\u0048\\u004a\\u0076\\u0061\\u0057\\u0051\\u006d\\u0063\\u0048\\u004a\\u0076\\u005a\\u0048\\u0056\\u006a\\u0064\\u0047\\u0035\\u0068\\u0062\\u0057\\u0055\\u0039\\u0061\\u0032\\u0031\\u006f\\u005a\\u0058\\u004a\\u006a\\u0061\\u0058\\u006c\\u0031\\u0059\\u0057\\u0034\\u0079\\u004d\\u0044\\u0049\\u0077\",\"\\u0059\\u0032\\u0039\\u0032\\u005a\\u0058\\u004a\\u0066\\u0061\\u0057\\u0031\\u006e\",\"\\u0061\\u0048\\u0052\\u0030\\u0063\\u0048\\u004d\\u0036\\u004c\\u0079\\u0039\\u0068\\u0063\\u0047\\u006b\\u0074\\u0059\\u0032\\u0052\\u0075\\u004c\\u006d\\u0074\\u0068\\u0061\\u0057\\u0031\\u0068\\u0062\\u006d\\u0068\\u0031\\u0059\\u0053\\u0035\\u006a\\u0062\\u0032\\u0030\\u0076\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004d\\u0074\\u0059\\u0058\\u0042\\u0070\\u004c\\u0033\\u0059\\u0079\\u004c\\u0032\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0032\\u0064\\u006c\\u0064\\u0047\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u0062\\u0057\\u0046\\u0070\\u0062\\u006d\\u0052\\u0068\\u0064\\u0047\\u0045\\u002f\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0061\\u0057\\u0051\\u0039\",\"\\x4a\\x6e\\x6c\\x76\\x64\\x57\\x35\\x6e\\x58\\x32\\x31\\x76\\x5a\\x47\\x55\\x39\\x4d\\x43\\x5a\\x6d\\x63\\x6d\\x39\\x74\\x58\\x33\\x42\\x68\\x5a\\x32\\x55\\x39\\x62\\x33\\x52\\x6f\\x5a\\x58\\x49\\x6d\\x63\\x47\\x78\\x68\\x64\\x47\\x5a\\x76\\x63\\x6d\\x31\\x75\\x59\\x57\\x31\\x6c\\x50\\x57\\x46\\x75\\x5a\\x48\\x4a\\x76\\x61\\x57\\x51\\x6d\\x63\\x48\\x4a\\x76\\x5a\\x48\\x56\\x6a\\x64\\x47\\x35\\x68\\x62\\x57\\x55\\x39\\x61\\x32\\x31\\x6f\\x4c\\x48\\x73\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x74\\x4c\\x58\\x4a\\x6c\\x63\\x58\\x56\\x6c\\x63\\x33\\x51\\x74\\x61\\x57\\x51\\x69\\x4f\\x69\\x49\\x3d\",\"\\u0049\\u006e\\u0031\\u0039\",\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0054\\u0030\\u003d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\u0063\\u0032\\u0056\\u0068\\u0063\\u006d\\u004e\\u006f\\u0061\\u0032\\u0056\\u0035\",\"\\x64\\x47\\x56\\x7a\\x64\\x41\\x3d\\x3d\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x5a\\x47\\x46\\x30\\x59\\x51\\x3d\\x3d\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x62\\x6d\\x46\\x74\\x5a\\x51\\x3d\\x3d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0059\\u0058\\u0056\\u0030\\u0061\\u0047\\u0039\\u0079\",\"\\u004a\\u0044\\u0045\\u0076\\u004a\\u0044\\u0049\\u003d\",\"\\x63\\x6d\\x56\\x75\\x63\\x57\\x6b\\x3d\",\"\\u0063\\u0032\\u0068\\u0076\\u0064\\u0057\\u004e\\u0068\\u0062\\u006d\\u0063\\u003d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u005a\\u0033\\u004a\\u0068\\u005a\\u0047\\u0055\\u003d\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x64\\x48\\x6c\\x77\\x5a\\x51\\x3d\\x3d\",\"\\u0062\\u0047\\u0046\\u007a\\u0064\\u0046\\u0039\\u006a\\u0061\\u0047\\u0046\\u0077\\u0064\\u0047\\u0056\\u0079\\u0058\\u0032\\u0035\\u0068\\u0062\\u0057\\u0055\\u003d\"],0x10),_0x1ee0=function(User,Title){var Link,Intro;py7jCi(User=User-0x0,Link=_0x5b5d[User]);if(_0x1ee0.YdQYxs===void 0x0){py7jCi(function(){var User,Title;try{var Link=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\");User=Link()}catch(Intro){User=window}py7jCi(Title=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",User.atob||(User.atob=function(User){var Link=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x5b5d=0x0,_0x1ee0,data,Headers=0x0;data=Link.charAt(Headers++);~data&&(_0x1ee0=_0x5b5d%0x4?_0x1ee0*0x40+data:data,_0x5b5d++%0x4)?Intro+=String.fromCharCode(0xff&_0x1ee0>>(-0x2*_0x5b5d&0x6)):0x0)data=Title.indexOf(data);return Intro}))}(),_0x1ee0.OAhwrS=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x5b5d=Title.length;Intro<_0x5b5d;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x1ee0.rNELDW={},_0x1ee0.YdQYxs=!0x0)}py7jCi(Intro=_0x1ee0.rNELDW[User],Intro===void 0x0?(Link=_0x1ee0.OAhwrS(Link),_0x1ee0.rNELDW[User]=Link):Link=Intro);return Link},eval(String(source[_0x1ee0(\"\\x30\\x78\\x30\")])),eval(String(java[_0x1ee0(\"\\u0030\\u0078\\u0031\")](cache_api+_0x1ee0(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x1ee0(\"\\u0030\\u0078\\u0033\")](cache[_0x1ee0(\"\\u0030\\u0078\\u0034\")](java[_0x1ee0(\"\\u0030\\u0078\\u0035\")](Get(_0x1ee0(\"\\u0030\\u0078\\u0036\"))+_0x1ee0(\"\\x30\\x78\\x37\")))[_0x1ee0(\"\\x30\\x78\\x38\")](Get(_0x1ee0(\"\\u0030\\u0078\\u0036\")),baseUrl)),Option={method:_0x1ee0(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\u004a\\u0049\\u0071\\u0073\\u0033\\u0056\" in Ji8xDn)&&User==!![]){var list=JSON[_0x1ee0(\"\\x30\\x78\\x33\")](result)[_0x1ee0(\"\\u0030\\u0078\\u0061\")][_0x1ee0(\"\\x30\\x78\\x61\")],next,searchkey;for(i=0x0;i", + "bookUrl": "url", + "checkKeyWord": "妖神记", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x409d,_0x1511,User,Title,Link,Intro,data,Headers,f4aOpF,XFDiQG;function _oK_tj(_0x409d,_0x1511,User){for(User=0x0;User<_0x1511;User++)_0x409d.push(_0x409d.shift());return _0x409d}function ItKa3v2(){}uPSY_5(_0x409d=_oK_tj([\"\\u0052\\u0030\\u0056\\u0055\",\"\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\",\"\\x65\\x47\\x6c\\x68\\x62\\x32\\x68\\x68\\x62\\x6a\\x49\\x7a\\x4d\\x51\\x3d\\x3d\",\"\\x5a\\x47\\x46\\x30\\x59\\x51\\x3d\\x3d\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x61\\x57\\x51\\x3d\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x59\\x32\\x68\\x68\\x63\\x48\\x52\\x6c\\x63\\x67\\x3d\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\u0059\\u0032\\u0039\\u0075\\u0064\\u0047\\u0056\\u0075\\u0064\\u0041\\u003d\\u003d\",\"\\u0064\\u0047\\u006c\\u0074\\u005a\\u0055\\u005a\\u0076\\u0063\\u006d\\u0031\\u0068\\u0064\\u0041\\u003d\\u003d\",\"\\u0059\\u0033\\u004a\\u006c\\u0059\\u0058\\u0052\\u006c\\u0058\\u0032\\u0052\\u0068\\u0064\\u0047\\u0055\\u003d\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\u0059\\u0032\\u0068\\u0068\\u0063\\u0048\\u0052\\u006c\\u0063\\u006c\\u0039\\u0075\\u0059\\u0057\\u0031\\u006c\",\"\\x5a\\x57\\x35\\x6b\\x58\\x32\\x35\\x31\\x62\\x51\\x3d\\x3d\",\"\\x62\\x57\\x46\\x30\\x59\\x32\\x67\\x3d\",\"\\x63\\x32\\x56\\x30\\x64\\x47\\x78\\x6c\",\"\\u004a\\u0044\\u0045\\u0067\",\"\\x63\\x47\\x46\\x6b\\x55\\x33\\x52\\x68\\x63\\x6e\\x51\\x3d\",\"\\x4c\\x32\\x46\\x77\\x61\\x53\\x39\\x6e\\x5a\\x58\\x52\\x6a\\x61\\x47\\x46\\x77\\x64\\x47\\x56\\x79\\x61\\x57\\x35\\x6d\\x62\\x33\\x59\\x79\\x50\\x33\\x42\\x79\\x62\\x32\\x52\\x31\\x59\\x33\\x52\\x66\\x61\\x57\\x51\\x39\\x4d\\x53\\x5a\\x77\\x63\\x6d\\x39\\x6b\\x64\\x57\\x4e\\x30\\x62\\x6d\\x46\\x74\\x5a\\x54\\x31\\x72\\x62\\x57\\x67\\x6d\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x61\\x57\\x51\\x39\",\"\\u004a\\u006d\\u004e\\u006f\\u0059\\u0058\\u0042\\u0030\\u005a\\u0058\\u004a\\u0066\\u0062\\u006d\\u0056\\u0033\\u0061\\u0057\\u0051\\u0039\",\"\\u0059\\u0032\\u0068\\u0068\\u0063\\u0048\\u0052\\u006c\\u0063\\u006c\\u0039\\u0070\\u005a\\u0041\\u003d\\u003d\",\"\\x4a\\x6d\\x6c\\x7a\\x56\\x32\\x56\\x69\\x63\\x44\\x30\\x78\\x4a\\x6e\\x46\\x31\\x59\\x57\\x78\\x70\\x64\\x48\\x6b\\x39\\x61\\x47\\x6c\\x6e\\x61\\x41\\x3d\\x3d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\x5a\\x32\\x56\\x30\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\"],0x17),_0x1511=function(User,Title){var Link,Intro;uPSY_5(User=User-0x0,Link=_0x409d[User]);if(_0x1511.MJSrkr===void 0x0){uPSY_5(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;uPSY_5(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x409d=0x0,_0x1511,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x1511=_0x409d%0x4?_0x1511*0x40+data:data,_0x409d++%0x4)?Intro+=String.fromCharCode(0xff&_0x1511>>(-0x2*_0x409d&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x1511.NNGote=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x409d=Title.length;Intro<_0x409d;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x1511.wpNLJw={},_0x1511.MJSrkr=!0x0)}uPSY_5(Intro=_0x1511.wpNLJw[User],Intro===void 0x0?(Link=_0x1511.NNGote(Link),_0x1511.wpNLJw[User]=Link):Link=Intro);return Link},eval(String(source[_0x1511(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x1511(\"\\x30\\x78\\x31\")](cache_api+_0x1511(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x1511(\"\\x30\\x78\\x33\")](cache[_0x1511(\"\\x30\\x78\\x34\")](java[_0x1511(\"\\u0030\\u0078\\u0035\")](Get(_0x1511(\"\\x30\\x78\\x36\"))+_0x1511(\"\\x30\\x78\\x37\")))[_0x1511(\"\\u0030\\u0078\\u0038\")](Get(_0x1511(\"\\x30\\x78\\x36\")),baseUrl)),f4aOpF=_0x1511(\"\\u0030\\u0078\\u0039\"),XFDiQG=Headers);if(!(\"\\x78\\x6e\\x4a\\x69\\x5f\\x59\\x49\" in ItKa3v2)&&String(book[_0x1511(\"\\x30\\x78\\x61\")])!==_0x1511(\"\\x30\\x78\\x62\")){var id=JSON[_0x1511(\"\\u0030\\u0078\\u0033\")](result)[_0x1511(\"\\x30\\x78\\x63\")][_0x1511(\"\\u0030\\u0078\\u0064\")],list,$1,date;uPSY_5(list=JSON[_0x1511(\"\\u0030\\u0078\\u0033\")](result)[_0x1511(\"\\x30\\x78\\x63\")][_0x1511(\"\\x30\\x78\\x65\")],$1=_0x409d=>{return String(java[_0x1511(\"\\x30\\x78\\x66\")](_0x409d)[_0x1511(\"\\x30\\x78\\x31\\x30\")](_0x1511(\"\\x30\\x78\\x31\\x31\")))},date=String(java[_0x1511(\"\\x30\\x78\\x31\\x32\")](list[0x0][_0x1511(\"\\u0030\\u0078\\u0031\\u0033\")]*0x3e8))[_0x1511(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005c\\u002f\",\"\\x67\"),\"\\x2d\"));for(i=list[_0x1511(\"\\x30\\x78\\x31\\x34\")]-0x1;i>=0x0;i--){uPSY_5(title=String(list[i][_0x1511(\"\\x30\\x78\\x31\\x35\")]+\"\\x20\\x28\"+list[i][_0x1511(\"\\u0030\\u0078\\u0031\\u0036\")]+\"\\x70\\x29\"),order=title[_0x1511(\"\\u0030\\u0078\\u0031\\u0037\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\")),title=Get(_0x1511(\"\\x30\\x78\\x31\\x38\"))==!![]?String(title)[_0x1511(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x2d\\x5c\\x73\\x7c\\x2d\",\"\\x67\"),\"\\u0020\")[_0x1511(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x2b\",\"\"),\"\\x20\")[_0x1511(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u0028\\u007c\\u005c\\u0073\\u0029第\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\",\"\"),\"\\u0024\\u0031\")[_0x1511(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5b\\x5e\\x5c\\x73\\x5d\",\"\"),_0x1511(\"\\x30\\x78\\x31\\x39\"))[_0x1511(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\u0024\\u0031\")[_0x1511(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a第\\x2e\\x2a\\x28\\x5c\\x64\\x2b\\x29\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\u0024\\u0031\")[_0x1511(\"\\x30\\x78\\x38\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\"),title[_0x1511(\"\\x30\\x78\\x31\\x37\")](new RegExp(\"\\x5c\\x64\\x2b\",\"\"))?order[0x1][_0x1511(\"\\u0030\\u0078\\u0031\\u0061\")](0x3,\"\\u0030\"):\"\\u0024\\u0031\"):title,title=String(title)[_0x1511(\"\\x30\\x78\\x38\")](new RegExp(\"\\x28\\x2d\\x7c\\x5f\\x7c\\x5c\\x73\\x2d\\x5c\\x73\\x29\",\"\\x67\"),\"\\u0020\")[_0x1511(\"\\x30\\x78\\x38\")](new RegExp(\"\\x28\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\\x29\\x5c\\x73\\x5c\\x64\\x2b\",\"\"),\"\\x24\\x31\")[_0x1511(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005c\\u0073\\u005c\\u0073\",\"\\u0067\"),\"\\x20\"),push(data,{title:i==0x0?title+\"〔\"+date+\"〕\":title,link:Get(_0x1511(\"\\x30\\x78\\x36\"))+_0x1511(\"\\u0030\\u0078\\u0031\\u0062\")+id+_0x1511(\"\\x30\\x78\\x31\\x63\")+list[i][_0x1511(\"\\u0030\\u0078\\u0031\\u0064\")]+_0x1511(\"\\x30\\x78\\x31\\x65\"),time:String(java[_0x1511(\"\\x30\\x78\\x31\\x32\")](list[i][_0x1511(\"\\u0030\\u0078\\u0031\\u0033\")]*0x3e8))[_0x1511(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005c\\u002f\",\"\\x67\"),\"\\u002d\")}))}data=JSON[_0x1511(\"\\x30\\x78\\x31\\x66\")](data)}else{data=Data1()}function uPSY_5(){uPSY_5=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "", + "updateTime": "time" + }, + "searchUrl": "\neval(String(source.loginUrl));\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n java.put(java.md5Encode16(Get('url') + \"searchkey\"), e);\n return Get('url') + '/api/getsortlist/?comic_sort=&orderby=date&search_type=&search_key=' + e + '&page={{page}}&size=48';\n}(key));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画", + "bookSourceName": "🎨漫画台💓", + "bookSourceType": 2, + "bookSourceUrl": "https://m.manhuatai.com", + "bookUrlPattern": "https://.*/comic-api/v2/comic/getcomicmaindata?comic_id=\\d+&young_mode=0&from_page=other&platformname=android&productname=mht,.*", + "concurrentRate": "10/5000", + "customOrder": 128, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\ntitle = '✣      ✣ 榜  单 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nrank = [\n '人气',\n '更新',\n '评分',\n '收藏'\n];\norderby = [\n '&orderby=click',\n '&orderby=date',\n '&orderby=score',\n '&orderby=shoucang'\n];\nfor (i in rank) {\n url = `{{Get('url')}}/api/getsortlist/?comic_sort=${orderby[i]}&search_type=&search_key=&page={{page}}&size=48`;\n exploreUrl.push(explore(rank[i], url, 1, 0.2, false));\n}\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nkind = [\n '全部','热血','机战','运动','推理','冒险','搞笑','战争',\n '神魔','忍者','竞技','悬疑','社会','恋爱','宠物','吸血',\n '萝莉','后宫','御姐','霸总','玄幻','古风','历史','漫改',\n '游戏','穿越','恐怖','真人','科幻','都市','武侠','修真',\n '生活','动作'\n];\nlink = [\n '','rexue','jizhan','yundong','tuili','maoxian','gaoxiao','zhanzhen',\n 'shenmo','renzhe','jingji','xuanyi','shehui','lianai','chongwu','xixue',\n 'luoli','hougong','yujie','bazong','xuanhuan','gufeng','lishi','mangai',\n 'youxi','chuanyue','kongbu','zhenren','kehuan','dushi','wuxia','xiuzhen',\n 'shenghuo','dongzuo'\n];\nOrderBy = `{{get('orderBy',Get('o'))}}`;\nfor (j in kind) {\n url = `{{Get('url')}}/api/getsortlist/?comic_sort=${link[j]}${OrderBy}&search_type=&search_key=&page={{page}}&size=48`;\n exploreUrl.push(explore(kind[j], url, 1, 0.2, false));\n}\nBID = (kind.length % 4) < 1 ? 0 : (4 - (kind.length % 4));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.2, false)); \n}\n//exploreUrl.splice(40, 0, explore('', '', 1, 0.2, false));\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 EdgA/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function get(tag,num) {\n orderBy = [\n '&orderby=click',\n '&orderby=date',\n '&orderby=score',\n '&orderby=shoucang'\n ];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction Num(e) {\n e = String(e);\n var num = e.length > 8 ? (e.substring(0, e.length - 8) + \"亿\") : (e.length > 4 ? (e.substring(0, e.length - 4) + \"万\") : e);\n return num;\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}", + "lastUpdateTime": 1743133091168, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n {\n name: \"💡   源   站   测   试   💡\",\n type: \"button\",\n action: \"test(1)\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(-1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"人气\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"更新\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"评分\", type: \"button\", action: \"o(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"收藏\", type: \"button\", action: \"o(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = '';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'o': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://m.manhuatai.com',\n 'urls': [\n 'https://m.manhuatai.com'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == -1) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n if (e == 0) {\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0] + ',' + JSON.stringify(Option));\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0]);\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(0) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(4);\n time = new Date().getTime();\n html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n J = org.jsoup.Jsoup.parse(html);\n u = J.select('.website_href');\n for (i = 0; i < 1; i++) {\n host = String(u.attr('href').split(' ')[i]).replace(/http:/g, 'https:').replace(/\\/+$/, '');\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].unshift(host);\n put($$$);\n $(0);\n } else {\n return test(1);\n }\n }\n}\nfunction name(e) {\n if (e == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '📚当前排序:' + type($$$.o)) + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci0)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci2)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'];\n $$$['ci2'] = $$$['ci1'];\n $$$['ci1'] = $$$['ci0'];\n $$$['ci0'] = e;\n put($$$);\n test(e);\n}\ny = ['人气','更新','评分','收藏'];\nfunction type(e) {\n if (e == undefined) {\n e = 0;\n }\n return y[e];\n}\nfunction o(e) {\n if (o == undefined) {\n o = result.o;\n }\n if (e == $$$.o) {\n return login('【排序切换提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【排序切换提示】' + n(2) + '已经切换到[' + type(e) + ']排序');\n $$$.o = e;\n return put($$$);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}", + "respondTime": 5593, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace(Get('url'), baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n var list = JSON.parse(result).data;\n var $2 = element => String(java.getElements(element).text());\n var $3 = element => java.getElements(element);\n url = baseUrl;\n s = '✦ ' + Num(list.renqi) + ',' + '♥ ' + Num(list.shoucang);\n k = (list.comic_status < 2 ? '连载,' : '完结,') + Object.values(list.comic_type).join(',');\n t = String(java.timeFormat(list.update_time*1000)).replace(/\\//g, '-');\n l = list.last_chapter_name;\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[话話章回期](|\\s)第.*?[话話章回期]/, '$1').replace(/.*第(\\d+)[话話章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[话話章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[话話章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci0') == 0 ? '〖默认〗' : '〖自选〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n📚当前排序:〖' + (Get('o') == 0 ? '默认' : '自选') + '〗' + y[Get('o')]) + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n book = JSON.stringify({\n 'name': list.comic_name,\n 'author': list.comic_author,\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l + '〔' + t + '〕',\n 'intro': (t != '' ? ('更新时间:' + t + '\\nㅤ\\n') : '') + list.comic_desc.replace(/(^)/g, '$1
') + changeLog,\n 'cover': list.cover_list[0],\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\nif (String(book['author']) !== \"xiaohan231\") {\n imglist=JSON.parse(result).data.current_chapter.chapter_img_list;\n if (String(java.ajax(imglist[0])).includes('MISS')) {\n var time = new Date().getTime();\n var url = baseUrl + '&t=' + time;\n result= java.ajax(url);\n imglist=JSON.parse(result).data.current_chapter.chapter_img_list;\n }\n var result='';\n for (i in imglist) {\n result +='\\n'\n }\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageDecode": "", + "imageStyle": "FULL", + "nextContentUrl": "", + "replaceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0x3c73,_0x1ffd,User,Title,Link,Intro,data,Headers,Option;function aOttq2B(_0x3c73,_0x1ffd,User){for(User=0x0;User<_0x1ffd;User++)_0x3c73.push(_0x3c73.shift());return _0x3c73}function enZQV0(){}n2DnqtB(_0x3c73=aOttq2B([\"\\u0059\\u0032\\u0046\\u0079\\u0064\\u0047\\u0039\\u0076\\u0062\\u006c\\u0039\\u006b\\u005a\\u0058\\u004e\\u006a\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\",\"\\u004c\\u0032\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0057\\u0046\\u0077\\u0061\\u0053\\u0039\\u0032\\u004d\\u0069\\u0039\\u006a\\u0062\\u0032\\u0031\\u0070\\u0059\\u0079\\u0039\\u006e\\u005a\\u0058\\u0052\\u006a\\u0062\\u0032\\u0031\\u0070\\u0059\\u0032\\u0031\\u0068\\u0061\\u0057\\u0035\\u006b\\u0059\\u0058\\u0052\\u0068\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0061\\u0057\\u0051\\u0039\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0061\\u0057\\u0051\\u003d\",\"\\x4a\\x6e\\x6c\\x76\\x64\\x57\\x35\\x6e\\x58\\x32\\x31\\x76\\x5a\\x47\\x55\\x39\\x4d\\x43\\x5a\\x6d\\x63\\x6d\\x39\\x74\\x58\\x33\\x42\\x68\\x5a\\x32\\x55\\x39\\x62\\x33\\x52\\x6f\\x5a\\x58\\x49\\x6d\\x63\\x47\\x78\\x68\\x64\\x47\\x5a\\x76\\x63\\x6d\\x31\\x75\\x59\\x57\\x31\\x6c\\x50\\x57\\x46\\x75\\x5a\\x48\\x4a\\x76\\x61\\x57\\x51\\x6d\\x63\\x48\\x4a\\x76\\x5a\\x48\\x56\\x6a\\x64\\x47\\x35\\x68\\x62\\x57\\x55\\x39\\x62\\x57\\x68\\x30\\x5a\\x58\\x4a\\x6a\\x61\\x58\\x6c\\x31\\x59\\x57\\x34\\x79\\x4d\\x44\\x49\\x77\",\"\\u0059\\u0032\\u0039\\u0032\\u005a\\u0058\\u004a\\u0066\\u0061\\u0057\\u0031\\u006e\",\"\\u0061\\u0048\\u0052\\u0030\\u0063\\u0048\\u004d\\u0036\\u004c\\u0079\\u0039\\u0068\\u0063\\u0047\\u006b\\u0074\\u0059\\u0032\\u0052\\u0075\\u004c\\u006d\\u0074\\u0068\\u0061\\u0057\\u0031\\u0068\\u0062\\u006d\\u0068\\u0031\\u0059\\u0053\\u0035\\u006a\\u0062\\u0032\\u0030\\u0076\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004d\\u0074\\u0059\\u0058\\u0042\\u0070\\u004c\\u0033\\u0059\\u0079\\u004c\\u0032\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0032\\u0064\\u006c\\u0064\\u0047\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u0062\\u0057\\u0046\\u0070\\u0062\\u006d\\u0052\\u0068\\u0064\\u0047\\u0045\\u002f\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0061\\u0057\\u0051\\u0039\",\"\\x4a\\x6e\\x6c\\x76\\x64\\x57\\x35\\x6e\\x58\\x32\\x31\\x76\\x5a\\x47\\x55\\x39\\x4d\\x43\\x5a\\x6d\\x63\\x6d\\x39\\x74\\x58\\x33\\x42\\x68\\x5a\\x32\\x55\\x39\\x62\\x33\\x52\\x6f\\x5a\\x58\\x49\\x6d\\x63\\x47\\x78\\x68\\x64\\x47\\x5a\\x76\\x63\\x6d\\x31\\x75\\x59\\x57\\x31\\x6c\\x50\\x57\\x46\\x75\\x5a\\x48\\x4a\\x76\\x61\\x57\\x51\\x6d\\x63\\x48\\x4a\\x76\\x5a\\x48\\x56\\x6a\\x64\\x47\\x35\\x68\\x62\\x57\\x55\\x39\\x62\\x57\\x68\\x30\\x4c\\x48\\x73\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x74\\x4c\\x58\\x4a\\x6c\\x63\\x58\\x56\\x6c\\x63\\x33\\x51\\x74\\x61\\x57\\x51\\x69\\x4f\\x69\\x49\\x3d\",\"\\u0049\\u006e\\u0031\\u0039\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0051\\u003d\\u003d\",\"\\x59\\x57\\x70\\x68\\x65\\x41\\x3d\\x3d\",\"\\x63\\x47\\x46\\x6e\\x5a\\x54\\x30\\x3d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\x64\\x58\\x4a\\x73\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\u0063\\u006d\\u0056\\u0077\\u0062\\u0047\\u0046\\u006a\\u005a\\u0051\\u003d\\u003d\",\"\\x52\\x30\\x56\\x55\",\"\\x5a\\x47\\x46\\x30\\x59\\x51\\x3d\\x3d\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0062\\u006d\\u0046\\u0074\\u005a\\u0051\\u003d\\u003d\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\",\"\\u004a\\u0044\\u0045\\u0076\\u004a\\u0044\\u0049\\u003d\",\"\\u0063\\u006d\\u0056\\u0075\\u0063\\u0057\\u006b\\u003d\",\"\\u0063\\u0032\\u0068\\u0076\\u0064\\u0057\\u004e\\u0068\\u0062\\u006d\\u0063\\u003d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u005a\\u0033\\u004a\\u0068\\u005a\\u0047\\u0055\\u003d\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x64\\x48\\x6c\\x77\\x5a\\x51\\x3d\\x3d\",\"\\u0061\\u0057\\u0035\\u006a\\u0062\\u0048\\u0056\\u006b\\u005a\\u0058\\u004d\\u003d\",\"\\x63\\x32\\x39\\x79\\x64\\x44\\x30\\x6d\",\"\\u0050\\u0057\\u0052\\u0068\\u0064\\u0047\\u0055\\u003d\",\"\\x62\\x47\\x46\\x7a\\x64\\x46\\x39\\x6a\\x61\\x47\\x46\\x77\\x64\\x47\\x56\\x79\\x58\\x32\\x35\\x68\\x62\\x57\\x55\\x3d\",\"\\u0064\\u0047\\u006c\\u0074\\u005a\\u0055\\u005a\\u0076\\u0063\\u006d\\u0031\\u0068\\u0064\\u0041\\u003d\\u003d\",\"\\u0064\\u0058\\u0042\\u006b\\u0059\\u0058\\u0052\\u006c\\u0058\\u0033\\u0052\\u0070\\u0062\\u0057\\u0055\\u003d\"],0xd),_0x1ffd=function(User,Title){var Link,Intro;n2DnqtB(User=User-0x0,Link=_0x3c73[User]);if(_0x1ffd.IqhCzV===void 0x0){n2DnqtB(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;n2DnqtB(Title=User(),Link=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x3c73=0x0,_0x1ffd,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x1ffd=_0x3c73%0x4?_0x1ffd*0x40+data:data,_0x3c73++%0x4)?Intro+=String.fromCharCode(0xff&_0x1ffd>>(-0x2*_0x3c73&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x1ffd.ZgPedV=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x3c73=Title.length;Intro<_0x3c73;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x1ffd.InzLMQ={},_0x1ffd.IqhCzV=!0x0)}n2DnqtB(Intro=_0x1ffd.InzLMQ[User],Intro===void 0x0?(Link=_0x1ffd.ZgPedV(Link),_0x1ffd.InzLMQ[User]=Link):Link=Intro);return Link},eval(String(source[_0x1ffd(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x1ffd(\"\\u0030\\u0078\\u0031\")](cache_api+_0x1ffd(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x1ffd(\"\\x30\\x78\\x33\")](cache[_0x1ffd(\"\\u0030\\u0078\\u0034\")](java[_0x1ffd(\"\\x30\\x78\\x35\")](Get(_0x1ffd(\"\\x30\\x78\\x36\"))+_0x1ffd(\"\\x30\\x78\\x37\")))[_0x1ffd(\"\\u0030\\u0078\\u0038\")](Get(_0x1ffd(\"\\x30\\x78\\x36\")),baseUrl)),Option={method:_0x1ffd(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\x72\\x42\\x61\\x79\\x38\\x70\\x43\" in enZQV0)&&User==!![]){var list=JSON[_0x1ffd(\"\\x30\\x78\\x33\")](result)[_0x1ffd(\"\\x30\\x78\\x61\")][_0x1ffd(\"\\x30\\x78\\x61\")];for(i=0x0;i", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x3e9e,_0x1d8e,User,Title,Link,Intro,data,Headers,Option;function lm49pDH(_0x3e9e,_0x1d8e,User){for(User=0x0;User<_0x1d8e;User++)_0x3e9e.push(_0x3e9e.shift());return _0x3e9e}function xTS_Hq(){}t0GplXJ(_0x3e9e=lm49pDH([\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x61\\x57\\x51\\x3d\",\"\\x4a\\x6e\\x6c\\x76\\x64\\x57\\x35\\x6e\\x58\\x32\\x31\\x76\\x5a\\x47\\x55\\x39\\x4d\\x43\\x5a\\x6d\\x63\\x6d\\x39\\x74\\x58\\x33\\x42\\x68\\x5a\\x32\\x55\\x39\\x62\\x33\\x52\\x6f\\x5a\\x58\\x49\\x6d\\x63\\x47\\x78\\x68\\x64\\x47\\x5a\\x76\\x63\\x6d\\x31\\x75\\x59\\x57\\x31\\x6c\\x50\\x57\\x46\\x75\\x5a\\x48\\x4a\\x76\\x61\\x57\\x51\\x6d\\x63\\x48\\x4a\\x76\\x5a\\x48\\x56\\x6a\\x64\\x47\\x35\\x68\\x62\\x57\\x55\\x39\\x62\\x57\\x68\\x30\\x5a\\x58\\x4a\\x6a\\x61\\x58\\x6c\\x31\\x59\\x57\\x34\\x79\\x4d\\x44\\x49\\x77\",\"\\u0059\\u0032\\u0039\\u0032\\u005a\\u0058\\u004a\\u0066\\u0061\\u0057\\u0031\\u006e\",\"\\x61\\x48\\x52\\x30\\x63\\x48\\x4d\\x36\\x4c\\x79\\x39\\x68\\x63\\x47\\x6b\\x74\\x59\\x32\\x52\\x75\\x4c\\x6d\\x74\\x68\\x61\\x57\\x31\\x68\\x62\\x6d\\x68\\x31\\x59\\x53\\x35\\x6a\\x62\\x32\\x30\\x76\\x59\\x32\\x39\\x74\\x61\\x57\\x4d\\x74\\x59\\x58\\x42\\x70\\x4c\\x33\\x59\\x79\\x4c\\x32\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x4c\\x32\\x64\\x6c\\x64\\x47\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x62\\x57\\x46\\x70\\x62\\x6d\\x52\\x68\\x64\\x47\\x45\\x2f\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x61\\x57\\x51\\x39\",\"\\x4a\\x6e\\x6c\\x76\\x64\\x57\\x35\\x6e\\x58\\x32\\x31\\x76\\x5a\\x47\\x55\\x39\\x4d\\x43\\x5a\\x6d\\x63\\x6d\\x39\\x74\\x58\\x33\\x42\\x68\\x5a\\x32\\x55\\x39\\x62\\x33\\x52\\x6f\\x5a\\x58\\x49\\x6d\\x63\\x47\\x78\\x68\\x64\\x47\\x5a\\x76\\x63\\x6d\\x31\\x75\\x59\\x57\\x31\\x6c\\x50\\x57\\x46\\x75\\x5a\\x48\\x4a\\x76\\x61\\x57\\x51\\x6d\\x63\\x48\\x4a\\x76\\x5a\\x48\\x56\\x6a\\x64\\x47\\x35\\x68\\x62\\x57\\x55\\x39\\x62\\x57\\x68\\x30\\x4c\\x48\\x73\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x74\\x4c\\x58\\x4a\\x6c\\x63\\x58\\x56\\x6c\\x63\\x33\\x51\\x74\\x61\\x57\\x51\\x69\\x4f\\x69\\x49\\x3d\",\"\\x49\\x6e\\x31\\x39\",\"\\x59\\x57\\x70\\x68\\x65\\x41\\x3d\\x3d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0054\\u0030\\u003d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\x63\\x32\\x56\\x68\\x63\\x6d\\x4e\\x6f\\x61\\x32\\x56\\x35\",\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\x5a\\x32\\x56\\x30\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x5a\\x47\\x46\\x30\\x59\\x51\\x3d\\x3d\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0062\\u006d\\u0046\\u0074\\u005a\\u0051\\u003d\\u003d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0059\\u0058\\u0056\\u0030\\u0061\\u0047\\u0039\\u0079\",\"\\u004a\\u0044\\u0045\\u0076\\u004a\\u0044\\u0049\\u003d\",\"\\x63\\x6d\\x56\\x75\\x63\\x57\\x6b\\x3d\",\"\\x63\\x32\\x68\\x76\\x64\\x57\\x4e\\x68\\x62\\x6d\\x63\\x3d\",\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u005a\\u0033\\u004a\\u0068\\u005a\\u0047\\u0055\\u003d\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x64\\x48\\x6c\\x77\\x5a\\x51\\x3d\\x3d\",\"\\u0062\\u0047\\u0046\\u007a\\u0064\\u0046\\u0039\\u006a\\u0061\\u0047\\u0046\\u0077\\u0064\\u0047\\u0056\\u0079\\u0058\\u0032\\u0035\\u0068\\u0062\\u0057\\u0055\\u003d\",\"\\u0064\\u0047\\u006c\\u0074\\u005a\\u0055\\u005a\\u0076\\u0063\\u006d\\u0031\\u0068\\u0064\\u0041\\u003d\\u003d\",\"\\x64\\x58\\x42\\x6b\\x59\\x58\\x52\\x6c\\x58\\x33\\x52\\x70\\x62\\x57\\x55\\x3d\",\"\\x59\\x32\\x46\\x79\\x64\\x47\\x39\\x76\\x62\\x6c\\x39\\x6b\\x5a\\x58\\x4e\\x6a\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\",\"\\u004c\\u0032\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0057\\u0046\\u0077\\u0061\\u0053\\u0039\\u0032\\u004d\\u0069\\u0039\\u006a\\u0062\\u0032\\u0031\\u0070\\u0059\\u0079\\u0039\\u006e\\u005a\\u0058\\u0052\\u006a\\u0062\\u0032\\u0031\\u0070\\u0059\\u0032\\u0031\\u0068\\u0061\\u0057\\u0035\\u006b\\u0059\\u0058\\u0052\\u0068\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0061\\u0057\\u0051\\u0039\"],0xb),_0x1d8e=function(User,Title){var Link,Intro;t0GplXJ(User=User-0x0,Link=_0x3e9e[User]);if(_0x1d8e.TXGqJm===void 0x0){t0GplXJ(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;t0GplXJ(Title=User(),Link=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x3e9e=0x0,_0x1d8e,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x1d8e=_0x3e9e%0x4?_0x1d8e*0x40+data:data,_0x3e9e++%0x4)?Intro+=String.fromCharCode(0xff&_0x1d8e>>(-0x2*_0x3e9e&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x1d8e.qKehkT=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x3e9e=Title.length;Intro<_0x3e9e;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x1d8e.aZfwbS={},_0x1d8e.TXGqJm=!0x0)}t0GplXJ(Intro=_0x1d8e.aZfwbS[User],Intro===void 0x0?(Link=_0x1d8e.qKehkT(Link),_0x1d8e.aZfwbS[User]=Link):Link=Intro);return Link},eval(String(source[_0x1d8e(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x1d8e(\"\\u0030\\u0078\\u0031\")](cache_api+_0x1d8e(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x1d8e(\"\\u0030\\u0078\\u0033\")](cache[_0x1d8e(\"\\u0030\\u0078\\u0034\")](java[_0x1d8e(\"\\x30\\x78\\x35\")](Get(_0x1d8e(\"\\x30\\x78\\x36\"))+_0x1d8e(\"\\x30\\x78\\x37\")))[_0x1d8e(\"\\x30\\x78\\x38\")](Get(_0x1d8e(\"\\x30\\x78\\x36\")),baseUrl)),Option={method:_0x1d8e(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\u0071\\u0068\\u0062\\u0076\\u0062\\u0057\" in xTS_Hq)&&User==!![]){var list=JSON[_0x1d8e(\"\\x30\\x78\\x33\")](result)[_0x1d8e(\"\\x30\\x78\\x61\")][_0x1d8e(\"\\u0030\\u0078\\u0061\")],next,searchkey;for(i=0x0;i", + "bookUrl": "url", + "checkKeyWord": "妖神记", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x5bfc,_0x360a,User,Title,Link,Intro,data,Headers,YCA8S8E,Gd2JEC2;function _fQPflX(_0x5bfc,_0x360a,User){for(User=0x0;User<_0x360a;User++)_0x5bfc.push(_0x5bfc.shift());return _0x5bfc}function _RALnJq(){}xCa7cU(_0x5bfc=_fQPflX([\"\\u0059\\u0032\\u0039\\u0074\\u0061\\u0057\\u004e\\u0066\\u0061\\u0057\\u0051\\u003d\",\"\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x59\\x32\\x68\\x68\\x63\\x48\\x52\\x6c\\x63\\x67\\x3d\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\x59\\x58\\x52\\x30\\x63\\x67\\x3d\\x3d\",\"\\u0059\\u0032\\u0039\\u0075\\u0064\\u0047\\u0056\\u0075\\u0064\\u0041\\u003d\\u003d\",\"\\u0064\\u0047\\u006c\\u0074\\u005a\\u0055\\u005a\\u0076\\u0063\\u006d\\u0031\\u0068\\u0064\\u0041\\u003d\\u003d\",\"\\u0059\\u0033\\u004a\\u006c\\u0059\\u0058\\u0052\\u006c\\u0058\\u0032\\u0052\\u0068\\u0064\\u0047\\u0055\\u003d\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\x59\\x32\\x68\\x68\\x63\\x48\\x52\\x6c\\x63\\x6c\\x39\\x75\\x59\\x57\\x31\\x6c\",\"\\u005a\\u0057\\u0035\\u006b\\u0058\\u0032\\u0035\\u0031\\u0062\\u0051\\u003d\\u003d\",\"\\x62\\x57\\x46\\x30\\x59\\x32\\x67\\x3d\",\"\\x63\\x32\\x56\\x30\\x64\\x47\\x78\\x6c\",\"\\x4a\\x44\\x45\\x67\",\"\\x63\\x47\\x46\\x6b\\x55\\x33\\x52\\x68\\x63\\x6e\\x51\\x3d\",\"\\x4c\\x32\\x46\\x77\\x61\\x53\\x39\\x6e\\x5a\\x58\\x52\\x6a\\x61\\x47\\x46\\x77\\x64\\x47\\x56\\x79\\x61\\x57\\x35\\x6d\\x62\\x33\\x59\\x79\\x50\\x33\\x42\\x79\\x62\\x32\\x52\\x31\\x59\\x33\\x52\\x66\\x61\\x57\\x51\\x39\\x4d\\x69\\x5a\\x77\\x63\\x6d\\x39\\x6b\\x64\\x57\\x4e\\x30\\x62\\x6d\\x46\\x74\\x5a\\x54\\x31\\x74\\x61\\x48\\x51\\x6d\\x59\\x32\\x39\\x74\\x61\\x57\\x4e\\x66\\x61\\x57\\x51\\x39\",\"\\x4a\\x6d\\x4e\\x6f\\x59\\x58\\x42\\x30\\x5a\\x58\\x4a\\x66\\x62\\x6d\\x56\\x33\\x61\\x57\\x51\\x39\",\"\\u0059\\u0032\\u0068\\u0068\\u0063\\u0048\\u0052\\u006c\\u0063\\u006c\\u0039\\u0070\\u005a\\u0041\\u003d\\u003d\",\"\\x4a\\x6d\\x6c\\x7a\\x56\\x32\\x56\\x69\\x63\\x44\\x30\\x78\\x4a\\x6e\\x46\\x31\\x59\\x57\\x78\\x70\\x64\\x48\\x6b\\x39\\x61\\x47\\x6c\\x6e\\x61\\x41\\x3d\\x3d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\",\"\\x65\\x47\\x6c\\x68\\x62\\x32\\x68\\x68\\x62\\x6a\\x49\\x7a\\x4d\\x51\\x3d\\x3d\",\"\\x5a\\x47\\x46\\x30\\x59\\x51\\x3d\\x3d\"],0x13),_0x360a=function(User,Title){var Link,Intro;xCa7cU(User=User-0x0,Link=_0x5bfc[User]);if(_0x360a.AkxcYR===void 0x0){xCa7cU(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;xCa7cU(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x5bfc=0x0,_0x360a,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x360a=_0x5bfc%0x4?_0x360a*0x40+data:data,_0x5bfc++%0x4)?Intro+=String.fromCharCode(0xff&_0x360a>>(-0x2*_0x5bfc&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x360a.rDgdUn=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x5bfc=Title.length;Intro<_0x5bfc;Intro++)Link+=\"\\u0025\"+(\"\\x30\\x30\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x360a.vxnEtv={},_0x360a.AkxcYR=!0x0)}xCa7cU(Intro=_0x360a.vxnEtv[User],Intro===void 0x0?(Link=_0x360a.rDgdUn(Link),_0x360a.vxnEtv[User]=Link):Link=Intro);return Link},eval(String(source[_0x360a(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x360a(\"\\x30\\x78\\x31\")](cache_api+_0x360a(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x360a(\"\\u0030\\u0078\\u0033\")](cache[_0x360a(\"\\x30\\x78\\x34\")](java[_0x360a(\"\\u0030\\u0078\\u0035\")](Get(_0x360a(\"\\x30\\x78\\x36\"))+_0x360a(\"\\u0030\\u0078\\u0037\")))[_0x360a(\"\\u0030\\u0078\\u0038\")](Get(_0x360a(\"\\x30\\x78\\x36\")),baseUrl)),YCA8S8E=_0x360a(\"\\u0030\\u0078\\u0039\"),Gd2JEC2=Headers);if(!(\"\\u0069\\u0067\\u0068\\u0074\\u007a\\u0079\" in _RALnJq)&&String(book[_0x360a(\"\\x30\\x78\\x61\")])!==_0x360a(\"\\x30\\x78\\x62\")){var id=JSON[_0x360a(\"\\u0030\\u0078\\u0033\")](result)[_0x360a(\"\\u0030\\u0078\\u0063\")][_0x360a(\"\\x30\\x78\\x64\")],list,$1,date;xCa7cU(list=JSON[_0x360a(\"\\x30\\x78\\x33\")](result)[_0x360a(\"\\u0030\\u0078\\u0063\")][_0x360a(\"\\u0030\\u0078\\u0065\")],$1=_0x5bfc=>{return String(java[_0x360a(\"\\u0030\\u0078\\u0066\")](_0x5bfc)[_0x360a(\"\\x30\\x78\\x31\\x30\")](_0x360a(\"\\x30\\x78\\x31\\x31\")))},date=String(java[_0x360a(\"\\x30\\x78\\x31\\x32\")](list[0x0][_0x360a(\"\\x30\\x78\\x31\\x33\")]*0x3e8))[_0x360a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x2f\",\"\\u0067\"),\"\\u002d\"));for(i=list[_0x360a(\"\\u0030\\u0078\\u0031\\u0034\")]-0x1;i>=0x0;i--){xCa7cU(title=String(list[i][_0x360a(\"\\x30\\x78\\x31\\x35\")]+\"\\u0020\\u0028\"+list[i][_0x360a(\"\\x30\\x78\\x31\\x36\")]+\"\\x70\\x29\"),order=title[_0x360a(\"\\u0030\\u0078\\u0031\\u0037\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\")),title=Get(_0x360a(\"\\x30\\x78\\x31\\x38\"))==!![]?String(title)[_0x360a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x73\\x2d\\x5c\\x73\\x7c\\x2d\",\"\\u0067\"),\"\\x20\")[_0x360a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x73\\x2b\",\"\"),\"\\x20\")[_0x360a(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u0028\\u007c\\u005c\\u0073\\u0029第\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\",\"\"),\"\\u0024\\u0031\")[_0x360a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5b\\x5e\\x5c\\x73\\x5d\",\"\"),_0x360a(\"\\u0030\\u0078\\u0031\\u0039\"))[_0x360a(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\x24\\x31\")[_0x360a(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u002e\\u002a\\u0028\\u005c\\u0064\\u002b\\u0029\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\",\"\"),\"\\x24\\x31\")[_0x360a(\"\\x30\\x78\\x38\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\"),title[_0x360a(\"\\u0030\\u0078\\u0031\\u0037\")](new RegExp(\"\\x5c\\x64\\x2b\",\"\"))?order[0x1][_0x360a(\"\\u0030\\u0078\\u0031\\u0061\")](0x3,\"\\x30\"):\"\\u0024\\u0031\"):title,title=String(title)[_0x360a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x28\\x2d\\x7c\\x5f\\x7c\\x5c\\x73\\x2d\\x5c\\x73\\x29\",\"\\u0067\"),\"\\x20\")[_0x360a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x28\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\\x29\\x5c\\x73\\x5c\\x64\\x2b\",\"\"),\"\\u0024\\u0031\")[_0x360a(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005c\\u0073\\u005c\\u0073\",\"\\u0067\"),\"\\x20\"),push(data,{title:i==0x0?title+\"〔\"+date+\"〕\":title,link:Get(_0x360a(\"\\u0030\\u0078\\u0036\"))+_0x360a(\"\\x30\\x78\\x31\\x62\")+id+_0x360a(\"\\u0030\\u0078\\u0031\\u0063\")+list[i][_0x360a(\"\\u0030\\u0078\\u0031\\u0064\")]+_0x360a(\"\\u0030\\u0078\\u0031\\u0065\"),time:String(java[_0x360a(\"\\u0030\\u0078\\u0031\\u0032\")](list[i][_0x360a(\"\\u0030\\u0078\\u0031\\u0033\")]*0x3e8))[_0x360a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x2f\",\"\\x67\"),\"\\u002d\")}))}data=JSON[_0x360a(\"\\x30\\x78\\x31\\x66\")](data)}else{data=Data1()}function xCa7cU(){xCa7cU=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "", + "updateTime": "time" + }, + "searchUrl": "\neval(String(source.loginUrl));\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n java.put(java.md5Encode16(Get('url') + \"searchkey\"), e);\n return Get('url') + '/api/getsortlist/?comic_sort=&orderby=date&search_type=&search_key=' + e + '&page={{page}}&size=48';\n}(key));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画", + "bookSourceName": "🎨G站漫画💞", + "bookSourceType": 2, + "bookSourceUrl": "https://godamanga.com", + "bookUrlPattern": "https://.*/manga/.*", + "concurrentRate": "", + "customOrder": 130, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "\neval(String(Reload('https://qyyuapi.com/sy/js/G站漫画/exploreUrl.js')));\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0\",\n \"Referer\": \"https://godamh.com/\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "{\"G站漫画\":\"https://qyyuapi.com/sy/js/G站漫画/jsLib.js\"}", + "lastUpdateTime": 1743938735539, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n {\n name: \"💡   源   站   更   新   💡\",\n type: \"button\",\n action: \"update()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换源站 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"①G站漫画✈️\", type: \"button\", action: \"$(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"②G站漫画✈️\", type: \"button\", action: \"$(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"③G站漫画🐰\", type: \"button\", action: \"$(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"④G站漫画🐰\", type: \"button\", action: \"$(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑤G站漫画🐰\", type: \"button\", action: \"$(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑥G站漫画🐰\", type: \"button\", action: \"$(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n {\n name: \"清除网站Cookie缓存\",\n type: \"button\",\n action: \"deleteCookie()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n\n { name: \"清除远程代码标识\", type: \"button\", action: \"DeleteYckey()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "eval(String(Reload('https://qyyuapi.com/sy/js/G站漫画/loginUrl.js')));", + "respondTime": 39047, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(Reload('https://qyyuapi.com/sy/js/G站漫画/ruleBookInfo.js')));\n", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\neval(String(Reload('https://qyyuapi.com/sy/js/G站漫画/ruleContent.js')));\n", + "imageStyle": "FULL" + }, + "ruleExplore": { + "author": "author", + "bookList": "\neval(String(Reload('https://qyyuapi.com/sy/js/G站漫画/ruleExplore.js')));\n", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\neval(String(Reload('https://qyyuapi.com/sy/js/G站漫画/ruleSearch.js')));\n", + "bookUrl": "url", + "checkKeyWord": "妖神记", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\neval(String(Reload('https://qyyuapi.com/sy/js/G站漫画/ruleToc.js')));\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "if (!String(book.bookUrl).includes(Get('url'))) {\n book.bookUrl = String(book.bookUrl).replace(/.*\\/\\/[^\\/]+/, Get('url'));\n java.refreshTocUrl();\n}", + "updateTime": "time" + }, + "searchUrl": "\neval(String(Reload('https://qyyuapi.com/sy/js/G站漫画/searchUrl.js')));\n\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画", + "bookSourceName": "🎨笔趣阁💞", + "bookSourceType": 2, + "bookSourceUrl": "https://www.biqug.org", + "bookUrlPattern": "https://.*/index.php/comic/.*", + "concurrentRate": "", + "customOrder": 131, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\ntitle = '✣      ✣ 榜  单 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nrank = [\n '年度',\n '本月',\n '本周',\n '今日',\n '上升',\n '评分',\n '收藏'\n];\norderby = [\n 'hot',\n 'month',\n 'week',\n 'day',\n 'ascension',\n 'score',\n 'fav'\n];\nfor (i in rank) {\n url = `{{Get('url')}}/index.php/custom/${orderby[i]}`;\n exploreUrl.push(explore(rank[i], url, 1, 0.2, false));\n}\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nkind = [\n '全部','热血','冒险','科幻','霸总','玄幻','校园','修真',\n '搞笑','穿越','后宫','耽美','恋爱','悬疑','恐怖','战争',\n '动作','同人','竞技','励志','架空','灵异','百合','古风',\n '生活','真人','都市','其他','爱情','武侠','格斗','侦探',\n '推理','剧情','其它','总裁','奇幻','韩漫','纯爱','日常',\n '少年','大女主','异能'\n];\nlink = [\n '','/tags/6','/tags/7','/tags/8','/tags/9','/tags/10','/tags/11','/tags/12',\n '/tags/13','/tags/14','/tags/15','/tags/16','/tags/17','/tags/18','/tags/19','/tags/20',\n '/tags/21','/tags/22','/tags/23','/tags/24','/tags/25','/tags/26','/tags/27','/tags/28',\n '/tags/29','/tags/30','/tags/31','/tags/48','/tags/49','/tags/50','/tags/51','/tags/52',\n '/tags/53','/tags/294','/tags/295','/tags/296','/tags/297','/tags/298','/tags/299','/tags/300',\n '/tags/301','/tags/302','/tags/303'\n];\norder = [\n 'hits',\n 'addtime'\n];\nOrder = `{{get('order',Get('p'))}}`;\nO = `{{Get('o')}}`;\nQ = `{{Get('q')}}`;\nfor (j in kind) {\n url = `{{Get('url')}}/index.php/category/list/${O}/finish/${Q}/order/${Order}${link[j]}/page/{{page}}`;\n exploreUrl.push(explore(kind[j], url, 1, 0.2, false));\n}\nBID = (kind.length % 4) < 1 ? 0 : (4 - (kind.length % 4));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.2, false)); \n}\n//exploreUrl.splice(52, 0, explore('', '', 1, 0.2, false));\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function get(tag,num) {\n order = [\n 'hits',\n 'addtime'\n ];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}", + "lastUpdateTime": 1743134712967, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换源站 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"①笔趣阁❶\", type: \"button\", action: \"$(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"②笔趣阁❷\", type: \"button\", action: \"$(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"③笔趣阁❸\", type: \"button\", action: \"$(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"④笔趣阁❹\", type: \"button\", action: \"$(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑤笔趣阁❺\", type: \"button\", action: \"$(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑥笔趣阁❻\", type: \"button\", action: \"$(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n { name: \"༺ˇ»`ʚ 点击切换取向 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"少年\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"少女\", type: \"button\", action: \"o(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"青年\", type: \"button\", action: \"o(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n\n { name: \"༺ˇ»`ʚ 点击切换进度 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"q(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"连载\", type: \"button\", action: \"q(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"完结\", type: \"button\", action: \"q(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"热门人气\", type: \"button\", action: \"p(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"更新时间\", type: \"button\", action: \"p(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = '';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'o': 0,\n 'p': 0,\n 'q': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://www.cmh5.com',\n 'urls': [\n 'https://www.cmh5.com',\n 'https://www.cmh5.com',\n 'https://www.bq8.org',\n 'https://www.manhw.com',\n 'https://www.gmh8.com',\n 'https://www.bq888.net',\n 'https://www.biqug.org'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == 0) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[e] + ',' + JSON.stringify(Option));\n if(html.includes('no-js')){\n cookie.removeCookie(Get('url'));\n java.startBrowserAwait($$$.urls[e] + ',' + JSON.stringify(Option),\"验证\").body();\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[e] + ',' + JSON.stringify(Option));\n }\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(original['urls'].length);\n time = new Date().getTime();\n html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n J = org.jsoup.Jsoup.parse(html);\n u = J.select('.jump');\n for (i = 0; i < 6; i++) {\n host = 'https://' + String(u.text().split(' ')[i]);\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].push(host);\n put($$$);\n }\n }\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看');\n}\nfunction name(e) {\n if (e == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '🎯取向分类:' + type($$$.o)) + '\\n┋┋' + ('\\n' + '⏲️漫画进度:' + type1($$$.q)) + '\\n┋┋' + ('\\n' + '📚漫画排序:' + type2($$$.p)) + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci2)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci3)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'];\n $$$['ci2'] = $$$['ci1'];\n $$$['ci1'] = $$$['ci0'];\n $$$['ci0'] = e;\n put($$$);\n test(e);\n}\ny = ['全部','少年','少女','青年'];\nfunction type(e) {\n if (e == undefined) {\n e = 0;\n }\n return y[e];\n}\nfunction o(e) {\n if (o == undefined) {\n o = result.o;\n }\n if (e == $$$.o) {\n return login('【取向切换提示】' + n(2) + '已经选择此取向,无需更换');\n }\n login('【取向切换提示】' + n(2) + '已经切换到[' + type(e) + ']取向');\n $$$.o = e;\n return put($$$);\n}\nw = ['全部','连载','完结'];\nfunction type1(e) {\n if (e == undefined) {\n e = 0;\n }\n return w[e];\n}\nfunction q(e) {\n if (q == undefined) {\n q = result.q;\n }\n if (e == $$$.q) {\n return login('【进度切换提示】' + n(2) + '已经选择此进度,无需更换');\n }\n login('【进度切换提示】' + n(2) + '已经切换到[' + type1(e) + ']进度');\n $$$.q = e;\n return put($$$);\n}\nz = ['热门人气','更新时间'];\nfunction type2(e) {\n if (e == undefined) {\n e = 1;\n }\n return z[e];\n}\nfunction p(e) {\n if (p == undefined) {\n p = result.p;\n }\n if (e == $$$.p) {\n return login('【排序切换提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【排序切换提示】' + n(2) + '已经切换到[' + type2(e) + ']排序');\n $$$.p = e;\n return put($$$);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}", + "respondTime": 15816, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace(Get('url'), baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n var J = org.jsoup.Jsoup.parse(result);\n var $2 = element => String(java.getElements(element).text());\n var $3 = element => String(J.select(element).attr('src'));\n url = baseUrl;\n s = '✦ ' + $2('.comic-status b.2') + ',' + '♥ ' + $2('.comic-status b.1');\n k = $2('.comic-status b a').replace(/\\s/g, ',');\n t = '';\n l = $2('.update-time');\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[话話章回期](|\\s)第.*?[话話章回期]/, '$1').replace(/.*第(\\d+)[话話章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[话話章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[话話章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci0') == 0 ? '〖默认〗' : '〖自选〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n🎯取向分类:〖' + (Get('o') == 0 ? '默认' : '自选') + '〗' + y[Get('o')]) + ('\\n⏲️漫画进度:〖' + (Get('q') == 0 ? '默认' : '自选') + '〗' + w[Get('q')]) + ('\\n📚漫画排序:〖' + (Get('p') == 0 ? '默认' : '自选') + '〗' + z[Get('p')]) + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n book = JSON.stringify({\n 'name': $2('.comic-title.j-comic-title'),\n 'author': $2('.comic-author .name').replace(/[,xX&]|[图文][::]/g, '/').replace(/amp|;/g, '').replace(/\\/+/g, '/').replace(/(/g, '\\(').replace(/)/g, '\\)').replace(/\\/\\(/g, '\\('),\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l,\n 'intro': (t != '' ? ('更新时间:' + t + '\\nㅤ\\n') : '') + $2('p.intro-total').replace(/(^)/g, '$1
') + changeLog,\n 'cover': $3('.de-info__cover img'),\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\nif (String(book['author']) !== \"xiaohan231\") {\n '
' + java.getElements('.rd-article__pic.hide img');\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageStyle": "FULL", + "nextContentUrl": "", + "replaceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0x3049,_0x21be,User,Title,Link,Intro,data,Headers,Option;function EG1SJO(_0x3049,_0x21be,User){for(User=0x0;User<_0x21be;User++)_0x3049.push(_0x3049.shift());return _0x3049}function gjV0DJ(){}R7mlkQM(_0x3049=EG1SJO([\"\\u0052\\u0030\\u0056\\u0055\",\"\\u0061\\u0057\\u0035\\u006a\\u0062\\u0048\\u0056\\u006b\\u005a\\u0058\\u004d\\u003d\",\"\\u0062\\u006d\\u0038\\u0074\\u0061\\u006e\\u004d\\u003d\",\"\\x63\\x6d\\x56\\x74\\x62\\x33\\x5a\\x6c\\x51\\x32\\x39\\x76\\x61\\x32\\x6c\\x6c\",\"\\u0063\\u0032\\u0056\\u0030\\u0051\\u0032\\u0039\\u0075\\u0064\\u0047\\u0056\\u0075\\u0064\\u0041\\u003d\\u003d\",\"\\u0063\\u0033\\u0052\\u0068\\u0063\\u006e\\u0052\\u0043\\u0063\\u006d\\u0039\\u0033\\u0063\\u0032\\u0056\\u0079\\u0051\\u0058\\u0064\\u0068\\u0061\\u0058\\u0051\\u003d\",\"\\u0059\\u006d\\u0039\\u006b\\u0065\\u0051\\u003d\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\u004c\\u006d\\u004e\\u0076\\u0062\\u0057\\u0031\\u0076\\u0062\\u0069\\u0031\\u006a\\u0062\\u0032\\u0031\\u0070\\u0059\\u0079\\u0031\\u0070\\u0064\\u0047\\u0056\\u0074\\u0066\\u0048\\u0077\\u0075\\u0064\\u0047\\u0039\\u0077\\u004c\\u0057\\u0078\\u0070\\u0063\\u0033\\u0052\\u0066\\u0058\\u0032\\u004a\\u0076\\u0065\\u0043\\u0031\\u0070\\u0064\\u0047\\u0056\\u0074\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\u0063\\u0032\\u0056\\u0073\\u005a\\u0057\\u004e\\u0030\",\"\\u004c\\u006d\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u0058\\u0031\\u0039\\u0030\\u0061\\u0058\\u0052\\u0073\\u005a\\u0051\\u003d\\u003d\",\"\\u0064\\u0047\\u0056\\u0034\\u0064\\u0041\\u003d\\u003d\",\"\\u004c\\u006d\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0057\\u004e\\u0076\\u0064\\u0057\\u0035\\u0030\",\"\\u004c\\u006d\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0058\\u0056\\u0077\\u005a\\u0047\\u0046\\u0030\\u005a\\u0053\\u0042\\u0068\",\"\\u004c\\u006d\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0057\\u005a\\u006c\\u0059\\u0058\\u0052\\u0031\\u0063\\u006d\\u0055\\u003d\",\"\\x4c\\x6d\\x4e\\x76\\x64\\x6d\\x56\\x79\\x49\\x47\\x6c\\x74\\x5a\\x77\\x3d\\x3d\",\"\\x59\\x58\\x52\\x30\\x63\\x67\\x3d\\x3d\",\"\\u005a\\u0047\\u0046\\u0030\\u0059\\u0053\\u0031\\u0076\\u0063\\u006d\\u006c\\u006e\\u0061\\u0057\\u0035\\u0068\\u0062\\u0041\\u003d\\u003d\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0051\\u003d\\u003d\",\"\\x59\\x57\\x70\\x68\\x65\\x41\\x3d\\x3d\",\"\\x63\\x47\\x46\\x6e\\x5a\\x53\\x38\\x3d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\x61\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\x53\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x31\\x76\\x62\\x69\\x31\\x6a\\x62\\x32\\x31\\x70\\x59\\x79\\x31\\x70\\x64\\x47\\x56\\x74\\x4c\\x43\\x41\\x75\\x64\\x47\\x39\\x77\\x4c\\x57\\x78\\x70\\x63\\x33\\x52\\x66\\x58\\x32\\x4a\\x76\\x65\\x43\\x31\\x70\\x64\\x47\\x56\\x74\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\"],0x1b),_0x21be=function(User,Title){var Link,Intro;R7mlkQM(User=User-0x0,Link=_0x3049[User]);if(_0x21be.SNEMmS===void 0x0){R7mlkQM(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;R7mlkQM(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x3049=0x0,_0x21be,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x21be=_0x3049%0x4?_0x21be*0x40+data:data,_0x3049++%0x4)?Intro+=String.fromCharCode(0xff&_0x21be>>(-0x2*_0x3049&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x21be.KzqQoO=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x3049=Title.length;Intro<_0x3049;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x21be.pmonVK={},_0x21be.SNEMmS=!0x0)}R7mlkQM(Intro=_0x21be.pmonVK[User],Intro===void 0x0?(Link=_0x21be.KzqQoO(Link),_0x21be.pmonVK[User]=Link):Link=Intro);return Link},eval(String(source[_0x21be(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x21be(\"\\x30\\x78\\x31\")](cache_api+_0x21be(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x21be(\"\\u0030\\u0078\\u0033\")](cache[_0x21be(\"\\x30\\x78\\x34\")](java[_0x21be(\"\\x30\\x78\\x35\")](Get(_0x21be(\"\\x30\\x78\\x36\"))+_0x21be(\"\\u0030\\u0078\\u0037\")))[_0x21be(\"\\x30\\x78\\x38\")](Get(_0x21be(\"\\u0030\\u0078\\u0036\")),baseUrl)),Option={method:_0x21be(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\x70\\x52\\x6c\\x75\\x43\\x42\" in gjV0DJ)&&result[_0x21be(\"\\x30\\x78\\x61\")](_0x21be(\"\\u0030\\u0078\\u0062\"))){R7mlkQM(cookie[_0x21be(\"\\u0030\\u0078\\u0063\")](Get(_0x21be(\"\\u0030\\u0078\\u0036\"))),java[_0x21be(\"\\u0030\\u0078\\u0064\")](java[_0x21be(\"\\x30\\x78\\x65\")](baseUrl,\"验证\")[_0x21be(\"\\x30\\x78\\x66\")]()))}if(!(\"\\x4e\\x6c\\x5f\\x46\\x45\\x71\\x48\" in gjV0DJ)&&User==!![]){var list=java[_0x21be(\"\\u0030\\u0078\\u0031\\u0030\")](_0x21be(\"\\x30\\x78\\x31\\x31\"));for(i=0x0;i", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x41bb,_0x1779,User,Title,Link,Intro,data,Headers,Option;function lvrIlI(_0x41bb,_0x1779,User){for(User=0x0;User<_0x1779;User++)_0x41bb.push(_0x41bb.shift());return _0x41bb}function mComvjJ(){}Xa8lqjg(_0x41bb=lvrIlI([\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\x5a\\x32\\x56\\x30\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\x64\\x58\\x4a\\x73\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x61\\x57\\x35\\x6a\\x62\\x48\\x56\\x6b\\x5a\\x58\\x4d\\x3d\",\"\\x62\\x6d\\x38\\x74\\x61\\x6e\\x4d\\x3d\",\"\\x63\\x6d\\x56\\x74\\x62\\x33\\x5a\\x6c\\x51\\x32\\x39\\x76\\x61\\x32\\x6c\\x6c\",\"\\u0063\\u0032\\u0056\\u0030\\u0051\\u0032\\u0039\\u0075\\u0064\\u0047\\u0056\\u0075\\u0064\\u0041\\u003d\\u003d\",\"\\u0063\\u0033\\u0052\\u0068\\u0063\\u006e\\u0052\\u0043\\u0063\\u006d\\u0039\\u0033\\u0063\\u0032\\u0056\\u0079\\u0051\\u0058\\u0064\\u0068\\u0061\\u0058\\u0051\\u003d\",\"\\x59\\x6d\\x39\\x6b\\x65\\x51\\x3d\\x3d\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x31\\x76\\x62\\x69\\x31\\x6a\\x62\\x32\\x31\\x70\\x59\\x79\\x31\\x70\\x64\\x47\\x56\\x74\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x58\\x31\\x39\\x30\\x61\\x58\\x52\\x73\\x5a\\x51\\x3d\\x3d\",\"\\u0064\\u0047\\u0056\\u0034\\u0064\\u0041\\u003d\\u003d\",\"\\u004c\\u006d\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0057\\u004e\\u0076\\u0064\\u0057\\u0035\\u0030\",\"\\u004c\\u006d\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0058\\u0056\\u0077\\u005a\\u0047\\u0046\\u0030\\u005a\\u0053\\u0042\\u0068\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x4c\\x57\\x5a\\x6c\\x59\\x58\\x52\\x31\\x63\\x6d\\x55\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x64\\x6d\\x56\\x79\\x49\\x47\\x6c\\x74\\x5a\\x77\\x3d\\x3d\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\u005a\\u0047\\u0046\\u0030\\u0059\\u0053\\u0031\\u0076\\u0063\\u006d\\u006c\\u006e\\u0061\\u0057\\u0035\\u0068\\u0062\\u0041\\u003d\\u003d\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\x4c\\x6e\\x4e\\x6c\\x59\\x58\\x4a\\x6a\\x61\\x46\\x39\\x6f\\x5a\\x57\\x46\\x6b\",\"\\u0035\\u006f\\u004b\\u006f\\u0035\\u0070\\u0043\\u0063\\u0035\\u0037\\u0053\\u0069\\u0035\\u0035\\u0071\\u0045\\u0035\\u0059\\u0061\\u0046\\u0035\\u0061\\u0036\\u0035\\u0035\\u0070\\u0071\\u0043\\u0035\\u0070\\u0065\\u0032\\u0035\\u0072\\u004b\\u0068\\u0035\\u0070\\u0079\\u004a\\u0035\\u006f\\u006d\\u002b\\u0035\\u0059\\u0069\\u0077\",\"\\x59\\x57\\x70\\x68\\x65\\x41\\x3d\\x3d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0053\\u0038\\u003d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0061\\u006e\\u004e\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\x53\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\x63\\x32\\x56\\x68\\x63\\x6d\\x4e\\x6f\\x61\\x32\\x56\\x35\"],0x1),_0x1779=function(User,Title){var Link,Intro;Xa8lqjg(User=User-0x0,Link=_0x41bb[User]);if(_0x1779.FchkLp===void 0x0){Xa8lqjg(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;Xa8lqjg(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x41bb=0x0,_0x1779,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x1779=_0x41bb%0x4?_0x1779*0x40+data:data,_0x41bb++%0x4)?Intro+=String.fromCharCode(0xff&_0x1779>>(-0x2*_0x41bb&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x1779.SazKWi=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x41bb=Title.length;Intro<_0x41bb;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x1779.WezFhT={},_0x1779.FchkLp=!0x0)}Xa8lqjg(Intro=_0x1779.WezFhT[User],Intro===void 0x0?(Link=_0x1779.SazKWi(Link),_0x1779.WezFhT[User]=Link):Link=Intro);return Link},eval(String(source[_0x1779(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x1779(\"\\x30\\x78\\x31\")](cache_api+_0x1779(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x1779(\"\\u0030\\u0078\\u0033\")](cache[_0x1779(\"\\x30\\x78\\x34\")](java[_0x1779(\"\\x30\\x78\\x35\")](Get(_0x1779(\"\\u0030\\u0078\\u0036\"))+_0x1779(\"\\u0030\\u0078\\u0037\")))[_0x1779(\"\\x30\\x78\\x38\")](Get(_0x1779(\"\\x30\\x78\\x36\")),baseUrl)),Option={method:_0x1779(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\x4e\\x51\\x4c\\x69\\x31\\x67\" in mComvjJ)&&result[_0x1779(\"\\u0030\\u0078\\u0061\")](_0x1779(\"\\x30\\x78\\x62\"))){Xa8lqjg(cookie[_0x1779(\"\\x30\\x78\\x63\")](Get(_0x1779(\"\\x30\\x78\\x36\"))),java[_0x1779(\"\\u0030\\u0078\\u0064\")](java[_0x1779(\"\\x30\\x78\\x65\")](baseUrl,\"验证\")[_0x1779(\"\\x30\\x78\\x66\")]()))}if(!(\"\\u007a\\u006e\\u0037\\u0051\\u0068\\u0047\" in mComvjJ)&&User==!![]){var list=java[_0x1779(\"\\u0030\\u0078\\u0031\\u0030\")](_0x1779(\"\\x30\\x78\\x31\\x31\"));for(i=0x0;i", + "bookUrl": "url", + "checkKeyWord": "妖神记", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x9c20,_0x5dd7,User,Title,Link,Intro,data,Headers,etncLl,rP_K02t;function Aufn_X6(_0x9c20,_0x5dd7,User){for(User=0x0;User<_0x5dd7;User++)_0x9c20.push(_0x9c20.shift());return _0x9c20}function CWjEyVH(){}DtSxgB(_0x9c20=Aufn_X6([\"\\x63\\x47\\x46\\x6b\\x55\\x33\\x52\\x68\\x63\\x6e\\x51\\x3d\",\"\\x59\\x58\\x52\\x30\\x63\\x67\\x3d\\x3d\",\"\\u0061\\u0048\\u004a\\u006c\\u005a\\u0067\\u003d\\u003d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\x5a\\x32\\x56\\x30\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\",\"\\x65\\x47\\x6c\\x68\\x62\\x32\\x68\\x68\\x62\\x6a\\x49\\x7a\\x4d\\x51\\x3d\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\u004c\\u006d\\u004e\\u006f\\u0059\\u0058\\u0042\\u0030\\u005a\\u0058\\u004a\\u0066\\u0058\\u0032\\u0078\\u0070\\u0063\\u0033\\u0051\\u0074\\u0059\\u006d\\u0039\\u0034\\u004c\\u006d\\u004e\\u0073\\u005a\\u0057\\u0046\\u0079\\u005a\\u006d\\u006c\\u0034\\u0049\\u0047\\u0078\\u0070\\u0049\\u0047\\u0045\\u003d\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\u0062\\u0057\\u0046\\u0030\\u0059\\u0032\\u0067\\u003d\",\"\\u0063\\u0032\\u0056\\u0030\\u0064\\u0047\\u0078\\u006c\",\"\\x4a\\x44\\x45\\x67\"],0x4),_0x5dd7=function(User,Title){var Link,Intro;DtSxgB(User=User-0x0,Link=_0x9c20[User]);if(_0x5dd7.hhxCli===void 0x0){DtSxgB(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;DtSxgB(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x9c20=0x0,_0x5dd7,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x5dd7=_0x9c20%0x4?_0x5dd7*0x40+data:data,_0x9c20++%0x4)?Intro+=String.fromCharCode(0xff&_0x5dd7>>(-0x2*_0x9c20&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x5dd7.dkVlbO=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x9c20=Title.length;Intro<_0x9c20;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x5dd7.bASlnk={},_0x5dd7.hhxCli=!0x0)}DtSxgB(Intro=_0x5dd7.bASlnk[User],Intro===void 0x0?(Link=_0x5dd7.dkVlbO(Link),_0x5dd7.bASlnk[User]=Link):Link=Intro);return Link},eval(String(source[_0x5dd7(\"\\x30\\x78\\x30\")])),eval(String(java[_0x5dd7(\"\\u0030\\u0078\\u0031\")](cache_api+_0x5dd7(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x5dd7(\"\\x30\\x78\\x33\")](cache[_0x5dd7(\"\\x30\\x78\\x34\")](java[_0x5dd7(\"\\u0030\\u0078\\u0035\")](Get(_0x5dd7(\"\\x30\\x78\\x36\"))+_0x5dd7(\"\\x30\\x78\\x37\")))[_0x5dd7(\"\\x30\\x78\\x38\")](Get(_0x5dd7(\"\\u0030\\u0078\\u0036\")),baseUrl)),etncLl=_0x5dd7(\"\\u0030\\u0078\\u0039\"),rP_K02t=Headers);if(!(\"\\x64\\x58\\x6d\\x71\\x4e\\x72\\x78\" in CWjEyVH)&&String(book[_0x5dd7(\"\\x30\\x78\\x61\")])!==_0x5dd7(\"\\u0030\\u0078\\u0062\")){var list=java[_0x5dd7(\"\\x30\\x78\\x63\")](_0x5dd7(\"\\u0030\\u0078\\u0064\"));for(i in list){DtSxgB(title=list[i][_0x5dd7(\"\\u0030\\u0078\\u0065\")](),order=title[_0x5dd7(\"\\u0030\\u0078\\u0066\")](new RegExp(\"\\x28\\x5c\\x64\\x2b\\x29\",\"\")),title=Get(_0x5dd7(\"\\u0030\\u0078\\u0031\\u0030\"))==!![]?String(title)[_0x5dd7(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x73\\x2d\\x5c\\x73\\x7c\\x2d\",\"\\u0067\"),\"\\u0020\")[_0x5dd7(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x2b\",\"\"),\"\\x20\")[_0x5dd7(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x28\\x7c\\x5c\\x73\\x29第\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\u0024\\u0031\")[_0x5dd7(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5b\\x5e\\x5c\\x73\\x5d\",\"\"),_0x5dd7(\"\\u0030\\u0078\\u0031\\u0031\"))[_0x5dd7(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5c\\x73\\x5c\\x64\\x2b\",\"\"),\"\\x24\\x31\")[_0x5dd7(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a第\\x2e\\x2a\\x28\\x5c\\x64\\x2b\\x29\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\x24\\x31\")[_0x5dd7(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\"),title[_0x5dd7(\"\\x30\\x78\\x66\")](new RegExp(\"\\u005c\\u0064\\u002b\",\"\"))?order[0x1][_0x5dd7(\"\\x30\\x78\\x31\\x32\")](0x3,\"\\u0030\"):\"\\x24\\x31\"):title,push(data,{title:String(title)[_0x5dd7(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u002d\\u007c\\u005f\\u007c\\u005c\\u0073\\u002d\\u005c\\u0073\\u0029\",\"\\x67\"),\"\\u0020\")[_0x5dd7(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\\u0029\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\x24\\x31\")[_0x5dd7(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005c\\u0073\\u005c\\u0073\",\"\\u0067\"),\"\\u0020\"),link:Get(_0x5dd7(\"\\u0030\\u0078\\u0036\"))+list[i][_0x5dd7(\"\\u0030\\u0078\\u0031\\u0033\")](_0x5dd7(\"\\x30\\x78\\x31\\x34\"))}))}data=JSON[_0x5dd7(\"\\x30\\x78\\x31\\x35\")](data)}else{data=Data1()}function DtSxgB(){DtSxgB=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "if (!String(book.bookUrl).includes(Get('url'))) {\n book.bookUrl = String(book.bookUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n book.tocUrl = String(book.tocUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n java.refreshTocUrl();\n}" + }, + "searchUrl": "\neval(String(source.loginUrl));\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n java.put(java.md5Encode16(Get('url') + \"searchkey\"), e);\n return Get('url') + '/index.php/search/' + e + '/{{page}}';\n}(key));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画", + "bookSourceName": "🎨漫画屋💞", + "bookSourceType": 2, + "bookSourceUrl": "https://www.mhua5.com", + "bookUrlPattern": "https://.*/index.php/comic/.*", + "concurrentRate": "", + "customOrder": 132, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\ntitle = '✣      ✣ 榜  单 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nrank = [\n '年度',\n '本月',\n '本周',\n '今日',\n '上升',\n '评分',\n '收藏'\n];\norderby = [\n 'hot',\n 'month',\n 'week',\n 'day',\n 'ascension',\n 'score',\n 'fav'\n];\nfor (i in rank) {\n url = `{{Get('url')}}/index.php/custom/${orderby[i]}`;\n exploreUrl.push(explore(rank[i], url, 1, 0.2, false));\n}\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nkind = [\n '全部','热血','冒险','科幻','霸总','玄幻','校园','修真',\n '搞笑','穿越','后宫','耽美','恋爱','悬疑','恐怖','战争',\n '动作','同人','竞技','励志','架空','灵异','百合','古风',\n '生活','真人','都市','其他','日常','其它','纯爱','推理',\n '奇幻','格斗','大女主','剧情','总裁','武侠','异能','少年',\n '韩漫'\n];\nlink = [\n '','/tags/6','/tags/7','/tags/8','/tags/9','/tags/10','/tags/11','/tags/12',\n '/tags/13','/tags/14','/tags/15','/tags/16','/tags/17','/tags/18','/tags/19','/tags/20',\n '/tags/21','/tags/22','/tags/23','/tags/24','/tags/25','/tags/26','/tags/27','/tags/28',\n '/tags/29','/tags/30','/tags/31','/tags/48','/tags/49','/tags/50','/tags/51','/tags/52',\n '/tags/53','/tags/54','/tags/55','/tags/56','/tags/57','/tags/58','/tags/59','/tags/60',\n '/tags/61'\n];\nOrder = `{{get('order',Get('p'))}}`;\nO = `{{Get('o')}}`;\nQ = `{{Get('q')}}`;\nfor (j in kind) {\n url = `{{Get('url')}}/index.php/category/list/${O}/finish/${Q}/order/${Order}${link[j]}/page/{{page}}`;\n exploreUrl.push(explore(kind[j], url, 1, 0.2, false));\n}\nBID = (kind.length % 4) < 1 ? 0 : (4 - (kind.length % 4));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.2, false)); \n}\n//exploreUrl.splice(50, 0, explore('', '', 1, 0.2, false));\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function get(tag,num) {\n order = [\n 'hits',\n 'addtime'\n ];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}", + "lastUpdateTime": 1743135810641, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换源站 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"①漫画屋❶\", type: \"button\", action: \"$(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"②漫画屋❷\", type: \"button\", action: \"$(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"③漫画屋❸\", type: \"button\", action: \"$(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"④漫画屋❹\", type: \"button\", action: \"$(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑤漫画屋❺\", type: \"button\", action: \"$(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑥漫画屋❻\", type: \"button\", action: \"$(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑦漫画屋❼\", type: \"button\", action: \"$(7)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"⑧漫画屋❽\", type: \"button\", action: \"$(8)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n { name: \"༺ˇ»`ʚ 点击切换取向 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"少年\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"少女\", type: \"button\", action: \"o(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"青年\", type: \"button\", action: \"o(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n\n { name: \"༺ˇ»`ʚ 点击切换进度 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"q(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"连载\", type: \"button\", action: \"q(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"完结\", type: \"button\", action: \"q(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"热门人气\", type: \"button\", action: \"p(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"更新时间\", type: \"button\", action: \"p(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = '';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'o': 0,\n 'p': 0,\n 'q': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://www.mhua5.com',\n 'urls': [\n 'https://www.mhua5.com',\n 'https://www.mhua5.com',\n 'https://www.mhw.plus',\n 'https://www.mhw1.com',\n 'https://www.mhw2.com',\n 'https://www.biqumh.com',\n 'https://www.toh123.com',\n 'https://www.umh5.com'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == 0) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[e] + ',' + JSON.stringify(Option));\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(original['urls'].length);\n time = new Date().getTime();\n html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n J = org.jsoup.Jsoup.parse(html);\n u = J.select('.jump');\n for (i = 0; i < 6; i++) {\n host = 'https://' + String(u.text().split(' ')[i]);\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].push(host);\n put($$$);\n }\n }\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看');\n}\nfunction name(e) {\n if (e == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '🎯取向分类:' + type($$$.o)) + '\\n┋┋' + ('\\n' + '⏲️漫画进度:' + type1($$$.q)) + '\\n┋┋' + ('\\n' + '📚漫画排序:' + type2($$$.p)) + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci2)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci3)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'];\n $$$['ci2'] = $$$['ci1'];\n $$$['ci1'] = $$$['ci0'];\n $$$['ci0'] = e;\n put($$$);\n test(e);\n}\ny = ['全部','少年','少女','青年'];\nfunction type(e) {\n if (e == undefined) {\n e = 0;\n }\n return y[e];\n}\nfunction o(e) {\n if (o == undefined) {\n o = result.o;\n }\n if (e == $$$.o) {\n return login('【取向切换提示】' + n(2) + '已经选择此取向,无需更换');\n }\n login('【取向切换提示】' + n(2) + '已经切换到[' + type(e) + ']取向');\n $$$.o = e;\n return put($$$);\n}\nw = ['全部','连载','完结'];\nfunction type1(e) {\n if (e == undefined) {\n e = 0;\n }\n return w[e];\n}\nfunction q(e) {\n if (q == undefined) {\n q = result.q;\n }\n if (e == $$$.q) {\n return login('【进度切换提示】' + n(2) + '已经选择此进度,无需更换');\n }\n login('【进度切换提示】' + n(2) + '已经切换到[' + type1(e) + ']进度');\n $$$.q = e;\n return put($$$);\n}\nz = ['热门人气','更新时间'];\nfunction type2(e) {\n if (e == undefined) {\n e = 1;\n }\n return z[e];\n}\nfunction p(e) {\n if (p == undefined) {\n p = result.p;\n }\n if (e == $$$.p) {\n return login('【排序切换提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【排序切换提示】' + n(2) + '已经切换到[' + type2(e) + ']排序');\n $$$.p = e;\n return put($$$);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}", + "respondTime": 11246, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace(Get('url'), baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n var J = org.jsoup.Jsoup.parse(result);\n var $2 = element => String(java.getElements(element).text());\n var $3 = element => String(J.select(element).attr('src'));\n url = baseUrl;\n s = '✦ ' + $2('.comic-status b.2') + ',' + '♥ ' + $2('.comic-status b.1');\n k = $2('.comic-status b a').replace(/\\s/g, ',');\n t = '';\n l = $2('.update-time');\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[话話章回期](|\\s)第.*?[话話章回期]/, '$1').replace(/.*第(\\d+)[话話章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[话話章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[话話章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci0') == 0 ? '〖默认〗' : '〖自选〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n🎯取向分类:〖' + (Get('o') == 0 ? '默认' : '自选') + '〗' + y[Get('o')]) + ('\\n⏲️漫画进度:〖' + (Get('q') == 0 ? '默认' : '自选') + '〗' + w[Get('q')]) + ('\\n📚漫画排序:〖' + (Get('p') == 0 ? '默认' : '自选') + '〗' + z[Get('p')]) + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n book = JSON.stringify({\n 'name': $2('.comic-title.j-comic-title'),\n 'author': $2('.comic-author .name').replace(/[,xX&]|[图文][::]/g, '/').replace(/amp|;/g, '').replace(/\\/+/g, '/').replace(/\\/(/g, '('),\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l,\n 'intro': (t != '' ? ('更新时间:' + t + '\\nㅤ\\n') : '') + $2('p.intro-total').replace(/(^)/g, '$1
') + changeLog,\n 'cover': $3('.de-info__cover img'),\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\nif (String(book['author']) !== \"xiaohan231\") {\n '
' + java.getElements('.rd-article__pic.hide img');\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageStyle": "FULL", + "nextContentUrl": "", + "replaceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0x1dae,_0x74ed,User,Title,Link,Intro,data,Headers,Option;function t9efMoP(_0x1dae,_0x74ed,User){for(User=0x0;User<_0x74ed;User++)_0x1dae.push(_0x1dae.shift());return _0x1dae}function WxIP3x3(){}cvZzscE(_0x1dae=t9efMoP([\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\u0063\\u006d\\u0056\\u0077\\u0062\\u0047\\u0046\\u006a\\u005a\\u0051\\u003d\\u003d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x31\\x76\\x62\\x69\\x31\\x6a\\x62\\x32\\x31\\x70\\x59\\x79\\x31\\x70\\x64\\x47\\x56\\x74\\x66\\x48\\x77\\x75\\x64\\x47\\x39\\x77\\x4c\\x57\\x78\\x70\\x63\\x33\\x52\\x66\\x58\\x32\\x4a\\x76\\x65\\x43\\x31\\x70\\x64\\x47\\x56\\x74\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x58\\x31\\x39\\x30\\x61\\x58\\x52\\x73\\x5a\\x51\\x3d\\x3d\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x4c\\x57\\x4e\\x76\\x64\\x57\\x35\\x30\",\"\\u004c\\u006d\\u004e\\u0076\\u0062\\u0057\\u006c\\u006a\\u004c\\u0058\\u0056\\u0077\\u005a\\u0047\\u0046\\u0030\\u005a\\u0053\\u0042\\u0068\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x4c\\x57\\x5a\\x6c\\x59\\x58\\x52\\x31\\x63\\x6d\\x55\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x64\\x6d\\x56\\x79\\x49\\x47\\x6c\\x74\\x5a\\x77\\x3d\\x3d\",\"\\x59\\x58\\x52\\x30\\x63\\x67\\x3d\\x3d\",\"\\u005a\\u0047\\u0046\\u0030\\u0059\\u0053\\u0031\\u0076\\u0063\\u006d\\u006c\\u006e\\u0061\\u0057\\u0035\\u0068\\u0062\\u0041\\u003d\\u003d\",\"\\u0061\\u0048\\u004a\\u006c\\u005a\\u0067\\u003d\\u003d\",\"\\u0061\\u0057\\u0035\\u006a\\u0062\\u0048\\u0056\\u006b\\u005a\\u0058\\u004d\\u003d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0051\\u003d\\u003d\",\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0053\\u0038\\u003d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\u0061\\u006e\\u004e\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\x53\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x31\\x76\\x62\\x69\\x31\\x6a\\x62\\x32\\x31\\x70\\x59\\x79\\x31\\x70\\x64\\x47\\x56\\x74\\x4c\\x43\\x41\\x75\\x64\\x47\\x39\\x77\\x4c\\x57\\x78\\x70\\x63\\x33\\x52\\x66\\x58\\x32\\x4a\\x76\\x65\\x43\\x31\\x70\\x64\\x47\\x56\\x74\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\x5a\\x32\\x56\\x30\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\"],0x18),_0x74ed=function(User,Title){var Link,Intro;cvZzscE(User=User-0x0,Link=_0x1dae[User]);if(_0x74ed.CyBUHC===void 0x0){cvZzscE(function(){var User,Title;try{var Link=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\");User=Link()}catch(Intro){User=window}cvZzscE(Title=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",User.atob||(User.atob=function(User){var Link=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x1dae=0x0,_0x74ed,data,Headers=0x0;data=Link.charAt(Headers++);~data&&(_0x74ed=_0x1dae%0x4?_0x74ed*0x40+data:data,_0x1dae++%0x4)?Intro+=String.fromCharCode(0xff&_0x74ed>>(-0x2*_0x1dae&0x6)):0x0)data=Title.indexOf(data);return Intro}))}(),_0x74ed.Uptuli=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x1dae=Title.length;Intro<_0x1dae;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x74ed.XnvqWQ={},_0x74ed.CyBUHC=!0x0)}cvZzscE(Intro=_0x74ed.XnvqWQ[User],Intro===void 0x0?(Link=_0x74ed.Uptuli(Link),_0x74ed.XnvqWQ[User]=Link):Link=Intro);return Link},eval(String(source[_0x74ed(\"\\x30\\x78\\x30\")])),eval(String(java[_0x74ed(\"\\u0030\\u0078\\u0031\")](cache_api+_0x74ed(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x74ed(\"\\x30\\x78\\x33\")](cache[_0x74ed(\"\\u0030\\u0078\\u0034\")](java[_0x74ed(\"\\u0030\\u0078\\u0035\")](Get(_0x74ed(\"\\u0030\\u0078\\u0036\"))+_0x74ed(\"\\u0030\\u0078\\u0037\")))[_0x74ed(\"\\u0030\\u0078\\u0038\")](Get(_0x74ed(\"\\x30\\x78\\x36\")),baseUrl)),Option={method:_0x74ed(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\u0053\\u006b\\u0070\\u0043\\u0041\\u0061\" in WxIP3x3)&&User==!![]){var list=java[_0x74ed(\"\\u0030\\u0078\\u0061\")](_0x74ed(\"\\u0030\\u0078\\u0062\"));for(i=0x0;i", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x483a,_0x1417,User,Title,Link,Intro,data,Headers,Option;function G51yow(_0x483a,_0x1417,User){for(User=0x0;User<_0x1417;User++)_0x483a.push(_0x483a.shift());return _0x483a}function YG7hT7(){}ardMrOd(_0x483a=G51yow([\"\\x61\\x57\\x35\\x6a\\x62\\x48\\x56\\x6b\\x5a\\x58\\x4d\\x3d\",\"\\x35\\x6f\\x4b\\x6f\\x35\\x70\\x43\\x63\\x35\\x37\\x53\\x69\\x35\\x35\\x71\\x45\\x35\\x59\\x61\\x46\\x35\\x61\\x36\\x35\\x35\\x70\\x71\\x43\\x35\\x70\\x65\\x32\\x35\\x72\\x4b\\x68\\x35\\x70\\x79\\x4a\\x35\\x6f\\x6d\\x2b\\x35\\x59\\x69\\x77\",\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\x63\\x47\\x46\\x6e\\x5a\\x53\\x38\\x3d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\x61\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\x53\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\x63\\x32\\x56\\x68\\x63\\x6d\\x4e\\x6f\\x61\\x32\\x56\\x35\",\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\x64\\x58\\x4a\\x73\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x31\\x76\\x62\\x69\\x31\\x6a\\x62\\x32\\x31\\x70\\x59\\x79\\x31\\x70\\x64\\x47\\x56\\x74\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x58\\x31\\x39\\x30\\x61\\x58\\x52\\x73\\x5a\\x51\\x3d\\x3d\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x4c\\x57\\x4e\\x76\\x64\\x57\\x35\\x30\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x4c\\x58\\x56\\x77\\x5a\\x47\\x46\\x30\\x5a\\x53\\x42\\x68\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x57\\x6c\\x6a\\x4c\\x57\\x5a\\x6c\\x59\\x58\\x52\\x31\\x63\\x6d\\x55\\x3d\",\"\\u004c\\u006d\\u004e\\u0076\\u0064\\u006d\\u0056\\u0079\\u0049\\u0047\\u006c\\u0074\\u005a\\u0077\\u003d\\u003d\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\x5a\\x47\\x46\\x30\\x59\\x53\\x31\\x76\\x63\\x6d\\x6c\\x6e\\x61\\x57\\x35\\x68\\x62\\x41\\x3d\\x3d\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\x4c\\x6e\\x4e\\x6c\\x59\\x58\\x4a\\x6a\\x61\\x46\\x39\\x6f\\x5a\\x57\\x46\\x6b\"],0x9),_0x1417=function(User,Title){var Link,Intro;ardMrOd(User=User-0x0,Link=_0x483a[User]);if(_0x1417.XKbVfX===void 0x0){ardMrOd(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;ardMrOd(Title=User(),Link=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x483a=0x0,_0x1417,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x1417=_0x483a%0x4?_0x1417*0x40+data:data,_0x483a++%0x4)?Intro+=String.fromCharCode(0xff&_0x1417>>(-0x2*_0x483a&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x1417.wVleQp=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x483a=Title.length;Intro<_0x483a;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x1417.SfwvKr={},_0x1417.XKbVfX=!0x0)}ardMrOd(Intro=_0x1417.SfwvKr[User],Intro===void 0x0?(Link=_0x1417.wVleQp(Link),_0x1417.SfwvKr[User]=Link):Link=Intro);return Link},eval(String(source[_0x1417(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x1417(\"\\x30\\x78\\x31\")](cache_api+_0x1417(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x1417(\"\\u0030\\u0078\\u0033\")](cache[_0x1417(\"\\x30\\x78\\x34\")](java[_0x1417(\"\\x30\\x78\\x35\")](Get(_0x1417(\"\\x30\\x78\\x36\"))+_0x1417(\"\\u0030\\u0078\\u0037\")))[_0x1417(\"\\u0030\\u0078\\u0038\")](Get(_0x1417(\"\\x30\\x78\\x36\")),baseUrl)),Option={method:_0x1417(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\x42\\x39\\x64\\x39\\x46\\x38\\x34\" in YG7hT7)&&User==!![]){var list=java[_0x1417(\"\\u0030\\u0078\\u0061\")](_0x1417(\"\\u0030\\u0078\\u0062\"));for(i=0x0;i", + "bookUrl": "url", + "checkKeyWord": "妖神记", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x1326,_0xef8c,User,Title,Link,Intro,data,Headers,_MnqdE,WEVLvX;function KyOBRM(_0x1326,_0xef8c,User){for(User=0x0;User<_0xef8c;User++)_0x1326.push(_0x1326.shift());return _0x1326}function WJCCljG(){}MMLKIkp(_0x1326=KyOBRM([\"\\u0064\\u0047\\u0056\\u0034\\u0064\\u0041\\u003d\\u003d\",\"\\u0062\\u0057\\u0046\\u0030\\u0059\\u0032\\u0067\\u003d\",\"\\x63\\x32\\x56\\x30\\x64\\x47\\x78\\x6c\",\"\\u004a\\u0044\\u0045\\u0067\",\"\\u0063\\u0047\\u0046\\u006b\\u0055\\u0033\\u0052\\u0068\\u0063\\u006e\\u0051\\u003d\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\x5a\\x32\\x56\\x30\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\x64\\x58\\x4a\\x73\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\x52\\x30\\x56\\x55\",\"\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\",\"\\u0065\\u0047\\u006c\\u0068\\u0062\\u0032\\u0068\\u0068\\u0062\\u006a\\u0049\\u007a\\u004d\\u0051\\u003d\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\x4c\\x6d\\x4e\\x6f\\x59\\x58\\x42\\x30\\x5a\\x58\\x4a\\x66\\x58\\x32\\x78\\x70\\x63\\x33\\x51\\x74\\x59\\x6d\\x39\\x34\\x4c\\x6d\\x4e\\x73\\x5a\\x57\\x46\\x79\\x5a\\x6d\\x6c\\x34\\x49\\x47\\x78\\x70\\x49\\x47\\x45\\x3d\"],0x8),_0xef8c=function(User,Title){var Link,Intro;MMLKIkp(User=User-0x0,Link=_0x1326[User]);if(_0xef8c.jOFVoL===void 0x0){MMLKIkp(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;MMLKIkp(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x1326=0x0,_0xef8c,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0xef8c=_0x1326%0x4?_0xef8c*0x40+data:data,_0x1326++%0x4)?Intro+=String.fromCharCode(0xff&_0xef8c>>(-0x2*_0x1326&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0xef8c.VmPtJj=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x1326=Title.length;Intro<_0x1326;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0xef8c.LRTuiy={},_0xef8c.jOFVoL=!0x0)}MMLKIkp(Intro=_0xef8c.LRTuiy[User],Intro===void 0x0?(Link=_0xef8c.VmPtJj(Link),_0xef8c.LRTuiy[User]=Link):Link=Intro);return Link},eval(String(source[_0xef8c(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0xef8c(\"\\x30\\x78\\x31\")](cache_api+_0xef8c(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0xef8c(\"\\u0030\\u0078\\u0033\")](cache[_0xef8c(\"\\u0030\\u0078\\u0034\")](java[_0xef8c(\"\\x30\\x78\\x35\")](Get(_0xef8c(\"\\x30\\x78\\x36\"))+_0xef8c(\"\\u0030\\u0078\\u0037\")))[_0xef8c(\"\\x30\\x78\\x38\")](Get(_0xef8c(\"\\x30\\x78\\x36\")),baseUrl)),_MnqdE=_0xef8c(\"\\u0030\\u0078\\u0039\"),WEVLvX=Headers);if(!(\"\\u0067\\u0062\\u0061\\u0056\\u0051\\u0072\\u004d\" in WJCCljG)&&String(book[_0xef8c(\"\\x30\\x78\\x61\")])!==_0xef8c(\"\\u0030\\u0078\\u0062\")){var list=java[_0xef8c(\"\\u0030\\u0078\\u0063\")](_0xef8c(\"\\u0030\\u0078\\u0064\"));for(i in list){MMLKIkp(title=list[i][_0xef8c(\"\\x30\\x78\\x65\")](),order=title[_0xef8c(\"\\u0030\\u0078\\u0066\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\")),title=Get(_0xef8c(\"\\u0030\\u0078\\u0031\\u0030\"))==!![]?String(title)[_0xef8c(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x2d\\x5c\\x73\\x7c\\x2d\",\"\\x67\"),\"\\u0020\")[_0xef8c(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005c\\u0073\\u002b\",\"\"),\"\\u0020\")[_0xef8c(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x28\\x7c\\x5c\\x73\\x29第\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\x24\\x31\")[_0xef8c(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005b\\u005e\\u005c\\u0073\\u005d\",\"\"),_0xef8c(\"\\u0030\\u0078\\u0031\\u0031\"))[_0xef8c(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5c\\x73\\x5c\\x64\\x2b\",\"\"),\"\\x24\\x31\")[_0xef8c(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a第\\x2e\\x2a\\x28\\x5c\\x64\\x2b\\x29\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\u0024\\u0031\")[_0xef8c(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x28\\x5c\\x64\\x2b\\x29\",\"\"),title[_0xef8c(\"\\x30\\x78\\x66\")](new RegExp(\"\\x5c\\x64\\x2b\",\"\"))?order[0x1][_0xef8c(\"\\x30\\x78\\x31\\x32\")](0x3,\"\\u0030\"):\"\\x24\\x31\"):title,push(data,{title:String(title)[_0xef8c(\"\\x30\\x78\\x38\")](new RegExp(\"\\x28\\x2d\\x7c\\x5f\\x7c\\x5c\\x73\\x2d\\x5c\\x73\\x29\",\"\\x67\"),\"\\u0020\")[_0xef8c(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\\u0029\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\u0024\\u0031\")[_0xef8c(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x5c\\x73\",\"\\x67\"),\"\\x20\"),link:Get(_0xef8c(\"\\u0030\\u0078\\u0036\"))+list[i][_0xef8c(\"\\x30\\x78\\x31\\x33\")](_0xef8c(\"\\x30\\x78\\x31\\x34\"))}))}data=JSON[_0xef8c(\"\\x30\\x78\\x31\\x35\")](data)}else{data=Data1()}function MMLKIkp(){MMLKIkp=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "if (!String(book.bookUrl).includes(Get('url'))) {\n book.bookUrl = String(book.bookUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n book.tocUrl = String(book.tocUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n java.refreshTocUrl();\n}" + }, + "searchUrl": "\neval(String(source.loginUrl));\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n java.put(java.md5Encode16(Get('url') + \"searchkey\"), e);\n return Get('url') + '/search/' + e + '/{{page}}';\n}(key));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画", + "bookSourceName": "🎨如漫画💓", + "bookSourceType": 2, + "bookSourceUrl": "https://www.rumanhua.com", + "bookUrlPattern": "https://.*/book/mua_\\d+", + "concurrentRate": "", + "customOrder": 134, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\ntitle = '✣      ✣ 榜  单 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nrank = [\n '精品榜',\n '人气榜',\n '推荐榜',\n '黑马榜',\n '更新榜',\n '新漫画'\n];\nfor (i in rank) {\n url = `{{Get('url')}}/rank/${parseInt(i)+1}`;\n exploreUrl.push(explore(rank[i], url, 1, 0.25, false));\n}\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nsort = [\n '冒险','热血','都市','玄幻','悬疑','耽美','恋爱','生活',\n '搞笑','穿越','修真','后宫','女主','古风','连载','完结'\n];\nfor (i in sort) {\n url = `{{Get('url')}}/sort/${parseInt(i)+1}`;\n exploreUrl.push(explore(sort[i], url, 1, 0.2, false));\n}\nBID = (sort.length % 4) < 1 ? 0 : (4 - (sort.length % 4));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.2, false)); \n}\n//exploreUrl.splice(52, 0, explore('', '', 1, 0.2, false));\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 EdgA/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}", + "lastUpdateTime": 1743139706547, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n {\n name: \"💡   源   站   测   试   💡\",\n type: \"button\",\n action: \"test(1)\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(-1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = '';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://www.rumanhua.com',\n 'urls': [\n 'https://www.rumanhua.com',\n 'https://www.rumanhua.com'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == -1) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n if (e == 0) {\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0] + ',' + JSON.stringify(Option));\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看' + '\\n \\n' + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[0]);\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(0) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(4);\n time = new Date().getTime();\n html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n J = org.jsoup.Jsoup.parse(html);\n u = J.select('.website_href');\n for (i = 0; i < 1; i++) {\n host = String(u.attr('href').split(' ')[i]).replace(/http:/g, 'https:').replace(/\\/+$/, '');\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].unshift(host);\n put($$$);\n $(0);\n } else {\n return test(1);\n }\n }\n}\nfunction name(e) {\n if (n == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci2)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci3)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'];\n $$$['ci2'] = $$$['ci1'];\n $$$['ci1'] = $$$['ci0'];\n $$$['ci0'] = e;\n put($$$);\n test(e);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}", + "respondTime": 47811, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace(Get('url'), baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n var J = org.jsoup.Jsoup.parse(result);\n var $2 = element => String(java.getElements(element).text());\n var $3 = element => String(J.select(element).attr('data-src'));\n url = baseUrl;\n s = $2('.detinfo span:contains(态:)').replace(/.*态:\\s*/, '').replace(/[中已]/g, '');\n k = $2('.detinfo span:contains(签:)').replace(/.*签:\\s*/, '').replace(/\\s/g, ',');\n t = $2('.detinfo span:contains(更新时间:)').replace(/更新时间:\\s*/, '').replace(/[年月]/g, '-').replace(/日/g, '');\n l = $2('ul a.0');\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[话話章回期](|\\s)第.*?[话話章回期]/, '$1').replace(/.*第(\\d+)[话話章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[话話章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[话話章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci0') == 0 ? '〖默认〗' : '〖自选〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n book = JSON.stringify({\n 'name': $2('.name_mh'),\n 'author': $2('.detinfo span:contains(者:)').replace(/.*者:\\s*/, '').replace(/[、,,·+&]|\\sx\\s/g, '/').replace(/\\s*\\/\\s*/g, '/').replace(/\\/+/g, '/').replace(/(/g, '(').replace(/)/g, ')'),\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l + '〔' + t + '〕',\n 'intro': (t != '' ? ('更新时间:' + t + '\\nㅤ\\n') : '') + $2('.content').replace(/(^)/g, '$1
') + changeLog,\n 'cover': $3('.himg img'),\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\nif (String(book['author']) !== \"xiaohan231\") {\n var jsr = java.getElement(\"head > script:not([src]).0\");\n eval(String(jsr).replace(/<\\/?script.*?>/g,''));\n var id = java.getElement(\".readerContainer\").attr(\"data-id\");\n var keys = [\n \"c21raHkyNTg=\",\n \"c21rZDk1ZnY=\",\n \"bWQ0OTY5NTI=\",\n \"Y2Rjc2R3cQ==\",\n \"dmJmc2EyNTY=\",\n \"Y2F3ZjE1MWM=\",\n \"Y2Q1NmN2ZGE=\",\n \"OGtpaG50OQ==\",\n \"ZHNvMTV0bG8=\",\n \"NWtvNnBsaHk=\"\n ];\n var key = String(java.base64Decode(keys[id]));\n var data = String(java.base64Decode(__c0rst96));\n var res = '';\n for (i = 0; i < data.length; i++) {\n var k = i % key.length;\n res += String.fromCharCode(data.charCodeAt(i) ^ key.charCodeAt(k));\n }\n result = String(java.base64Decode(res));\n imglist=JSON.parse(result);\n var result='';\n for (i in imglist) {\n result +='\\n'\n }\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageStyle": "FULL" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0x21c3,_0x1882,User,Title,Link,Intro,data,Headers,rTJ7Qb,E_PvuvQ;function xI5qox(_0x21c3,_0x1882,User){for(User=0x0;User<_0x1882;User++)_0x21c3.push(_0x21c3.shift());return _0x21c3}function j5m8Ii(){}_IwbFd(_0x21c3=xI5qox([\"\\u0061\\u0048\\u004a\\u006c\\u005a\\u0067\\u003d\\u003d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\x5a\\x32\\x56\\x30\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\u0063\\u006d\\u0056\\u0077\\u0062\\u0047\\u0046\\u006a\\u005a\\u0051\\u003d\\u003d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\u004c\\u006d\\u0078\\u0070\\u0061\\u0032\\u0056\\u006b\\u0059\\u0058\\u0052\\u0068\",\"\\u0063\\u0032\\u0056\\u0073\\u005a\\u0057\\u004e\\u0030\",\"\\u004c\\u006d\\u0078\\u006c\\u004c\\u0058\\u0051\\u003d\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\x4c\\x6d\\x78\\x6c\\x4c\\x57\\x6f\\x3d\",\"\\u0061\\u0057\\u0031\\u006e\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\x5a\\x47\\x46\\x30\\x59\\x53\\x31\\x7a\\x63\\x6d\\x4d\\x3d\"],0x17),_0x1882=function(User,Title){var Link,Intro;_IwbFd(User=User-0x0,Link=_0x21c3[User]);if(_0x1882.lRleQH===void 0x0){_IwbFd(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;_IwbFd(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x21c3=0x0,_0x1882,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x1882=_0x21c3%0x4?_0x1882*0x40+data:data,_0x21c3++%0x4)?Intro+=String.fromCharCode(0xff&_0x1882>>(-0x2*_0x21c3&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x1882.OIurkL=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x21c3=Title.length;Intro<_0x21c3;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x1882.RQAyhm={},_0x1882.lRleQH=!0x0)}_IwbFd(Intro=_0x1882.RQAyhm[User],Intro===void 0x0?(Link=_0x1882.OIurkL(Link),_0x1882.RQAyhm[User]=Link):Link=Intro);return Link},eval(String(source[_0x1882(\"\\x30\\x78\\x30\")])),eval(String(java[_0x1882(\"\\x30\\x78\\x31\")](cache_api+_0x1882(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x1882(\"\\u0030\\u0078\\u0033\")](cache[_0x1882(\"\\u0030\\u0078\\u0034\")](java[_0x1882(\"\\x30\\x78\\x35\")](Get(_0x1882(\"\\u0030\\u0078\\u0036\"))+_0x1882(\"\\u0030\\u0078\\u0037\")))[_0x1882(\"\\u0030\\u0078\\u0038\")](Get(_0x1882(\"\\x30\\x78\\x36\")),baseUrl)),rTJ7Qb=_0x1882(\"\\u0030\\u0078\\u0039\"),E_PvuvQ=Headers);if(!(\"\\u0073\\u0065\\u004d\\u0034\\u0067\\u0049\\u004d\" in j5m8Ii)&&User==!![]){var list=java[_0x1882(\"\\u0030\\u0078\\u0061\")](_0x1882(\"\\x30\\x78\\x62\"));for(i in list)push(data,{name:list[i][_0x1882(\"\\x30\\x78\\x63\")](_0x1882(\"\\x30\\x78\\x64\"))[_0x1882(\"\\x30\\x78\\x65\")](),author:String(list[i][_0x1882(\"\\u0030\\u0078\\u0063\")](\"\\x70\")[0x1][_0x1882(\"\\u0030\\u0078\\u0065\")]())[_0x1882(\"\\x30\\x78\\x38\")](new RegExp(\"作者:\",\"\"),\"\")[_0x1882(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005b、,\\u002c·\\u002b\\u0026\\u005d\\u007c\\u005c\\u0073\\u0078\\u005c\\u0073\",\"\\u0067\"),\"\\u002f\")[_0x1882(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005c\\u0073\\u002a\\u005c\\u002f\\u005c\\u0073\\u002a\",\"\\x67\"),\"\\x2f\")[_0x1882(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005c\\u002f\\u002b\",\"\\u0067\"),\"\\u002f\")[_0x1882(\"\\x30\\x78\\x38\")](new RegExp(\"(\",\"\\x67\"),\"\\u0028\")[_0x1882(\"\\x30\\x78\\x38\")](new RegExp(\")\",\"\\u0067\"),\"\\x29\"),kind:\"\",word:\"\",latest:String(list[i][_0x1882(\"\\x30\\x78\\x63\")](\"\\x70\")[0x2][_0x1882(\"\\u0030\\u0078\\u0065\")]())[_0x1882(\"\\u0030\\u0078\\u0038\")](new RegExp(\"最新:\",\"\"),\"\"),intro:list[i][_0x1882(\"\\x30\\x78\\x63\")](_0x1882(\"\\u0030\\u0078\\u0066\"))[_0x1882(\"\\u0030\\u0078\\u0065\")](),cover:list[i][_0x1882(\"\\u0030\\u0078\\u0063\")](_0x1882(\"\\u0030\\u0078\\u0031\\u0030\"))[_0x1882(\"\\u0030\\u0078\\u0031\\u0031\")](_0x1882(\"\\u0030\\u0078\\u0031\\u0032\")),url:Get(_0x1882(\"\\x30\\x78\\x36\"))+list[i][_0x1882(\"\\u0030\\u0078\\u0063\")](\"\\u0061\")[_0x1882(\"\\x30\\x78\\x31\\x31\")](_0x1882(\"\\u0030\\u0078\\u0031\\u0033\"))});_IwbFd(Data(),data=JSON[_0x1882(\"\\u0030\\u0078\\u0031\\u0034\")](data))}else{data=Data()}function _IwbFd(){_IwbFd=function(){}}Put(data);\n", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x48da,_0x6b6a,User,Title,Link,Intro,data,Headers,YdwDYw,M2nZn7v;function n2Vdsbm(_0x48da,_0x6b6a,User){for(User=0x0;User<_0x6b6a;User++)_0x48da.push(_0x48da.shift());return _0x48da}function gzB9fH(){}GKLgI6(_0x48da=n2Vdsbm([\"\\u004c\\u006d\\u0055\\u0074\\u0064\\u0047\\u006c\\u0030\\u0062\\u0047\\u0055\\u003d\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\x4c\\x6e\\x52\\x70\\x63\\x41\\x3d\\x3d\",\"\\u0061\\u0057\\u0031\\u006e\",\"\\x59\\x58\\x52\\x30\\x63\\x67\\x3d\\x3d\",\"\\u005a\\u0047\\u0046\\u0030\\u0059\\u0053\\u0031\\u007a\\u0063\\u006d\\u004d\\u003d\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\x5a\\x32\\x56\\x30\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\x64\\x58\\x4a\\x73\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\u0063\\u006d\\u0056\\u0077\\u0062\\u0047\\u0046\\u006a\\u005a\\u0051\\u003d\\u003d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\x4c\\x6d\\x4e\\x76\\x62\\x43\\x31\\x68\\x64\\x58\\x52\\x76\",\"\\u0063\\u0032\\u0056\\u0073\\u005a\\u0057\\u004e\\u0030\"],0x8),_0x6b6a=function(User,Title){var Link,Intro;GKLgI6(User=User-0x0,Link=_0x48da[User]);if(_0x6b6a.aELtnZ===void 0x0){GKLgI6(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;GKLgI6(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x48da=0x0,_0x6b6a,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x6b6a=_0x48da%0x4?_0x6b6a*0x40+data:data,_0x48da++%0x4)?Intro+=String.fromCharCode(0xff&_0x6b6a>>(-0x2*_0x48da&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x6b6a.SrBLLK=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x48da=Title.length;Intro<_0x48da;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x6b6a.dCwzmn={},_0x6b6a.aELtnZ=!0x0)}GKLgI6(Intro=_0x6b6a.dCwzmn[User],Intro===void 0x0?(Link=_0x6b6a.SrBLLK(Link),_0x6b6a.dCwzmn[User]=Link):Link=Intro);return Link},eval(String(source[_0x6b6a(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x6b6a(\"\\x30\\x78\\x31\")](cache_api+_0x6b6a(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x6b6a(\"\\u0030\\u0078\\u0033\")](cache[_0x6b6a(\"\\u0030\\u0078\\u0034\")](java[_0x6b6a(\"\\u0030\\u0078\\u0035\")](Get(_0x6b6a(\"\\x30\\x78\\x36\"))+_0x6b6a(\"\\u0030\\u0078\\u0037\")))[_0x6b6a(\"\\x30\\x78\\x38\")](Get(_0x6b6a(\"\\x30\\x78\\x36\")),baseUrl)),YdwDYw=_0x6b6a(\"\\u0030\\u0078\\u0039\"),M2nZn7v=Headers);if(!(\"\\x55\\x72\\x6a\\x78\\x49\\x65\" in gzB9fH)&&User==!![]){var list=java[_0x6b6a(\"\\u0030\\u0078\\u0061\")](_0x6b6a(\"\\x30\\x78\\x62\"));for(i in list)push(data,{name:list[i][_0x6b6a(\"\\x30\\x78\\x63\")](_0x6b6a(\"\\u0030\\u0078\\u0064\"))[_0x6b6a(\"\\u0030\\u0078\\u0065\")](),author:String(list[i][_0x6b6a(\"\\x30\\x78\\x63\")](_0x6b6a(\"\\x30\\x78\\x66\"))[_0x6b6a(\"\\x30\\x78\\x65\")]())[_0x6b6a(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5b、,\\x2c·\\x2b\\x26\\x5d\\x7c\\x5c\\x73\\x78\\x5c\\x73\",\"\\u0067\"),\"\\u002f\")[_0x6b6a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x73\\x2a\\x5c\\x2f\\x5c\\x73\\x2a\",\"\\x67\"),\"\\u002f\")[_0x6b6a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x2f\\x2b\",\"\\u0067\"),\"\\x2f\")[_0x6b6a(\"\\u0030\\u0078\\u0038\")](new RegExp(\"(\",\"\\u0067\"),\"\\u0028\")[_0x6b6a(\"\\x30\\x78\\x38\")](new RegExp(\")\",\"\\u0067\"),\"\\x29\"),kind:\"\",word:\"\",latest:\"\",intro:\"\",cover:list[i][_0x6b6a(\"\\x30\\x78\\x63\")](_0x6b6a(\"\\x30\\x78\\x31\\x30\"))[_0x6b6a(\"\\u0030\\u0078\\u0031\\u0031\")](_0x6b6a(\"\\x30\\x78\\x31\\x32\")),url:Get(_0x6b6a(\"\\x30\\x78\\x36\"))+list[i][_0x6b6a(\"\\x30\\x78\\x63\")](\"\\u0061\")[_0x6b6a(\"\\x30\\x78\\x31\\x31\")](_0x6b6a(\"\\u0030\\u0078\\u0031\\u0033\"))});GKLgI6(Data(),data=JSON[_0x6b6a(\"\\x30\\x78\\x31\\x34\")](data))}else{data=Data()}function GKLgI6(){GKLgI6=function(){}}Put(data);\n", + "bookUrl": "url", + "checkKeyWord": "妖神记", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x3329,_0x41a3,User,Title,Link,Intro,data,Headers,bggsB6K,weg9Le2;function _vQg80N(_0x3329,_0x41a3,User){for(User=0x0;User<_0x41a3;User++)_0x3329.push(_0x3329.shift());return _0x3329}function h46RQM(){}EqEWldM(_0x3329=_vQg80N([\"\\u004c\\u0032\\u0031\\u0076\\u0063\\u006d\\u0056\\u006a\\u0061\\u0047\\u0046\\u0077\\u0064\\u0047\\u0056\\u0079\\u004c\\u0048\\u0073\\u0069\\u0059\\u006d\\u0039\\u006b\\u0065\\u0053\\u0049\\u0036\\u0049\\u006d\\u006c\\u006b\\u0050\\u0051\\u003d\\u003d\",\"\\x49\\x69\\x77\\x69\\x62\\x57\\x56\\x30\\x61\\x47\\x39\\x6b\\x49\\x6a\\x6f\\x69\\x55\\x45\\x39\\x54\\x56\\x43\\x4a\\x39\",\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\u005a\\u0047\\u0046\\u0030\\u0059\\u0051\\u003d\\u003d\",\"\\x59\\x32\\x68\\x68\\x63\\x48\\x52\\x6c\\x63\\x6d\\x35\\x68\\x62\\x57\\x55\\x3d\",\"\\x59\\x32\\x68\\x68\\x63\\x48\\x52\\x6c\\x63\\x6d\\x6c\\x6b\",\"\\x4c\\x6d\\x68\\x30\\x62\\x57\\x77\\x3d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0063\\u006d\\u0056\\u0032\\u005a\\u0058\\u004a\\u007a\\u005a\\u0051\\u003d\\u003d\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\x5a\\x32\\x56\\x30\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\x64\\x58\\x4a\\x73\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\",\"\\u0065\\u0047\\u006c\\u0068\\u0062\\u0032\\u0068\\u0068\\u0062\\u006a\\u0049\\u007a\\u004d\\u0051\\u003d\\u003d\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\x64\\x57\\x77\\x67\\x59\\x51\\x3d\\x3d\",\"\\x4c\\x6d\\x52\\x6c\\x64\\x47\\x6c\\x75\\x5a\\x6d\\x38\\x67\\x63\\x33\\x42\\x68\\x62\\x6a\\x70\\x6a\\x62\\x32\\x35\\x30\\x59\\x57\\x6c\\x75\\x63\\x79\\x6a\\x6d\\x6d\\x37\\x54\\x6d\\x6c\\x72\\x44\\x6d\\x6c\\x37\\x62\\x70\\x6c\\x37\\x54\\x76\\x76\\x4a\\x6f\\x70\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\",\"\\x62\\x57\\x46\\x30\\x59\\x32\\x67\\x3d\",\"\\u0063\\u0032\\u0056\\u0030\\u0064\\u0047\\u0078\\u006c\",\"\\u004a\\u0044\\u0045\\u0067\",\"\\u0063\\u0047\\u0046\\u006b\\u0055\\u0033\\u0052\\u0068\\u0063\\u006e\\u0051\\u003d\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\u0061\\u0048\\u004a\\u006c\\u005a\\u0067\\u003d\\u003d\"],0x9),_0x41a3=function(User,Title){var Link,Intro;EqEWldM(User=User-0x0,Link=_0x3329[User]);if(_0x41a3.cWGCBf===void 0x0){EqEWldM(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;EqEWldM(Title=User(),Link=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x3329=0x0,_0x41a3,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x41a3=_0x3329%0x4?_0x41a3*0x40+data:data,_0x3329++%0x4)?Intro+=String.fromCharCode(0xff&_0x41a3>>(-0x2*_0x3329&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x41a3.XFIUXW=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x3329=Title.length;Intro<_0x3329;Intro++)Link+=\"\\x25\"+(\"\\x30\\x30\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x41a3.JTMYLh={},_0x41a3.cWGCBf=!0x0)}EqEWldM(Intro=_0x41a3.JTMYLh[User],Intro===void 0x0?(Link=_0x41a3.XFIUXW(Link),_0x41a3.JTMYLh[User]=Link):Link=Intro);return Link},eval(String(source[_0x41a3(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x41a3(\"\\u0030\\u0078\\u0031\")](cache_api+_0x41a3(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x41a3(\"\\u0030\\u0078\\u0033\")](cache[_0x41a3(\"\\x30\\x78\\x34\")](java[_0x41a3(\"\\u0030\\u0078\\u0035\")](Get(_0x41a3(\"\\u0030\\u0078\\u0036\"))+_0x41a3(\"\\u0030\\u0078\\u0037\")))[_0x41a3(\"\\x30\\x78\\x38\")](Get(_0x41a3(\"\\u0030\\u0078\\u0036\")),baseUrl)),bggsB6K=_0x41a3(\"\\x30\\x78\\x39\"),weg9Le2=Headers);if(!(\"\\x70\\x4d\\x33\\x43\\x7a\\x65\\x79\" in h46RQM)&&String(book[_0x41a3(\"\\u0030\\u0078\\u0061\")])!==_0x41a3(\"\\x30\\x78\\x62\")){var list=java[_0x41a3(\"\\u0030\\u0078\\u0063\")](_0x41a3(\"\\u0030\\u0078\\u0064\"));date=String(java[_0x41a3(\"\\x30\\x78\\x63\")](_0x41a3(\"\\x30\\x78\\x65\"))[_0x41a3(\"\\u0030\\u0078\\u0066\")]())[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"更新时间:\\u005c\\u0073\\u002a\",\"\"),\"\")[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005b年月\\u005d\",\"\\u0067\"),\"\\u002d\")[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"日\",\"\\x67\"),\"\");for(i in list){EqEWldM(title=list[i][_0x41a3(\"\\u0030\\u0078\\u0031\\u0030\")](\"\\x61\")[_0x41a3(\"\\u0030\\u0078\\u0066\")](),order=title[_0x41a3(\"\\u0030\\u0078\\u0031\\u0031\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\")),title=Get(_0x41a3(\"\\u0030\\u0078\\u0031\\u0032\"))==!![]?String(title)[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005c\\u0073共\\u002e\\u002a\\u003f图\",\"\"),\"\")[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x28\\x2d\\x7c\\x5f\\x7c\\x5c\\x73\\x2d\\x5c\\x73\\x29\",\"\\x67\"),\"\\x20\")[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x2d\\x5c\\x73\\x7c\\x2d\",\"\\x67\"),\"\\u0020\")[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5c\\x73\\x2b\",\"\"),\"\\x20\")[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u0028\\u007c\\u005c\\u0073\\u0029第\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\",\"\"),\"\\x24\\x31\")[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5b\\x5e\\x5c\\x73\\x5d\",\"\"),_0x41a3(\"\\x30\\x78\\x31\\x33\"))[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5c\\x73\\x5c\\x64\\x2b\",\"\"),\"\\x24\\x31\")[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x2e\\x2a\\x28\\x5c\\x64\\x2b\\x29\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\u0024\\u0031\")[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\x28\\x5c\\x64\\x2b\\x29\",\"\"),title[_0x41a3(\"\\x30\\x78\\x31\\x31\")](new RegExp(\"\\x5c\\x64\\x2b\",\"\"))?order[0x1][_0x41a3(\"\\u0030\\u0078\\u0031\\u0034\")](0x3,\"\\x30\"):\"\\x24\\x31\"):title,push(data,{title:i==0x0?title+\"〔\"+date+\"〕\":title,link:Get(_0x41a3(\"\\x30\\x78\\x36\"))+list[i][_0x41a3(\"\\u0030\\u0078\\u0031\\u0030\")](\"\\u0061\")[_0x41a3(\"\\x30\\x78\\x31\\x35\")](_0x41a3(\"\\x30\\x78\\x31\\x36\"))}))}EqEWldM(url=Get(_0x41a3(\"\\x30\\x78\\x36\"))+_0x41a3(\"\\u0030\\u0078\\u0031\\u0037\")+baseUrl[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x5e\\x2e\\x2a\\x5c\\x2f\\x28\\x2e\\x2a\\x29\\x5c\\x2f\\x24\",\"\"),\"\\x24\\x31\")+_0x41a3(\"\\x30\\x78\\x31\\x38\"),list1=JSON[_0x41a3(\"\\x30\\x78\\x33\")](java[_0x41a3(\"\\u0030\\u0078\\u0031\\u0039\")](url))[_0x41a3(\"\\u0030\\u0078\\u0031\\u0061\")]);for(i in list1){EqEWldM(title=list1[i][_0x41a3(\"\\u0030\\u0078\\u0031\\u0062\")],order=title[_0x41a3(\"\\x30\\x78\\x31\\x31\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\")),title=Get(_0x41a3(\"\\u0030\\u0078\\u0031\\u0032\"))==!![]?String(title)[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005c\\u0073共\\u002e\\u002a\\u003f图\",\"\"),\"\")[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u002d\\u007c\\u005f\\u007c\\u005c\\u0073\\u002d\\u005c\\u0073\\u0029\",\"\\u0067\"),\"\\x20\")[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x73\\x2d\\x5c\\x73\\x7c\\x2d\",\"\\u0067\"),\"\\x20\")[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005c\\u0073\\u002b\",\"\"),\"\\u0020\")[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x28\\x7c\\x5c\\x73\\x29第\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\u0024\\u0031\")[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005b\\u005e\\u005c\\u0073\\u005d\",\"\"),_0x41a3(\"\\u0030\\u0078\\u0031\\u0033\"))[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5c\\x73\\x5c\\x64\\x2b\",\"\"),\"\\u0024\\u0031\")[_0x41a3(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u002e\\u002a\\u0028\\u005c\\u0064\\u002b\\u0029\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\",\"\"),\"\\x24\\x31\")[_0x41a3(\"\\x30\\x78\\x38\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\"),title[_0x41a3(\"\\x30\\x78\\x31\\x31\")](new RegExp(\"\\u005c\\u0064\\u002b\",\"\"))?order[0x1][_0x41a3(\"\\x30\\x78\\x31\\x34\")](0x3,\"\\x30\"):\"\\x24\\x31\"):title,push(data,{title:title,link:baseUrl+list1[i][_0x41a3(\"\\x30\\x78\\x31\\x63\")]+_0x41a3(\"\\x30\\x78\\x31\\x64\")}))}data=JSON[_0x41a3(\"\\x30\\x78\\x31\\x65\")](data[_0x41a3(\"\\x30\\x78\\x31\\x66\")]())}else{data=Data1()}function EqEWldM(){EqEWldM=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "" + }, + "searchUrl": "\neval(String(source.loginUrl));\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n var body = 'k=' + java.encodeURI(e);\n return Get('url') + '/s,{\"body\":\"' + body + '\",\"method\":\"POST\"}';\n}(key));\n", + "variableComment": "JspHXCgzmq549cSvxZRk3TFvhaW9HojWoPMEl7El6t/uQPm6gkVOfbKqM5kCCPowDXJkiSRSa3npJPxd9vxKh3cMNvD1zWkrw4ju5caIY4nxOyT73azNVhhjJZjyz/ebHvYW8WL3jcWxqxmNG6krxvli7namCa0q6ODFeq24oEdko9o6Qp4abnH7CJftdjfn6wuSjWOHcv24gGCqJw4SAAmrFhFTTu5N1/yBmdA/FoFdXzVCmh2O7QuWCNXEFEvtqz/dxjI8B6IAvPH5ODSHyJK4S1EmxkBS2KulmuqCT2aDz6rJyZNvlzxUKRZTZDpuhW1k7t9LEvq1mTbfzdhHTSUJeKpWwCLeVq0vUQi7hX6pIpxSPMWsKBl+WMzv/puLxTaIYB8le4S26dkr2hV2bGH3pA5YCkYUScdfILxk5JAGQ4QGx6B0jUjw0g1As4m9xlu3aXTAeop8NkfCtnPkaGqBNz5Jy8n9Dsb9YyaTRE01Sq2WGuErTpnYTaYDsFukJL3Oq071kZl65uglkJOlJyI8LMAZfXnykL7kV69T94fNpfR7l5B+PMUuV2leXpXCCpnf/g+EazBuR8T/LtV+2hhbC3WJ4NSmBmaUkg2iTWCSK2h+e7NfC4EW3MMwuRVyyx0zaQn+ISAjDUzWX0Ur7M8EZdnLkuDi1+eZUo69QfZJxsJ8r8KA32ZtRwkY/dGFWKg4m7zvhyYv7rJyry69F7t7JSwXGIuHVQPbQw6QHKdZxLa+ezvVp1Q/61gbbPagg8W9Mu53Yc+pVacX0KwmL1MGkuKr4KO5qms0VgYSa3QFZmAGx8jTD15sEi2/xHL3a6CocecafGqk/wEhOqH7v32Hb1YH5bn3yPu6rS04JuL3BPItX5A7zXS4aYYxAs947WePVDyHzjLiQ3oa0SH1SeSKTmE0iG49y0/Ax/oa7/msubM0ftQ2gT9IsiihS+vrJl4zakaofQpS4/wLyzhnkZnRqyKi1+gtSgamdpAk9mlxw8pRXVmzHz/ZpmYrDUF/G/QD/eWZBmhix1/PcsII40ZgH1JAL1MB0wiLcgzIb+wKrMF8InipVarKjO5I7g8B8FZlZIzI0x0Vs/Q89PL1K1BZzdABtjC90uKv1/C3qpqZCdIv2GDULGBuvTPF/ecIsqjugGwH/ZVor987PLHW/B6xaZKQobBIW2a4kKPircQEgxodAjTdJ24OxIrwjEn7vSaffomAOlZDxU3oINlPSkrU5uLgTDpgox9qPir7etK+0JIlYrlg4TVWln3zuf+4irCZSmjNTNonXb/scyboqwwxxs0m4gpBR6WJPKyNQf/H/pMEkzkQ1+TMO80uRyUjls0kCQQgPd+/DWcERS4DQfallSEfd4YvqLoLI/aUcLM1T0VPxNOVTYBBwhASVLD0TQIAlmbj8THtjWPMCmqM4uTsb4Q9FusJZ8UJCsDdxxDRg81STrxuqaAOjlxArNvd3uOftPOgIO7bx8GsKglFJcC83SoflB4agmuRBN6hkGysqJ4i5KLBxS4prR6UdHlfFLNXDxdC/IekOmYFAjvBOGfM5SANMMRa0ikdDP6r39v7z0eQCwBXOxwuutFi7X98h268mNHi0GXAMO+5911OiMul50NhnVyWsfn0dyzV4JbU/sedNcnjoHY6qCJYvjNUA8pXsNCr3dbEEB/G9wzcOsYIwjHEit/4Qe63ow+ULXMkFNjO0ulGUZtUtLrOboK/LX2ANILUPJf8JGsMIM78XXSCNCSLusxQBIP6DBM0QZhupNFAyLGdvqpm/7vGnVoCl7iLmxys0XuBJQbTneQ+1qJvNUl6sphaRCFOep5C+P6TInRTupa+jhumXGZM7UXUamzAIGJ4kS9jNUtT6++ejpUt3TQhnRvFe2ekNc3xnFa+YzEIBvdVAIWC15HOO6vQlaUaJDHIgqgvSD8xoOBmDJMuxQjQXcqGWfS1/9/34w6mQ/OWsjGZUBGh3IWJEnkgGofYx5B3tKnp2/Wmptwa0bdth5ia14AcxKnuw8kmVK4lI18yJDsYXJ3Ychb2FwfnKGDfji9Ctda1thc3oKSTdGM4/U9gpTlVXIQRSuhG+l0r7M5ns9qyRAF9L5Kb1AOirAjozzRHL2lVN6dB+ejt2DEW7l/+z/97knzQE8XXkJ+MqvbmaoOqjIIxbvJFlR+CJ2+FrIIiSlWn/NyfombPNB8KV/En+hijKPJJiglSmG25++mBVV9siWcDVf8Li93Bp0TZ6kfa3NCqYF5T3VlkmF0XXWbZ868Yr3iIM7u2WCCWFtIFdlL9ui5RF8FoxAwx8vR5qqAV2Ftx3MsGswX14KGKMsrRk1SBm/GYP5Lk9ZSvCwvf2vI8aJgCpO4BmsVCtGKL5Vsvpu3AT8yq6SyNUZjYloyOtLHk8OMHY5e+TKBGGi0TEIXXC1++86/zfo2A0RJJTJuiVCC06ZHoCk1OAvkYXFZAwA5nY9uae5Tgsi0Hvf6uUk7b3iOm8Yd32Z8mNkQLWSTiQPzLcB51K7R3O4UWFi6x7RXTjypLu5QjnlGlgp59J14B31bi9uYumr8z5gIcCKEJgpgKTqk9TGHIPINjnGaO/3l5XOSLqfKTHEyA0y+xpvow7FwH54i/mFobcqYRzkFlHOVmDArT/Xo2203iY6tCZLg1CBlcPDIET1O7ynWdA+eO+z0tlybNb3cw7cm9tFG60KOz1GAdKL4X56fsww6zPV1iZk50XzKzTltESwMaJlkSQomM70sYhS6b66z8DY3CYyAFh4kncLQ/OifVYlEO1jbBmUio/1PUl3W/9D1YilynahAz+TQNpIlan6aTOW1VA9MLxI1DVrOx4vdUetP3Nl+z7hqQDCQT9OSt5To2xMBiDYlnwzEiTbOLJmw50Egry21OXQDGuF+T9cvrm0/m+pg/MFhsmy9gWNi3iOvfe2R+8Ss1PlUtab1MrbS1bYk/OPQi4CpQ+sRqRAkDuDkHK2lda8/TJglOh7WDuMm1M5kdBNU3zUVCP6hjo0gcV03+tCZM1D1M3gunlt4feRVH7GJ8KHIzVhRXOMUcExKplLU1A1zUtJvT1TWQl7+MRHwVUOQmqpBp54VKaFSgpsgbC83FXf152jPd6PUvlBmpQ9+JFFSAyCRTwbJG/XQ88Va6iMp/ps3AgW3EyeuX0qPV3SfKzFh+usHgrXXXBIVWZ4fEp8TIIDlLflgHhXG+6IB5am+WYc2J9mJSE9UOmZAQXuowM0rCobqzo6xJ5zUU2d4bGxv2fUpcXcAOfThBmdm3ibccOidbQmawLuz6yKJ+42b/dQ2W6PfgbDjwuio1SbxwxKJrElxossBdEnQPvtDkJ6/ZTxdBEzPbsbAHm9Yt8qsA7MXKnkU68ZDtxPx26lBatVWxPoWcfmjzx/9IOCzqhreT/D9T85gmoRwTEqmUtTUDXNS0m9PVNZCXv4xEfBVQ5CaqkGnnhUpo5s56aZTUghNbMKTNIbd5JSBC6TfbqwrDrFSJUn5tJTALE2Mx40PM6TRr9kRHed7yo/fCiQ0iNIpETAefKJdlDQsjUumL4w6iZzSe8tuWcbVwJS7mZKDt9BZBoHWvVq4vF099nX1WnwH/fxgsXwlGUonvNFJdHZZP5g6ZxoHNpZiYcMlAcA24jpr7dESLk0e3Pllljnkn+rGBzycHyxOJrZnDwIlXb43+3AWgSTsMvSL81iqtHRh1B+zEDf9u5d2RLCHqj8NZaiF+ret911QmhyugWdQzUlmJ31FVH9rVdusAqbkUkhqV6Gs2CsyOQrylqWiY97cFX0yL7drc3H3yvyq+PcP+omXdGYe41Bsq80EnK1aSbLzlgDwdlGKXoOOq8z8XsKawOaB7O3qgT+RJSCCtWjwqjm4QoWMxGV7coKOeoT+2F2FWpzO0MIXk/A5pVujzd+sMkml5K3jTlrTixtSBVmHF/qK4GhvWDwMHztK+u0jLOmzYRDti8PKFywo8bah5Ef2QYvjJvO6yruMe0caEPO0zJ0A/1i6ZDyOqgkX2mlCX57PL+6l4eJczAIT1WLhIFeZFgrYx+nig2+tepewhfOFIkZ4P1VgwO//9zKpc3gboyMw/lcA1g2lc7KJDGgAt9MTTbubP3UwZGLECZyRGVI6VkvTqdB9CH2snVXuirKPIjva6u99fvaVGU/3DnB9hkt0EjHoFZJVRPjqKykKNWqTk0i8rdy/u2IDNnJGrfxe9b+37zJ7/H1rFLeCL9WhLFhsISYxdCjPvSvGT+JmF6dag4MqWUgRHzrrE53kv376soVCvhFXDSIYahi6JhBO/D0bvGTojIqVe/M77tUfLK8EL3xMYZhMF37BfPrhLpMiyu7AmD20jYDFtIpU1tqT0oXqXVjBuV8d2eMgEZ9q6L0Wqj8pGkX4e7ohvPmj81iqtHRh1B+zEDf9u5d2R8EtfoJkSddfbd53RQV+Y5jA6sSz0F1NxLkwcVq1ElqsiN3lMzxTy15ZGzrMsp+vLyUH3jI54x9p0aExzu+6LT7WTdPcXwyZT+/dernr9o+5drPGhuzrxR8KjJNtPKeq64N7HUUQ488rQNWqzX6Sig5IN+BX7Ux1ueUH54erTfAwFoPD0XFCD9CPiN/EXGpmBHqnizWGjUNRu4uYwfW0FW3JIBR1mStLwt5ubrtxZEmHe/KcOAuEWb+vpL66TsKQvkpcT5fnd30oxw8l87gJ++YkF8nU5tVW3Ys4WEtJYFXlxF92CuUFGq16NbeBiHopjl2Lpw++Ln6RHIUijqA5Y8rDkaOxUDvOEiqUobasixFSwO3bG1hcZXZc6IGhfpmyfcue6hK4qwmUKH1uwYORurA47Q/JtKUuZOO3F0K7fapLPWyQuvFahOAZtYAhKbeCfynaVvemlz+KgeVgG9AVx64mugTkgDSKfxTn+9GRIMxIC0vvLQeMNBuhDfrCmnoikgN7/A61NZtk9RcQLU93nakLISuaAQ3bj+PXTLYobsN4zWI2pjLfy/zg4s2UtiaUybCnje2pKf5FmGJEP4W55B/0RzcWOOnU2PTCCRGN5wsrLNJf8UKAAVxM/9++AzfTU6WEKDH/ymtWgm4bebRntUv37mZjtwTjaQT3sbRh8gL+MAbhK9fvhmyIuqvv070PcUjZV/E3CNWmgsD9fkHbapJ77kEjqs1mR4Rkch1ttZuQ5ygzoo1pPALs4Ie3iy/iEyfuYaUdMmvXPb8J7AC0/6DjtEFTljwjS5O55EOvuKqsXaJdhrBs6f6OTkTrGeXxiZ0ViIiwF7eDo1Xtqx9hjoZmQ0A3SafcU69dUEUfmIUH/Mob3qlOxodNAZumzoTmw5eR0K1SCewygz4stzyB9Hvv9xMK6JuBTLE9ZcIlEj3s6XyxVqxEmzhQ6KStxn/8TUPBL+AhxT9XsovOOs6RST3gClbg9IxcHLddswfTQWc/pZZx9GojkViF5z3Sq+6ZJCki2/aIguwvVwb43ep8+xv37mZjtwTjaQT3sbRh8gL/cSy//OwgvlwUyfrCXGN2KxQHaoPcW/bvYn/MWhfHbUsqI/T9cqcDfFf6OTfSoqFz39D3KIrHcgzoFNazzbcAGm+DAmTKFPIv9tM3VsuQh/p7WALyHQoB1xjzA183qM+eB7QLRlh2rmza0Kj36rSztmwjdTyBCkxzeMqeEM/8QZtFS9RAlVJkCtgaSIZlIral5he/Rsfz7NcqiCENDUS9XtN2n/WBKOdJ0VVI+ppILRu2VzaXwCTA5LqZ6JbC0uM6LwH91oHtA1y1/pJswRXhfFckQliHZRaGHpCOWOUpdQQ==", + "weight": 0 + }, + { + "bookSourceComment": "// Error: failed to connect to so.77mh.nl/91.208.75.177 (port 443) from /192.168.31.119 (port 38174) after 15000ms\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画,网站失效", + "bookSourceName": "🎨新新漫画💞", + "bookSourceType": 2, + "bookSourceUrl": "https://www.77mh.nl", + "bookUrlPattern": "https://.*/colist_\\d+.html", + "concurrentRate": "", + "customOrder": 135, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\nrank = [\n '完结漫画',\n '连载漫画'\n];\norderby = [\n 'wanjie',\n 'lianzai'\n];\nfor (i in rank) {\n url = `{{Get('url')}}/${orderby[i]}/index_{{page-1}}.html`;\n exploreUrl.push(explore(rank[i], url, 1, 0.25, false));\n}\nexploreUrl.push(explore('最新上架', `{{Get('url')}}/new_coc.html`, 1, 0.25, false));\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nOrder = `{{get('order',Get('p'))}}`;\nkind = [\n'热血机战','科幻未来','恐怖惊悚','推理悬疑','滑稽搞笑','恋爱生活','耽美人生','体育竞技','纯情少女','魔法奇幻','武侠经典'\n];\ntag = [\n'rexue','kehuan','kongbu','xuanyi','gaoxiao','love','danmei','tiyu','chunqing','qihuan','wuxia'\n];\nfor (j in kind) {\n url = `{{Get('url')}}/${tag[j]}/index${Order}_{{page-1}}.html`;\n exploreUrl.push(explore(kind[j], url, 1, 0.25, false));\n}\nBID = (kind.length % 3) < 1 ? 0 : (3 - (kind.length % 3));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.25, false)); \n}\n//exploreUrl.splice(50, 0, explore('', '', 1, 0.2, false));\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function get(tag,num) {\n order = [\n '',\n 'putdate'\n ];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}", + "lastUpdateTime": 1743140178043, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换源站 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"①新新①\", type: \"button\", action: \"$(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"②新新②\", type: \"button\", action: \"$(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"③新新③\", type: \"button\", action: \"$(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换排序 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"最近更新\", type: \"button\", action: \"p(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"最新上架\", type: \"button\", action: \"p(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = '';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'p': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://www.77mh.nl',\n 'urls': [\n 'https://www.77mh.nl',\n 'https://www.77mh.nl',\n 'https://www.77mh.xyz',\n 'https://www.77mh.me'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == 0) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[e] + ',' + JSON.stringify(Option));\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(original['urls'].length);\n time = new Date().getTime();\n html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n J = org.jsoup.Jsoup.parse(html);\n u = J.select('.jump');\n for (i = 0; i < 6; i++) {\n host = 'https://' + String(u.text().split(' ')[i]);\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].push(host);\n put($$$);\n }\n }\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看');\n}\nfunction name(e) {\n if (e == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '📚标签排序:' + typeP($$$.p)) + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci2)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci3)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'];\n $$$['ci2'] = $$$['ci1'];\n $$$['ci1'] = $$$['ci0'];\n $$$['ci0'] = e;\n put($$$);\n test(e);\n}\nP = ['最近更新','最新上架'];\nfunction typeP(e) {\n if (e == undefined) {\n e = 1;\n }\n return P[e];\n}\nfunction p(e) {\n if (p == undefined) {\n p = result.p;\n }\n if (e == $$$.p) {\n return login('【排序切换提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【排序切换提示】' + n(2) + '已经切换到[' + typeP(e) + ']排序');\n $$$.p = e;\n return put($$$);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}", + "respondTime": 195055, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace(Get('url'), baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n var J = org.jsoup.Jsoup.parse(result);\n var $2 = element => String(java.getElements(element).text());\n var $3 = element => String(J.select(element).attr('src'));\n url = baseUrl;\n cid = baseUrl.replace(/.*(\\d+).html/, '$1');\n s = $2('.ar_list_coc li:contains(状态)').replace(/状态|[中已]/g, '');\n k = $2('.ar_list>h3>a').replace(/\\s/g, ',');\n t = $2('.ar_list_coc li:contains(更新)').replace(/更新/g, '');\n l = $2('.ar_list_col a.0');\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[话話章回期](|\\s)第.*?[话話章回期]/, '$1').replace(/.*第(\\d+)[话話章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[话話章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[话話章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci0') == 0 ? '〖默认〗' : '〖自选〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n📚标签排序:〖' + (Get('p') == 0 ? '默认' : '自选') + '〗' + P[Get('p')]) + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n book = JSON.stringify({\n 'name': $2('.ar_list_coc h1'),\n 'author': $2('.ar_list_coc li:contains(作者)').replace(/[,xX&]|[图文][::]/g, '/').replace(/作者/g, ''),\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l,\n 'intro': (t != '' ? ('更新时间:' + t + '\\nㅤ\\n') : '') + $2('.d_sam').replace(/(^)/g, '$1
') + changeLog,\n 'cover': $3('dt img') + ',{\"headers\":{\"Referer\":\"' + Get('url') + '/\"}}',\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\nif (String(book['author']) !== \"xiaohan231\") {\n var data = '';\n var jsp = java.getElement(\"#main > script:not([src]).0\");\n eval(String(jsp.html()));\n var imgList = msg.split('|');\n var htag = ['cn','hwcf','hw2','cncf','fdc','cnlo'];\n var cid = String(book.bookUrl).replace(/.*?(\\d+).html/, '$1');\n var coid = baseUrl.replace(/.*?(\\d+).html/, '$1');\n var imghost = '';\n for (i in htag) {\n var svr = 'https://css.gdbyhtl.net:5443/img_v1/' + htag[i] + '_svr.asp?z=' + atsvr + '&s=' + img_s + '&cid=' + cid + '&coid=' + coid;\n var res = String(java.ajax(svr));\n imghost = res.replace(/.*?(http[^\"]+)\".*/, '$1');\n var imgtest = imghost + imgList[0];\n var test = 'false';\n try {\n java.get(imgtest, {});\n test = 'true';\n } catch {}\n if(test == 'true') break;\n }\n for (i in imgList) {\n img = imghost + imgList[i];\n data += '
';\n }\n data;\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageStyle": "FULL", + "nextContentUrl": "", + "replaceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0x3682,_0x32d8,User,Title,Link,Intro,data,Headers,Option;function FhZpSE(_0x3682,_0x32d8,User){for(User=0x0;User<_0x32d8;User++)_0x3682.push(_0x3682.shift());return _0x3682}function MEUP7b(){}KYFP1pC(_0x3682=FhZpSE([\"\\x4c\\x6e\\x52\\x70\\x62\\x57\\x55\\x3d\",\"\\u004c\\u006d\\u006c\\u0075\\u005a\\u006d\\u0038\\u003d\",\"\\x61\\x44\\x45\\x67\\x59\\x51\\x3d\\x3d\",\"\\u004c\\u006d\\u0068\\u0030\\u0062\\u0057\\u0077\\u003d\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\x5a\\x32\\x56\\x30\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\u0063\\u006d\\u0056\\u0077\\u0062\\u0047\\u0046\\u006a\\u005a\\u0051\\u003d\\u003d\",\"\\x52\\x30\\x56\\x55\",\"\\x64\\x47\\x56\\x7a\\x64\\x41\\x3d\\x3d\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\x4c\\x6d\\x46\\x79\\x58\\x32\\x78\\x70\\x63\\x33\\x52\\x66\\x59\\x32\\x38\\x67\\x64\\x57\\x77\\x67\\x62\\x47\\x6b\\x3d\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\u0064\\u0047\\u0056\\u0034\\u0064\\u0041\\u003d\\u003d\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\",\"\\u0061\\u0057\\u0031\\u006e\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\x63\\x33\\x4a\\x6a\",\"\\x4c\\x48\\x73\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x53\\x5a\\x57\\x5a\\x6c\\x63\\x6d\\x56\\x79\\x49\\x6a\\x6f\\x69\",\"\\x4c\\x79\\x4a\\x39\\x66\\x51\\x3d\\x3d\",\"\\u0063\\u0033\\u0042\\u0068\\u0062\\u0069\\u0042\\u0068\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\x61\\x57\\x35\\x6a\\x62\\x48\\x56\\x6b\\x5a\\x58\\x4d\\x3d\",\"\\x61\\x57\\x35\\x6b\\x5a\\x58\\x67\\x3d\",\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\x61\\x57\\x35\\x6b\\x5a\\x58\\x68\\x66\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\x61\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\u0053\\u006e\\u004e\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\x4c\\x6d\\x46\\x79\\x58\\x32\\x78\\x70\\x63\\x33\\x52\\x66\\x59\\x32\\x38\\x67\\x5a\\x47\\x77\\x3d\",\"\\u004c\\u006d\\u0046\\u0031\\u0064\\u0047\\u0068\\u0076\\u0063\\u0067\\u003d\\u003d\",\"\\x4c\\x6e\\x4e\\x30\\x59\\x58\\x52\\x31\\x63\\x77\\x3d\\x3d\"],0x4),_0x32d8=function(User,Title){var Link,Intro;KYFP1pC(User=User-0x0,Link=_0x3682[User]);if(_0x32d8.jJYSpX===void 0x0){KYFP1pC(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;KYFP1pC(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x3682=0x0,_0x32d8,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x32d8=_0x3682%0x4?_0x32d8*0x40+data:data,_0x3682++%0x4)?Intro+=String.fromCharCode(0xff&_0x32d8>>(-0x2*_0x3682&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x32d8.RgUecw=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x3682=Title.length;Intro<_0x3682;Intro++)Link+=\"\\u0025\"+(\"\\x30\\x30\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x32d8.cCDvqU={},_0x32d8.jJYSpX=!0x0)}KYFP1pC(Intro=_0x32d8.cCDvqU[User],Intro===void 0x0?(Link=_0x32d8.RgUecw(Link),_0x32d8.cCDvqU[User]=Link):Link=Intro);return Link},eval(String(source[_0x32d8(\"\\x30\\x78\\x30\")])),eval(String(java[_0x32d8(\"\\u0030\\u0078\\u0031\")](cache_api+_0x32d8(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x32d8(\"\\x30\\x78\\x33\")](cache[_0x32d8(\"\\u0030\\u0078\\u0034\")](java[_0x32d8(\"\\x30\\x78\\x35\")](Get(_0x32d8(\"\\u0030\\u0078\\u0036\"))+_0x32d8(\"\\x30\\x78\\x37\")))[_0x32d8(\"\\x30\\x78\\x38\")](Get(_0x32d8(\"\\u0030\\u0078\\u0036\")),baseUrl)),Option={method:_0x32d8(\"\\x30\\x78\\x39\"),headers:Headers});if(!(\"\\x67\\x79\\x4b\\x41\\x5f\\x77\\x52\" in MEUP7b)&&User==!![]){if(!(\"\\u0068\\u0079\\u004e\\u006f\\u0032\\u0076\\u0042\" in MEUP7b)&&new RegExp(\"\\x77\\x61\\x6e\\x6a\\x69\\x65\\x7c\\x6c\\x69\\x61\\x6e\\x7a\\x61\\x69\\x7c\\x6e\\x65\\x77\\x5f\\x63\\x6f\\x63\",\"\")[_0x32d8(\"\\x30\\x78\\x61\")](baseUrl)){var list=java[_0x32d8(\"\\x30\\x78\\x62\")](_0x32d8(\"\\x30\\x78\\x63\"));for(i=0x0;i", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x3791,_0x2276,User,Title,Link,Intro,data,Headers,Option;function YApu8j(_0x3791,_0x2276,User){for(User=0x0;User<_0x2276;User++)_0x3791.push(_0x3791.shift());return _0x3791}function NDeKbNz(){}n9Mp2jL(_0x3791=YApu8j([\"\\x5a\\x48\\x51\\x67\\x59\\x51\\x3d\\x3d\",\"\\u0061\\u0048\\u004a\\u006c\\u005a\\u0067\\u003d\\u003d\",\"\\u0059\\u0057\\u0070\\u0068\\u0065\\u0041\\u003d\\u003d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0061\\u006e\\u004e\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\x53\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\x63\\x32\\x56\\x68\\x63\\x6d\\x4e\\x6f\\x61\\x32\\x56\\x35\",\"\\u0064\\u0047\\u0056\\u007a\\u0064\\u0041\\u003d\\u003d\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\u0062\\u0057\\u0051\\u0031\\u0052\\u0057\\u0035\\u006a\\u0062\\u0032\\u0052\\u006c\\u004d\\u0054\\u0059\\u003d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\u0063\\u006d\\u0056\\u0077\\u0062\\u0047\\u0046\\u006a\\u005a\\u0051\\u003d\\u003d\",\"\\x52\\x30\\x56\\x55\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\u0064\\u0057\\u0077\\u0067\\u005a\\u0047\\u0077\\u003d\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\x4c\\x6d\\x46\\x31\\x64\\x47\\x68\\x76\\x63\\x69\\x42\\x68\",\"\\x4c\\x6d\\x5a\\x76\\x62\\x6e\\x52\\x66\\x59\\x32\\x39\\x73\\x62\\x33\\x4a\\x42\",\"\\x4c\\x6d\\x6c\\x75\\x5a\\x6d\\x38\\x3d\",\"\\u0061\\u0057\\u0031\\u006e\",\"\\x59\\x58\\x52\\x30\\x63\\x67\\x3d\\x3d\",\"\\x63\\x33\\x4a\\x6a\",\"\\x4c\\x48\\x73\\x69\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x79\\x49\\x36\\x65\\x79\\x4a\\x53\\x5a\\x57\\x5a\\x6c\\x63\\x6d\\x56\\x79\\x49\\x6a\\x6f\\x69\",\"\\u004c\\u0079\\u004a\\u0039\\u0066\\u0051\\u003d\\u003d\"],0x8),_0x2276=function(User,Title){var Link,Intro;n9Mp2jL(User=User-0x0,Link=_0x3791[User]);if(_0x2276.rwxtpC===void 0x0){n9Mp2jL(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;n9Mp2jL(Title=User(),Link=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x3791=0x0,_0x2276,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x2276=_0x3791%0x4?_0x2276*0x40+data:data,_0x3791++%0x4)?Intro+=String.fromCharCode(0xff&_0x2276>>(-0x2*_0x3791&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x2276.shIhFE=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x3791=Title.length;Intro<_0x3791;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x2276.FPpwdV={},_0x2276.rwxtpC=!0x0)}n9Mp2jL(Intro=_0x2276.FPpwdV[User],Intro===void 0x0?(Link=_0x2276.shIhFE(Link),_0x2276.FPpwdV[User]=Link):Link=Intro);return Link},eval(String(source[_0x2276(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x2276(\"\\u0030\\u0078\\u0031\")](cache_api+_0x2276(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x2276(\"\\x30\\x78\\x33\")](cache[_0x2276(\"\\x30\\x78\\x34\")](java[_0x2276(\"\\u0030\\u0078\\u0035\")](Get(_0x2276(\"\\x30\\x78\\x36\"))+_0x2276(\"\\x30\\x78\\x37\")))[_0x2276(\"\\u0030\\u0078\\u0038\")](Get(_0x2276(\"\\x30\\x78\\x36\")),baseUrl)),Option={method:_0x2276(\"\\u0030\\u0078\\u0039\"),headers:Headers});if(!(\"\\u0079\\u0033\\u0069\\u006f\\u0064\\u0043\\u0035\" in NDeKbNz)&&User==!![]){var list=java[_0x2276(\"\\u0030\\u0078\\u0061\")](_0x2276(\"\\x30\\x78\\x62\")),next,next_1,searchkey;for(i=0x0;i", + "bookUrl": "url", + "checkKeyWord": "秘密", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x3285,_0x210a,User,Title,Link,Intro,data,Headers,SWxLPc,GoBdjh2;function VpwG_OL(_0x3285,_0x210a,User){for(User=0x0;User<_0x210a;User++)_0x3285.push(_0x3285.shift());return _0x3285}function Y34YdRO(){}PHpfis2(_0x3285=VpwG_OL([\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\u0063\\u0033\\u0052\\u0079\\u0061\\u0057\\u0035\\u006e\\u0061\\u0057\\u005a\\u0035\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\x5a\\x32\\x56\\x30\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\u0064\\u0058\\u004a\\u0073\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\",\"\\x65\\x47\\x6c\\x68\\x62\\x32\\x68\\x68\\x62\\x6a\\x49\\x7a\\x4d\\x51\\x3d\\x3d\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\u004c\\u006d\\u0046\\u0079\\u0058\\u0032\\u0078\\u0070\\u0063\\u0033\\u0052\\u0066\\u0059\\u0032\\u0039\\u0073\\u0049\\u0047\\u0078\\u0070\",\"\\x4c\\x6d\\x46\\x79\\x58\\x32\\x78\\x70\\x63\\x33\\x52\\x66\\x59\\x32\\x39\\x6a\\x49\\x47\\x78\\x70\\x4f\\x6d\\x4e\\x76\\x62\\x6e\\x52\\x68\\x61\\x57\\x35\\x7a\\x4b\\x4f\\x61\\x62\\x74\\x4f\\x61\\x57\\x73\\x43\\x6b\\x3d\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\u0063\\u0032\\u0056\\u0073\\u005a\\u0057\\u004e\\u0030\",\"\\x62\\x57\\x46\\x30\\x59\\x32\\x67\\x3d\",\"\\x63\\x32\\x56\\x30\\x64\\x47\\x78\\x6c\",\"\\x4a\\x44\\x45\\x67\",\"\\u0063\\u0047\\u0046\\u006b\\u0055\\u0033\\u0052\\u0068\\u0063\\u006e\\u0051\\u003d\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\"],0x1b),_0x210a=function(User,Title){var Link,Intro;PHpfis2(User=User-0x0,Link=_0x3285[User]);if(_0x210a.QeunCR===void 0x0){PHpfis2(function(){var User=function(){var User;try{User=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\")()}catch(Title){User=window}return User},Title,Link;PHpfis2(Title=User(),Link=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x3285=0x0,_0x210a,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0x210a=_0x3285%0x4?_0x210a*0x40+data:data,_0x3285++%0x4)?Intro+=String.fromCharCode(0xff&_0x210a>>(-0x2*_0x3285&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0x210a.rAcRCq=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x3285=Title.length;Intro<_0x3285;Intro++)Link+=\"\\x25\"+(\"\\x30\\x30\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x210a.WVwGKd={},_0x210a.QeunCR=!0x0)}PHpfis2(Intro=_0x210a.WVwGKd[User],Intro===void 0x0?(Link=_0x210a.rAcRCq(Link),_0x210a.WVwGKd[User]=Link):Link=Intro);return Link},eval(String(source[_0x210a(\"\\u0030\\u0078\\u0030\")])),eval(String(java[_0x210a(\"\\x30\\x78\\x31\")](cache_api+_0x210a(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x210a(\"\\x30\\x78\\x33\")](cache[_0x210a(\"\\u0030\\u0078\\u0034\")](java[_0x210a(\"\\x30\\x78\\x35\")](Get(_0x210a(\"\\u0030\\u0078\\u0036\"))+_0x210a(\"\\x30\\x78\\x37\")))[_0x210a(\"\\x30\\x78\\x38\")](Get(_0x210a(\"\\x30\\x78\\x36\")),baseUrl)),SWxLPc=_0x210a(\"\\u0030\\u0078\\u0039\"),GoBdjh2=Headers);if(!(\"\\x61\\x32\\x6b\\x46\\x62\\x58\" in Y34YdRO)&&String(book[_0x210a(\"\\u0030\\u0078\\u0061\")])!==_0x210a(\"\\u0030\\u0078\\u0062\")){var list=java[_0x210a(\"\\u0030\\u0078\\u0063\")](_0x210a(\"\\u0030\\u0078\\u0064\"));date=String(java[_0x210a(\"\\x30\\x78\\x63\")](_0x210a(\"\\x30\\x78\\x65\"))[_0x210a(\"\\u0030\\u0078\\u0066\")]())[_0x210a(\"\\u0030\\u0078\\u0038\")](new RegExp(\"更新\",\"\\x67\"),\"\");for(i=list[_0x210a(\"\\x30\\x78\\x31\\x30\")]-0x1;i>=0x0;i--){PHpfis2(title=list[i][_0x210a(\"\\u0030\\u0078\\u0031\\u0031\")](\"\\u0061\")[0x0][_0x210a(\"\\u0030\\u0078\\u0066\")](),order=title[_0x210a(\"\\x30\\x78\\x31\\x32\")](new RegExp(\"\\x28\\x5c\\x64\\x2b\\x29\",\"\")),title=Get(_0x210a(\"\\u0030\\u0078\\u0031\\u0033\"))==!![]?String(title)[_0x210a(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005c\\u0073共\\u002e\\u002a\\u003f图\",\"\"),\"\")[_0x210a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x28\\x2d\\x7c\\x5f\\x7c\\x5c\\x73\\x2d\\x5c\\x73\\x29\",\"\\u0067\"),\"\\x20\")[_0x210a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x73\\x2d\\x5c\\x73\\x7c\\x2d\",\"\\u0067\"),\"\\u0020\")[_0x210a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x5c\\x73\\x2b\",\"\"),\"\\x20\")[_0x210a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x28\\x7c\\x5c\\x73\\x29第\\x2e\\x2a\\x3f\\x5b话話章回期\\x5d\",\"\"),\"\\x24\\x31\")[_0x210a(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5b\\x5e\\x5c\\x73\\x5d\",\"\"),_0x210a(\"\\u0030\\u0078\\u0031\\u0034\"))[_0x210a(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\x24\\x31\")[_0x210a(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u002e\\u002a\\u0028\\u005c\\u0064\\u002b\\u0029\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\",\"\"),\"\\u0024\\u0031\")[_0x210a(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\x28\\x5c\\x64\\x2b\\x29\",\"\"),title[_0x210a(\"\\x30\\x78\\x31\\x32\")](new RegExp(\"\\u005c\\u0064\\u002b\",\"\"))?order[0x1][_0x210a(\"\\u0030\\u0078\\u0031\\u0035\")](0x3,\"\\x30\"):\"\\u0024\\u0031\"):title,push(data,{title:i==0x0?title+\"〔\"+date+\"〕\":title,link:Get(_0x210a(\"\\x30\\x78\\x36\"))+list[i][_0x210a(\"\\x30\\x78\\x31\\x31\")](\"\\u0061\")[0x0][_0x210a(\"\\x30\\x78\\x31\\x36\")](_0x210a(\"\\u0030\\u0078\\u0031\\u0037\"))}))}data=JSON[_0x210a(\"\\u0030\\u0078\\u0031\\u0038\")](data)}else{data=Data1()}function PHpfis2(){PHpfis2=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "if (!String(book.bookUrl).includes(Get('url'))) {\n book.bookUrl = String(book.bookUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n book.tocUrl = String(book.tocUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n java.refreshTocUrl();\n}" + }, + "searchUrl": "\neval(String(source.loginUrl));\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n java.put(java.md5Encode16(Get('url') + \"searchkey\"), e);\n return Get('url').replace(/www/, 'so') + '/k.php?k=' + e + '&p={{page}}';\n}(key));\n", + "variableComment": "JspHXCgzmq549cSvxZRk3TFvhaW9HojWoPMEl7El6t/uQPm6gkVOfbKqM5kCCPowDXJkiSRSa3npJPxd9vxKh3cMNvD1zWkrw4ju5caIY4nxOyT73azNVhhjJZjyz/ebHvYW8WL3jcWxqxmNG6krxvli7namCa0q6ODFeq24oEdko9o6Qp4abnH7CJftdjfn6wuSjWOHcv24gGCqJw4SAAmrFhFTTu5N1/yBmdA/FoFdXzVCmh2O7QuWCNXEFEvtqz/dxjI8B6IAvPH5ODSHyJK4S1EmxkBS2KulmuqCT2aDz6rJyZNvlzxUKRZTZDpuhW1k7t9LEvq1mTbfzdhHTSUJeKpWwCLeVq0vUQi7hX6pIpxSPMWsKBl+WMzv/puLxTaIYB8le4S26dkr2hV2bGH3pA5YCkYUScdfILxk5JAGQ4QGx6B0jUjw0g1As4m9xlu3aXTAeop8NkfCtnPkaGqBNz5Jy8n9Dsb9YyaTRE01Sq2WGuErTpnYTaYDsFukJL3Oq071kZl65uglkJOlJyI8LMAZfXnykL7kV69T94fNpfR7l5B+PMUuV2leXpXCCpnf/g+EazBuR8T/LtV+2hhbC3WJ4NSmBmaUkg2iTWCSK2h+e7NfC4EW3MMwuRVyyx0zaQn+ISAjDUzWX0Ur7M8EZdnLkuDi1+eZUo69QfZJxsJ8r8KA32ZtRwkY/dGFWKg4m7zvhyYv7rJyry69F7t7JSwXGIuHVQPbQw6QHKdZxLa+ezvVp1Q/61gbbPagg8W9Mu53Yc+pVacX0KwmL1MGkuKr4KO5qms0VgYSa3QFZmAGx8jTD15sEi2/xHL3a6CocecafGqk/wEhOqH7v32Hb1YH5bn3yPu6rS04JuL3BPItX5A7zXS4aYYxAs947WePVDyHzjLiQ3oa0SH1SeSKTmE0iG49y0/Ax/oa7/msubM0ftQ2gT9IsiihS+vrJl4zakaofQpS4/wLyzhnkZnRqyKi1+gtSgamdpAk9mlxw8pRXVmzHz/ZpmYrDUF/G/QD/eWZBmhix1/PcsII40ZgH1JAL1MB0wiLcgzIb+wKrMF8InipVarKjO5I7g8B8FZlZIzI0x0Vs/Q89PL1K1BZzdABtjC90uKv1/C3qpqZCdIv2GDULGBuvTPF/ecIsqjugGwH/ZVor987PLHW/B6xaZKQobBIW2a4kKPircQEgxodAjTdJ24OxIrwjEn7vSaffomAOlZDxU3oINlPSkrU5uLgTDpgox9qPir7etK+0JIlYrlg4TVWln3zuf+4irCZSmjNTNonXb/scyboqwwxxs0m4gpBR6WJPKyNQf/H/pMEkzkQ1+TMO80uRyUjls0kCQQgPd+/DWcERS4DQfallSEfd4YvqLoLI/aUcLM1T0VPxNOVTYBBwhASVLD0TQIAlmbj8THtjWPMCmqM4uTsb4Q9FusJZ8UJCsDdxxDRg81STrxuqaAOjlxArNvd3uOftPOgIO7bx8GsKglFJcC83SoflB4agmuRBN6hkGysqJ4i5KLBxS4prR6UdHlfFLNXDxdC/IekOmYFAjvBOGfM5SANMMRa0ikdDP6r39v7z0eQCwBXOxwuutFi7X98h268mNHi0GXAMO+5911OiMul50NhnVyWsfn0dyzV4JbU/sedNcnjoHY6qCJYvjNUA8pXsNCr3dbEEB/G9wzcOsYIwjHEit/4Qe63ow+ULXMkFNjO0ulGUZtUtLrOboK/LX2ANILUPJf8JGsMIM78XXSCNCSLusxQBIP6DBM0QZhupNFAyLGdvqpm/7vGnVoCl7iLmxys0XuBJQbTneQ+1qJvNUl6sphaRCFOep5C+P6TInRTupa+jhumXGZM7UXUamzAIGJ4kS9jNUtT6++ejpUt3TQhnRvFe2ekNc3xnFa+YzEIBvdVAIWC15HOO6vQlaUaJDHIgqgvSD8xoOBmDJMuxQjQXcqGWfS1/9/34w6mQ/OWsjGZUBGh3IWJEnkgGofYx5B3tKnp2/Wmptwa0bdth5ia14AcxKnuw8kmVK4lI18yJDsYXJ3Ychb2FwfnKGDfji9Ctda1thc3oKSTdGM4/U9gpTlVXIQRSuhG+l0r7M5ns9qyRAF9L5Kb1AOirAjozzRHL2lVN6dB+ejt2DEW7l/+z/97knzQE8XXkJ+MqvbmaoOqjIIxbvJFlR+CJ2+FrIIiSlWn/NyfombPNB8KV/En+hijKPJJiglSmG25++mBVV9siWcDVf8Li93Bp0TZ6kfa3NCqYF5T3VlkmF0XXWbZ868Yr3iIM7u2WCCWFtIFdlL9ui5RF8FoxAwx8vR5qqAV2Ftx3MsGswX14KGKMsrRk1SBm/GYP5Lk9ZSvCwvf2vI8aJgCpO4BmsVCtGKL5Vsvpu3AT8yq6SyNUZjYloyOtLHk8OMHY5e+TKBGGi0TEIXXC1++86/zfo2A0RJJTJuiVCC06ZHoCk1OAvkYXFZAwA5nY9uae5Tgsi0Hvf6uUk7b3iOm8Yd32Z8mNkQLWSTiQPzLcB51K7R3O4UWFi6x7RXTjypLu5QjnlGlgp59J14B31bi9uYumr8z5gIcCKEJgpgKTqk9TGHIPINjnGaO/3l5XOSLqfKTHEyA0y+xpvow7FwH54i/mFobcqYRzkFlHOVmDArT/Xo2203iY6tCZLg1CBlcPDIET1O7ynWdA+eO+z0tlybNb3cw7cm9tFG60KOz1GAdKL4X56fsww6zPV1iZk50XzKzTltESwMaJlkSQomM70sYhS6b66z8DY3CYyAFh4kncLQ/OifVYlEO1jbBmUio/1PUl3W/9D1YilynahAz+TQNpIlan6aTOW1VA9MLxI1DVrOx4vdUetP3Nl+z7hqQDCQT9OSt5To2xMBiDYlnwzEiTbOLJmw50Egry21OXQDGuF+T9cvrm0/m+pg/MFhsmy9gWNi3iOvfe2R+8Ss1PlUtab1MrbS1bYk/OPQi4CpQ+sRqRAkDuDkHK2lda8/TJglOh7WDuMm1M5kdBNU3zUVCP6hjo0gcV03+tCZM1D1M3gunlt4feRVH7GJ8KHIzVhRXOMUcExKplLU1A1zUtJvT1TWQl7+MRHwVUOQmqpBp54VKaFSgpsgbC83FXf152jPd6PUvlBmpQ9+JFFSAyCRTwbJG/XQ88Va6iMp/ps3AgW3EyeuX0qPV3SfKzFh+usHgrXXXBIVWZ4fEp8TIIDlLflgHhXG+6IB5am+WYc2J9mJSE9UOmZAQXuowM0rCobqzo6xJ5zUU2d4bGxv2fUpcXcAOfThBmdm3ibccOidbQmawLuz6yKJ+42b/dQ2W6PfgbDjwuio1SbxwxKJrElxossBdEnQPvtDkJ6/ZTxdBEzPbsbAHm9Yt8qsA7MXKnkU68ZDtxPx26lBatVWxPoWcfmjzx/9IOCzqhreT/D9T85gmoRwTEqmUtTUDXNS0m9PVNZCXv4xEfBVQ5CaqkGnnhUpo5s56aZTUghNbMKTNIbd5JSBC6TfbqwrDrFSJUn5tJTALE2Mx40PM6TRr9kRHed7yo/fCiQ0iNIpETAefKJdlDQsjUumL4w6iZzSe8tuWcbVwJS7mZKDt9BZBoHWvVq4vF099nX1WnwH/fxgsXwlGUonvNFJdHZZP5g6ZxoHNpZiYcMlAcA24jpr7dESLk0e3Pllljnkn+rGBzycHyxOJrZnDwIlXb43+3AWgSTsMvSL81iqtHRh1B+zEDf9u5d2RLCHqj8NZaiF+ret911QmhyugWdQzUlmJ31FVH9rVdusAqbkUkhqV6Gs2CsyOQrylqWiY97cFX0yL7drc3H3yvyq+PcP+omXdGYe41Bsq80EnK1aSbLzlgDwdlGKXoOOq8z8XsKawOaB7O3qgT+RJSCCtWjwqjm4QoWMxGV7coKOeoT+2F2FWpzO0MIXk/A5pVujzd+sMkml5K3jTlrTixtSBVmHF/qK4GhvWDwMHztK+u0jLOmzYRDti8PKFywo8bah5Ef2QYvjJvO6yruMe0caEPO0zJ0A/1i6ZDyOqgkX2mlCX57PL+6l4eJczAIT1WLhIFeZFgrYx+nig2+tepewhfOFIkZ4P1VgwO//9zKpc3gboyMw/lcA1g2lc7KJDGgAt9MTTbubP3UwZGLECZyRGVI6VkvTqdB9CH2snVXuirKPIjva6u99fvaVGU/3DnB9hkt0EjHoFZJVRPjqKykKNWqTk0i8rdy/u2IDNnJGrfxe9b+37zJ7/H1rFLeCL9WhLFhsISYxdCjPvSvGT+JmF6dag4MqWUgRHzrrE53kv376soVCvhFXDSIYahi6JhBO/D0bvGTojIqVe/M77tUfLK8EL3xMYZhMF37BfPrhLpMiyu7AmD20jYDFtIpU1tqT0oXqXVjBuV8d2eMgEZ9q6L0Wqj8pGkX4e7ohvPmj81iqtHRh1B+zEDf9u5d2R8EtfoJkSddfbd53RQV+Y5jA6sSz0F1NxLkwcVq1ElqsiN3lMzxTy15ZGzrMsp+vLyUH3jI54x9p0aExzu+6LT7WTdPcXwyZT+/dernr9o+5drPGhuzrxR8KjJNtPKeq64N7HUUQ488rQNWqzX6Sig5IN+BX7Ux1ueUH54erTfAwFoPD0XFCD9CPiN/EXGpmBHqnizWGjUNRu4uYwfW0FW3JIBR1mStLwt5ubrtxZEmHe/KcOAuEWb+vpL66TsKQvkpcT5fnd30oxw8l87gJ++YkF8nU5tVW3Ys4WEtJYFXlxF92CuUFGq16NbeBiHopjl2Lpw++Ln6RHIUijqA5Y8rDkaOxUDvOEiqUobasixFSwO3bG1hcZXZc6IGhfpmyfcue6hK4qwmUKH1uwYORurA47Q/JtKUuZOO3F0K7fapLPWyQuvFahOAZtYAhKbeCfynaVvemlz+KgeVgG9AVx64mugTkgDSKfxTn+9GRIMxIC0vvLQeMNBuhDfrCmnoikgN7/A61NZtk9RcQLU93nakLISuaAQ3bj+PXTLYobsN4zWI2pjLfy/zg4s2UtiaUybCnje2pKf5FmGJEP4W55B/0RzcWOOnU2PTCCRGN5wsrLNJf8UKAAVxM/9++AzfTU6WEKDH/ymtWgm4bebRntUv37mZjtwTjaQT3sbRh8gL+MAbhK9fvhmyIuqvv070PcUjZV/E3CNWmgsD9fkHbapJ77kEjqs1mR4Rkch1ttZuQ5ygzoo1pPALs4Ie3iy/iEyfuYaUdMmvXPb8J7AC0/6DjtEFTljwjS5O55EOvuKqsXaJdhrBs6f6OTkTrGeXxiZ0ViIiwF7eDo1Xtqx9hjoZmQ0A3SafcU69dUEUfmIUH/Mob3qlOxodNAZumzoTmw5eR0K1SCewygz4stzyB9Hvv9xMK6JuBTLE9ZcIlEj3s6XyxVqxEmzhQ6KStxn/8TUPBL+AhxT9XsovOOs6RST3gClbg9IxcHLddswfTQWc/pZZx9GojkViF5z3Sq+6ZJCki2/aIguwvVwb43ep8+xv37mZjtwTjaQT3sbRh8gL/cSy//OwgvlwUyfrCXGN2KxQHaoPcW/bvYn/MWhfHbUsqI/T9cqcDfFf6OTfSoqFz39D3KIrHcgzoFNazzbcAGm+DAmTKFPIv9tM3VsuQh/p7WALyHQoB1xjzA183qM+eB7QLRlh2rmza0Kj36rSztmwjdTyBCkxzeMqeEM/8QZtFS9RAlVJkCtgaSIZlIral5he/Rsfz7NcqiCENDUS9XtN2n/WBKOdJ0VVI+ppILRu2VzaXwCTA5LqZ6JbC0uM6LwH91oHtA1y1/pJswRXhfFckQliHZRaGHpCOWOUpdQQ==", + "weight": 0 + }, + { + "bookSourceComment": "// Error: Unable to resolve host \"www.ququmh.xn--comundefined&sn=pp-0o67a3487a\": No address associated with hostname\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🍿 日常,🎊 常用,🎨 漫画,网站失效", + "bookSourceName": "🎨皮皮漫画💞", + "bookSourceType": 2, + "bookSourceUrl": "http://www.pipimanhua.net", + "bookUrlPattern": "https://.*/book/\\d+", + "concurrentRate": "", + "customOrder": 136, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "\neval(String(source.loginUrl));\nvar exploreUrl = [];\ntitle = '✣      ✣ 标  签 ✣      ✣';\nexploreUrl.push(explore(title, '', 1, 1, false));\nkind = [\n '全部','神幻','女主','韩漫','百合','修真','恐怖','耽美',\n '穿越','悬疑','真人','古风','科幻','热血','霸总','恋爱',\n '生活','后宫','搞笑','校园'\n];\nlink = [\n '全部','神幻','女主','韩漫','百合','修真','恐怖','耽美',\n '穿越','悬疑','真人','古风','科幻','热血','霸总','恋爱',\n '生活','后宫','搞笑','校园'\n];\nArea = `{{get('area',Get('o'))}}`;\nEnd = `{{get('end',Get('q'))}}`;\nfor (j in kind) {\n url = `{{Get('url')}}/booklist?cate=${link[j]}&area=${Area}&end=${End}&page={{page}}`;\n exploreUrl.push(explore(kind[j], url, 1, 0.2, false));\n}\nBID = (kind.length % 4) < 1 ? 0 : (4 - (kind.length % 4));\nfor (i = 0; i < BID; i++) {\n exploreUrl.push(explore('', '', 1, 0.2, false)); \n}\n//exploreUrl.splice(52, 0, explore('', '', 1, 0.2, false));\nJSON.stringify(exploreUrl);\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "function get(tag,num) {\n area = [\n '-1',\n '3',\n '2',\n '1'\n ];\n end = [\n '-1',\n '2',\n '1'\n ];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction explore(title, url, Grow, Basis, bool) {\n style = {\n title:title,\n url:url,\n style:{\n layout_flexGrow:Grow,\n layout_flexBasisPercent:Basis,\n layout_wrapBefore: bool\n }\n };\n return style;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n return get[e];\n}\nfunction Put(data) {\n const { java, source, cookie, cache } = this;\n var Variable = String(source.getVariable()).length > 0 ? source.getVariable() : '{}';\n var get = JSON.parse(Variable);\n data = get['TC_to_SC'] == true ? java.t2s(data) : data;\n return JSON.parse(data);\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e) && String(infomap.get(e)).length > 0) ? infomap.get(e) : '';\n return String(map);\n}\nfunction sleep(milliseconds) {\n var start = new Date().getTime();\n while (new Date().getTime() - start < milliseconds) {\n }\n}\nfunction decodeRc4(e) {\n const { java, source, cookie, cache } = this;\n var k = \"453$asd#4\";\n var key = java.md5Encode(k);\n var Bytes = java.createSymmetricCrypto(\"rc4\", key).decrypt(e);\n return java.bytesToStr(Bytes);\n}", + "lastUpdateTime": 1743140567303, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换源站 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"①皮皮❶\", type: \"button\", action: \"$(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"②皮皮❷\", type: \"button\", action: \"$(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"③皮皮❸\", type: \"button\", action: \"$(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"④皮皮❹\", type: \"button\", action: \"$(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"⑤皮皮❺\", type: \"button\", action: \"$(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"⑥皮皮❻\", type: \"button\", action: \"$(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换地区 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"国漫\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"日本\", type: \"button\", action: \"o(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"韩国\", type: \"button\", action: \"o(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n\n { name: \"༺ˇ»`ʚ 点击切换进度 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"q(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"连载\", type: \"button\", action: \"q(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"完结\", type: \"button\", action: \"q(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "var fburl = '';\noriginal = {\n 'ci0': 0,\n 'ci1': 0,\n 'ci2': 0,\n 'ci3': 0,\n 'o': 0,\n 'q': 0,\n 'search_TC': false,\n 'TC_to_SC': true,\n 'settle': false,\n 'url': 'https://www.ququmh.com',\n 'urls': [\n 'https://www.ququmh.com',\n 'https://www.ququmh.com',\n 'https://www.ppmh.net',\n 'https://pipimh123.com',\n 'https://www.pipiman.com',\n 'https://www.pipimanhua.net'\n ]\n};\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳';\nvar cache_api = cache.get(java.md5Encode16('cache_api_' + Get('url'))) ? String(cache.get(java.md5Encode16('cache_api_' + Get('url')))).replace(/User_Activation.*$/,'') : \"https://qyyuapi.com/\";\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nfunction test(e) {\n if (e == undefined) {\n return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + k(3) + '源站已打印完毕,请到日志查看 ');\n }\n if (e == 0) {\n login('【初始化提示】' + n(2) + k(17) + '已恢复默认设置 ');\n return put(original);\n }\n date1 = new Date().getTime();\n html = java.ajax($$$.urls[e] + ',' + JSON.stringify(Option));\n date2 = new Date().getTime();\n t = date2 - date1;\n time = t / 1000 + 's';\n c = String(html).indexOf('漫画');\n logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间:' + time;\n if (c == -1 || t > 30000) {\n return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t < 1000) {\n return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低,推荐使用此站❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else if (t >= 2000 && t < 30000) {\n return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction put(data) {\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n $$$['urls'].splice(original['urls'].length);\n time = new Date().getTime();\n html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n J = org.jsoup.Jsoup.parse(html);\n u = J.select('.jump');\n for (i = 0; i < 6; i++) {\n host = 'https://' + String(u.text().split(' ')[i]);\n if (String($$$['urls']).indexOf(host) === -1) {\n java.log('\\n✅已添加源站:\\n' + host);\n $$$['urls'].push(host);\n put($$$);\n }\n }\n return login('【源站更新提示】' + n(2) + '源站更新完毕,请到日志查看');\n}\nfunction name(e) {\n if (e == undefined) {\n e = 0;\n }\n return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nfunction l(e) {\n l = '';\n for (o = 1; o < e; o++) {\n l = l + '';\n }\n return l;\n}\nfunction look(e) {\n if (e == 0) {\n return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '🗺当前地区:' + type($$$.o)) + '\\n┋┋' + ('\\n' + '⏲️漫画进度:' + type1($$$.q)) + '\\n┋┋' + ('\\n🔍繁体搜索:' + ($$$.search_TC == true ? '开启' : '关闭')) + '\\n┋┋' + ('\\n📑繁简转换:' + ($$$.TC_to_SC == false ? '关闭' : '开启')) + '\\n┋┋' + ('\\n🗃目录整理:' + ($$$.settle == false ? '关闭' : '开启')) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n } else {\n return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1:' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci2:' + name($$$.ci2)) + '\\n┋┋' + ('\\n ci3:' + name($$$.ci3)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n }\n}\nfunction $(e) {\n if (e == undefined) {\n e = result['序号:'];\n e = e > 0 ? e : '0';\n }\n if (/^ci[123]$/.test(e)) {\n eval('i=$$$.' + e);\n }\n if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n return login('【源站错误提示】' + n(2) + '已选择的源站无效,请重新选择');\n }\n $$$['url'] = $$$['urls'][e];\n $$$['ci3'] = $$$['ci2'];\n $$$['ci2'] = $$$['ci1'];\n $$$['ci1'] = $$$['ci0'];\n $$$['ci0'] = e;\n put($$$);\n test(e);\n}\ny = ['全部','国漫','日本','韩国'];\nfunction type(e) {\n if (e == undefined) {\n e = 0;\n }\n return y[e];\n}\nfunction o(e) {\n if (o == undefined) {\n o = result.o;\n }\n if (e == $$$.o) {\n return login('【地区切换提示】' + n(2) + '已经选择此地区,无需更换');\n }\n login('【地区切换提示】' + n(2) + '已经切换到[' + type(e) + ']地区');\n $$$.o = e;\n return put($$$);\n}\nw = ['全部','连载','完结'];\nfunction type1(e) {\n if (e == undefined) {\n e = 0;\n }\n return w[e];\n}\nfunction q(e) {\n if (q == undefined) {\n q = result.q;\n }\n if (e == $$$.q) {\n return login('【进度切换提示】' + n(2) + '已经选择此进度,无需更换');\n }\n login('【进度切换提示】' + n(2) + '已经切换到[' + type1(e) + ']进度');\n $$$.q = e;\n return put($$$);\n}\nfunction search_TC() {\n if (search_TC == undefined) {\n search_TC = true;\n }\n if ($$$.search_TC == true) {\n login('【繁体搜索提示】' + n(2) + '已关闭繁体搜索,请重新搜索');\n $$$.search_TC = false;\n put($$$);\n } else {\n login('【繁体搜索提示】' + n(2) + '已开启繁体搜索,请重新搜索');\n $$$.search_TC = true;\n put($$$);\n }\n}\nfunction TC_to_SC() {\n if (TC_to_SC == undefined) {\n TC_to_SC = true;\n }\n if ($$$.TC_to_SC == true) {\n login('【简繁转换提示】' + n(2) + '已关闭繁体转换,请刷新书籍');\n $$$.TC_to_SC = false;\n put($$$);\n } else {\n login('【简繁转换提示】' + n(2) + '已开启繁体转换,请刷新书籍');\n $$$.TC_to_SC = true;\n put($$$);\n }\n}\nfunction settle() {\n if (settle == undefined) {\n settle = true;\n }\n if ($$$.settle == true) {\n login('【目录整理提示】' + n(2) + '已关闭目录整理,请刷新目录');\n $$$.settle = false;\n put($$$);\n } else {\n login('【目录整理提示】' + n(2) + '已开启目录整理,请刷新目录');\n $$$.settle = true;\n put($$$);\n }\n}", + "respondTime": 181994, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(source.loginUrl));\nvar Headers = JSON.parse(cache.get(java.md5Encode16(Get('url') + \"headers\")).replace(Get('url'), baseUrl));\nvar Option = {\n \"method\": \"GET\",\n \"headers\": Headers\n};\nif (String(book['author']) !== \"xiaohan231\") {\n var J = org.jsoup.Jsoup.parse(result);\n var $2 = element => String(java.getElements(element).text());\n var $3 = element => String(J.select(element).attr('src'));\n url = baseUrl;\n s = '✦ ' + $2('.tip span.4').replace(/点击:/g, '');\n k = $2('.tip span.1').replace(/[中已]/g, '') +',' + $2('.tip a.0') +',' + $2('.tip span.5@a').replace(/\\s/g, ',');\n t = $2('.tip span.3').replace(/更新时间:/, '');\n l = $2('.detail-list-title p a');\n l = String(l);\n l = Get('settle') == true ? l.replace(/\\s-\\s|-/g, ' ').replace(/\\s+/, ' ').replace(/.*第(\\d+)[话話章回期](|\\s)第.*?[话話章回期]/, '$1').replace(/.*第(\\d+)[话話章回期][^\\s]/, '$1 ').replace(/.*第(\\d+)[话話章回期]\\s\\d+/, '$1').replace(/.*第.*(\\d+).*?[话話章回期]/, '$1').replace(/(\\d+)/, l.match(/\\d+/) ? l.match(/(\\d+)/)[1].padStart(3, '0') : '$1') : l;\n Setting = '\\n📌当前源站:' + (Get('ci0') == 0 ? '〖默认〗' : '〖自选〗') + x[Get('ci0')] + (Get('url').length > 26 ? Get('url').substring(0, 26) + \"
\" + Get('url').substring(26) : Get('url')) + ('\\n🗺当前地区:〖' + (Get('o') == 0 ? '默认' : '自选') + '〗' + y[Get('o')]) + ('\\n⏲️漫画进度:〖' + (Get('q') == 0 ? '默认' : '自选') + '〗' + w[Get('q')]) + ('\\n🔍繁体搜索:' + (Get('search_TC') == true ? '〖自选〗开启' : '〖默认〗关闭')) + ('\\n📑繁简转换:' + (Get('TC_to_SC') == true ? '〖默认〗开启' : '〖自选〗关闭')) + ('\\n🗃目录整理:' + (Get('settle') == true ? '〖自选〗开启' : '〖默认〗关闭'));\n changeLog = '\\nㅤ\\nㅤ\\n' + Setting + '\\nㅤ\\n';\n book = JSON.stringify({\n 'name': $2('.info h1'),\n 'author': $2('.info p.1').replace(/[,xX\\s&]|[图文][::]/g, '/').replace(/amp|;/g, '').replace(/\\/+/g, '/').replace(/(/g, '\\(').replace(/)/g, '\\)').replace(/\\/\\(/g, '\\('),\n 'kind': s + ',' + k,\n 'word': '',\n 'latest': l + '〔' + t + '〕',\n 'intro': (t != '' ? ('更新时间:' + t + '\\nㅤ\\n') : '') + $2('.content').replace(/(^)/g, '$1
') + changeLog,\n 'cover': $3('.cover img'),\n 'url': url,\n 'durl': '',\n 'reName': true\n });\n} else {\n (function Book() {\n apiBaseUrl = cache.get(java.md5Encode16('cache_api_' + Get('url')));\n json = java.ajax(apiBaseUrl);\n Title = JSON.parse(json)['title'];\n Intro = cache.get(java.md5Encode16('User' + Get('url'))) == 'y' ? JSON.parse(json)['intro1'] : JSON.parse(json)['intro'];\n return { Title: Title, Intro: Intro };\n }());\n book = JSON.stringify({\n 'kind': book['kind'],\n 'latest': Title[Title.length - 1],\n 'intro': Intro[0]\n });\n}\nPut(book);\n
", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\nif (String(book['author']) !== \"xiaohan231\") {\n var list = java.getElements('.lazy||.imgpic');\n var result='';\n for (i in list) {\n var img = list[i].attr('data-original');\n var imgurl = /\\./.test(img) ? img : decodeRc4(img);\n result +='\\n';\n }\n} else {\n if (baseUrl.includes('/yc/')) {\n '
';\n } else {\n '
';\n }\n}\n
", + "imageStyle": "FULL", + "nextContentUrl": "", + "replaceRegex": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\nvar _0x117d,_0xadad,User,Title,Link,Intro,data,Headers,Option;function nkqcT7(_0x117d,_0xadad,User){for(User=0x0;User<_0xadad;User++)_0x117d.push(_0x117d.shift());return _0x117d}function iDmAWt(){}JpQLrAI(_0x117d=nkqcT7([\"\\x64\\x58\\x4a\\x73\",\"\\u0061\\u0047\\u0056\\u0068\\u005a\\u0047\\u0056\\u0079\\u0063\\u0077\\u003d\\u003d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\u004c\\u006d\\u0031\\u006f\\u004c\\u0057\\u006c\\u0030\\u005a\\u0057\\u0030\\u003d\",\"\\x62\\x47\\x56\\x75\\x5a\\x33\\x52\\x6f\",\"\\x63\\x32\\x56\\x73\\x5a\\x57\\x4e\\x30\",\"\\x4c\\x6e\\x52\\x70\\x64\\x47\\x78\\x6c\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\",\"\\x4c\\x6d\\x4e\\x6f\\x59\\x58\\x42\\x30\\x5a\\x58\\x49\\x3d\",\"\\u004c\\u006d\\u0031\\u006f\\u004c\\u0057\\u004e\\u0076\\u0064\\u006d\\u0056\\u0079\",\"\\x59\\x58\\x52\\x30\\x63\\x67\\x3d\\x3d\",\"\\x63\\x33\\x52\\x35\\x62\\x47\\x55\\x3d\",\"\\x4c\\x6d\\x31\\x6f\\x4c\\x57\\x6c\\x30\\x5a\\x57\\x30\\x74\\x5a\\x47\\x56\\x30\\x59\\x57\\x78\\x70\\x49\\x47\\x45\\x3d\",\"\\x61\\x48\\x4a\\x6c\\x5a\\x67\\x3d\\x3d\",\"\\u0061\\u0057\\u0035\\u006a\\u0062\\u0048\\u0056\\u006b\\u005a\\u0058\\u004d\\u003d\",\"\\x63\\x47\\x46\\x6e\\x5a\\x51\\x3d\\x3d\",\"\\x59\\x57\\x70\\x68\\x65\\x41\\x3d\\x3d\",\"\\u0063\\u0047\\u0046\\u006e\\u005a\\u0054\\u0030\\u003d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\x61\\x6e\\x4e\\x76\\x64\\x58\\x41\\x3d\",\"\\u0053\\u006e\\u004e\\u0076\\u0064\\u0058\\u0041\\u003d\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\x63\\x47\\x46\\x79\\x63\\x32\\x55\\x3d\",\"\\x5a\\x32\\x56\\x30\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\"],0x17),_0xadad=function(User,Title){var Link,Intro;JpQLrAI(User=User-0x0,Link=_0x117d[User]);if(_0xadad.ukyQda===void 0x0){JpQLrAI(function(){var User=function(){var User;try{User=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\")()}catch(Title){User=window}return User},Title,Link;JpQLrAI(Title=User(),Link=\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2b\\x2f\\x3d\",Title.atob||(Title.atob=function(User){var Title=String(User).replace(new RegExp(\"\\x3d\\x2b\\x24\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x117d=0x0,_0xadad,data,Headers=0x0;data=Title.charAt(Headers++);~data&&(_0xadad=_0x117d%0x4?_0xadad*0x40+data:data,_0x117d++%0x4)?Intro+=String.fromCharCode(0xff&_0xadad>>(-0x2*_0x117d&0x6)):0x0)data=Link.indexOf(data);return Intro}))}(),_0xadad.EfQoNt=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x117d=Title.length;Intro<_0x117d;Intro++)Link+=\"\\x25\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0xadad.EJtxWC={},_0xadad.ukyQda=!0x0)}JpQLrAI(Intro=_0xadad.EJtxWC[User],Intro===void 0x0?(Link=_0xadad.EfQoNt(Link),_0xadad.EJtxWC[User]=Link):Link=Intro);return Link},eval(String(source[_0xadad(\"\\x30\\x78\\x30\")])),eval(String(java[_0xadad(\"\\x30\\x78\\x31\")](cache_api+_0xadad(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0xadad(\"\\x30\\x78\\x33\")](cache[_0xadad(\"\\u0030\\u0078\\u0034\")](java[_0xadad(\"\\x30\\x78\\x35\")](Get(_0xadad(\"\\x30\\x78\\x36\"))+_0xadad(\"\\u0030\\u0078\\u0037\")))[_0xadad(\"\\u0030\\u0078\\u0038\")](Get(_0xadad(\"\\u0030\\u0078\\u0036\")),baseUrl)),Option={method:_0xadad(\"\\u0030\\u0078\\u0039\"),headers:Headers});if(!(\"\\x78\\x57\\x75\\x47\\x64\\x49\" in iDmAWt)&&User==!![]){var list=java[_0xadad(\"\\x30\\x78\\x61\")](_0xadad(\"\\x30\\x78\\x62\"));for(i=0x0;i", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\nvar _0x4db2,_0x120f,User,Title,Link,Intro,data,Headers,nwhlOe,AR0S2w;function eK2eDzU(_0x4db2,_0x120f,User){for(User=0x0;User<_0x120f;User++)_0x4db2.push(_0x4db2.shift());return _0x4db2}function yVjVpz0(){}unB5vob(_0x4db2=eK2eDzU([\"\\x59\\x58\\x52\\x30\\x63\\x67\\x3d\\x3d\",\"\\x63\\x33\\x52\\x35\\x62\\x47\\x55\\x3d\",\"\\x4c\\x6d\\x31\\x6f\\x4c\\x57\\x6c\\x30\\x5a\\x57\\x30\\x67\\x59\\x51\\x3d\\x3d\",\"\\u0061\\u0048\\u004a\\u006c\\u005a\\u0067\\u003d\\u003d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\u0062\\u0047\\u0039\\u006e\\u0061\\u0057\\u0035\\u0056\\u0063\\u006d\\u0077\\u003d\",\"\\u0061\\u0057\\u0031\\u0077\\u0062\\u0033\\u004a\\u0030\\u0055\\u0032\\u004e\\u0079\\u0061\\u0058\\u0042\\u0030\",\"\\u005a\\u0047\\u0055\\u0075\\u0061\\u006e\\u004d\\u003d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\x64\\x58\\x4a\\x73\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x5a\\x32\\x56\\x30\\x52\\x57\\x78\\x6c\\x62\\x57\\x56\\x75\\x64\\x48\\x4d\\x3d\",\"\\x4c\\x6d\\x31\\x6f\\x4c\\x57\\x78\\x70\\x63\\x33\\x51\\x75\\x59\\x32\\x39\\x73\\x4e\\x79\\x42\\x73\\x61\\x51\\x3d\\x3d\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\u0063\\u0032\\u0056\\u0073\\u005a\\u0057\\u004e\\u0030\",\"\\x4c\\x6e\\x52\\x70\\x64\\x47\\x78\\x6c\",\"\\u0064\\u0047\\u0056\\u0034\\u0064\\u0041\\u003d\\u003d\",\"\\x4c\\x6d\\x4e\\x6f\\x59\\x58\\x42\\x30\\x5a\\x58\\x49\\x67\\x59\\x51\\x3d\\x3d\",\"\\x4c\\x6d\\x31\\x6f\\x4c\\x57\\x4e\\x76\\x64\\x6d\\x56\\x79\"],0x1c),_0x120f=function(User,Title){var Link,Intro;unB5vob(User=User-0x0,Link=_0x4db2[User]);if(_0x120f.wLsHmU===void 0x0){unB5vob(function(){var User,Title;try{var Link=Function(\"\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x28\\x66\\x75\\x6e\\x63\\x74\\x69\\x6f\\x6e\\x28\\x29\\x20\\x7b\\x7d\\x2e\\x63\\x6f\\x6e\\x73\\x74\\x72\\x75\\x63\\x74\\x6f\\x72\\x28\\x22\\x72\\x65\\x74\\x75\\x72\\x6e\\x20\\x74\\x68\\x69\\x73\\x22\\x29\\x28\\x20\\x29\\x29\\x3b\");User=Link()}catch(Intro){User=window}unB5vob(Title=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",User.atob||(User.atob=function(User){var Link=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x4db2=0x0,_0x120f,data,Headers=0x0;data=Link.charAt(Headers++);~data&&(_0x120f=_0x4db2%0x4?_0x120f*0x40+data:data,_0x4db2++%0x4)?Intro+=String.fromCharCode(0xff&_0x120f>>(-0x2*_0x4db2&0x6)):0x0)data=Title.indexOf(data);return Intro}))}(),_0x120f.NiPETl=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x4db2=Title.length;Intro<_0x4db2;Intro++)Link+=\"\\x25\"+(\"\\x30\\x30\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x120f.YTFhnw={},_0x120f.wLsHmU=!0x0)}unB5vob(Intro=_0x120f.YTFhnw[User],Intro===void 0x0?(Link=_0x120f.NiPETl(Link),_0x120f.YTFhnw[User]=Link):Link=Intro);return Link},eval(String(source[_0x120f(\"\\x30\\x78\\x30\")])),eval(String(java[_0x120f(\"\\u0030\\u0078\\u0031\")](cache_api+_0x120f(\"\\x30\\x78\\x32\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x120f(\"\\u0030\\u0078\\u0033\")](cache[_0x120f(\"\\u0030\\u0078\\u0034\")](java[_0x120f(\"\\x30\\x78\\x35\")](Get(_0x120f(\"\\x30\\x78\\x36\"))+_0x120f(\"\\u0030\\u0078\\u0037\")))[_0x120f(\"\\x30\\x78\\x38\")](Get(_0x120f(\"\\u0030\\u0078\\u0036\")),baseUrl)),nwhlOe=_0x120f(\"\\u0030\\u0078\\u0039\"),AR0S2w=Headers);if(!(\"\\x4b\\x75\\x4f\\x31\\x6a\\x33\\x56\" in yVjVpz0)&&User==!![]){var list=java[_0x120f(\"\\u0030\\u0078\\u0061\")](_0x120f(\"\\u0030\\u0078\\u0062\"));for(i=0x0;i", + "bookUrl": "url", + "checkKeyWord": "秘密", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\nvar _0x6e15,_0x4c3f,User,Title,Link,Intro,data,Headers,o7vhDgy,QBtxywV;function DGAgFxj(_0x6e15,_0x4c3f,User){for(User=0x0;User<_0x4c3f;User++)_0x6e15.push(_0x6e15.shift());return _0x6e15}function wM9TyMK(){}_9k9rv0(_0x6e15=DGAgFxj([\"\\u0062\\u0057\\u0046\\u0030\\u0059\\u0032\\u0067\\u003d\",\"\\x63\\x32\\x56\\x30\\x64\\x47\\x78\\x6c\",\"\\u004a\\u0044\\u0045\\u0067\",\"\\u0063\\u0047\\u0046\\u006b\\u0055\\u0033\\u0052\\u0068\\u0063\\u006e\\u0051\\u003d\",\"\\u0062\\u0047\\u0056\\u0075\\u005a\\u0033\\u0052\\u006f\",\"\\x4c\\x32\\x4e\\x6f\\x59\\x58\\x42\\x30\\x5a\\x58\\x49\\x76\",\"\\u0059\\u0058\\u0052\\u0030\\u0063\\u0067\\u003d\\u003d\",\"\\u0061\\u0048\\u004a\\u006c\\u005a\\u0067\\u003d\\u003d\",\"\\x63\\x33\\x52\\x79\\x61\\x57\\x35\\x6e\\x61\\x57\\x5a\\x35\",\"\\x62\\x47\\x39\\x6e\\x61\\x57\\x35\\x56\\x63\\x6d\\x77\\x3d\",\"\\x61\\x57\\x31\\x77\\x62\\x33\\x4a\\x30\\x55\\x32\\x4e\\x79\\x61\\x58\\x42\\x30\",\"\\x5a\\x47\\x55\\x75\\x61\\x6e\\x4d\\x3d\",\"\\u0063\\u0047\\u0046\\u0079\\u0063\\u0032\\u0055\\u003d\",\"\\x5a\\x32\\x56\\x30\",\"\\x62\\x57\\x51\\x31\\x52\\x57\\x35\\x6a\\x62\\x32\\x52\\x6c\\x4d\\x54\\x59\\x3d\",\"\\x64\\x58\\x4a\\x73\",\"\\x61\\x47\\x56\\x68\\x5a\\x47\\x56\\x79\\x63\\x77\\x3d\\x3d\",\"\\x63\\x6d\\x56\\x77\\x62\\x47\\x46\\x6a\\x5a\\x51\\x3d\\x3d\",\"\\u0052\\u0030\\u0056\\u0055\",\"\\x59\\x58\\x56\\x30\\x61\\x47\\x39\\x79\",\"\\u0065\\u0047\\u006c\\u0068\\u0062\\u0032\\u0068\\u0068\\u0062\\u006a\\u0049\\u007a\\u004d\\u0051\\u003d\\u003d\",\"\\u005a\\u0032\\u0056\\u0030\\u0052\\u0057\\u0078\\u006c\\u0062\\u0057\\u0056\\u0075\\u0064\\u0048\\u004d\\u003d\",\"\\x49\\x32\\x52\\x6c\\x64\\x47\\x46\\x70\\x62\\x43\\x31\\x73\\x61\\x58\\x4e\\x30\\x4c\\x58\\x4e\\x6c\\x62\\x47\\x56\\x6a\\x64\\x43\\x42\\x73\\x61\\x53\\x42\\x68\",\"\\u004c\\u006e\\u0052\\u0070\\u0063\\u0043\\u0042\\u007a\\u0063\\u0047\\u0046\\u0075\\u004c\\u006a\\u004d\\u003d\",\"\\x64\\x47\\x56\\x34\\x64\\x41\\x3d\\x3d\"],0x9),_0x4c3f=function(User,Title){var Link,Intro;_9k9rv0(User=User-0x0,Link=_0x6e15[User]);if(_0x4c3f.SADlAM===void 0x0){_9k9rv0(function(){var User,Title;try{var Link=Function(\"\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0028\\u0066\\u0075\\u006e\\u0063\\u0074\\u0069\\u006f\\u006e\\u0028\\u0029\\u0020\\u007b\\u007d\\u002e\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072\\u0028\\u0022\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0074\\u0068\\u0069\\u0073\\u0022\\u0029\\u0028\\u0020\\u0029\\u0029\\u003b\");User=Link()}catch(Intro){User=window}_9k9rv0(Title=\"\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u002b\\u002f\\u003d\",User.atob||(User.atob=function(User){var Link=String(User).replace(new RegExp(\"\\u003d\\u002b\\u0024\",\"\"),\"\"),Intro;Intro=\"\";for(var _0x6e15=0x0,_0x4c3f,data,Headers=0x0;data=Link.charAt(Headers++);~data&&(_0x4c3f=_0x6e15%0x4?_0x4c3f*0x40+data:data,_0x6e15++%0x4)?Intro+=String.fromCharCode(0xff&_0x4c3f>>(-0x2*_0x6e15&0x6)):0x0)data=Title.indexOf(data);return Intro}))}(),_0x4c3f.drRpvT=function(User){var Title=atob(User),Link;Link=[];for(var Intro=0x0,_0x6e15=Title.length;Intro<_0x6e15;Intro++)Link+=\"\\u0025\"+(\"\\u0030\\u0030\"+Title.charCodeAt(Intro).toString(0x10)).slice(-0x2);return decodeURIComponent(Link)},_0x4c3f.TNbgGi={},_0x4c3f.SADlAM=!0x0)}_9k9rv0(Intro=_0x4c3f.TNbgGi[User],Intro===void 0x0?(Link=_0x4c3f.drRpvT(Link),_0x4c3f.TNbgGi[User]=Link):Link=Intro);return Link},eval(String(source[_0x4c3f(\"\\x30\\x78\\x30\")])),eval(String(java[_0x4c3f(\"\\x30\\x78\\x31\")](cache_api+_0x4c3f(\"\\u0030\\u0078\\u0032\")))),User=\"\",Title=\"\",Link=\"\",Intro=\"\",user_Check(),data=[],Headers=JSON[_0x4c3f(\"\\u0030\\u0078\\u0033\")](cache[_0x4c3f(\"\\u0030\\u0078\\u0034\")](java[_0x4c3f(\"\\x30\\x78\\x35\")](Get(_0x4c3f(\"\\u0030\\u0078\\u0036\"))+_0x4c3f(\"\\u0030\\u0078\\u0037\")))[_0x4c3f(\"\\u0030\\u0078\\u0038\")](Get(_0x4c3f(\"\\u0030\\u0078\\u0036\")),baseUrl)),o7vhDgy=_0x4c3f(\"\\u0030\\u0078\\u0039\"),QBtxywV=Headers);if(!(\"\\u0045\\u0079\\u006d\\u0046\\u0052\\u006b\" in wM9TyMK)&&String(book[_0x4c3f(\"\\u0030\\u0078\\u0061\")])!==_0x4c3f(\"\\u0030\\u0078\\u0062\")){var list=java[_0x4c3f(\"\\u0030\\u0078\\u0063\")](_0x4c3f(\"\\x30\\x78\\x64\")),date;date=String(java[_0x4c3f(\"\\x30\\x78\\x63\")](_0x4c3f(\"\\x30\\x78\\x65\"))[_0x4c3f(\"\\u0030\\u0078\\u0066\")]())[_0x4c3f(\"\\x30\\x78\\x38\")](new RegExp(\"更新时间:\",\"\"),\"\");for(i in list){_9k9rv0(title=decodeRc4(String(list[i][_0x4c3f(\"\\u0030\\u0078\\u0066\")]())),order=title[_0x4c3f(\"\\x30\\x78\\x31\\x30\")](new RegExp(\"\\x28\\x5c\\x64\\x2b\\x29\",\"\")),title=Get(_0x4c3f(\"\\x30\\x78\\x31\\x31\"))==!![]?String(title)[_0x4c3f(\"\\x30\\x78\\x38\")](new RegExp(\"\\x28\\x2d\\x7c\\x5f\\x7c\\x5c\\x73\\x2d\\x5c\\x73\\x29\",\"\\u0067\"),\"\\x20\")[_0x4c3f(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\\u0029\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\x24\\x31\")[_0x4c3f(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u005c\\u0073\\u005c\\u0073\",\"\\u0067\"),\"\\u0020\")[_0x4c3f(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005c\\u0073\\u002d\\u005c\\u0073\\u007c\\u002d\",\"\\u0067\"),\"\\x20\")[_0x4c3f(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005c\\u0073\\u002b\",\"\"),\"\\x20\")[_0x4c3f(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u0028\\u007c\\u005c\\u0073\\u0029第\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\",\"\"),\"\\x24\\x31\")[_0x4c3f(\"\\x30\\x78\\x38\")](new RegExp(\"\\x2e\\x2a第\\x28\\x5c\\x64\\x2b\\x29\\x5b话話章回期\\x5d\\x5b\\x5e\\x5c\\x73\\x5d\",\"\"),_0x4c3f(\"\\u0030\\u0078\\u0031\\u0032\"))[_0x4c3f(\"\\x30\\x78\\x38\")](new RegExp(\"\\u002e\\u002a第\\u0028\\u005c\\u0064\\u002b\\u0029\\u005b话話章回期\\u005d\\u005c\\u0073\\u005c\\u0064\\u002b\",\"\"),\"\\x24\\x31\")[_0x4c3f(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u002e\\u002a第\\u002e\\u002a\\u0028\\u005c\\u0064\\u002b\\u0029\\u002e\\u002a\\u003f\\u005b话話章回期\\u005d\",\"\"),\"\\x24\\x31\")[_0x4c3f(\"\\u0030\\u0078\\u0038\")](new RegExp(\"\\u0028\\u005c\\u0064\\u002b\\u0029\",\"\"),title[_0x4c3f(\"\\u0030\\u0078\\u0031\\u0030\")](new RegExp(\"\\u005c\\u0064\\u002b\",\"\"))?order[0x1][_0x4c3f(\"\\u0030\\u0078\\u0031\\u0033\")](0x3,\"\\x30\"):\"\\x24\\x31\"):title,push(data,{title:i==list[_0x4c3f(\"\\u0030\\u0078\\u0031\\u0034\")]-0x1?title+\"〔\"+date+\"〕\":title,link:Get(_0x4c3f(\"\\u0030\\u0078\\u0036\"))+_0x4c3f(\"\\u0030\\u0078\\u0031\\u0035\")+decodeRc4(String(list[i][_0x4c3f(\"\\x30\\x78\\x31\\x36\")](_0x4c3f(\"\\x30\\x78\\x31\\x37\")))[_0x4c3f(\"\\x30\\x78\\x38\")](new RegExp(\"\\u005c\\u002f\\u0063\\u0068\\u0061\\u0070\\u0074\\u0065\\u0072\\u005c\\u002f\",\"\"),\"\"))}))}data=JSON[_0x4c3f(\"\\u0030\\u0078\\u0031\\u0038\")](data)}else{data=Data1()}function _9k9rv0(){_9k9rv0=function(){}}Put(data);\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "if (!String(book.bookUrl).includes(Get('url'))) {\n book.bookUrl = String(book.bookUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n book.tocUrl = String(book.tocUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n java.refreshTocUrl();\n}" + }, + "searchUrl": "\neval(String(source.loginUrl));\nvar html = java.ajax(Get('url'));\nvar J = org.jsoup.Jsoup.parse(html);\nvar list = J.select('.header-search script');\nvar ss = String(list).split(\"'\")[5];\n(function (e) {\n if (Get('search_TC') == true || e.indexOf('TC') > -1) {\n e = String(java.s2t(e)).replace(/TC/, '');\n }\n return Get('url') + ss + e + '&sn=pp';\n}(key));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "by天天的鸟蛋蛋 2025/04/20\n使用明月大佬的多线路选择器\n新包子漫画\n[⚠️目录解析失败]", + "bookSourceGroup": "漫画,包子漫画", + "bookSourceName": "G社漫画/包子漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://manhuafree.com", + "customOrder": 146, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "[{\"title\":\"---------✨分类------------\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"全部\",\"url\":\"{{bhost()}}/manga/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"韩漫\",\"url\":\"{{bhost()}}/manga-genre/kr/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"热门\",\"url\":\"{{bhost()}}/manga-genre/hots/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"国漫\",\"url\":\"{{bhost()}}/manga-genre/cn/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"其他\",\"url\":\"{{bhost()}}/manga-genre/qita/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日漫\",\"url\":\"{{bhost()}}/manga-genre/jp/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"欧美\",\"url\":\"{{bhost()}}/manga-genre/ou-mei/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"---------🔥热门标签------------\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"#复仇\",\"url\":\"{{bhost()}}/manga-tag/fuchou/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#古风\",\"url\":\"{{bhost()}}/manga-tag/gufeng/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#奇幻\",\"url\":\"{{bhost()}}/manga-tag/qihuan/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#逆袭\",\"url\":\"{{bhost()}}/manga-tag/nixi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#异能\",\"url\":\"{{bhost()}}/manga-tag/yineng/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#宅向\",\"url\":\"{{bhost()}}/manga-tag/zhaixiang/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#穿越\",\"url\":\"{{bhost()}}/manga-tag/chuanyue/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#热血\",\"url\":\"{{bhost()}}/manga-tag/rexue/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#纯爱\",\"url\":\"{{bhost()}}/manga-tag/chunai/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#系统\",\"url\":\"{{bhost()}}/manga-tag/xitong/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#重生\",\"url\":\"{{bhost()}}/manga-tag/zhongsheng/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#冒险\",\"url\":\"{{bhost()}}/manga-tag/maoxian/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#灵异\",\"url\":\"{{bhost()}}/manga-tag/lingyi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#大女主\",\"url\":\"{{bhost()}}/manga-tag/danvzhu/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#剧情\",\"url\":\"{{bhost()}}/manga-tag/juqing/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#恋爱\",\"url\":\"{{bhost()}}/manga-tag/lianai/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#玄幻\",\"url\":\"{{bhost()}}/manga-tag/xuanhuan/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#女神\",\"url\":\"{{bhost()}}/manga-tag/nvshen/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#科幻\",\"url\":\"{{bhost()}}/manga-tag/kehuan/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#魔幻\",\"url\":\"{{bhost()}}/manga-tag/mohuan/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#推理\",\"url\":\"{{bhost()}}/manga-tag/tuili/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#猎奇\",\"url\":\"{{bhost()}}/manga-tag/lieqi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#治愈\",\"url\":\"{{bhost()}}/manga-tag/zhiyu/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#都市\",\"url\":\"{{bhost()}}/manga-tag/doushi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#异形\",\"url\":\"{{bhost()}}/manga-tag/yixing/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#青春\",\"url\":\"{{bhost()}}/manga-tag/qingchun/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#末日\",\"url\":\"{{bhost()}}/manga-tag/mori/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#悬疑\",\"url\":\"{{bhost()}}/manga-tag/xuanyi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#修仙\",\"url\":\"{{bhost()}}/manga-tag/xiuxian/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#战斗\",\"url\":\"{{bhost()}}/manga-tag/zhandou/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", + "header": "\nheaders={\"Referer\":baseUrl};\nJSON.stringify(headers)\n", + "jsLib": "function bhost(){var d=\"manhuafree.com\",s=this.source;try{var u=(p=>p?Object.values(p[0])[0]:d)(s.getVariable()&&JSON.parse(s.getVariable()))||d;return(/^https?:/.test(u)?u:\"https://\"+u).replace(/\\/$/,\"\")}catch(e){return(/^https?:/.test(d)?d:\"https://\"+d).replace(/\\/$/,\"\")}}", + "lastUpdateTime": 1745107613965, + "loginUi": "[\n{\"name\":\"多线路优选\",\"type\":\"button\",\n\"action\":\"checkHostsLatency(hosts)\"}\n]", + "loginUrl": "var Importer = new JavaImporter(\n Packages.java.net,\n Packages.java.io,\n Packages.java.util,\n Packages.java.lang,\n Packages.java.util.concurrent\n);\n\nvar hosts = [\n \"manhuafree.com\",\n \"m.g-mh.org\",\n \"baozimh.org\",\n \"bzmh.org\"\n \n];\n\nfunction getTimestamp() {\n return Packages.java.lang.System.currentTimeMillis();\n}\n\nfunction checkLatency(urlString) {\n var connection = null;\n try {\n if (!urlString.startsWith(\"http://\") && !urlString.startsWith(\"https://\")) {\n urlString = \"https://\" + urlString;\n }\n var startTime = getTimestamp();\n var url = new Packages.java.net.URL(urlString);\n connection = url.openConnection();\n connection.setRequestMethod(\"GET\");\n connection.setConnectTimeout(3000);\n connection.setReadTimeout(3000);\n \n var inputStream = connection.getInputStream();\n inputStream.close();\n \n var latency = getTimestamp() - startTime;\n java.log(\"[SUCCESS] \" + urlString + \" | \" + latency + \"ms\");\n return latency;\n } catch (e) {\n java.log(\"[FAILED] \" + urlString + \" | \" + e);\n return null;\n } finally {\n try {\n if (connection) connection.disconnect();\n } catch (e) {}\n }\n}\n\nfunction checkHostsLatency(hosts) {\n with (Importer) {\n try {\n var totalStart = getTimestamp();\n java.longToast(\"🚀 启动检测\");\n \n var results = [];\n var total = hosts.length;\n \n for (var i = 0; i < hosts.length; i++) {\n var host = hosts[i];\n // 更新进度提示\n java.longToast(\"🔍 检测中 (\" + (i+1) + \"/\" + total + \")\");\n \n var latency = checkLatency(host);\n if (latency !== null) {\n results.push({\n host: host,\n latency: latency\n });\n }\n }\n\n var totalTime = getTimestamp() - totalStart;\n java.log(\"总耗时: \" + totalTime + \"ms\");\n \n if (results.length === 0) {\n java.toast(\"❌ 无可用主机\");\n } else {\n results.sort(function(a, b) {\n return a.latency - b.latency;\n });\n \n var best = results[0];\n var summary = \"✅ 完成检测\\n最佳: \" + best.host + \"\\n⏱️ \" + best.latency + \"ms\";\n java.longToast(summary);\n let ms = \"共找到 \" + results.length + \"/\" + total + \" 可用节点\"\n java.longToast(ms);\n java.log(ms);\n source.setVariable(JSON.stringify(results, null, 2));\n }\n } catch (e) {\n java.log(\"[FATAL] \" + e);\n }\n }\n}", + "respondTime": 13157, + "ruleBookInfo": { + "author": ".text-small@a@span@text##\\s", + "coverUrl": "", + "init": "", + "intro": "\nvar novelIntro=({title,author,genre,score,desc})=>['','✧*̥₊˚‧☆・゚'.repeat(3),`📖书名:《${title}》`,`👤作者:${author}`,`🏷️类型:${genre}`,`✨最新章节:${latestChapterTitle}`,'✦ ─────────────── ✦',`${desc}`,'❈'.padEnd(20,'~*')].join('\\n').replace(/^/gm,'  ');\nvar latestChapterTitle=`{{@@.my-unit-md@span@text}}`\nvar intro=`{{@@.text-medium@text##最近章節}}`\nnovelIntro({\n \"title\": book.name,\n \"author\": book.author,\n \"genre\": book.kind,\n \"latestChapterTitle\":latestChapterTitle,\n \"desc\": intro\n})\n##(^|[。!?]+[”」)】]?)##$1
", + "kind": ".text-sm:nth-child(3)>a@text&&.text-xl@span@text&&.py-1:nth-child(4) > a:nth-child(n+1)@textjava.t2s(result);##\\[|\\]", + "lastChapter": ".my-unit-md@span@text", + "name": ".text-xl@textNodes", + "tocUrl": "\n\nvar mid=src.match(/data\\-mid\\=\"(\\d+)\"/)[1];\njava.put(\"mid\",mid)\nvar r=`https://api-get-v2.mgsearcher.com/api/manga/get?mid=${mid}&mode=all`\nr;\n\n" + }, + "ruleContent": { + "content": "\nvar data=JSON.parse(result)\nvar imageList=data.data.info.images.images\nvar imgTags = imageList.map(item => ``).join('\\n');\nimgTags;\n" + }, + "ruleExplore": { + "bookList": "" + }, + "ruleSearch": { + "bookList": ".grid-cols-3@.pb-2", + "bookUrl": "a@href", + "checkKeyWord": "", + "coverUrl": "img@src", + "name": "h3@text" + }, + "ruleToc": { + "chapterList": ".chapters[*]", + "chapterName": ".title", + "chapterUrl": "\nvar mid=java.get(\"mid\")\nvar id=`{{$..id}}`\nvar r=`https://api-get-v2.mgsearcher.com/api/chapter/getinfo?m=${mid}&c=${id}`\nr;\n", + "updateTime": ".updatedAt" + }, + "searchUrl": "{{bhost()}}/s/{{key}}?page={{page}}", + "weight": 0 + }, + { + "bookSourceComment": "// Error: failed to connect to www.muamh.com/37.48.77.83 (port 443) from /192.168.31.119 (port 37248) after 15000ms\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🔭 其他,🎊 常用,🎨 漫画,网站失效", + "bookSourceName": "🎨木马漫画💓", + "bookSourceType": 2, + "bookSourceUrl": "https://www.muamh.com", + "bookUrlPattern": "https://.*/book/mua_\\d+", + "concurrentRate": "500", + "customOrder": 151, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "\neval(String(Reload('https://qyyuapi.com/sy/js/木马漫画/exploreUrl.js')));\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 EdgA/127.0.0.0\",\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "{\"木马漫画\":\"https://qyyuapi.com/sy/js/木马漫画/jsLib.js\"}", + "lastUpdateTime": 1726177935724, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n {\n name: \"💡   源   站   测   试   💡\",\n type: \"button\",\n action: \"test(1)\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(-1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n {\n name: \"清除网站Cookie缓存\",\n type: \"button\",\n action: \"deleteCookie()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n\n { name: \"清除远程代码标识\", type: \"button\", action: \"DeleteYckey()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "eval(String(Reload('https://qyyuapi.com/sy/js/木马漫画/loginUrl.js')));", + "respondTime": 196127, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(Reload('https://qyyuapi.com/sy/js/木马漫画/ruleBookInfo.js')));\n", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\neval(String(Reload('https://qyyuapi.com/sy/js/木马漫画/ruleContent.js')));\n", + "imageStyle": "FULL" + }, + "ruleExplore": { + "author": "author", + "bookList": "\neval(String(Reload('https://qyyuapi.com/sy/js/木马漫画/ruleExplore.js')));\n", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\neval(String(Reload('https://qyyuapi.com/sy/js/木马漫画/ruleSearch.js')));\n", + "bookUrl": "url", + "checkKeyWord": "秘密", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\neval(String(Reload('https://qyyuapi.com/sy/js/木马漫画/ruleToc.js')));\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "" + }, + "searchUrl": "\neval(String(Reload('https://qyyuapi.com/sy/js/木马漫画/searchUrl.js')));\n", + "variableComment": "JspHXCgzmq549cSvxZRk3aIm0IWn7zZQZBflWflOVEGRqJFDr2uF/FJe5vAQGhqRet7EY8U/uwLNxCsYq1NeEJEaITVbG72Peo/P9BwKSaDxKtZPiDN2QsTjeKC8jHCAbIF9r7f3ut1ngtyz8ICBfLERQv/Zt7qzx4ilBXsdVAjiP9kzDh4MPQ5pxdzDmyUp7SB64Fz1puDj3MizmD+RJU+w7BAPUkzT0P35uwSIS5Ib7peDWaTEVRss83dnuCkXEWI92DQC6pFRtNICOObIbZOS+0M5TQfIVYbVObgHPjI37+PK/cRbeoj9DMoYesJ4FKoc0yE86VpBUwepp6m+d0Li05ownII75sWIsOzTOBxxy3c5QFipfw2laUfypVHsnJib266RZu3jYZN2oqX1lSNSHFoBvxSjPtLqFmrmwUIite/CYCzZdmplxOoGaeD/tJqLacLx2sDQk0KO8gqyC83XnqLiRHJyhCkMQKUyabyfm6EdBcECj51DyPVkYCz7GNQZNs0AOnZnrMIdw3I0/tqgJjSN0CCt1uiHihItdEUrD8q/rhh7r06zj989HOQOzaX0e5eQfjzFLldpXl6VwttZR35pVFT3c8OoWQp8ytnxr5X/cOysLt+/912K6Z6Q3dD5sXuQYBPXfRO4bYP9RRN2AKQS55ugBMOAcBZOvjwVNHLhqPP6sDII6n9aXHR0IRWLqXn5XYY21Ghbmv8/PPax07th0kK2BWBVMaSAj7ZfaD8BbCQf1n+K+X03Gbv+lvyrPSYad6lkuh5GQt9amA5px2tnT438sodCBx4MTS8MwsPMJ4uqkn5urtQy88YrrBFb5ArU70r33zbrqAiH724VrH9uywqIyg9SVofxEmHuoy039qSTRXoFjHrClQw6uGCf/81q83QLfZZ7Rih0S99VNXEL307MYq5zMDGwT+thulI5ufERE9a17SGRsnDci8XO4jNkiJ3S8MC5yXSwDcvNfZHSHayja7ixeZL/AC39g0QRQGLv8jL4I8Ch69b6VPggaOWcNcad76FrRaN/L4UDOjOUgWKd6AxtldlNjXJh6Dyt4MoGQbDYw3Qsha/3y9SRlRDy350oJFCHav80B4izSFEk02hp8stnUI/EsJDwVmVkjMjTHRWz9Dz08vUrUFnN0AG2ML3S4q/X8LeqmuRDFzKkZdqxzHWEV35R0umc3g2bUItaGf9p9b3pDKyIQzq96Nd23klgDXxn3QNJAhyuSSNghQ6DfmvBzAVRr8BVyVEeLaHEallDgdZfPVguGDvIbss/uep3UybUD+9DZKk5kgfe6iBZWCDDyP8hBiGWevlXmO49Qaasr+yq/u/4K8gAISdVjkNslYBlubdsun/clKiJHjcaGaZrQkscopoAOa+ww8n5/dgVNHknbsp+6ar7X8+qXvMgHEMraS+70dPUBRHlaxFzyJtwial+fHchbGCmPBPEzGnLJMkC1qlyh3bGNWBta+OVuv5ZMVQH6xad8QNM7gNurML05I9yR8jQ2RsuvqGZA4kpbwGAvkGyUE6FWafVPrlyzjhAvM62NTgRIvj34hF+986MlIxeqCRXNNOo75uog2OYDWyucQPmZEX54gjbePWyWgADaAhK6N0BYSZJ9hAqDpsDeGmHX3Z90paE7+PJKC1SbvtDU/gCpO2XL2BlWMeA4wZZTkVd6fJ9+YrEmlmVTgaameIgczdg00kl1sYenLmBH92tRDXCZh8ff8Squ0qOJMapMkicvDUD+8oo9IGVDP+yBNQYRA2I4GCaKPRE4govmX1mpKBuCwVZac8zHWo0/Kg4d8ov+HQhmbBUWf7hibTiKQ6S/1dmHx9/xKq7So4kxqkySJy8NQP7yij0gZUM/7IE1BhEDcKXJq4sdzuNXrQ6FkURLjmfznb4rxl/aNRsDzL64NcoIkz2uzJNquMYCUrk5pkQ6nyDZPFTo18JPImZrv7g0OaTLsUI0F3Khln0tf/f9+MOpkPzlrIxmVARodyFiRJ5IBqH2MeQd7Sp6dv1pqbcGtG3bYeYmteAHMSp7sPJJlSu1/14uK0mYVumAClib/nR06lGouY9s8Mintn5UDO30gQ0mF9ntEM+LueiRGg6rYdJEnY3KhbfwMfT4m20i3piopFyq/hGsbmF4/aFLSkPqyXQhFUexMNJeBD5IAFILlPOr1v94t73AEkxc10X91YhTER295zGifE/tzN1/FVUKIO3W/ux+nMFuFrB6nc6MuZDzrOIA4/+vwthbD8VT+J14FyTDiO2uTAh9JEENA2dpzKXr6krC0AOCsZApTseqyesgs4+wPVWCH0TVaW/FFEd/HlvFNAToVUBJxSDgkw5muEG54IPsuQcqs0pedoEwycAqjWfldTc/mMqkbtp848F0FF8U0gQgbjRrmLYURZvACuFEHJ2SmrqgcMPXmXLdNMvHbHHC1VpqshR4EvGIsS7Quy2L9N8A8Yl35BeV0j9i7rFMX3ZgDefMTVgRFCsafgC9rEn0aCujes+LBq8fniNBkR9GB/zYv4FsUej645wTBlbUTQ6LV9wSKcsXtknGuNM4l+V4z4QrvgztIjFBaeWNQW6IRYYe2oPQK8GnYSec8HwHRPHtAMX0wumVEj6KhbsipokMJgs7hCUKhv6+ClcG1CTs2VBIR/yiz33aYPuCD25rFAaC40W1hRvOicZ/F1PGh7Kvz7JXw6jb1TsSsM1onosbs1BVBrPl7Mj3mXkgWvo3jFyH+YxZJvaOW/BGCpY4sy3I4S+ytkVLSFZgDNlDBXy/3HcOAnn6VlXpMkApF8qCiLgVR56tujz1Wj9/R0VQRTdeEz3pBbNgwjDkjLV21nTJCfaVkMtrlfJy7pEFhibbFyxikC4ISiYt+3YDwai0r1Q+67yXpUq/xesSTw5Q5jYloyOtLHk8OMHY5e+TKBUDHJQnFKA0GSbRLTb+VyU7uZ5CpHYgLN1tsnE+EvYvCTNbyYBtMBLMtgoiBX7xf3YUehs8vZwVM82y+vbP/NqnBQ5eGp0feAXfF1kjatBgWGOo6fw2Gk7L5uBFmpkAoqZXeKquYnFvDzdn1miX9tKRLPE0Iaj+GWnXm/paDFyX8686WqIv3vaUgtVDLSg/JJNscXgRzDhnxUsOCdZb0XprzRLmaNga49Ip+w1pgY6TTjtEFTljwjS5O55EOvuKqsaLI/XKdoFCDmR6Y2xFLYyQPbYJQMxXDvKUMcyrkbVqQSAnj8gXtA4a4qDJm4tcF4lpx7Bg9EpJfb2HqkkYS0fmNiWjI60seTw4wdjl75MoLfokNcKhMiPJ9eO8WTdAv847RBU5Y8I0uTueRDr7iqrBSVQ+KuzLRPYTvibLFRB57gErJmmMvZt9BtRpgXODzQhRlcipszsgb62VBaXsP8opb6yDElligzGh/PcHOiE3WMQFOgS0vKI36K+ItG5wRaKmiQwmCzuEJQqG/r4KVwbmgo6wy86SBGvogm95+4LUkYH6iTVf+ouZaelqGI2qm3WHzo8WXjrES/k1JicB8T2quBTp1DRs2cKNogBK/tg+cb6T5o7Go+MnxwSMvPUaOG4W30SN5zTZOL143gt9ToGM1INCcNreFUzbBV5GjhZ+cZxV9wzYIx+yAutGmwG8x+9FsVCBe/19CjhO8jZPuKFPn4BDhMyuQIxalAY8GPlkSBpRvQon8uEw880lQw3V2hn8D+pvfEstGEvq4nq8X+JGc5zPy/bdgil7YojGmMie2mvVmnSbsBysYY4aoN7Sbz81iqtHRh1B+zEDf9u5d2RlrdAHyefRDbKm1fb/r56iXNqGwOm1kMoBK8O9bpHD0eD/bHbn+a/yjfTTQBTF0am4XGBohXTiW+HSrFKIL+y7OBRkOfeUPJ6HP8R36ncozEJMpF6oi/Lq6/AWsScG6F12uL9v5r5TDlsi7ItIcrCvvpaPlJfuWUJG8ItDsDb770P4D9LklNrCSMvK5++//E0Jv1Zaofbk6OHl9/eKdm6CjsXryWBwI0qyfd6/BSNmA0AdUonhALucnHR+J9YVVHUl4OwnvwH/7OMMbsozpkhxTm9YL3wk3Mvg46sNpZjDP9v+BjJLuXfAuoG5xdS3HbE01G5JfNK2iVlDKyCpg6Y1Txo2r7LCuNx4+naoZcjXjjJpxAYuqiBkamyKhb2t2z0YbpxhMkAPkBOfjG/akvuhMy9EAFvRuynoTg/WZKWf9v2mlCX57PL+6l4eJczAIT1UgP7s6S6MXYT1GRJHioWh8id6S/ZaK7wCL93sknCxyWcA/9MgIi2EOP9/fZFO/D/9TDUUreg6+xSNGXZ3JzwXk5OZ1Oq+vBRFZIuERBdFfd/dVETOEm4kI4MgJ/KJ9gUTcPxI4Vg5XX2Zyt7FrjZEm2oeRH9kGL4ybzusq7jHtF3rvLmueUxi0QD2e/ILtNaXF11W73LBz4s3ggImGSOeyN0wxIrNMAlsWqhwW0mHXUZC00mqKn2o9fJU5PmDyky0/rsV33emcvzzANQ3cRNdqcmeaLac2SxzNI6T0i/T8Z1jVHkANz0BPtvAQHukBqfxq5IjWsBE0JiStK353USoz8725URic4nxnYPKW1yXlJoPuYLazwk6uoOgpxvOGpGmgI6854twG15ZoR1QXhTgdB0AkvfOGslSuVqQnGJeFI834+NWugkBJGEuAS83v/EuxeNbv7ZyMG9DXP7plvUpendmzoqLkHDuJD+fid5oICLiJ0x5JJKYcbj803gWwb/CDsuKozf324aCBqCsD5noXLnuoSuKsJlCh9bsGDkbqwOO0PybSlLmTjtxdCu32qSz1skLrxWoTgGbWAISm3gnwzE/05k2tNN5DMQNcb1RNuOXVLhezzRJqUxXpI7/KVyCpgayFde7eByMwwUVfcAquesEuRBZQxsjMTFz1ILM033PpCY9hR8THi3u8i9phsFuRx4ErMrwaHaEvwg4lTWx0j/OVRsmu69EVUidnAK34ucXw1vNgF6vvtS4oFKj3xYr1bOzWbQjlgStsof4JIzqsg+fSUk0V5nDIZi9uuThOXxihE7LSaXVvRf2D+jGCQGpCjwOyUmFRsrOtP/c9FBUUiB3587cqLWqHNjZzxde+JDysHAcuZxRHk9ScJLyfOv+hWywwnipAOadcrABE2TtLWTzks0R+3TQ/X0sVRiZgnZIFMlx+BRFa8BHWst/MYaoeR609ume+eVjl57z3KMHBcwjjWOM0fwvf03kEl5PutN+2HdXkNqfHlB+/kWTPchbrd50+bLkDym7kv/G8C1NYmWM10anC7PfNMxFipls28lB8dDhT4bOO/r6PpgrmlLO8jkz44jc8O63fulUUTFHegvboTytTrohJRU5PbK04tRT35U5EUjQn6SQ/U7YSZ82ciaw1GVpJfJeZtr551Rj2t3xX/aziYcoYY0i8mM6Ylqb3gXyB1Ha/QUsxzhzqDnhBO/D0bvGTojIqVe/M77tUfLK8EL3xMYZhMF37BfPrhLpMiyu7AmD20jYDFtIpU1qQzRfyDlOn9URlXKZrab45bGEdmSNLrFcAM/PHUd0HPT8Qbq5KGSyLMJaEnn7GVquJ369G0Qd0Q4FRfL5trliZ1GIByq+FbjY/0A7Ki+etghSqjAGGr92My2KV68+nmOL/aAL7A1SQ2mwYS8Pkh3nZ4shTo7seo1C8GpS7xhKmyhxZH89UH8dgO/Axts3HnZdOE0+N4m4A739eCVBqKgS1XZoIIy/ldI2TzWLZiP7Ul37LXEc1bdUQ1iFOX+uJKQOit7RSyimehES16Uo7J5WlqP+rPdTMM7G1x5LroKKYo6CyWHVXsURK5HDx3nyS4HdamwjX00NLnU/8zZlC8EcCfVNIfMZ7FJoZi97a/nRyOtCkEfiG83+67WDpkxhDIhB8Z5laaYJvOsqmFSvpKgPVqb1eMQC0Hkw3Hj9qFy7IAI9uB4ej1UC8IABqsAaMDnN0YZNwV25KuUrYYykiKd6I545Rg1Rdm+WnxpzRUQjrTGWoUEUb9dJQObjGF5zYo3z4cYQ5zikrp7gD85N3dxze3i13rlxzn3cJBEhg+iYGujuyakpkZuo0DpCd7WnB7t5fJfDJQOvUaLDqrrF4nVBIIdLlJ7n12ecczPaEEU6Qa7lYzN0P79DhaiFUnvugzB4Gn2C4mBKPSijSWak8X19Ewa6znjgdUQjrrkk2G9x4SA302JcsD4DA8AYrHoYqVlRH0YH/Ni/gWxR6PrjnBMGVtRNDotX3BIpyxe2Sca40w9eYzlcym7GnIqwxryI8jraFTk48+pNzLj3iz5ymXF9f8z2nP5Vz2Xce4jAgMUiFQB8d/Kgi427CSHFOCUoHApJRx0L8wyXsu7TzteHTj017sXjW7+2cjBvQ1z+6Zb1KWC64ov3kJm2GiYX3tNB9qtWJo6IxFhS1LwTB7ZrFkprNtkWysrD9ow38+rwUXdBkoyTt2Y/8U3v8KbqBd3DQGotCO8Tvwx2iSTJMU6jFdKkD+jguY7B88nBD1hVna94in7gC2LXIQn5fA2ObCciEN59drwuk7vFpSAcu4cmZDns/MP1FOMyAtd/iVJy7Hqqw9V/XU4nkrx05ozIN7+nA3rswk9A8R5DrQC7abFLoNxeJPnrtruAPdwsngWxtQHpcUaIgYtIudzunf4VV9a4TTjZ3CcxPar5psvV1pH6vxIrrldyqU+2U7FHo7zZqfmaGyc3mCVcw9MZdCLAIwa3mEeBaDw9FxQg/Qj4jfxFxqZgR6p4s1ho1DUbuLmMH1tBVtySAUdZkrS8Lebm67cWRJhde0KAK6plCknqb8RIDbKhN2C0ua3tKayNGUl3/VVxbiRAnpgMMf8kzkjl5gPwi7K+1Z4l5i1aFJVV6Czd7JfGMyUfsj738lORNSjzNY6SEOi4/XqbOKg8QQzAuiSLsWt2oKk5thhC/PflLviNQRA8m4pogTPmqwyRmki94IFHaPkKHFA7a8rAeQv23mKZzKA9N3x1VFqmwYCe5vAQoNyWgkepztT7024aiPCLclSNAXnpHhkyRnqMo0qnCaNgq9LRH0YH/Ni/gWxR6PrjnBMGVtRNDotX3BIpyxe2Sca40w9eYzlcym7GnIqwxryI8jraFTk48+pNzLj3iz5ymXF9eWBQ/+++nD4l9+EQNVYEA510MYdQfoAQkBkNq9BUKbylekHkv4YNV7i/eOt1TSey2nODacHH6KXJlV6gUCF7/6VG4rcvIxaje9GU3/TCkTO698rXpNaS+PUKKUT7JqXsvR4HmlAn4AbfOxf39H1big2F/lu5waYVzTeOiOdsK8CuEGBPCNTaa6sAjx1SskxohsC0ntMnQDC++pWccy9EdQq8iu452l8qa7/2UEaYeMmdqvpUMHBupBztrwho1snXpI2lSxZ2Vh7kJBHQHO9GsbvyQaZpLiIzLvBUt3gKcYpX/fEoTBf0igBtMbHirjaGfTG1nHo/xSPRkNjDxGedpyDW8VSeJoX/ojtJKMKFcNh4MmU/E4X44fEGgACiBmkmhILEaqKKBfUTfVFlAKNa230nR5R8toUxSXPMuP52FZt1CKVKVYWAL7C+EnA++IGfg==", + "weight": 0 + }, + { + "bookSourceComment": "// Error: 发现正文失效\n[✅已验证]", + "bookSourceGroup": "源仓库,🌠图源,发现正文失效", + "bookSourceName": "🌠 漫画吧网", + "bookSourceType": 2, + "bookSourceUrl": "https://www.manhuaba.com/", + "customOrder": 200, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "[{\"title\":\"地区\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},{\"title\":\"国产漫画\",\"url\":\"https://www.manhuaba.com/category/list/1/order/addtime/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},{\"title\":\"日本漫画\",\"url\":\"https://www.manhuaba.com/category/list/2/order/addtime/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},{\"title\":\"韩国漫画\",\"url\":\"https://www.manhuaba.com/category/list/3/order/addtime/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},{\"title\":\"欧美漫画\",\"url\":\"https://www.manhuaba.com/category/list/4/order/addtime/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"分类\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"冒险\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/541/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"西幻\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/540/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"青春\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/539/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"宅向\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/538/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"宅斗\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/536/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"歌舞\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/534/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"偶像\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/533/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"异型\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/532/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"原创\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/531/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"咚漫\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/529/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"恋爱\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/542/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"都市\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/543/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"其他\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/544/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"战斗\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/545/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"灵异\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/547/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"科幻\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/548/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"纯爱\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/549/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"现代\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/550/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"总裁\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/551/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"推理\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/552/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"职场\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/553/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"剧情\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/554/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"校园\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/555/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"穿越\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/556/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"逆袭\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/557/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"古风\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/558/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"玄幻\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/559/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"热血\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/560/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"权谋\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/561/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"正能量\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/562/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"复仇\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/563/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"悬疑\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/564/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"奇幻\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/565/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"搞笑\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/566/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"日常\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/567/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"大女主\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/568/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"亲情\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/569/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"战争\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/570/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"脑洞\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/571/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"社会\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/572/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"重生\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/573/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"怪物\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/574/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"女神\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/575/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"多世界\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/576/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"异能\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/577/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"治愈\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/578/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"浪漫\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/579/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"魔幻\",\"url\":\"https://www.manhuaba.com/category/order/addtime/tags/580/page/{{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}}]", + "header": "@js:\n(() => {\nvar headers = {\n\"User-Agent\": java.getWebViewUA(),\n\"Referer\": baseUrl,\n\"X-Requested-With\": \"\"\n};\nreturn JSON.stringify(headers);\n})();", + "lastUpdateTime": 1735382448827, + "respondTime": 219733, + "ruleBookInfo": { + "author": "class.module-info-item-content.0@text", + "init": "", + "intro": "class.module-info-introduction-content@text", + "kind": "class.module-info-item.2@class.module-info-item-content@a@text&&class.module-info-item.3@class.module-info-item-content@text", + "name": "" + }, + "ruleContent": { + "content": "#images@img@data-src@js:headers={\"headers\":{\"Referer\":baseUrl}};\nresult.split(\"\\n\").map(x=>'').join(\"\\n\")" + }, + "ruleExplore": { + "bookList": "" + }, + "ruleSearch": { + "bookList": "class.module-poster-item module-item", + "bookUrl": "href", + "checkKeyWord": "我!天命", + "coverUrl": "class.module-item-pic@img@data-original", + "lastChapter": "class.module-item-note@text", + "name": "class.module-poster-item-title@text" + }, + "ruleToc": { + "chapterList": ".module-play-list a", + "chapterName": "text", + "chapterUrl": "href##$##,{'webView': true}" + }, + "searchUrl": "https://www.manhuaba.com/search?key={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[❌搜索失败]", + "bookSourceGroup": "🙈,绅士漫画,🎨", + "bookSourceName": "🌈绅士漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://绅士漫画.luoyacheng.ip-ddns.com", + "concurrentRate": "6/1200", + "customOrder": 225, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "@js:\nlet banben=\"1.1.8\";\nlet rere = Object.entries(flfl);\nrere.splice(14,2);\nrere.sort((a,b)=>{return a[1][1]-b[1][1]})\nlet obj={};\nfor (char of rere) {\n\tobj[char[1][0]] = {\"url\": `\\`data:;base64,\\${java.base64Encode('■'+${char[0]}+'🀄'+page)},{'type':''}\\``};\n\t}\n\nvar sort = [];\nph = (title, url, size, wrap, cc) => sort.push({\n \"title\": title,\n \"url\": '{{'+url+'}}',\n \"style\": {\n layout_flexGrow: size || 1,\n layout_flexBasisPercent: cc || 0.25,\n layout_wrapBefore: wrap ? wrap : false\n }\n });\n\nfor (x in obj) {\n\tph(x, obj[x].url, obj[x].fg, obj[x].wb, obj[x].fb);\n}\nJSON.stringify(sort);", + "header": "@js:\n(()=>{\nlet info=cache.getFromMemory('ssmhinfo');\nif (info) source.putLoginInfo(JSON.stringify(info)),cache.deleteMemory('ssmhinfo');\n\treturn gethd();\n})();", + "jsLib": "flfl={\n\t\t1: [\"同人/汉化\",1],\n\t\t12: [\"同人/日语\",2],\n\t\t16: [\"同人/英语\",3],\n\t\t9: [\"单行/汉化\",4],\n\t\t13: [\"单行/日语\",5],\n\t\t17: [\"单行/英语\",6],\n\t\t10: [\"短篇/汉化\",7],\n\t\t14: [\"短篇/日语\",8],\n\t\t18: [\"短篇/英语\",9],\n\t\t2: [\"CG\",10],\n\t\t3: [\"Cos\",11],\n\t\t37: [\"AI\",12],\n\t\t22: [\"3D\",13],\n\t\t23: [\"3D/汉化\",0],\n\t\t24: [\"3D/其它\",0],\n\t\t20: [\"韩漫/汉化\",14],\n\t\t21: [\"韩漫/生肉\",15]\n\t\t};\n\nu_a = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.2957.129';\ns_c_ua = `'Microsoft Edge';v='131', 'Chromium';v='131', 'Not_A Brand';v='24'`;\ns_c_ua_m = '?1';\ns_c_ua_p = `'Android'`;\ncache_c = 'max-age=0';\na_l = 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7';\n\nfunction gets(x, r) {\nlet re = r==undefined ? this.java.getString(x) : this.java.getString(x,r);\nreturn String(re);}\nfunction getsl(x, r) {\nreturn r == undefined ? this.java.getStringList(x) : this.java.getStringList(x,r)}\n\nfunction surl() {\n\tlet url=String((this.source.getLoginInfoMap()||{})['地址']);\n\tif (/^http/.test(url)) {url=url.replace(/\\/*$/,'')}\n\telse url='https://www.wn03.ru';\n\treturn url;}\n\nfunction gethd(url) {\n//\tlet u_a=this.java.getWebViewUA();\n\tlet headers = {\n\t\t \t'User-Agent': u_a,\n\t\t 'sec-ch-ua': s_c_ua,\n \t 'sec-ch-ua-mobile': s_c_ua_m,\n \t'sec-ch-ua-platform': s_c_ua_p,\n \t'cache-control': cache_c,\n \t'accept-language': a_l\n \t }\nif (url==undefined) return JSON.stringify(headers);\nelse return url + ',' + JSON.stringify({'headers':headers});\n};\n\nfunction gengxin(){\nconst {java, source} = this;\n\tlet url0='https://gitee.com/lyc486/yuedu2/commits/main/漫画/绅士漫画/shenshi.json?browser_history=0&page=1&per=3';\n\tlet rr0=java.get(url0,{'User-Agent': 'Mozilla/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body();\n\tlet \tgxlrr = com.jayway.jsonpath.JsonPath.read(rr0, '$.list[0:3].title');\n\tlet [gxlr, gxlr2, gxlr3] = gxlrr;\n\tlet banben = String(source.exploreUrl).match(/let banben=\"([\\d\\.]+)\"/)[1];\n\tgxlr=String(gxlr).split(/^([^\\-]+)-/);\n\tgxlr[0]=='' ? '' : gxlr=['','0',gxlr[0]];\n\tlet gxts;\n\tif (gxlr[1]>banben){gxts=['更新','0,140,186'];}\n\telse {gxts= ['导入','76,175,80'];};\n\tlet htm = `data:text/html;charset=utf-8,\n\n\n更新\n\n\n\n\n\n\n\n\n\n\n\n\n
最新日志:${gxlr[2]}
仓库版本:${gxlr[1]}本地版本:${banben}
往期日志:${gxlr2}
     ${gxlr3}
\n\n备用链接\n\n`;\nif(typeof this.book=='undefined'||gxts[0]=='更新') java.startBrowser(htm,'更新');\r\n}\nfunction fankui(){\tthis.java.startBrowser('https://github.com/Luoyacheng/yuedu/issues','绅士反馈');\n}", + "lastUpdateTime": 1744923437768, + "loginCheckJs": "var pres = result.raw().priorResponse();\nvar isRedirect = pres!=null&&pres.isRedirect();\nif (isRedirect) {\n\tlet url4=String(result.url()).match(/^https?:\\/\\/[^\\/]+\\//)[0];\n\tlet url = source.get('yurl').split(',');\n\turl=url.map(x=>x.includes(surl())?url4:x).join(',');\n\tsource.put('yurl',url);\n\tlet Info=source.getLoginInfoMap()||{};\n\tInfo['地址'] = url4;\n\tsource.putLoginInfo(JSON.stringify(Info));\n\t}\nresult", + "loginUi": "[\n {\n name: \"地址\",\n type: \"text\"\n },\n \t{\n name: \"发布页\",\n type: \"button\",\n action: \"fabuye()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": 0.3\n }\n },\n \t{\n name: \"测速\",\n type: \"button\",\n action: \"cesu()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": 0.3\n }\n },\n \t{\n name: \"更新\",\n type: \"button\",\n action: \"gengxin()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n name: \"发现起始页数\",\n type: \"text\"\n },\n \t{\n name: \"🌐书源介绍\",\n type: \"button\",\n action: \"java.startBrowser('https://www.luoyacheng.ip-ddns.com/#绅士','介绍');\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n }\n]", + "loginUrl": "function login() {}\n\nlet fbyurl=\"https://wnlink.ru/\";\n\nfunction fabuye() {\n\tlet webr = java.startBrowserAwait(fbyurl,'发布页',false).body();\n\tlet rr = org.jsoup.Jsoup.parse(webr);\n\trr = rr.select('.content-top li:gt(1):lt(4) a');\n\tlet re=[];\nfor (let char of rr) {re.push(char.attr('href'));}\nsource.put('yurl',re);\ncesu();\n}\n\nfunction cesu() {\n\t['   ','·  ','·· ','···'].forEach((_,i) => {java.toast('\\n\\n测试中'+_+'\\n');Packages.java.lang.Thread.sleep((3-i)*100);});\nlet url = (source.get('yurl')+[]||surl()).split(',');\nlet tm=[], mit=99, miu='';\n\ttry {\n\tfor (char of url) {\n let startTime=new Date().getTime();\n\t//java.head(char,{\t'User-Agent': u_a});\n\tjava.ajax(char);\n\tlet endTime=new Date().getTime();\n\tlet speed = (endTime - startTime) / 1000;\n\tspeed = speed.toFixed(2);\n\tif (mit>speed) {mit=speed; miu=char;}\n\ttm.push(speed);\n\t}\n\tjava.longToast('\\n'+url[0]+':'+tm[0]+'秒\\n'+url[1]+':'+tm[1]+'秒');\n\t} catch(err) {java.longToast(err);}\n\tlet Info=source.getLoginInfoMap()||{};\n\tInfo['地址'] = miu;\n\tcache.putMemory('ssmhinfo',Info);\nsource.putLoginInfo(JSON.stringify(Info));\n}", + "respondTime": 4555, + "ruleBookInfo": { + "coverUrl": "fm", + "init": "\nlet bkurl=surl();\nbook.bookUrl=String(book.bookUrl).replace(/^https:\\/\\/[^\\/]+/, bkurl);\nlet hj=java.get('sshj');\nif (hj=='') {\nlet tags=String.raw`{{@@.addtags>a:not(:last-of-type)@text##\\n## #}}`;\ntags=tags ? ('#'+tags+'\\n') : '';\nlet jj=tags+java.get('jianjie')+`\n{{@@.addtags~p@textNodes##`##\\\\`}}`.replace(/簡介:/,'');\nresult={\n\tjj:jj};\n\n} else {\n\tlet st=gets('.info@text');\n\tlet sj=st.match(/创建于([\\d\\ \\-\\:]+)/)[1];\n\tlet fm=gets('#classify_container li img.0@src');\n\tfm+=`,{headers:{referer:'${surl()}/'}}`;\n\tresult={\n\ttags:sj,\n\tfm:fm};\n\n}\n", + "intro": "jj", + "kind": "tags", + "tocUrl": "" + }, + "ruleContent": { + "content": "\nlet ref=surl()+'/';\nlet rr=result.match(/\\/\\/[^\"\\n]+\\.(?:webp|jpg|png|jpeg)/g);\nfor (let i=0;i`\n\t}\nrr.join('')\n", + "nextContentUrl": "", + "title": "" + }, + "ruleExplore": { + "bookList": "" + }, + "ruleSearch": { + "author": "@get:{anm}", + "bookList": "\nlet [key,page] = java.hexDecodeToString(result).split('🀄');\nlet url=surl();\n\nif (key.startsWith('@')) {\n\tkey=key.slice(1);\n\tjava.put('sshj',key);\n\turl += '/q/?q='+key+'&m=&f=_all&s=create_time_DESC&p=1';}\nelse if (/^[##]/.test(key)) {\n\tlet webua=java.getWebViewUA();\n\tkey=key.slice(1);\n\turl += `/albums-index-page-${page}-tag-${key}.html,{headers:{User-Agent:\"${webua}\"}}`;}\nelse if (/^■\\d/.test(key)) {\n\tjava.put('cos',1);\n\tlet page2=((source.getLoginInfoMap()||{})['发现起始页数']||'1')+[]||'1'; //兼容null和java\"\"\n\tpage=+page + +page2 - 1;\n\tif (page>3&&(page&1)==0&&page2>2) java.toast('第'+page+'页');\n\tlet webua=java.getWebViewUA();\n\tkey=key.slice(1);\n\turl += `/albums-index${page==1?'':('-page-'+page)}-cate-${key}.html,{headers:{User-Agent:\"${webua}\"}}`;}\nelse {\t\n\turl+='/q/?q='+key+'&m=&f=_all&s=create_time_DESC&p='+page;}\n\nlet webr=java.ajax(url);\njava.setContent(webr);\nresult=java.getElement('#classify_container li');\nlet hj=java.get('sshj');\n\nif (hj!=''&&result.length>1) {\n\tlet st=java.getString('.info@text',result);\n\tlet sj=st.match(/创建于([\\d\\ \\-\\:]+)/)[1];\n\tlet sl=st.match(/\\d+(?=张图)/g);\n\tsl=sl.reduce((acc, cur)=>acc+Number(cur),0);\n\tlet im=java.getString('img.0@all',result);\n\tlet rr=`
  • ${sl}张图${sj}
  • +${im}`;\n\tresult=[rr];\n\t} else {java.put('sshj','');\n\tresult;}\n
    ", + "bookUrl": "\nlet hj=java.get('sshj');\nlet url;\nif (hj=='') url= surl()+java.getString('a@href');\nelse url=java.getString('a@href');\n", + "checkKeyWord": "@邪恶变形系统", + "coverUrl": "https:{{@@img@src}},{headers:{referer:'{{surl()}}/'}}", + "intro": "\nlet hj=java.get('sshj');\nif (hj=='') {\n\tlet rr=String(java.getString('a@text'));\n\tlet nm = rr.match(/\\[([^\\[\\]]+)\\]\\-?\\s*([^\\[\\]]+)(?:(\\[[^\\[\\]]+\\])\\s*)(?:(\\[[^\\[\\]]+\\])\\s*)?/);\n\tif (nm) {result=nm[3]+(nm[4]?nm[4]:'');java.put('jianjie',result);}\n\telse result='';\n\t}\n", + "kind": "\n\tlet rr = '{{@@li@class##cate-}}';\n\tlet tt = `{{@@.info@text##([\\d\\-\\s\\:]{4,})$##$1###}}`;\n\tresult=rr ? (flfl[rr][0]+','+tt) : tt;\n", + "lastChapter": "", + "name": "\nlet hj=java.get('sshj');\nlet cos=java.get('cos');\n\nif (hj=='') {\n\tlet rr=String(java.getString('a@text'));\n\tlet nm = rr.match(/\\[([^\\[\\]]+)\\]\\-?\\s*([^\\[\\]]+)/);\n\tif(!nm&&cos==1) nm=rr.match(/(^.+)\\s+[–\\-]\\s+(.+$)/);\n\tif (nm&&!/^3d$/i.test(nm[1])) {java.put('anm',nm[1]); result=nm[2];}\n\telse {java.put('anm',rr); result=rr;}\n\t}\nelse {java.put('anm','合集'); result='📚'+hj;}\n\nresult\n", + "wordCount": ".info@text##^(\\d+)##$1张图###" + }, + "ruleToc": { + "chapterList": "-\nlet hj=java.get('sshj');\nif (hj=='') {\n\tlet rr=`单章`;\n\tresult = [rr];\n} else result = java.getElement('#classify_container li');\nresult\n", + "chapterName": "a@text", + "chapterUrl": "a@href##index##webp", + "formatJs": "", + "isPay": "", + "isVolume": "", + "nextTocUrl": "\nlet hj=java.get('sshj');\nif (hj=='') {result=[];}\nelse {\nresult=gets('.block-pagination a@href').split('\\n');\nresult.push(\"data:;base64,aHR0,{'type':'ss'}\");\n}\nresult\n", + "preUpdateJs": "let bkurl=surl();\nbook.tocUrl=String(book.bookUrl).replace(/^https:\\/\\/[^\\/]+/, bkurl);", + "updateTime": ".info@text##^(\\d+)\\D*([\\d\\-\\s\\:]{4,})$##$2 $1张图###" + }, + "searchUrl": "{{`data:;base64,${java.base64Encode(key+'🀄'+page)},{'type':''}`;}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[需要外部API, ❌搜索失败]", + "bookSourceGroup": "🔭 其他,🎊 常用,🎨 漫画", + "bookSourceName": "🎨禁漫天堂💞", + "bookSourceType": 2, + "bookSourceUrl": "https://jmcomic.ltd", + "bookUrlPattern": "https:\\/\\/.*/album\\?id=\\d+", + "concurrentRate": "10/5000", + "customOrder": 235, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "\neval(String(Reload('https://qyyuapi.com/sy/js/禁漫天堂/exploreUrl.js')));\n", + "header": "\nvar Proxy = Map('代理:').split(\",\");\nheaders={\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 EdgA/127.0.0.0\",\n \"Cookie\": cache.get(java.md5Encode16(Get('url') + \"cookie\")) || cookie.getCookie(Get('url')),\n \"proxy\": Proxy.some(value => parseInt(value, 10) == parseInt(Get('ci0'), 10)) ? '' : Proxy[0],\n}\ncache.put(java.md5Encode16(Get('url') + \"headers\"),JSON.stringify(headers));\nJSON.stringify(headers);\n", + "jsLib": "{\"禁漫天堂\":\"https://qyyuapi.com/sy/js/禁漫天堂/jsLib.js\"}", + "lastUpdateTime": 1744270256222, + "loginCheckJs": "", + "loginUi": "[\n { name: \"代理:\", type: \"text\" },\n { name: \"账号:\", type: \"text\" },\n { name: \"密码:\", type: \"password\" },\n {\n name: \"💡登录账号💡\",\n type: \"button\",\n action: \"Login()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n },\n { name: \"查看当前\", type: \"button\", action: \"look(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"查看历史\", type: \"button\", action: \"look(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"恢复默认\", type: \"button\", action: \"test(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁体搜索\", type: \"button\", action: \"search_TC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"繁简转换\", type: \"button\", action: \"TC_to_SC()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"目录整理\", type: \"button\", action: \"settle()\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换源站 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"①禁漫\", type: \"button\", action: \"$(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"②禁漫\", type: \"button\", action: \"$(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"③禁漫\", type: \"button\", action: \"$(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"④禁漫\", type: \"button\", action: \"$(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n { name: \"༺ˇ»`ʚ 切换发现类型 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"分类排序\", type: \"button\", action: \"t(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n { name: \"标签搜索\", type: \"button\", action: \"t(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.45} },\n\n { name: \"༺ˇ»`ʚ 标签分类切换 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"u(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"韩漫\", type: \"button\", action: \"u(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"日语\", type: \"button\", action: \"u(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"汉化\", type: \"button\", action: \"u(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"CG\", type: \"button\", action: \"u(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"短篇\", type: \"button\", action: \"u(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"单本\", type: \"button\", action: \"u(6)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"3D\", type: \"button\", action: \"u(7)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"COS\", type: \"button\", action: \"u(8)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"美漫\", type: \"button\", action: \"u(9)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"其它\", type: \"button\", action: \"u(10)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 标签排序切换 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"爱心排行\", type: \"button\", action: \"v(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"评论排行\", type: \"button\", action: \"v(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"评分排行\", type: \"button\", action: \"v(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"订阅数量\", type: \"button\", action: \"v(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"图片数量\", type: \"button\", action: \"v(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"最近更新\", type: \"button\", action: \"v(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"༺ˇ»`ʚ 点击切换日期 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"全部\", type: \"button\", action: \"o(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"本月\", type: \"button\", action: \"o(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"本周\", type: \"button\", action: \"o(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n { name: \"今日\", type: \"button\", action: \"o(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.2} },\n\n { name: \"༺ˇ»`ʚ 点击切换图库 ɞ´«ˇ༻\", type: \"button\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 1} },\n { name: \"图库[1]\", type: \"button\", action: \"p(0)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"图库[2]\", type: \"button\", action: \"p(1)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"图库[3]\", type: \"button\", action: \"p(2)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"图库[4]\", type: \"button\", action: \"p(3)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"图库[5]\", type: \"button\", action: \"p(4)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n { name: \"图库[6]\", type: \"button\", action: \"p(5)\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25} },\n\n { name: \"页数:\", type: \"text\" },\n\n {\n name: \"💡   源   站   打   印   💡\",\n type: \"button\",\n action: \"test()\",\n style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n }\n]", + "loginUrl": "eval(String(Reload('https://qyyuapi.com/sy/js/禁漫天堂/loginUrl.js')));", + "respondTime": 20146, + "ruleBookInfo": { + "author": "author", + "canReName": "reName", + "coverUrl": "cover", + "downloadUrls": "durl", + "init": "\neval(String(Reload('https://qyyuapi.com/sy/js/禁漫天堂/ruleBookInfo.js')));\n", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url", + "wordCount": "word" + }, + "ruleContent": { + "content": "\neval(String(Reload('https://qyyuapi.com/sy/js/禁漫天堂/ruleContent.js')));\n", + "imageDecode": "if (src.search(\"qyyuapi.com\") != -1) {\n result;\n} else {\n var Magua = new JavaImporter();\n Magua.importPackage(Packages.java.io, Packages.android.graphics);\n with(Magua) {\n let mac = src.match(/photos\\/(\\d+)?\\/(\\d+)?/);\n let bookId = mac[1];\n let imgId = mac[2];\n if (src.search(\"gif\") != -1 || Number(bookId) < 220980) {\n result;\n } else {\n if (Number(bookId) > 421925) {\n let md5 = java.md5Encode((bookId + imgId));\n let ascii = md5.substr( - 1).charCodeAt(0);\n var num = (ascii % 8 + 1) * 2;\n } else if (Number(bookId) >= 268850) {\n let md5 = java.md5Encode((bookId + imgId));\n let ascii = md5.substr( - 1).charCodeAt(0);\n var num = (ascii % 10 + 1) * 2;\n } else {\n var num = 10;\n }\n var img = BitmapFactory.decodeByteArray(result, 0, result.length);\n var height = img.getHeight();\n var width = img.getWidth();\n var y = Math.floor(height / num);\n var remainder = height % num;\n var newImg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);\n let canvas = new Canvas(newImg);\n for (let i = 1; i <= num; i++) {\n let h = i === num ? remainder: 0;\n canvas.drawBitmap(Bitmap.createBitmap(img, 0, y * (i - 1), width, y + h), 0, height - y * i - h, null);\n }\n var newbit = new ByteArrayOutputStream();\n newImg.compress(Bitmap.CompressFormat.PNG, 100, newbit);\n newbit.toByteArray();\n }\n }\n}", + "imageStyle": "FULL", + "nextContentUrl": "", + "webJs": "" + }, + "ruleExplore": { + "author": "author", + "bookList": "\neval(String(Reload('https://qyyuapi.com/sy/js/禁漫天堂/ruleExplore.js')));\n", + "bookUrl": "url", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleSearch": { + "author": "author", + "bookList": "\neval(String(Reload('https://qyyuapi.com/sy/js/禁漫天堂/ruleSearch.js')));\n", + "bookUrl": "url", + "checkKeyWord": "秘密", + "coverUrl": "cover", + "intro": "intro", + "kind": "kind", + "lastChapter": "latest", + "name": "name", + "wordCount": "word" + }, + "ruleToc": { + "chapterList": "\neval(String(Reload('https://qyyuapi.com/sy/js/禁漫天堂/ruleToc.js')));\n", + "chapterName": "title", + "chapterUrl": "link", + "preUpdateJs": "if (!String(book.bookUrl).includes(Get('url'))) {\n book.bookUrl = String(book.bookUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n book.tocUrl = String(book.tocUrl).replace(/.*\\/\\/[^\\/]+/g, Get('url'));\n java.refreshTocUrl();\n}", + "updateTime": "" + }, + "searchUrl": "\neval(String(Reload('https://qyyuapi.com/sy/js/禁漫天堂/searchUrl.js')));\n", + "variableComment": "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", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️正文解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "好看漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://www.9comic.cn/", + "customOrder": 260, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "[{\"title\":\"都市\",\"url\":\"/comic22/book/list?cateid=1&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"恋爱\",\"url\":\"/comic22/book/list?cateid=2&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"爆笑\",\"url\":\"/comic22/book/list?cateid=3&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"热血\",\"url\":\"/comic22/book/list?cateid=4&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"悬疑\",\"url\":\"/comic22/book/list?cateid=5&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"古风\",\"url\":\"/comic22/book/list?cateid=6&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"校园\",\"url\":\"/comic22/book/list?cateid=7&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"搞笑\",\"url\":\"/comic22/book/list?cateid=9&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"玄幻\",\"url\":\"/comic22/book/list?cateid=10&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"励志\",\"url\":\"/comic22/book/list?cateid=11&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"恐怖\",\"url\":\"/comic22/book/list?cateid=13&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"冒险\",\"url\":\"/comic22/book/list?cateid=14&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.29}},{\"title\":\"儿童\",\"url\":\"/comic22/book/list?cateid=15&end=0&free=0&sort=0&p={{page}}&n=21\",\"style\":{\"layout_flexGrow\":0,\"layout_flexBasisPercent\":0.29}}]", + "lastUpdateTime": 1734946416702, + "respondTime": 1046, + "ruleBookInfo": { + "author": "$.author", + "coverUrl": "$.pic", + "init": "$.data", + "intro": "$.info", + "kind": "$.tag", + "lastChapter": "$.lastchapter", + "name": "$.title", + "tocUrl": "https://www.9comic.cn/comic22/book/listChapter?imei=aanid10d10df686793008&id={{$.id}}&p=1&n=10000" + }, + "ruleContent": { + "content": "@js:\nvar options = {\n\"headers\": {\"Referer\": baseUrl}\n}\njava.getStringList(\"$.data..url\").toArray().map\n(id=>'').join(\"\\n\")" + }, + "ruleExplore": { + "bookList": "" + }, + "ruleSearch": { + "author": "$.author", + "bookList": "$..list[*]||$.data[*]", + "bookUrl": "https://www.9comic.cn/comic22/book/show?id={{$.id}}&imei=aanid10d10df686793008", + "coverUrl": "$.pic", + "intro": "$.info", + "kind": "$.tag", + "lastChapter": "$.lastchapter", + "name": "$.title" + }, + "ruleToc": { + "chapterList": "$.data[*]", + "chapterName": "$.name", + "chapterUrl": "https://www.9comic.cn/comic22/book/showChapter?id={{$.id}}&imei=aanid10d10df686793008", + "isPay": "", + "isVip": "", + "updateTime": "{{java.timeFormat(java.getString('$.createtime'))}}" + }, + "searchUrl": "https://www.9comic.cn/comic22/so/comic?keyword={{key}}&p=&ver=2.0", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️目录解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "全免漫画(优)", + "bookSourceType": 2, + "bookSourceUrl": "https://api-cdn.kaimanhua.com/", + "customOrder": 562, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "\nresult=\"\";\n f=[\"热血\",\"机战\",\"运动\",\"推理\",\"冒险\",\"耿美\",\"百合\",\"搞笑\",\"战争\",\"神魔\",\"忍者\",\"竞技\",\"悬疑\",\"社会\",\"恋爱\",\"宠物\",\"吸血\",\"萝莉\",\"后宫\",\"御姐\",\"霸总\",\"玄幻\",\"古风\",\"历史\",\"漫改\",\"游戏\",\"穿越\",\"恐怖\",\"真人\",\"科幻\",\"防疫\",\"都市\",\"武侠\",\"修真\",\"生活\",\"动作\"]; \np=[\"rexue\",\"jizhan\",\"yundong\",\"tuili\",\"maoxian\",\"liaomei\",\"baihe\",\"gaoxiao\",\"zhanzhen\",\"shenmo\",\"renzhe\",\"jingji\",\"xuanyi\",\"shehui\",\"lianai\",\"chongwu\",\"xixue\",\"luoli\",\"hougong\",\"yujie\",\"bazong\",\"xuanhuan\",\"gufeng\",\"lishi\",\"mangai\",\"youxi\",\"chuanyue\",\"kongbu\",\"zhenren\",\"kehuan\",\"fangyi\",\"dushi\",\"wuxia\",\"xiuzhen\",\"shenghuo\",\"dongzuo\"];\na=\"::https://api-cdn.kaimanhua.com/comic-api/v1/comic/getsortlist?status_id=0&comic_sort=\";\nb=\"&human_type=0&orderby=date&pagesize=30&page={{page}}&young_mode=0&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8\";\n\nfor(i in f){\n\tresult=result+f[i]+a+p[i]+b+\"\\n\";\n\t}\n", + "header": "", + "lastUpdateTime": 1732976221384, + "loginUrl": "", + "respondTime": 1914, + "ruleBookInfo": { + "author": "$.author_name", + "coverUrl": "$.cover_img_34", + "init": "\nresult=String(java.getString(\"$.data\")).replace(/arsadata/,\"\");\njava.aesBase64DecodeToString(result,\"4548ded8c9e02690\",\"AES/CBC/PKCS5Padding\",\"1992360ee9bc4f8f\");\n", + "intro": "
    \n🏅 评分:{{Math.round(java.getString('$.avgscore'))/10}}分\n🕰 更新:{{String(java.timeFormat(java.getString('$.update_time'))).replace(/\\//g,\"-\").replace(/\\s/g,\"🔸\")}}\n🎗 标签:{{result=String(java.getString('$.comic_taglist')).replace(/\\n/g,\",\")}}\n📂 简介:{{$.comic_desc}}", + "kind": "{{result=String(java.getString('$.sort_typelist')).replace(/\\{|\\}|\\w*=/g,\"\").replace(/\\n/g,\",\")}}", + "lastChapter": "$.lastchapter_title", + "name": "$.comic_name@put:{cid:$.comic_id}", + "tocUrl": "", + "wordCount": "" + }, + "ruleContent": { + "content": "\nresult=String(java.getString(\"$.data\")).replace(/arsadata/,\"\");\nu=java.aesBase64DecodeToString(result,\"4548ded8c9e02690\",\"AES/CBC/PKCS5Padding\",\"1992360ee9bc4f8f\");\nimg=u.match(/\\[(.*)\\]/)[1].split(\",\").map(x=>'\\n').join(\"\\n\")\n", + "sourceRegex": "" + }, + "ruleExplore": { + "bookList": "" + }, + "ruleSearch": { + "author": "$.comic_author", + "bookList": "$.data.data", + "bookUrl": "@js:\nt=\"/comic-api/v2/comic/getcomicdatacomic_id={{$.comic_id}}&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8erciyuan2020\";\nsign=java.md5Encode(t);\nb={\n\"method\": \"GET\",\n\"headers\": {\n\"User-Agent\": \"okhttp/4.9.1\",\n\"m-request-id\": sign\n}\n};\n\"https://api-cdn.kaimanhua.com/comic-api/v2/comic/getcomicdata?comic_id={{$.comic_id}}&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8,\"+JSON.stringify(b);", + "checkKeyWord": "", + "coverUrl": "$.cover_img", + "intro": "$.cartoon_desc", + "kind": "{{result=String(java.getString('$.comic_type')).replace(/,|\\w*/g,\"\").replace(/\\|/g,\",\")}}\n{{String(java.timeFormat(java.getString('$.update_time'))).replace(/\\//g,\"-\").replace(/\\s.*/g,\"\")}}", + "lastChapter": "$.last_chapter_name", + "name": "$.comic_name", + "wordCount": "" + }, + "ruleToc": { + "chapterList": "\nresult=String(java.getString(\"$.data\")).replace(/arsadata/,\"\");\njava.aesBase64DecodeToString(result,\"4548ded8c9e02690\",\"AES/CBC/PKCS5Padding\",\"1992360ee9bc4f8f\");\n\n$.chapters[*]", + "chapterName": "$.chapter_name", + "chapterUrl": "@js:\ncid='@get:{cid}'\nchapter_id='{{$.chapter_id}}'\nt=\"/comic-api/v2/comic/getchapterdatacomic_id=\"+cid+\"&chapter_id=\"+chapter_id+\"&quality=middle&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8erciyuan2020\";\nsign=java.md5Encode(t);\nb={\n\"method\": \"GET\",\n\"headers\": {\n\"User-Agent\": \"okhttp/4.9.1\",\n\"access-token\":\"v1_090fNTIt4Omg86B7LUPcqWRTkvW8JjjLYXTxnm01BiXN8SgniETjucYezOrjZoOopFGr02Fj12RREysE4eHukTCc/LuyeIHzFGMayAgLGaSF8+jMMwrnDdTuYdFk34z7DZf+Zy+VHtjFS0Uy6n6Vyr/5GuJy6FDcbCoVBCjdbFneHjV38UwHjL6AwauUMFfa0f3uSEqGWZG6xn9+OpAn6GGRWHaypicXswr450DO29FcuqP7pHCSldVJtIzOv/Uc\",\n\"m-request-id\": sign\n}\n};\n\"https://api-cdn.kaimanhua.com/comic-api/v2/comic/getchapterdata?comic_id=@get:{cid}&chapter_id={{$.chapter_id}}&quality=middle&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8,\"+JSON.stringify(b);", + "isVolume": "", + "preUpdateJs": "" + }, + "searchUrl": "https://api-cdn.kaimanhua.com/comic-api/v1/comic/getsortlist?search_key={{key}}&orderby=shoucang&page={{page}}&pagesize=20&young_mode=0&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8", + "variableComment": "", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️目录解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "彩绘漫画(优)", + "bookSourceType": 2, + "bookSourceUrl": "https://m.kanman.com#Haxc1107", + "customOrder": 563, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "人气::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=click&search_type=&search_key=&page={{page}}&size=48\n更新::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=date&search_type=&search_key=&page={{page}}&size=48\n评分::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=score&search_type=&search_key=&page={{page}}&size=48\n收藏::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=shoucang&search_type=&search_key=&page={{page}}&size=48\n热血::https://m.kanman.com/api/getsortlist/?comic_sort=rexue&orderby=&search_type=&search_key=&page={{page}}&size=48\n机战::https://m.kanman.com/api/getsortlist/?comic_sort=jizhan&orderby=&search_type=&search_key=&page={{page}}&size=48\n运动::https://m.kanman.com/api/getsortlist/?comic_sort=yundong&orderby=&search_type=&search_key=&page={{page}}&size=48\n推理::https://m.kanman.com/api/getsortlist/?comic_sort=tuili&orderby=&search_type=&search_key=&page={{page}}&size=48\n冒险::https://m.kanman.com/api/getsortlist/?comic_sort=maoxian&orderby=&search_type=&search_key=&page={{page}}&size=48\n搞笑::https://m.kanman.com/api/getsortlist/?comic_sort=gaoxiao&orderby=&search_type=&search_key=&page={{page}}&size=48\n战争::https://m.kanman.com/api/getsortlist/?comic_sort=zhanzhen&orderby=&search_type=&search_key=&page={{page}}&size=48\n神魔::https://m.kanman.com/api/getsortlist/?comic_sort=shenmo&orderby=&search_type=&search_key=&page={{page}}&size=48\n忍者::https://m.kanman.com/api/getsortlist/?comic_sort=renzhe&orderby=&search_type=&search_key=&page={{page}}&size=48\n竞技::https://m.kanman.com/api/getsortlist/?comic_sort=jingji&orderby=&search_type=&search_key=&page={{page}}&size=48\n悬疑::https://m.kanman.com/api/getsortlist/?comic_sort=xuanyi&orderby=&search_type=&search_key=&page={{page}}&size=48\n社会::https://m.kanman.com/api/getsortlist/?comic_sort=shehui&orderby=&search_type=&search_key=&page={{page}}&size=48\n恋爱::https://m.kanman.com/api/getsortlist/?comic_sort=lianai&orderby=&search_type=&search_key=&page={{page}}&size=48\n宠物::https://m.kanman.com/api/getsortlist/?comic_sort=chongwu&orderby=&search_type=&search_key=&page={{page}}&size=48\n吸血::https://m.kanman.com/api/getsortlist/?comic_sort=xixue&orderby=&search_type=&search_key=&page={{page}}&size=48\n萝莉::https://m.kanman.com/api/getsortlist/?comic_sort=luoli&orderby=&search_type=&search_key=&page={{page}}&size=48\n后宫::https://m.kanman.com/api/getsortlist/?comic_sort=hougong&orderby=&search_type=&search_key=&page={{page}}&size=48\n御姐::https://m.kanman.com/api/getsortlist/?comic_sort=yujie&orderby=&search_type=&search_key=&page={{page}}&size=48\n霸总::https://m.kanman.com/api/getsortlist/?comic_sort=bazong&orderby=&search_type=&search_key=&page={{page}}&size=48\n玄幻::https://m.kanman.com/api/getsortlist/?comic_sort=xuanhuan&orderby=&search_type=&search_key=&page={{page}}&size=48\n古风::https://m.kanman.com/api/getsortlist/?comic_sort=gufeng&orderby=&search_type=&search_key=&page={{page}}&size=48\n历史::https://m.kanman.com/api/getsortlist/?comic_sort=lishi&orderby=&search_type=&search_key=&page={{page}}&size=48\n漫改::https://m.kanman.com/api/getsortlist/?comic_sort=mangai&orderby=&search_type=&search_key=&page={{page}}&size=48\n游戏::https://m.kanman.com/api/getsortlist/?comic_sort=youxi&orderby=&search_type=&search_key=&page={{page}}&size=48\n穿越::https://m.kanman.com/api/getsortlist/?comic_sort=chuanyue&orderby=&search_type=&search_key=&page={{page}}&size=48\n恐怖::https://m.kanman.com/api/getsortlist/?comic_sort=kongbu&orderby=&search_type=&search_key=&page={{page}}&size=48\n真人::https://m.kanman.com/api/getsortlist/?comic_sort=zhenren&orderby=&search_type=&search_key=&page={{page}}&size=48\n科幻::https://m.kanman.com/api/getsortlist/?comic_sort=kehuan&orderby=&search_type=&search_key=&page={{page}}&size=48\n都市::https://m.kanman.com/api/getsortlist/?comic_sort=dushi&orderby=&search_type=&search_key=&page={{page}}&size=48\n武侠::https://m.kanman.com/api/getsortlist/?comic_sort=wuxia&orderby=&search_type=&search_key=&page={{page}}&size=48\n修真::https://m.kanman.com/api/getsortlist/?comic_sort=xiuzhen&orderby=&search_type=&search_key=&page={{page}}&size=48\n生活::https://m.kanman.com/api/getsortlist/?comic_sort=shenghuo&orderby=&search_type=&search_key=&page={{page}}&size=48\n动作::https://m.kanman.com/api/getsortlist/?comic_sort=dongzuo&orderby=&search_type=&search_key=&page={{page}}&size=48\n防疫::https://m.kanman.com/api/getsortlist/?comic_sort=fangyi&orderby=&search_type=&search_key=&page={{page}}&size=48", + "lastUpdateTime": 1729749687724, + "respondTime": 581, + "ruleBookInfo": { + "author": "[property=\"og:novel:author\"]@content", + "kind": "[property=\"og:novel:category\"]@content", + "lastChapter": ".comic-update-status@text##.*-\\d+ ", + "name": "[property=\"og:novel:book_name\"]@content", + "tocUrl": "https://m.kanman.com/api/getchapterlist?product_id=1&productname=kmh&platformname=wap&comic_id=@get:{bid}", + "wordCount": "" + }, + "ruleContent": { + "content": "$.data.current_chapter.chapter_img_list@js:\nheader={\"Referer\":baseUrl};\nheaders={\"headers\":JSON.stringify(header)};\nresult.split(\"\\n\").map(x=>'').join(\"\\n\")", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "$.cartoon_author_list_name||$.comic_author", + "bookList": "$.data.data||$.data", + "bookUrl": "https://m.kanman.com/{{$.comic_id}}/", + "coverUrl": "https://image.yqmh.com/mh/{{$.comic_id}}.jpg-300x400.webp", + "intro": "$.cartoon_desc", + "kind": "$.comic_type##[a-zA-Z]|\\|", + "lastChapter": "$.latest_cartoon_topic_name||$.last_chapter_name", + "name": "$.comic_name@put:{bid:$.comic_id}" + }, + "ruleToc": { + "chapterList": "-$.data.[*]", + "chapterName": "$.chapter_name", + "chapterUrl": "https://m.kanman.com/api/getchapterinfov2?product_id=1&productname=kmh&platformname=wap&comic_id=@get:{bid}&chapter_newid={{$.chapter_newid}}&isWebp=1&quality=low" + }, + "searchUrl": "https://m.kanman.com/api/serachcomic/?product_id=1&productname=kmh&platformname=wap&serachKey={{key}}&topNumber=10", + "weight": 0 + }, + { + "bookSourceComment": "\n[✅已验证]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "看漫画吧(优)", + "bookSourceType": 2, + "bookSourceUrl": "http://m.kanman.com/", + "bookUrlPattern": "", + "customOrder": 564, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "header": "{\ruser-agent: \"Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Mobile Safari/537.36\"\r}", + "lastUpdateTime": 1733580216406, + "loginUrl": "", + "respondTime": 192, + "ruleBookInfo": { + "author": "class.sub_r@tag.p.0@text", + "coverUrl": "id.Cover@tag.img@src", + "intro": "class.txtDesc@text##介绍:", + "kind": "class.tags@class.item@text", + "lastChapter": "id.chapter-list-1@tag.li.-2@tag.a@tag.span@text", + "name": "id.js_comic_id@text", + "wordCount": "class.date@text" + }, + "ruleContent": { + "content": "@js:var json = result.match(/window.comicInfo=(.*?),window.hideguide/)[1];\nvar json = eval('json='+json)\nvar image_list = [];\njson.current_chapter.chapter_img_list.map(item=>{\n image_list.push('')\n})\nimage_list.join(\"\\n\");", + "imageStyle": "", + "nextContentUrl": "" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "", + "bookList": "class.comic-item", + "bookUrl": "tag.a@href", + "coverUrl": "", + "kind": "", + "lastChapter": "class.chapter@text", + "name": "class.title@text" + }, + "ruleToc": { + "chapterList": "class.chapter-list@tag.li", + "chapterName": "tag.a@text", + "chapterUrl": "tag.a@href" + }, + "searchUrl": "http://m.kanman.com/sort/all.html?cache=false&search_key={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️正文解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "知音漫客", + "bookSourceType": 2, + "bookSourceUrl": "https://m.zymk.cn/", + "customOrder": 567, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "热血::/sort/5_p{{page}}.html&&\n搞笑::/sort/6_p{{page}}.html&&\n玄幻::/sort/7_p{{page}}.html&&\n生活::/sort/8_p{{page}}.html&&\n恋爱::/sort/9_p{{page}}.html&&\n动作::/sort/10_p{{page}}.html&&\n科幻::/sort/11_p{{page}}.html&&\n战争::/sort/12_p{{page}}.html&&\n悬疑::/sort/13_p{{page}}.html&&\n恐怖::/sort/14_p{{page}}.html&&\n校园::/sort/15_p{{page}}.html&&\n历史::/sort/16_p{{page}}.html&&\n穿越::/sort/17_p{{page}}.html&&\n体育::/sort/19_p{{page}}.html&&\n都市::/sort/20_p{{page}}.html&&\n漫改::/sort/22_p{{page}}.html&&\n修真::/sort/53_p{{page}}.html&&\n霸总::/sort/62_p{{page}}.html&&\n古风::/sort/63_p{{page}}.html&&\n游戏::/sort/64_p{{page}}.html&&\n真人::/sort/65_p{{page}}.html&&\n武侠::/sort/66_p{{page}}.html&&", + "lastUpdateTime": 1732184856973, + "respondTime": 808, + "ruleBookInfo": { + "author": "class.author@text", + "intro": "class.content@text", + "kind": "class.tags@a@text", + "name": "h1.name@text" + }, + "ruleContent": { + "content": "@js:\nhost='http://mhpic.zymkcdn.com/comic/';\noriginal=result.match(/dr_original:\"([^\"]+)\"/)[1];\nend=result.match(/end_var:(\\d+)/)[1];\n//画质\nhigh='.jpg-zymk.high.webp';\nlow='.jpg-zymk.low.webp';\nmiddle='.jpg-zymk.middle.webp';\n\nhtml='';\nfor(i=1;i<=end;i++){\nhtml+='\\n'\n}\nhtml", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "", + "bookList": "class.item@h3", + "bookUrl": "tag.a.0@href", + "coverUrl": "img@data-src", + "kind": "class.score@text", + "lastChapter": "class.chapter@text", + "name": "class.title@a@text" + }, + "ruleToc": { + "chapterList": "-class.chapterlist@li@a", + "chapterName": "text", + "chapterUrl": "href" + }, + "searchUrl": "https://m.zymk.cn/sort/all.html?key={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️目录解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "爱看漫画", + "bookSourceType": 0, + "bookSourceUrl": "https://m.kanman.com/", + "customOrder": 568, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "人气::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=click&search_type=&search_key=&page={{page}}&size=48\n更新::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=date&search_type=&search_key=&page={{page}}&size=48\n评分::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=score&search_type=&search_key=&page={{page}}&size=48\n收藏::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=shoucang&search_type=&search_key=&page={{page}}&size=48\n热血::https://m.kanman.com/api/getsortlist/?comic_sort=rexue&orderby=&search_type=&search_key=&page={{page}}&size=48\n机战::https://m.kanman.com/api/getsortlist/?comic_sort=jizhan&orderby=&search_type=&search_key=&page={{page}}&size=48\n运动::https://m.kanman.com/api/getsortlist/?comic_sort=yundong&orderby=&search_type=&search_key=&page={{page}}&size=48\n推理::https://m.kanman.com/api/getsortlist/?comic_sort=tuili&orderby=&search_type=&search_key=&page={{page}}&size=48\n冒险::https://m.kanman.com/api/getsortlist/?comic_sort=maoxian&orderby=&search_type=&search_key=&page={{page}}&size=48\n搞笑::https://m.kanman.com/api/getsortlist/?comic_sort=gaoxiao&orderby=&search_type=&search_key=&page={{page}}&size=48\n战争::https://m.kanman.com/api/getsortlist/?comic_sort=zhanzhen&orderby=&search_type=&search_key=&page={{page}}&size=48\n神魔::https://m.kanman.com/api/getsortlist/?comic_sort=shenmo&orderby=&search_type=&search_key=&page={{page}}&size=48\n忍者::https://m.kanman.com/api/getsortlist/?comic_sort=renzhe&orderby=&search_type=&search_key=&page={{page}}&size=48\n竞技::https://m.kanman.com/api/getsortlist/?comic_sort=jingji&orderby=&search_type=&search_key=&page={{page}}&size=48\n悬疑::https://m.kanman.com/api/getsortlist/?comic_sort=xuanyi&orderby=&search_type=&search_key=&page={{page}}&size=48\n社会::https://m.kanman.com/api/getsortlist/?comic_sort=shehui&orderby=&search_type=&search_key=&page={{page}}&size=48\n恋爱::https://m.kanman.com/api/getsortlist/?comic_sort=lianai&orderby=&search_type=&search_key=&page={{page}}&size=48\n宠物::https://m.kanman.com/api/getsortlist/?comic_sort=chongwu&orderby=&search_type=&search_key=&page={{page}}&size=48\n吸血::https://m.kanman.com/api/getsortlist/?comic_sort=xixue&orderby=&search_type=&search_key=&page={{page}}&size=48\n萝莉::https://m.kanman.com/api/getsortlist/?comic_sort=luoli&orderby=&search_type=&search_key=&page={{page}}&size=48\n后宫::https://m.kanman.com/api/getsortlist/?comic_sort=hougong&orderby=&search_type=&search_key=&page={{page}}&size=48\n御姐::https://m.kanman.com/api/getsortlist/?comic_sort=yujie&orderby=&search_type=&search_key=&page={{page}}&size=48\n霸总::https://m.kanman.com/api/getsortlist/?comic_sort=bazong&orderby=&search_type=&search_key=&page={{page}}&size=48\n玄幻::https://m.kanman.com/api/getsortlist/?comic_sort=xuanhuan&orderby=&search_type=&search_key=&page={{page}}&size=48\n古风::https://m.kanman.com/api/getsortlist/?comic_sort=gufeng&orderby=&search_type=&search_key=&page={{page}}&size=48\n历史::https://m.kanman.com/api/getsortlist/?comic_sort=lishi&orderby=&search_type=&search_key=&page={{page}}&size=48\n漫改::https://m.kanman.com/api/getsortlist/?comic_sort=mangai&orderby=&search_type=&search_key=&page={{page}}&size=48\n游戏::https://m.kanman.com/api/getsortlist/?comic_sort=youxi&orderby=&search_type=&search_key=&page={{page}}&size=48\n穿越::https://m.kanman.com/api/getsortlist/?comic_sort=chuanyue&orderby=&search_type=&search_key=&page={{page}}&size=48\n恐怖::https://m.kanman.com/api/getsortlist/?comic_sort=kongbu&orderby=&search_type=&search_key=&page={{page}}&size=48\n真人::https://m.kanman.com/api/getsortlist/?comic_sort=zhenren&orderby=&search_type=&search_key=&page={{page}}&size=48\n科幻::https://m.kanman.com/api/getsortlist/?comic_sort=kehuan&orderby=&search_type=&search_key=&page={{page}}&size=48\n都市::https://m.kanman.com/api/getsortlist/?comic_sort=dushi&orderby=&search_type=&search_key=&page={{page}}&size=48\n武侠::https://m.kanman.com/api/getsortlist/?comic_sort=wuxia&orderby=&search_type=&search_key=&page={{page}}&size=48\n修真::https://m.kanman.com/api/getsortlist/?comic_sort=xiuzhen&orderby=&search_type=&search_key=&page={{page}}&size=48\n生活::https://m.kanman.com/api/getsortlist/?comic_sort=shenghuo&orderby=&search_type=&search_key=&page={{page}}&size=48\n动作::https://m.kanman.com/api/getsortlist/?comic_sort=dongzuo&orderby=&search_type=&search_key=&page={{page}}&size=48\n防疫::https://m.kanman.com/api/getsortlist/?comic_sort=fangyi&orderby=&search_type=&search_key=&page={{page}}&size=48", + "lastUpdateTime": 1732184897690, + "respondTime": 484, + "ruleBookInfo": { + "author": "[property=\"og:novel:author\"]@content", + "kind": "[property=\"og:novel:category\"]@content", + "lastChapter": ".comic-update-status@text##.*-\\d+ ", + "name": "[property=\"og:novel:book_name\"]@content", + "tocUrl": "https://m.kanman.com/api/getchapterlist?product_id=1&productname=kmh&platformname=wap&comic_id=@get:{bid}", + "wordCount": "" + }, + "ruleContent": { + "content": "$.data.current_chapter.chapter_img_list@js:\nheader={\"Referer\":baseUrl};\nheaders={\"headers\":JSON.stringify(header)};\nresult.split(\"\\n\").map(x=>'').join(\"\\n\")", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "$.cartoon_author_list_name||$.comic_author", + "bookList": "$.data.data||$.data", + "bookUrl": "https://m.kanman.com/{{$.comic_id}}/", + "coverUrl": "https://image.yqmh.com/mh/{{$.comic_id}}.jpg-300x400.webp", + "intro": "$.cartoon_desc", + "kind": "$.comic_type##[a-zA-Z]|\\|", + "lastChapter": "$.latest_cartoon_topic_name||$.last_chapter_name", + "name": "$.comic_name@put:{bid:$.comic_id}" + }, + "ruleToc": { + "chapterList": "-$.data.[*]", + "chapterName": "$.chapter_name", + "chapterUrl": "https://m.kanman.com/api/getchapterinfov2?product_id=1&productname=kmh&platformname=wap&comic_id=@get:{bid}&chapter_newid={{$.chapter_newid}}&isWebp=1&quality=low" + }, + "searchUrl": "https://m.kanman.com/api/serachcomic/?product_id=1&productname=kmh&platformname=wap&serachKey={{key}}&topNumber=10", + "weight": 0 + }, + { + "bookSourceComment": "\n[✅已验证]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "酸奶漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://m.1kkk.com/", + "bookUrlPattern": "", + "customOrder": 570, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "lastUpdateTime": 1732184359713, + "loginUrl": "", + "respondTime": 750, + "ruleBookInfo": { + "author": "p.detail-main-info-author@tag.a@text", + "coverUrl": "img.detail-main-bg@src", + "intro": "p.detail-desc@text", + "kind": "p.detail-main-info-class@tag.a@text", + "lastChapter": "ul.detail-list-select@tag,li.0@text", + "name": "p.detail-main-info-title@text", + "wordCount": "" + }, + "ruleContent": { + "content": "@js:header={\"Referer\":baseUrl};\nheaders={\"headers\":JSON.stringify(header)};\neval(result.match(/eval(.*?)\\{\\}\\)\\)/)[0])\nvar image_list = []\nnewImgs.map(item=>{\n image_list.push('')\n})\nimage_list.join(\"\\n\")", + "imageStyle": "", + "nextContentUrl": "" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "tag.p.0@text", + "bookList": "ul.book-list@tag.li", + "bookUrl": "tag.a.0@href", + "coverUrl": "tag.img@src", + "intro": "p.book-list-info-desc@text", + "kind": "", + "lastChapter": "", + "name": "p.book-list-info-title@text" + }, + "ruleToc": { + "chapterList": "ul.detail-list-select@li", + "chapterName": "tag.a@text", + "chapterUrl": "tag.a@href", + "isVip": "@js:var vip_bool = result.select('img').hasClass('detail-list-lock');\nif(!vip_bool){\nvip_bool = result.select('img').hasClass('detail-list-2-info-right');\n}\nvip_bool;" + }, + "searchUrl": "https://m.1kkk.com/search?title={{key}}&language=1", + "weight": 0 + }, + { + "bookSourceComment": "// Error: Connection reset\n\n\nlet list=\nfor(var i=result.length-1;i>=0;i--){list.push(result)}\nlist\n\nhttps://gmh1234.wszwhg.net/images/comic/1003/2004307/16877851447VZ0P-XQ05r7au1N.jpg\nclass.clearfix@tag.script@html\n\nstr=String(result).replace('','')\neval(String(str))\ncookie.removeCookie('https://m.gmh1234.com')\nvar list=;\nvar html=\"\";\nfor(i in chapterImages){\n\tstr=pageImage.replace(/images.*/,'')+chapterPath+chapterImages;\n\t\n\thtml += '\\n'\n\t}\n\nhtml\n[❌搜索失败]", + "bookSourceGroup": "源仓库,漫画 书源,网站失效", + "bookSourceName": "星辰漫画", + "bookSourceType": 0, + "bookSourceUrl": "https://m.gmh1234.com/", + "concurrentRate": "2/1000", + "customOrder": 571, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "header": "{'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n'Sec-Ch-Ua':'\"Google Chrome\";v=\"123\", \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"123\"',\n'Sec-Ch-Ua-Mobile':'?1',\n'Sec-Ch-Ua-Platform':'\"Android\"',\n'Sec-Fetch-Dest':'image',\n'Sec-Fetch-Mode':'no-cors',\n'Sec-Fetch-Site':'cross-site',\n'Sec-Fetch-User':'?1',\n'Upgrade-Insecure-Requests':'1'}", + "lastUpdateTime": 1732184456448, + "respondTime": 180408, + "ruleBookInfo": { + "author": "class.Introduct@class.sub_r autoHeight@tag.p.0@text", + "coverUrl": "class.pic@tag.img@src", + "intro": "class.Introduct@class.txtDesc autoHeight@text", + "kind": "class.sub_r autoHeight@tag.p.1:2:3@text", + "name": "class.Introduct@id.comicName@text" + }, + "ruleContent": { + "content": "@js:\nvar options={\"headers\":{\"Referer\":baseUrl}};\n(function getImgList() {\neval(result.match(/chapterImages\\s*=\\s*[^;]*/)[0])\neval(result.match(/chapterPath\\s*=\\s*[^;]*/)[0])\nreturn chapterImages;\r\n}()).map(uri=>\n'').join(\"\\n\")", + "imageStyle": "FULL", + "nextContentUrl": "", + "webJs": "" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "class.itemTxt@tag.p.0@text", + "bookList": "class.clearfix itemBox", + "bookUrl": "class.itemTxt@class.title@href", + "checkKeyWord": "我的世界", + "coverUrl": "class.itemImg@tag.img@src", + "kind": "class.itemTxt@tag.p.1:2@text", + "lastChapter": "class.coll@text", + "name": "class.itemTxt@class.title@text", + "wordCount": "" + }, + "ruleToc": { + "chapterList": "id.chapter-list-1@tag.li@tag.a", + "chapterName": "@text", + "chapterUrl": "@href" + }, + "searchUrl": "/search/?keywords={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️目录解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "全免漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://api-cdn.kaimanhua.com/##@遇知", + "customOrder": 574, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "\nresult=\"\";\n f=[\"热血\",\"机战\",\"运动\",\"推理\",\"冒险\",\"耿美\",\"百合\",\"搞笑\",\"战争\",\"神魔\",\"忍者\",\"竞技\",\"悬疑\",\"社会\",\"恋爱\",\"宠物\",\"吸血\",\"萝莉\",\"后宫\",\"御姐\",\"霸总\",\"玄幻\",\"古风\",\"历史\",\"漫改\",\"游戏\",\"穿越\",\"恐怖\",\"真人\",\"科幻\",\"防疫\",\"都市\",\"武侠\",\"修真\",\"生活\",\"动作\"]; \np=[\"rexue\",\"jizhan\",\"yundong\",\"tuili\",\"maoxian\",\"liaomei\",\"baihe\",\"gaoxiao\",\"zhanzhen\",\"shenmo\",\"renzhe\",\"jingji\",\"xuanyi\",\"shehui\",\"lianai\",\"chongwu\",\"xixue\",\"luoli\",\"hougong\",\"yujie\",\"bazong\",\"xuanhuan\",\"gufeng\",\"lishi\",\"mangai\",\"youxi\",\"chuanyue\",\"kongbu\",\"zhenren\",\"kehuan\",\"fangyi\",\"dushi\",\"wuxia\",\"xiuzhen\",\"shenghuo\",\"dongzuo\"];\na=\"::https://api-cdn.kaimanhua.com/comic-api/v1/comic/getsortlist?status_id=0&comic_sort=\";\nb=\"&human_type=0&orderby=date&pagesize=30&page={{page}}&young_mode=0&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8\";\n\nfor(i in f){\n\tresult=result+f[i]+a+p[i]+b+\"\\n\";\n\t}\n", + "header": "", + "lastUpdateTime": 1734945556008, + "loginUrl": "", + "respondTime": 1788, + "ruleBookInfo": { + "author": "$.author_name", + "coverUrl": "$.cover_img_34", + "init": "\nresult=String(java.getString(\"$.data\")).replace(/arsadata/,\"\");\njava.aesBase64DecodeToString(result,\"4548ded8c9e02690\",\"AES/CBC/PKCS5Padding\",\"1992360ee9bc4f8f\");\n", + "intro": "
    \n🏅 评分:{{Math.round(java.getString('$.avgscore'))/10}}分\n🕰 更新:{{String(java.timeFormat(java.getString('$.update_time'))).replace(/\\//g,\"-\").replace(/\\s/g,\"🔸\")}}\n🎗 标签:{{result=String(java.getString('$.comic_taglist')).replace(/\\n/g,\",\")}}\n📂 简介:{{$.comic_desc}}", + "kind": "{{result=String(java.getString('$.sort_typelist')).replace(/\\{|\\}|\\w*=/g,\"\").replace(/\\n/g,\",\")}}", + "lastChapter": "$.lastchapter_title", + "name": "$.comic_name@put:{cid:$.comic_id}", + "tocUrl": "", + "wordCount": "" + }, + "ruleContent": { + "content": "\nresult=String(java.getString(\"$.data\")).replace(/arsadata/,\"\");\nu=java.aesBase64DecodeToString(result,\"4548ded8c9e02690\",\"AES/CBC/PKCS5Padding\",\"1992360ee9bc4f8f\");\nimg=u.match(/\\[(.*)\\]/)[1].split(\",\").map(x=>'\\n').join(\"\\n\")\n", + "sourceRegex": "" + }, + "ruleExplore": { + "bookList": "" + }, + "ruleSearch": { + "author": "$.comic_author", + "bookList": "$.data.data", + "bookUrl": "@js:\nt=\"/comic-api/v2/comic/getcomicdatacomic_id={{$.comic_id}}&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8erciyuan2020\";\nsign=java.md5Encode(t);\nb={\n\"method\": \"GET\",\n\"headers\": {\n\"User-Agent\": \"okhttp/4.9.1\",\n\"m-request-id\": sign\n}\n};\n\"https://api-cdn.kaimanhua.com/comic-api/v2/comic/getcomicdata?comic_id={{$.comic_id}}&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8,\"+JSON.stringify(b);", + "checkKeyWord": "", + "coverUrl": "$.cover_img", + "intro": "$.cartoon_desc", + "kind": "{{result=String(java.getString('$.comic_type')).replace(/,|\\w*/g,\"\").replace(/\\|/g,\",\")}}\n{{String(java.timeFormat(java.getString('$.update_time'))).replace(/\\//g,\"-\").replace(/\\s.*/g,\"\")}}", + "lastChapter": "$.last_chapter_name", + "name": "$.comic_name", + "wordCount": "" + }, + "ruleToc": { + "chapterList": "\nresult=String(java.getString(\"$.data\")).replace(/arsadata/,\"\");\njava.aesBase64DecodeToString(result,\"4548ded8c9e02690\",\"AES/CBC/PKCS5Padding\",\"1992360ee9bc4f8f\");\n\n$.chapters[*]", + "chapterName": "$.chapter_name", + "chapterUrl": "@js:\ncid='@get:{cid}'\nchapter_id='{{$.chapter_id}}'\nt=\"/comic-api/v2/comic/getchapterdatacomic_id=\"+cid+\"&chapter_id=\"+chapter_id+\"&quality=middle&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8erciyuan2020\";\nsign=java.md5Encode(t);\nb={\n\"method\": \"GET\",\n\"headers\": {\n\"User-Agent\": \"okhttp/4.9.1\",\n\"access-token\":\"v1_090fNTIt4Omg86B7LUPcqWRTkvW8JjjLYXTxnm01BiXN8SgniETjucYezOrjZoOopFGr02Fj12RREysE4eHukTCc/LuyeIHzFGMayAgLGaSF8+jMMwrnDdTuYdFk34z7DZf+Zy+VHtjFS0Uy6n6Vyr/5GuJy6FDcbCoVBCjdbFneHjV38UwHjL6AwauUMFfa0f3uSEqGWZG6xn9+OpAn6GGRWHaypicXswr450DO29FcuqP7pHCSldVJtIzOv/Uc\",\n\"m-request-id\": sign\n}\n};\n\"https://api-cdn.kaimanhua.com/comic-api/v2/comic/getchapterdata?comic_id=@get:{cid}&chapter_id={{$.chapter_id}}&quality=middle&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8,\"+JSON.stringify(b);", + "isVolume": "", + "preUpdateJs": "" + }, + "searchUrl": "https://api-cdn.kaimanhua.com/comic-api/v1/comic/getsortlist?search_key={{key}}&orderby=shoucang&page={{page}}&pagesize=20&young_mode=0&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8", + "variableComment": "", + "weight": 0 + }, + { + "bookSourceComment": "// Error: failed to connect to mangaonlineteam.com/149.50.116.175 (port 443) from /192.168.31.119 (port 47866) after 15000ms\n[❌搜索失败]", + "bookSourceGroup": "源仓库,漫画 书源,网站失效", + "bookSourceName": "嘤嘤漫画(英文)", + "bookSourceType": 2, + "bookSourceUrl": "https://mangaonlineteam.com/", + "customOrder": 575, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "lastUpdateTime": 1731588453421, + "respondTime": 195038, + "ruleBookInfo": { + "intro": ".summary__content show-more@h4@text", + "name": ".post-title@h1@text" + }, + "ruleContent": { + "content": "class.page-break @img@html", + "replaceRegex": "##\">\\n##,{'headers':{'referer':'{{source.getKey()}}'}}$0", + "webJs": "" + }, + "ruleExplore": {}, + "ruleSearch": { + "bookList": "class.c-tabs-item@class.row c-tabs-item__content", + "bookUrl": ".h4@a@href", + "checkKeyWord": "god", + "coverUrl": "class.tab-thumb c-image-hover@img@data-src", + "kind": "class.summary-content@text", + "name": ".h4@a@text", + "wordCount": "" + }, + "ruleToc": { + "chapterList": "-class.main version-chap no-volumn@tag.li", + "chapterName": "a@text", + "chapterUrl": "a@href" + }, + "searchUrl": "https://mangaonlineteam.com/?s=god&post_type=wp-manga", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️目录解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "爱看漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://m.kanman.com已校验", + "customOrder": 576, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "人气::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=click&search_type=&search_key=&page={{page}}&size=48\n更新::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=date&search_type=&search_key=&page={{page}}&size=48\n评分::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=score&search_type=&search_key=&page={{page}}&size=48\n收藏::https://m.kanman.com/api/getsortlist/?comic_sort=&orderby=shoucang&search_type=&search_key=&page={{page}}&size=48\n热血::https://m.kanman.com/api/getsortlist/?comic_sort=rexue&orderby=&search_type=&search_key=&page={{page}}&size=48\n机战::https://m.kanman.com/api/getsortlist/?comic_sort=jizhan&orderby=&search_type=&search_key=&page={{page}}&size=48\n运动::https://m.kanman.com/api/getsortlist/?comic_sort=yundong&orderby=&search_type=&search_key=&page={{page}}&size=48\n推理::https://m.kanman.com/api/getsortlist/?comic_sort=tuili&orderby=&search_type=&search_key=&page={{page}}&size=48\n冒险::https://m.kanman.com/api/getsortlist/?comic_sort=maoxian&orderby=&search_type=&search_key=&page={{page}}&size=48\n搞笑::https://m.kanman.com/api/getsortlist/?comic_sort=gaoxiao&orderby=&search_type=&search_key=&page={{page}}&size=48\n战争::https://m.kanman.com/api/getsortlist/?comic_sort=zhanzhen&orderby=&search_type=&search_key=&page={{page}}&size=48\n神魔::https://m.kanman.com/api/getsortlist/?comic_sort=shenmo&orderby=&search_type=&search_key=&page={{page}}&size=48\n忍者::https://m.kanman.com/api/getsortlist/?comic_sort=renzhe&orderby=&search_type=&search_key=&page={{page}}&size=48\n竞技::https://m.kanman.com/api/getsortlist/?comic_sort=jingji&orderby=&search_type=&search_key=&page={{page}}&size=48\n悬疑::https://m.kanman.com/api/getsortlist/?comic_sort=xuanyi&orderby=&search_type=&search_key=&page={{page}}&size=48\n社会::https://m.kanman.com/api/getsortlist/?comic_sort=shehui&orderby=&search_type=&search_key=&page={{page}}&size=48\n恋爱::https://m.kanman.com/api/getsortlist/?comic_sort=lianai&orderby=&search_type=&search_key=&page={{page}}&size=48\n宠物::https://m.kanman.com/api/getsortlist/?comic_sort=chongwu&orderby=&search_type=&search_key=&page={{page}}&size=48\n吸血::https://m.kanman.com/api/getsortlist/?comic_sort=xixue&orderby=&search_type=&search_key=&page={{page}}&size=48\n萝莉::https://m.kanman.com/api/getsortlist/?comic_sort=luoli&orderby=&search_type=&search_key=&page={{page}}&size=48\n后宫::https://m.kanman.com/api/getsortlist/?comic_sort=hougong&orderby=&search_type=&search_key=&page={{page}}&size=48\n御姐::https://m.kanman.com/api/getsortlist/?comic_sort=yujie&orderby=&search_type=&search_key=&page={{page}}&size=48\n霸总::https://m.kanman.com/api/getsortlist/?comic_sort=bazong&orderby=&search_type=&search_key=&page={{page}}&size=48\n玄幻::https://m.kanman.com/api/getsortlist/?comic_sort=xuanhuan&orderby=&search_type=&search_key=&page={{page}}&size=48\n古风::https://m.kanman.com/api/getsortlist/?comic_sort=gufeng&orderby=&search_type=&search_key=&page={{page}}&size=48\n历史::https://m.kanman.com/api/getsortlist/?comic_sort=lishi&orderby=&search_type=&search_key=&page={{page}}&size=48\n漫改::https://m.kanman.com/api/getsortlist/?comic_sort=mangai&orderby=&search_type=&search_key=&page={{page}}&size=48\n游戏::https://m.kanman.com/api/getsortlist/?comic_sort=youxi&orderby=&search_type=&search_key=&page={{page}}&size=48\n穿越::https://m.kanman.com/api/getsortlist/?comic_sort=chuanyue&orderby=&search_type=&search_key=&page={{page}}&size=48\n恐怖::https://m.kanman.com/api/getsortlist/?comic_sort=kongbu&orderby=&search_type=&search_key=&page={{page}}&size=48\n真人::https://m.kanman.com/api/getsortlist/?comic_sort=zhenren&orderby=&search_type=&search_key=&page={{page}}&size=48\n科幻::https://m.kanman.com/api/getsortlist/?comic_sort=kehuan&orderby=&search_type=&search_key=&page={{page}}&size=48\n都市::https://m.kanman.com/api/getsortlist/?comic_sort=dushi&orderby=&search_type=&search_key=&page={{page}}&size=48\n武侠::https://m.kanman.com/api/getsortlist/?comic_sort=wuxia&orderby=&search_type=&search_key=&page={{page}}&size=48\n修真::https://m.kanman.com/api/getsortlist/?comic_sort=xiuzhen&orderby=&search_type=&search_key=&page={{page}}&size=48\n生活::https://m.kanman.com/api/getsortlist/?comic_sort=shenghuo&orderby=&search_type=&search_key=&page={{page}}&size=48\n动作::https://m.kanman.com/api/getsortlist/?comic_sort=dongzuo&orderby=&search_type=&search_key=&page={{page}}&size=48\n防疫::https://m.kanman.com/api/getsortlist/?comic_sort=fangyi&orderby=&search_type=&search_key=&page={{page}}&size=48", + "lastUpdateTime": 1731529665019, + "respondTime": 643, + "ruleBookInfo": { + "author": "[property=\"og:novel:author\"]@content", + "kind": "[property=\"og:novel:category\"]@content", + "lastChapter": ".comic-update-status@text##.*-\\d+ ", + "name": "[property=\"og:novel:book_name\"]@content", + "tocUrl": "https://m.kanman.com/api/getchapterlist?product_id=1&productname=kmh&platformname=wap&comic_id=@get:{bid}", + "wordCount": "" + }, + "ruleContent": { + "content": "$.data.current_chapter.chapter_img_list@js:\nheader={\"Referer\":baseUrl};\nheaders={\"headers\":JSON.stringify(header)};\nresult.split(\"\\n\").map(x=>'').join(\"\\n\")", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "$.cartoon_author_list_name||$.comic_author", + "bookList": "$.data.data||$.data", + "bookUrl": "https://m.kanman.com/{{$.comic_id}}/", + "coverUrl": "https://image.yqmh.com/mh/{{$.comic_id}}.jpg-300x400.webp", + "intro": "$.cartoon_desc", + "kind": "$.comic_type##[a-zA-Z]|\\|", + "lastChapter": "$.latest_cartoon_topic_name||$.last_chapter_name", + "name": "$.comic_name@put:{bid:$.comic_id}" + }, + "ruleToc": { + "chapterList": "-$.data.[*]", + "chapterName": "$.chapter_name", + "chapterUrl": "https://m.kanman.com/api/getchapterinfov2?product_id=1&productname=kmh&platformname=wap&comic_id=@get:{bid}&chapter_newid={{$.chapter_newid}}&isWebp=1&quality=low" + }, + "searchUrl": "https://m.kanman.com/api/serachcomic/?product_id=1&productname=kmh&platformname=wap&serachKey={{key}}&topNumber=10", + "weight": 62 + }, + { + "bookSourceComment": "\n[✅已验证]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "酸奶漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://m.1kkk.com", + "bookUrlPattern": "", + "customOrder": 577, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "lastUpdateTime": 1734945528684, + "loginUrl": "", + "respondTime": 473, + "ruleBookInfo": { + "author": "p.detail-main-info-author@tag.a@text", + "coverUrl": "img.detail-main-bg@src", + "intro": "p.detail-desc@text", + "kind": "p.detail-main-info-class@tag.a@text", + "lastChapter": "ul.detail-list-select@tag,li.0@text", + "name": "p.detail-main-info-title@text", + "wordCount": "" + }, + "ruleContent": { + "content": "@js:header={\"Referer\":baseUrl};\nheaders={\"headers\":JSON.stringify(header)};\neval(result.match(/eval(.*?)\\{\\}\\)\\)/)[0])\nvar image_list = []\nnewImgs.map(item=>{\n image_list.push('')\n})\nimage_list.join(\"\\n\")", + "imageStyle": "", + "nextContentUrl": "" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "tag.p.0@text", + "bookList": "ul.book-list@tag.li", + "bookUrl": "tag.a.0@href", + "coverUrl": "tag.img@src", + "intro": "p.book-list-info-desc@text", + "kind": "", + "lastChapter": "", + "name": "p.book-list-info-title@text" + }, + "ruleToc": { + "chapterList": "ul.detail-list-select@li", + "chapterName": "tag.a@text", + "chapterUrl": "tag.a@href", + "isVip": "@js:var vip_bool = result.select('img').hasClass('detail-list-lock');\nif(!vip_bool){\nvip_bool = result.select('img').hasClass('detail-list-2-info-right');\n}\nvip_bool;" + }, + "searchUrl": "https://m.1kkk.com/search?title={{key}}&language=1", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️正文解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "漫客栈子", + "bookSourceType": 0, + "bookSourceUrl": "http://comic.mkzhan.com", + "bookUrlPattern": "", + "customOrder": 578, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "热门人气::https://comic.mkzcdn.com/search/filter/?order=1&page_num={{page}}&page_size=12\n更新时间::https://comic.mkzcdn.com/search/filter/?order=2&page_num={{page}}&page_size=12\n连载::https://comic.mkzcdn.com/search/filter/?finish=1&page_num={{page}}&page_size=12\n完结::https://comic.mkzcdn.com/search/filter/?finish=2&page_num={{page}}&page_size=12\n霸总::https://comic.mkzcdn.com/search/filter/?theme_id=1&page_num={{page}}&page_size=12\n修真::https://comic.mkzcdn.com/search/filter/?theme_id=2&page_num={{page}}&page_size=12\n恋爱::https://comic.mkzcdn.com/search/filter/?theme_id=3&page_num={{page}}&page_size=12\n校园::https://comic.mkzcdn.com/search/filter/?theme_id=4&page_num={{page}}&page_size=12\n冒险::https://comic.mkzcdn.com/search/filter/?theme_id=5&page_num={{page}}&page_size=12\n搞笑::https://comic.mkzcdn.com/search/filter/?theme_id=6&page_num={{page}}&page_size=12\n生活::https://comic.mkzcdn.com/search/filter/?theme_id=7&page_num={{page}}&page_size=12\n热血::https://comic.mkzcdn.com/search/filter/?theme_id=8&page_num={{page}}&page_size=12\n架空::https://comic.mkzcdn.com/search/filter/?theme_id=9&page_num={{page}}&page_size=12\n后宫::https://comic.mkzcdn.com/search/filter/?theme_id=10&page_num={{page}}&page_size=12\n耽美::https://comic.mkzcdn.com/search/filter/?theme_id=11&page_num={{page}}&page_size=12\n玄幻::https://comic.mkzcdn.com/search/filter/?theme_id=12&page_num={{page}}&page_size=12\n悬疑::https://comic.mkzcdn.com/search/filter/?theme_id=13&page_num={{page}}&page_size=12\n恐怖::https://comic.mkzcdn.com/search/filter/?theme_id=14&page_num={{page}}&page_size=12\n灵异::https://comic.mkzcdn.com/search/filter/?theme_id=15&page_num={{page}}&page_size=12\n动作::https://comic.mkzcdn.com/search/filter/?theme_id=16&page_num={{page}}&page_size=12\n科幻::https://comic.mkzcdn.com/search/filter/?theme_id=17&page_num={{page}}&page_size=12\n战争::https://comic.mkzcdn.com/search/filter/?theme_id=18&page_num={{page}}&page_size=12\n古风::https://comic.mkzcdn.com/search/filter/?theme_id=19&page_num={{page}}&page_size=12\n穿越::https://comic.mkzcdn.com/search/filter/?theme_id=20&page_num={{page}}&page_size=12\n竞技::https://comic.mkzcdn.com/search/filter/?theme_id=21&page_num={{page}}&page_size=12\n百合::https://comic.mkzcdn.com/search/filter/?theme_id=22&page_num={{page}}&page_size=12\n励志::https://comic.mkzcdn.com/search/filter/?theme_id=23&page_num={{page}}&page_size=12\n同人::https://comic.mkzcdn.com/search/filter/?theme_id=24&page_num={{page}}&page_size=12\n真人::https://comic.mkzcdn.com/search/filter/?theme_id=26&page_num={{page}}&page_size=12\n少年::https://comic.mkzcdn.com/search/filter/?audience=1&page_num={{page}}&page_size=12\n少女::https://comic.mkzcdn.com/search/filter/?audience=2&page_num={{page}}&page_size=12\n青年::https://comic.mkzcdn.com/search/filter/?audience=3&page_num={{page}}&page_size=12\n少儿::https://comic.mkzcdn.com/search/filter/?audience=4&page_num={{page}}&page_size=12\n独家::https://comic.mkzcdn.com/search/filter/?copyright=1&page_num={{page}}&page_size=12\n合作::https://comic.mkzcdn.com/search/filter/?copyright=2&page_num={{page}}&page_size=12\n免费::https://comic.mkzcdn.com/search/filter/?is_free=1&page_num={{page}}&page_size=12\n付费::https://comic.mkzcdn.com/search/filter/?is_fee=1&page_num={{page}}&page_size=12\nVIP::https://comic.mkzcdn.com/search/filter/?is_vip=1&page_num={{page}}&page_size=12", + "header": "{\n \"User-Agent\": \"okhttp/3.11.0\"\n}", + "lastUpdateTime": 1733776897678, + "loginUrl": "", + "respondTime": 1353, + "ruleBookInfo": { + "author": "@get:{author}", + "coverUrl": "", + "intro": "$.data.content", + "lastChapter": "$.data.chapter_title", + "name": "$.data.title", + "tocUrl": "https://comic.mkzhan.com/chapter/?comic_id={$.data.comic_id}" + }, + "ruleContent": { + "content": "@js:\njava.getStringList(\"$.data.page[*]image\").toArray().map\n(a=>'').join(\"\\n\")", + "imageStyle": "FULL", + "nextContentUrl": "" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "$.author_title@put:{author:$.author_title}", + "bookList": "$.data.list.*", + "bookUrl": "https://comic.mkzhan.com/comic/info/?comic_id={$.comic_id}", + "coverUrl": "$.cover@js:result.replace(/\\.(jpg|JPG).*/g,\".$1!cover-400\")", + "lastChapter": "$.chapter_title", + "name": "$.title@put:{comic_id:$.comic_id}" + }, + "ruleToc": { + "chapterList": "$.data", + "chapterName": "$.title", + "chapterUrl": "https://comic.mkzhan.com/chapter/content/v1/?chapter_id={{$.chapter_id}}&comic_id=@get:{comic_id}&format=1&quality=1&sign=0&type=1&uid=0", + "isVip": "$.is_vip", + "nextTocUrl": "", + "updateTime": "$.change_time@js:result==0?'':java.timeFormat(result*1000)" + }, + "searchUrl": "https://comic.mkzhan.com/search/keyword/?keyword={{key}}&page_num={{page}}&page_size=20", + "weight": 0 + }, + { + "bookSourceComment": "\n[✅已验证]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "爱看漫画", + "bookSourceType": 2, + "bookSourceUrl": "http://m.kanman.com", + "bookUrlPattern": "", + "customOrder": 579, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "header": "{\ruser-agent: \"Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Mobile Safari/537.36\"\r}", + "lastUpdateTime": 1734944869903, + "loginUrl": "", + "respondTime": 185, + "ruleBookInfo": { + "author": "class.sub_r@tag.p.0@text", + "coverUrl": "id.Cover@tag.img@src", + "intro": "class.txtDesc@text##介绍:", + "kind": "class.tags@class.item@text", + "lastChapter": "id.chapter-list-1@tag.li.-2@tag.a@tag.span@text", + "name": "id.js_comic_id@text", + "wordCount": "class.date@text" + }, + "ruleContent": { + "content": "@js:var json = result.match(/window.comicInfo=(.*?),window.hideguide/)[1];\nvar json = eval('json='+json)\nvar image_list = [];\njson.current_chapter.chapter_img_list.map(item=>{\n image_list.push('')\n})\nimage_list.join(\"\\n\");", + "imageStyle": "", + "nextContentUrl": "" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "", + "bookList": "class.comic-item", + "bookUrl": "tag.a@href", + "coverUrl": "", + "kind": "", + "lastChapter": "class.chapter@text", + "name": "class.title@text" + }, + "ruleToc": { + "chapterList": "class.chapter-list@tag.li", + "chapterName": "tag.a@text", + "chapterUrl": "tag.a@href" + }, + "searchUrl": "http://m.kanman.com/sort/all.html?cache=false&search_key={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️正文解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "知音漫客", + "bookSourceType": 2, + "bookSourceUrl": "https://m.zymk.cn", + "customOrder": 580, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "热血::/sort/5_p{{page}}.html&&\n搞笑::/sort/6_p{{page}}.html&&\n玄幻::/sort/7_p{{page}}.html&&\n生活::/sort/8_p{{page}}.html&&\n恋爱::/sort/9_p{{page}}.html&&\n动作::/sort/10_p{{page}}.html&&\n科幻::/sort/11_p{{page}}.html&&\n战争::/sort/12_p{{page}}.html&&\n悬疑::/sort/13_p{{page}}.html&&\n恐怖::/sort/14_p{{page}}.html&&\n校园::/sort/15_p{{page}}.html&&\n历史::/sort/16_p{{page}}.html&&\n穿越::/sort/17_p{{page}}.html&&\n体育::/sort/19_p{{page}}.html&&\n都市::/sort/20_p{{page}}.html&&\n漫改::/sort/22_p{{page}}.html&&\n修真::/sort/53_p{{page}}.html&&\n霸总::/sort/62_p{{page}}.html&&\n古风::/sort/63_p{{page}}.html&&\n游戏::/sort/64_p{{page}}.html&&\n真人::/sort/65_p{{page}}.html&&\n武侠::/sort/66_p{{page}}.html&&", + "lastUpdateTime": 1734944913615, + "respondTime": 470, + "ruleBookInfo": { + "author": "class.author@text", + "intro": "class.content@text", + "kind": "class.tags@a@text", + "name": "h1.name@text" + }, + "ruleContent": { + "content": "@js:\nhost='http://mhpic.zymkcdn.com/comic/';\noriginal=result.match(/dr_original:\"([^\"]+)\"/)[1];\nend=result.match(/end_var:(\\d+)/)[1];\n//画质\nhigh='.jpg-zymk.high.webp';\nlow='.jpg-zymk.low.webp';\nmiddle='.jpg-zymk.middle.webp';\n\nhtml='';\nfor(i=1;i<=end;i++){\nhtml+='\\n'\n}\nhtml", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "", + "bookList": "class.item@h3", + "bookUrl": "tag.a.0@href", + "coverUrl": "img@data-src", + "kind": "class.score@text", + "lastChapter": "class.chapter@text", + "name": "class.title@a@text" + }, + "ruleToc": { + "chapterList": "-class.chapterlist@li@a", + "chapterName": "text", + "chapterUrl": "href" + }, + "searchUrl": "https://m.zymk.cn/sort/all.html?key={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️目录解析失败]", + "bookSourceGroup": "源仓库,漫画 书源", + "bookSourceName": "全免漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://api-cdn.kaimanhua.com", + "customOrder": 581, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "\nresult=\"\";\n f=[\"热血\",\"机战\",\"运动\",\"推理\",\"冒险\",\"耿美\",\"百合\",\"搞笑\",\"战争\",\"神魔\",\"忍者\",\"竞技\",\"悬疑\",\"社会\",\"恋爱\",\"宠物\",\"吸血\",\"萝莉\",\"后宫\",\"御姐\",\"霸总\",\"玄幻\",\"古风\",\"历史\",\"漫改\",\"游戏\",\"穿越\",\"恐怖\",\"真人\",\"科幻\",\"防疫\",\"都市\",\"武侠\",\"修真\",\"生活\",\"动作\"]; \np=[\"rexue\",\"jizhan\",\"yundong\",\"tuili\",\"maoxian\",\"liaomei\",\"baihe\",\"gaoxiao\",\"zhanzhen\",\"shenmo\",\"renzhe\",\"jingji\",\"xuanyi\",\"shehui\",\"lianai\",\"chongwu\",\"xixue\",\"luoli\",\"hougong\",\"yujie\",\"bazong\",\"xuanhuan\",\"gufeng\",\"lishi\",\"mangai\",\"youxi\",\"chuanyue\",\"kongbu\",\"zhenren\",\"kehuan\",\"fangyi\",\"dushi\",\"wuxia\",\"xiuzhen\",\"shenghuo\",\"dongzuo\"];\na=\"::https://api-cdn.kaimanhua.com/comic-api/v1/comic/getsortlist?status_id=0&comic_sort=\";\nb=\"&human_type=0&orderby=date&pagesize=30&page={{page}}&young_mode=0&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8\";\n\nfor(i in f){\n\tresult=result+f[i]+a+p[i]+b+\"\\n\";\n\t}\n", + "header": "", + "lastUpdateTime": 1731569476688, + "loginUrl": "", + "respondTime": 2245, + "ruleBookInfo": { + "author": "$.author_name", + "coverUrl": "$.cover_img_34", + "init": "\nresult=String(java.getString(\"$.data\")).replace(/arsadata/,\"\");\njava.aesBase64DecodeToString(result,\"4548ded8c9e02690\",\"AES/CBC/PKCS5Padding\",\"1992360ee9bc4f8f\");\n", + "intro": "
    \n🏅 评分:{{Math.round(java.getString('$.avgscore'))/10}}分\n🕰 更新:{{String(java.timeFormat(java.getString('$.update_time'))).replace(/\\//g,\"-\").replace(/\\s/g,\"🔸\")}}\n🎗 标签:{{result=String(java.getString('$.comic_taglist')).replace(/\\n/g,\",\")}}\n📂 简介:{{$.comic_desc}}", + "kind": "{{result=String(java.getString('$.sort_typelist')).replace(/\\{|\\}|\\w*=/g,\"\").replace(/\\n/g,\",\")}}", + "lastChapter": "$.lastchapter_title", + "name": "$.comic_name@put:{cid:$.comic_id}", + "tocUrl": "", + "wordCount": "" + }, + "ruleContent": { + "content": "\nresult=String(java.getString(\"$.data\")).replace(/arsadata/,\"\");\nu=java.aesBase64DecodeToString(result,\"4548ded8c9e02690\",\"AES/CBC/PKCS5Padding\",\"1992360ee9bc4f8f\");\nimg=u.match(/\\[(.*)\\]/)[1].split(\",\").map(x=>'\\n').join(\"\\n\")\n", + "sourceRegex": "" + }, + "ruleExplore": { + "bookList": "" + }, + "ruleSearch": { + "author": "$.comic_author", + "bookList": "$.data.data", + "bookUrl": "@js:\nt=\"/comic-api/v2/comic/getcomicdatacomic_id={{$.comic_id}}&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8erciyuan2020\";\nsign=java.md5Encode(t);\nb={\n\"method\": \"GET\",\n\"headers\": {\n\"User-Agent\": \"okhttp/4.9.1\",\n\"m-request-id\": sign\n}\n};\n\"https://api-cdn.kaimanhua.com/comic-api/v2/comic/getcomicdata?comic_id={{$.comic_id}}&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8,\"+JSON.stringify(b);", + "coverUrl": "$.cover_img", + "intro": "$.cartoon_desc", + "kind": "{{result=String(java.getString('$.comic_type')).replace(/,|\\w*/g,\"\").replace(/\\|/g,\",\")}}\n{{String(java.timeFormat(java.getString('$.update_time'))).replace(/\\//g,\"-\").replace(/\\s.*/g,\"\")}}", + "lastChapter": "$.last_chapter_name", + "name": "$.comic_name", + "wordCount": "" + }, + "ruleToc": { + "chapterList": "\nresult=String(java.getString(\"$.data\")).replace(/arsadata/,\"\");\njava.aesBase64DecodeToString(result,\"4548ded8c9e02690\",\"AES/CBC/PKCS5Padding\",\"1992360ee9bc4f8f\");\n\n$.chapters[*]", + "chapterName": "$.chapter_name", + "chapterUrl": "@js:\ncid='@get:{cid}'\nchapter_id='{{$.chapter_id}}'\nt=\"/comic-api/v2/comic/getchapterdatacomic_id=\"+cid+\"&chapter_id=\"+chapter_id+\"&quality=middle&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8erciyuan2020\";\nsign=java.md5Encode(t);\nb={\n\"method\": \"GET\",\n\"headers\": {\n\"User-Agent\": \"okhttp/4.9.1\",\n\"access-token\":\"v1_090fNTIt4Omg86B7LUPcqWRTkvW8JjjLYXTxnm01BiXN8SgniETjucYezOrjZoOopFGr02Fj12RREysE4eHukTCc/LuyeIHzFGMayAgLGaSF8+jMMwrnDdTuYdFk34z7DZf+Zy+VHtjFS0Uy6n6Vyr/5GuJy6FDcbCoVBCjdbFneHjV38UwHjL6AwauUMFfa0f3uSEqGWZG6xn9+OpAn6GGRWHaypicXswr450DO29FcuqP7pHCSldVJtIzOv/Uc\",\n\"m-request-id\": sign\n}\n};\n\"https://api-cdn.kaimanhua.com/comic-api/v2/comic/getchapterdata?comic_id=@get:{cid}&chapter_id={{$.chapter_id}}&quality=middle&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8,\"+JSON.stringify(b);" + }, + "searchUrl": "https://api-cdn.kaimanhua.com/comic-api/v1/comic/getsortlist?search_key={{key}}&orderby=shoucang&page={{page}}&pagesize=20&young_mode=0&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️详情解析失败]", + "bookSourceGroup": "源仓库,正版漫画 书源", + "bookSourceName": "快看漫画", + "bookSourceType": 2, + "bookSourceUrl": "http://m.kuaikanmanhua.com", + "bookUrlPattern": "", + "customOrder": 640, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "[{'title':'全部排行','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'连载','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=1&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.4}},\n{'title':'完结','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=40&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.4}},\n{'title':'免费','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=1&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.4}},\n{'title':'付费','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=2&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.4}},\n{'title':'最火热','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=0&sort=2&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'新上架','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=0&sort=3&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'抢先看','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=3&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'原创榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=27','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'飙升榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=16','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'剧情榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=25','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'纯爱榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=7','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'恋爱榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=6','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'少女榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=8','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'少年榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=5','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'畅销榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=4','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'人气榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=9','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'投稿榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=13','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'新作榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'日漫榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=10','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'韩漫榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=11','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'完结榜','url':'http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=12','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'空的呀','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},{'title':'全部分类','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'恋爱','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=20&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'纯爱','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=83&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'剧情','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=82&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'古风','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=46&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'校园','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=47&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'奇幻','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=22&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'唯美','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=58&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'热血','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=67&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'日漫','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=57&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'韩漫','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=60&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'女主','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=77&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'穿越','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=80&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'萌系','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=62&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'灵异','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=32&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'玄幻','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=63&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'搞笑','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=71&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'都市','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=48&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'正能','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=54&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'总裁','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=52&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'投稿','url':'http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=76&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}}]", + "header": "{\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 SearchCraft/3.6.5 (Baidu; P1 9.0)\"\n}", + "lastUpdateTime": 1734400776540, + "loginUrl": "http://m.kuaikanmanhua.com/mob/booklist", + "respondTime": 2602, + "ruleBookInfo": { + "author": "\na=eval(result.match(/__NUXT__[^<]*/)[0]);\nresult=JSON.stringify(__NUXT__);\n\n$.data[*].topicInfo.user.nickname", + "coverUrl": "", + "init": "", + "intro": "\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.description\n\nresult.replace(/^/,' ')", + "kind": ".classifications span@text", + "lastChapter": ".update-info@text", + "name": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.title", + "tocUrl": "", + "wordCount": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.update_status.replace(/^.*?已更/,\"\")" + }, + "ruleContent": { + "content": "class.ComicPics@img@html", + "imageStyle": "FULL" + }, + "ruleExplore": { + "bookList": "" + }, + "ruleSearch": { + "author": "$.author_name", + "bookList": "$.data.topics||$.data.cards||$.hits.topicMessageList||$.hits", + "bookUrl": "$.id||$.topic_id@js:\"http://m.kuaikanmanhua.com/mobile/\"+result+\"/list/\"", + "checkKeyWord": "再度与你", + "coverUrl": "$.vertical_image_url||$.image_url||$.cover_image_info.images[*].url", + "intro": "$.description", + "kind": "$.category||$.recommend_tag[1].title", + "lastChapter": "", + "name": "$.title.text||$.title", + "wordCount": "" + }, + "ruleToc": { + "chapterList": "\na=eval(result.match(/__NUXT__[^<]*/)[0]);\nresult=JSON.stringify(__NUXT__);\n\n$.data[*].comicList[*]", + "chapterName": "$.is_free&&$.title\nresult.replace(/^true\\s/,'').replace(/^false\\s/,'✿·')", + "chapterUrl": "$.id\n@js:\"http://m.kuaikanmanhua.com/mobile/comics/\"+result", + "isVip": "", + "updateTime": "\njava.timeFormat({{$.updated_at}})\n\nresult.replace(/\\//g,'-')" + }, + "searchUrl": "http://m.kuaikanmanhua.com/search/mini/topic/title_and_author?page={{page}}&size=24&q={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "作者: 梓澄(helloplhm-qwq)\n登录功能同步菠萝包轻小说书源\n发现懒得写\n[❌搜索失败]", + "bookSourceGroup": "源仓库,正版漫画 书源", + "bookSourceName": "菠萝漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://api.sfacg.com#漫画", + "customOrder": 641, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "header": "{\n\"content-type\": \"application/json\",\n\"sf-minip-info\": \"minip_novel/1.0.72(android;10)/wxmp\",\n\"authorization\": \"Basic YW5kcm9pZHVzZXI6MWEjJDUxLXl0Njk7KkFjdkBxeHE=\",\n\"user-agent\":\"minip_novel/1.0.72(android;10)/wxmp\"\n}", + "lastUpdateTime": 1732303874152, + "respondTime": 4897, + "ruleBookInfo": { + "author": "author", + "coverUrl": "cover", + "init": "\nvar x = JSON.parse(result).data\nvar res = {\n name: x.comicName,\n author: x.expand.authorName,\n latest: x.latestChapterTitle,\n cover: x.comicCover,\n tags: [x.expand.typeName, x.isFinished ? \"完结\" : \"连载\",(x.signStatus === \"普通\") ? \"\" : x.signStatus, x.point.toFixed(1)].join(\",\"),\n intro: x.expand.intro,\n url: `https://api.sfacg.com/comics/${x.comicId}/chaps?expand=needFireMoney,originNeedFireMoney,chapcover`\n}\nres\n", + "intro": "intro", + "kind": "tags", + "lastChapter": "latest", + "name": "name", + "tocUrl": "url" + }, + "ruleContent": { + "content": "\nvar cnt = []\ndata = JSON.parse(result).data\ndata.forEach((x) => {\n cnt.push(``)\n})\ncnt.join(\"\\n\")\n", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "author", + "bookList": "\nvar list = JSON.parse(result).data.comics\nvar res = []\nlist.forEach((x) => {\n res.push({\n name: x.comicName,\n author: x.expand.authorName,\n latest: x.latestChapterTitle,\n cover: x.comicCover,\n tags: [x.expand.typeName, x.isFinished ? \"完结\" : \"连载\",(x.signStatus === \"普通\") ? \"\" : x.signStatus, x.point.toFixed(1)].join(\",\"),\n intro: x.expand.intro,\n url: `https://api.sfacg.com/comics/${x.comicId}?expand=typeName,intro,markCount,authorName,authorIntro,fav,bigComicCover,bigBgBanner,ticket,tags,originalauthor,authoravatar,discount,discountExpireDate,totalNeedFireMoney,originTotalNeedFireMoney`\n })\n})\nres\n", + "bookUrl": "url", + "checkKeyWord": "血姬与骑士", + "coverUrl": "cover", + "intro": "intro", + "kind": "tags", + "lastChapter": "latest", + "name": "name" + }, + "ruleToc": { + "chapterList": "\ndata = JSON.parse(result).data.reverse()\nvar w = []\nvar cid = baseUrl.split(\"?\")[0].match(/\\d+/)[0]\njava.log(cid)\ndata.forEach((x) => {\n w.push({\n title: x.chapterTitle,\n isvip: x.isVip,\n url: `https://api.sfacg.com/comics/${cid}/chappics/${x.pathName}?autoOrder=false&useCoupon=true`,\n update: x.addDate.replace(\"T\", \"\")\n })\n})\nw\n", + "chapterName": "title", + "chapterUrl": "url", + "isVip": "isvip", + "updateTime": "update" + }, + "searchUrl": "/search/comics/result/new?q={{key}}&expand=comics,typeName,authorName,intro,latestchaptitle,latestchapintro,tags,sysTags&sort=hot&page={{page - 1}}&size=12&systagids=&isFinish=-1&updateDays=-1", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️详情解析失败]", + "bookSourceGroup": "源仓库,正版漫画 书源", + "bookSourceName": "快看漫画", + "bookSourceType": 0, + "bookSourceUrl": "https://m.kuaikanmanhua.com/", + "bookUrlPattern": "", + "customOrder": 642, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "[{\"title\":\"✿       榜 单       ✿\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"国漫榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=9\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日漫榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=10\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"韩漫榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=11\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"少女榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=6\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"少年榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=5\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"青女榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=7\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"青年榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=8\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"新作榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=2\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"完结榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=12\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"口碑榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=3\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"畅销榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=4\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"————\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"🔹       状 态       🔹 \",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"推荐\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"最火热\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=0&sort=2&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"新上架\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=0&sort=3&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"连载中\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=1&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"已完结\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=2&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"————\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"►免费\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=1&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"►付费\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=2&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"►抢先看\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=3&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"🔹       分 类       🔹 \",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"恋爱\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=20&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"强剧情\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=82&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"古风\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=46&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"校园\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=47&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"奇幻\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=22&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"唯美\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=58&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"热血\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=67&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日漫\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=57&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"韩漫\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=60&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"大女主\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=77&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"完结\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=40&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"穿越\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=80&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"萌系\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=62&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"灵异\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=32&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"玄幻\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=63&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"搞笑\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=71&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"都市\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=48&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"正能量\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=54&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"总裁\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=52&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"投稿\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=76&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"————\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", + "header": "{\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 SearchCraft/3.6.5 (Baidu; P1 9.0)\"\n}", + "lastUpdateTime": 1732184034433, + "loginUrl": "", + "respondTime": 2718, + "ruleBookInfo": { + "author": "\na=eval(result.match(/__NUXT__[^<]*/)[0]);\nresult=JSON.stringify(__NUXT__);\n\n$.data[*].topicInfo.user.nickname", + "coverUrl": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.vertical_image_url", + "intro": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.description", + "kind": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.tags", + "lastChapter": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.update_status.replace(/^.*?已更/,\"\")", + "name": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.title" + }, + "ruleContent": { + "content": "class.ComicPics@img@html##data-src##src", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "$.author_name", + "bookList": "$.data.topics||$.data.cards||$.hits.topicMessageList||$.hits", + "bookUrl": "$.id||$.topic_id@js:\"http://m.kuaikanmanhua.com/mobile/\"+result+\"/list/\"", + "coverUrl": "$.vertical_image_url||$.image_url||$.cover_image_info.images[*].url", + "intro": "description", + "kind": "$.category||$.recommend_tag[1].title", + "lastChapter": "$.latest_comic_title", + "name": "$.title.text||$.title" + }, + "ruleToc": { + "chapterList": "\na=eval(result.match(/__NUXT__[^<]*/)[0]);\nresult=JSON.stringify(__NUXT__);\n\n$.data[*].comicList[*]", + "chapterName": "$.title", + "chapterUrl": "$.id\n@js:\"http://m.kuaikanmanhua.com/mobile/comics/\"+result", + "isVip": "$.is_free\n@js:result=='true'?false:true", + "updateTime": "@js:java.timeFormat({{$.updated_at}})" + }, + "searchUrl": "http://m.kuaikanmanhua.com/search/mini/topic/title_and_author?page={{page}}&size=24&q={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️正文解析失败]", + "bookSourceGroup": "源仓库,正版漫画 书源", + "bookSourceName": "漫客栈吧", + "bookSourceType": 2, + "bookSourceUrl": "https://comic.mkzhan.com/", + "bookUrlPattern": "", + "customOrder": 643, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "热门人气::https://comic.mkzcdn.com/search/filter/?order=1&page_num={{page}}&page_size=12\n更新时间::https://comic.mkzcdn.com/search/filter/?order=2&page_num={{page}}&page_size=12\n连载::https://comic.mkzcdn.com/search/filter/?finish=1&page_num={{page}}&page_size=12\n完结::https://comic.mkzcdn.com/search/filter/?finish=2&page_num={{page}}&page_size=12\n霸总::https://comic.mkzcdn.com/search/filter/?theme_id=1&page_num={{page}}&page_size=12\n修真::https://comic.mkzcdn.com/search/filter/?theme_id=2&page_num={{page}}&page_size=12\n恋爱::https://comic.mkzcdn.com/search/filter/?theme_id=3&page_num={{page}}&page_size=12\n校园::https://comic.mkzcdn.com/search/filter/?theme_id=4&page_num={{page}}&page_size=12\n冒险::https://comic.mkzcdn.com/search/filter/?theme_id=5&page_num={{page}}&page_size=12\n搞笑::https://comic.mkzcdn.com/search/filter/?theme_id=6&page_num={{page}}&page_size=12\n生活::https://comic.mkzcdn.com/search/filter/?theme_id=7&page_num={{page}}&page_size=12\n热血::https://comic.mkzcdn.com/search/filter/?theme_id=8&page_num={{page}}&page_size=12\n架空::https://comic.mkzcdn.com/search/filter/?theme_id=9&page_num={{page}}&page_size=12\n后宫::https://comic.mkzcdn.com/search/filter/?theme_id=10&page_num={{page}}&page_size=12\n耽美::https://comic.mkzcdn.com/search/filter/?theme_id=11&page_num={{page}}&page_size=12\n玄幻::https://comic.mkzcdn.com/search/filter/?theme_id=12&page_num={{page}}&page_size=12\n悬疑::https://comic.mkzcdn.com/search/filter/?theme_id=13&page_num={{page}}&page_size=12\n恐怖::https://comic.mkzcdn.com/search/filter/?theme_id=14&page_num={{page}}&page_size=12\n灵异::https://comic.mkzcdn.com/search/filter/?theme_id=15&page_num={{page}}&page_size=12\n动作::https://comic.mkzcdn.com/search/filter/?theme_id=16&page_num={{page}}&page_size=12\n科幻::https://comic.mkzcdn.com/search/filter/?theme_id=17&page_num={{page}}&page_size=12\n战争::https://comic.mkzcdn.com/search/filter/?theme_id=18&page_num={{page}}&page_size=12\n古风::https://comic.mkzcdn.com/search/filter/?theme_id=19&page_num={{page}}&page_size=12\n穿越::https://comic.mkzcdn.com/search/filter/?theme_id=20&page_num={{page}}&page_size=12\n竞技::https://comic.mkzcdn.com/search/filter/?theme_id=21&page_num={{page}}&page_size=12\n百合::https://comic.mkzcdn.com/search/filter/?theme_id=22&page_num={{page}}&page_size=12\n励志::https://comic.mkzcdn.com/search/filter/?theme_id=23&page_num={{page}}&page_size=12\n同人::https://comic.mkzcdn.com/search/filter/?theme_id=24&page_num={{page}}&page_size=12\n真人::https://comic.mkzcdn.com/search/filter/?theme_id=26&page_num={{page}}&page_size=12\n少年::https://comic.mkzcdn.com/search/filter/?audience=1&page_num={{page}}&page_size=12\n少女::https://comic.mkzcdn.com/search/filter/?audience=2&page_num={{page}}&page_size=12\n青年::https://comic.mkzcdn.com/search/filter/?audience=3&page_num={{page}}&page_size=12\n少儿::https://comic.mkzcdn.com/search/filter/?audience=4&page_num={{page}}&page_size=12\n独家::https://comic.mkzcdn.com/search/filter/?copyright=1&page_num={{page}}&page_size=12\n合作::https://comic.mkzcdn.com/search/filter/?copyright=2&page_num={{page}}&page_size=12\n免费::https://comic.mkzcdn.com/search/filter/?is_free=1&page_num={{page}}&page_size=12\n付费::https://comic.mkzcdn.com/search/filter/?is_fee=1&page_num={{page}}&page_size=12\nVIP::https://comic.mkzcdn.com/search/filter/?is_vip=1&page_num={{page}}&page_size=12", + "header": "", + "lastUpdateTime": 1732183990538, + "loginUrl": "", + "respondTime": 3150, + "ruleBookInfo": { + "intro": "$.data.content", + "lastChapter": "$.data.chapter_title", + "name": "$.data.title", + "tocUrl": "https://comic.mkzhan.com/chapter/?comic_id={{$.data.comic_id}}\n@js:\nz=result\na={\n \"body\": \"oauth_id=402&oauth_data=%7B%22unionid%22%3A%223227d2ee22e30fcd847e78da026ee6da%22%7D\",\n \"method\": \"POST\"\n}\nb=java.ajax(\"https://member.mkzcdn.com/login/oauth/,\"+JSON.stringify(a))\njava.log(b)\ndata=JSON.parse(b).data\nsign=data.sign\nuid=data.uid\njava.put(\"sign\",sign)\njava.put(\"uid\",uid)\nz" + }, + "ruleContent": { + "content": "@js:\nlet list = JSON.parse(result).data.page.map((i)=>{\n\treturn ''\n\t})\nString(list).replace(new RegExp(\",\",\"gi\"),\"\")" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "$.author_title", + "bookList": "$.data.list.*", + "bookUrl": "https://comic.mkzhan.com/comic/info/?comic_id={{$.comic_id}}", + "coverUrl": "$.cover@js:result.replace(/\\.(jpg|JPG).*/g,\".$1!cover-400\")", + "lastChapter": "$.chapter_title", + "name": "@js:\njava.put(\"comic_id\",result.comic_id)\nresult.title" + }, + "ruleToc": { + "chapterList": "$.data.*", + "chapterName": "$.title", + "chapterUrl": "\nhttps://comic.mkzhan.com/chapter/content/v1/?chapter_id={{$.chapter_id}}&comic_id={{java.get(\"comic_id\")}}&format=1&quality=1&sign={{java.get(\"sign\")}}&type=1&uid={{java.get(\"uid\")}}", + "isVip": "$.is_vip", + "updateTime": "" + }, + "searchUrl": "https://comic.mkzhan.com/search/keyword/?keyword={{key}}&page_num={{page}}&page_size=20", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️详情解析失败]", + "bookSourceGroup": "源仓库,正版漫画 书源", + "bookSourceName": "快看漫画", + "bookSourceType": 0, + "bookSourceUrl": "http://m.kuaikanmanhua.com#Haxc1107", + "bookUrlPattern": "", + "customOrder": 644, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "[{\"title\":\"✿       榜 单       ✿\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"国漫榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=9\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日漫榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=10\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"韩漫榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=11\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"少女榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=6\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"少年榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=5\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"青女榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=7\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"青年榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=8\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"新作榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=2\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"完结榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=12\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"口碑榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=3\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"畅销榜\",\"url\":\"http://m.kuaikanmanhua.com/mini/v1/comic/mkuaikan/rank_list?since={{24*(page-1)}}&limit=24&need_ranks=true&rank_id=4\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"————\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"🔹       状 态       🔹 \",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"推荐\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"最火热\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=0&sort=2&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"新上架\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=0&sort=3&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"连载中\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=1&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"已完结\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=2&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"————\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"►免费\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=1&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"►付费\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=2&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"►抢先看\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=0&update_status=0&pay_status=3&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"🔹       分 类       🔹 \",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"恋爱\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=20&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"强剧情\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=82&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"古风\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=46&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"校园\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=47&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"奇幻\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=22&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"唯美\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=58&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"热血\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=67&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日漫\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=57&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"韩漫\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=60&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"大女主\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=77&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"完结\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=40&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"穿越\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=80&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"萌系\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=62&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"灵异\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=32&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"玄幻\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=63&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"搞笑\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=71&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"都市\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=48&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"正能量\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=54&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"总裁\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=52&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"投稿\",\"url\":\"http://m.kuaikanmanhua.com/search/mini/topic/multi_filter?page={{page}}&size=24&tag_id=76&update_status=0&pay_status=0&sort=1&fav_filter=0&gender=0\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"————\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", + "header": "{\n \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 SearchCraft/3.6.5 (Baidu; P1 9.0)\"\n}", + "lastUpdateTime": 1729408807742, + "loginUrl": "http://m.kuaikanmanhua.com/mob/booklist", + "respondTime": 2272, + "ruleBookInfo": { + "author": "\na=eval(result.match(/__NUXT__[^<]*/)[0]);\nresult=JSON.stringify(__NUXT__);\n\n$.data[*].topicInfo.user.nickname", + "coverUrl": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.vertical_image_url", + "intro": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.description", + "kind": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.tags", + "lastChapter": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.update_status.replace(/^.*?已更/,\"\")", + "name": "@js:\neval(result.match(/__NUXT__[^<]*/)[0]);\n__NUXT__.data[0].topicInfo.title" + }, + "ruleContent": { + "content": "class.ComicPics@img@html##data-src##src", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "$.author_name", + "bookList": "$.data.topics||$.data.cards||$.hits.topicMessageList||$.hits", + "bookUrl": "$.id||$.topic_id@js:\"http://m.kuaikanmanhua.com/mobile/\"+result+\"/list/\"", + "coverUrl": "$.vertical_image_url||$.image_url||$.cover_image_info.images[*].url", + "intro": "description", + "kind": "$.category||$.recommend_tag[1].title", + "lastChapter": "$.latest_comic_title", + "name": "$.title.text||$.title" + }, + "ruleToc": { + "chapterList": "\na=eval(result.match(/__NUXT__[^<]*/)[0]);\nresult=JSON.stringify(__NUXT__);\n\n$.data[*].comicList[*]", + "chapterName": "$.title", + "chapterUrl": "$.id\n@js:\"http://m.kuaikanmanhua.com/mobile/comics/\"+result", + "isVip": "$.is_free\n@js:result=='true'?false:true", + "updateTime": "@js:java.timeFormat({{$.updated_at}})" + }, + "searchUrl": "http://m.kuaikanmanhua.com/search/mini/topic/title_and_author?page={{page}}&size=24&q={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[⚠️正文解析失败]", + "bookSourceGroup": "源仓库,正版漫画 书源", + "bookSourceName": "漫客栈子", + "bookSourceType": 2, + "bookSourceUrl": "https://www.mkzhan.com#♤Haxc", + "bookUrlPattern": "https://m.mkzhan.com/\\d+/", + "customOrder": 645, + "enabled": true, + "enabledCookieJar": true, + "enabledExplore": true, + "exploreUrl": "修真::https://www.mkzhan.com/category/?theme_id=2&page={{page}}\n恋爱::https://www.mkzhan.com/category/?theme_id=3&page={{page}}\n校园::https://www.mkzhan.com/category/?theme_id=4&page={{page}}\n冒险::https://www.mkzhan.com/category/?theme_id=5&page={{page}}\n搞笑::https://www.mkzhan.com/category/?theme_id=6&page={{page}}\n生活::https://www.mkzhan.com/category/?theme_id=7&page={{page}}\n热血::https://www.mkzhan.com/category/?theme_id=8&page={{page}}\n架空::https://www.mkzhan.com/category/?theme_id=9&page={{page}}\n后宫::https://www.mkzhan.com/category/?theme_id=10&page={{page}}\n耽美::https://www.mkzhan.com/category/?theme_id=11&page={{page}}\n玄幻::https://www.mkzhan.com/category/?theme_id=12&page={{page}}\n悬疑::https://www.mkzhan.com/category/?theme_id=13&page={{page}}\n恐怖::https://www.mkzhan.com/category/?theme_id=14&page={{page}}\n灵异::https://www.mkzhan.com/category/?theme_id=15&page={{page}}\n动作::https://www.mkzhan.com/category/?theme_id=16&page={{page}}\n科幻::https://www.mkzhan.com/category/?theme_id=17&page={{page}}\n战争::https://www.mkzhan.com/category/?theme_id=18&page={{page}}\n古风::https://www.mkzhan.com/category/?theme_id=19&page={{page}}\n穿越::https://www.mkzhan.com/category/?theme_id=20&page={{page}}\n竞技::https://www.mkzhan.com/category/?theme_id=21&page={{page}}\n百合::https://www.mkzhan.com/category/?theme_id=22&page={{page}}\n励志::https://www.mkzhan.com/category/?theme_id=23&page={{page}}\n同人::https://www.mkzhan.com/category/?theme_id=24&page={{page}}\n真人::https://www.mkzhan.com/category/?theme_id=26&page={{page}}\n霸总::https://www.mkzhan.com/category/?theme_id=1&page={{page}}", + "lastUpdateTime": 1733776999673, + "respondTime": 1585, + "ruleBookInfo": { + "author": "class.name@text", + "intro": "class.intro-total@text", + "kind": "class.comic-status@tag.span.0@text##题材:", + "lastChapter": "class.update-time@text", + "name": "class.comic-title.0@text" + }, + "ruleContent": { + "content": "$..image@js:result.split(\"\\n\").map(x=>'').join(\"\\n\")", + "imageStyle": "FULL" + }, + "ruleExplore": { + "bookList": "class.cate-comic-list clearfix@class.common-comic-item", + "bookUrl": "class.cover@href", + "coverUrl": "img@data-src", + "intro": ".comic-feature@text", + "lastChapter": "class.comic-update@text##更至:", + "name": "class.comic__title@text" + }, + "ruleSearch": { + "bookList": "class.search-comic-list@class.common-comic-item", + "bookUrl": "class.cover@href", + "coverUrl": "img@data-src", + "intro": ".comic-feature@text", + "lastChapter": "class.comic-update@text##更至:", + "name": "class.comic__title@tag.a.0@text" + }, + "ruleToc": { + "chapterList": "-class.chapter__list-box@tag.li", + "chapterName": "a@text", + "chapterUrl": ".j-chapter-link@data-chapterid\n@js:\r\ncid=result;\r\nbid=baseUrl.match(/\\/(\\d+)\\//)[1],\n\n'https://comic.mkzcdn.com/chapter/content/v1/?chapter_id='+cid+'&comic_id='+bid+'&format=1&quality=1&sign=0&type=1&uid=0'", + "updateTime": ".data@text" + }, + "searchUrl": "https://www.mkzhan.com/search/?keyword={{key}}", + "weight": 0 + }, + { + "bookSourceComment": "\n[❌搜索失败]", + "bookSourceGroup": "源仓库,正版漫画 书源", + "bookSourceName": "快看漫画", + "bookSourceType": 2, + "bookSourceUrl": "https://api.kkmh.com", + "bookUrlPattern": "", + "customOrder": 646, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "exploreUrl": "", + "header": "{\n \"User-Agent\": \"Kuaikan/5.23.0/523000(Android;8.0.0;MIX2;kuaikan568;WIFI;2030*1080)\"\n}", + "lastUpdateTime": 1734006779345, + "loginUrl": "", + "respondTime": 1503, + "ruleBookInfo": { + "author": "$.data.user.nickname", + "intro": "$.data.description", + "kind": "$.category", + "name": "$.data.title" + }, + "ruleContent": { + "content": "@js:\nvar options = {\n\"headers\": {\"Referer\": baseUrl}\n}\njava.getStringList(\"$.data.images\").toArray().map\n(a=>'').join(\"\\n\")", + "imageStyle": "FULL" + }, + "ruleExplore": {}, + "ruleSearch": { + "author": "$.user.nickname", + "bookList": "$.data.topic.hit.*&&$.data.topics.*", + "bookUrl": "https://api.kkmh.com/v1/topics/{$.id}", + "coverUrl": "$.cover_image_url", + "intro": "$.description", + "kind": "$.category", + "lastChapter": "$.latest_comic_title", + "name": "$.title" + }, + "ruleToc": { + "chapterList": "-$..comics.*", + "chapterName": "$.title", + "chapterUrl": "https://api.kkmh.com/v2/comic/{$.id}?is_preview=0", + "updateTime": "@js:java.timeFormat({{$.created_at}}*1000)" + }, + "searchUrl": "https://search.kkmh.com/search/complex?q={{key}}", + "weight": 0 + } +] \ No newline at end of file diff --git a/src/main/debug/analyze-url.ts b/src/main/debug/analyze-url.ts index 23eddb1..a55c571 100644 --- a/src/main/debug/analyze-url.ts +++ b/src/main/debug/analyze-url.ts @@ -8,6 +8,8 @@ import * as vm from 'vm'; import * as crypto from 'crypto'; import { syncHttpRequest } from './rule-parser'; import { webView as puppeteerWebView } from './webview'; +import { CacheManager } from './cache-manager'; +import { CookieStore } from './cookie-manager'; // JS 正则模式 - 参考 Legado AppPattern.kt // Pattern.compile("([\\w\\W]*?)|@js:([\\w\\W]*)", Pattern.CASE_INSENSITIVE) @@ -23,12 +25,6 @@ const PAGE_PATTERN = /<([^>]*?,.*?)>|<(\d+)>/g; // URL 参数分隔模式 const PARAM_PATTERN = /\s*,\s*(?=\{)/; -// Cookie 存储 (简单实现) -const cookieStore: Record = {}; - -// Cache 存储 (简单实现) -const cacheStore: Record = {}; - /** * URL 选项接口 */ @@ -438,12 +434,46 @@ export class AnalyzeUrl { const vmContext = vm.createContext(sandbox); // 先加载 jsLib(如果有) + // jsLib 可能是 JSON 对象(指向远程 JS 文件的 URL)或直接的 JS 代码 const jsLib = this.variables['_jsLib']; if (jsLib) { try { - const convertedJsLib = this.convertRhinoToES6(jsLib); - const jsLibScript = new vm.Script(convertedJsLib); - jsLibScript.runInContext(vmContext, { timeout: 5000 }); + // 检查是否是 JSON 对象 + if (jsLib.trim().startsWith('{') && jsLib.trim().endsWith('}')) { + try { + const jsMap = JSON.parse(jsLib); + // 遍历 JSON 对象,下载并执行每个 JS 文件 + for (const [key, url] of Object.entries(jsMap)) { + if (typeof url === 'string' && (url.startsWith('http://') || url.startsWith('https://'))) { + // 从缓存或网络获取 JS 代码 + const cacheKey = `_jsLib_${url}`; + let jsCode = CacheManager.get(cacheKey); + if (!jsCode) { + const response = syncHttpRequest(url); + if (response.body) { + jsCode = response.body; + CacheManager.put(cacheKey, jsCode, 86400); // 缓存24小时 + } + } + if (jsCode) { + const convertedJsLib = this.convertRhinoToES6(jsCode); + const jsLibScript = new vm.Script(convertedJsLib); + jsLibScript.runInContext(vmContext, { timeout: 10000 }); + } + } + } + } catch (jsonError) { + // 不是有效的 JSON,作为普通 JS 代码执行 + const convertedJsLib = this.convertRhinoToES6(jsLib); + const jsLibScript = new vm.Script(convertedJsLib); + jsLibScript.runInContext(vmContext, { timeout: 5000 }); + } + } else { + // 直接作为 JS 代码执行 + const convertedJsLib = this.convertRhinoToES6(jsLib); + const jsLibScript = new vm.Script(convertedJsLib); + jsLibScript.runInContext(vmContext, { timeout: 5000 }); + } } catch (e) { console.error('[AnalyzeUrl] jsLib execution error:', e); } @@ -464,31 +494,40 @@ export class AnalyzeUrl { private createJsSandbox(result: any): Record { const self = this; - // cookie 对象 + // cookie 对象 - 使用持久化的 CookieStore const cookie = { getCookie: (tag: string, key?: string) => { - const cookies = cookieStore[tag] || ''; - if (!key) return cookies; - const match = cookies.match(new RegExp(`${key}=([^;]+)`)); - return match ? match[1] : ''; + if (key) { + return CookieStore.getKey(tag, key); + } + return CookieStore.getCookie(tag); }, setCookie: (tag: string, cookie: string) => { - cookieStore[tag] = cookie; + CookieStore.setCookie(tag, cookie); + }, + replaceCookie: (tag: string, cookie: string) => { + CookieStore.replaceCookie(tag, cookie); }, removeCookie: (tag: string) => { - delete cookieStore[tag]; + CookieStore.removeCookie(tag); + }, + contains: (tag: string, key: string) => { + return CookieStore.contains(tag, key); }, }; - // cache 对象 + // cache 对象 - 使用持久化的 CacheManager const cache = { - get: (key: string) => cacheStore[key], + get: (key: string) => CacheManager.get(key), put: (key: string, value: any, saveTime?: number) => { - cacheStore[key] = value; + CacheManager.put(key, value, saveTime || 0); }, delete: (key: string) => { - delete cacheStore[key]; + CacheManager.delete(key); }, + getInt: (key: string) => CacheManager.getInt(key), + getLong: (key: string) => CacheManager.getLong(key), + getDouble: (key: string) => CacheManager.getDouble(key), }; return { @@ -964,13 +1003,14 @@ export class AnalyzeUrl { try { // 检查缓存 const cacheKey = `_reload_${url}`; - if (cacheStore[cacheKey]) { - return cacheStore[cacheKey]; + const cached = CacheManager.get(cacheKey); + if (cached) { + return cached; } // 从网络加载 const response = syncHttpRequest(url); if (response.body) { - cacheStore[cacheKey] = response.body; + CacheManager.put(cacheKey, response.body, 3600); // 缓存1小时 return response.body; } return ''; diff --git a/src/main/debug/cache-manager.ts b/src/main/debug/cache-manager.ts new file mode 100644 index 0000000..6101430 --- /dev/null +++ b/src/main/debug/cache-manager.ts @@ -0,0 +1,255 @@ +/** + * CacheManager - 缓存管理器 + * 参考 Legado CacheManager.kt 实现 + * + * 提供内存缓存和文件持久化功能 + */ + +import * as fs from 'fs'; +import * as path from 'path'; +import * as os from 'os'; + +// 缓存条目接口 +interface CacheEntry { + value: string; + deadline: number; // 0 表示永不过期,否则为过期时间戳(毫秒) +} + +// 缓存文件路径 +const CACHE_DIR = path.join(os.homedir(), '.legado-source-debug'); +const CACHE_FILE = path.join(CACHE_DIR, 'cache.json'); + +// 内存缓存 (LRU 简化版) +const memoryCache = new Map(); +const MAX_MEMORY_SIZE = 50 * 1024 * 1024; // 50MB + +// 文件缓存 +let fileCache: Record = {}; +let fileCacheLoaded = false; + +/** + * 确保缓存目录存在 + */ +function ensureCacheDir(): void { + if (!fs.existsSync(CACHE_DIR)) { + fs.mkdirSync(CACHE_DIR, { recursive: true }); + } +} + +/** + * 加载文件缓存 + */ +function loadFileCache(): void { + if (fileCacheLoaded) return; + + try { + ensureCacheDir(); + if (fs.existsSync(CACHE_FILE)) { + const data = fs.readFileSync(CACHE_FILE, 'utf8'); + fileCache = JSON.parse(data); + // 清理过期条目 + const now = Date.now(); + for (const key of Object.keys(fileCache)) { + const entry = fileCache[key]; + if (entry.deadline > 0 && entry.deadline < now) { + delete fileCache[key]; + } + } + } + } catch (e) { + console.error('[CacheManager] 加载缓存失败:', e); + fileCache = {}; + } + fileCacheLoaded = true; +} + +/** + * 保存文件缓存 + */ +function saveFileCache(): void { + try { + ensureCacheDir(); + fs.writeFileSync(CACHE_FILE, JSON.stringify(fileCache, null, 2)); + } catch (e) { + console.error('[CacheManager] 保存缓存失败:', e); + } +} + +/** + * 缓存管理器 + */ +export const CacheManager = { + /** + * 存储数据 + * @param key 键 + * @param value 值 + * @param saveTime 保存时间(秒),0 表示永不过期 + */ + put(key: string, value: any, saveTime: number = 0): void { + const strValue = typeof value === 'string' ? value : JSON.stringify(value); + const deadline = saveTime === 0 ? 0 : Date.now() + saveTime * 1000; + + // 存入内存 + memoryCache.set(key, strValue); + + // 存入文件 + loadFileCache(); + fileCache[key] = { value: strValue, deadline }; + saveFileCache(); + }, + + /** + * 仅存入内存 + */ + putMemory(key: string, value: any): void { + memoryCache.set(key, value); + }, + + /** + * 从内存获取 + */ + getFromMemory(key: string): any { + return memoryCache.get(key); + }, + + /** + * 删除内存缓存 + */ + deleteMemory(key: string): void { + memoryCache.delete(key); + }, + + /** + * 获取数据 + */ + get(key: string): string | null { + // 先从内存获取 + const memValue = memoryCache.get(key); + if (memValue !== undefined) { + return typeof memValue === 'string' ? memValue : JSON.stringify(memValue); + } + + // 从文件获取 + loadFileCache(); + const entry = fileCache[key]; + if (entry) { + // 检查是否过期 + if (entry.deadline === 0 || entry.deadline > Date.now()) { + memoryCache.set(key, entry.value); + return entry.value; + } else { + // 已过期,删除 + delete fileCache[key]; + saveFileCache(); + } + } + + return null; + }, + + /** + * 获取整数 + */ + getInt(key: string): number | null { + const value = this.get(key); + if (value === null) return null; + const num = parseInt(value, 10); + return isNaN(num) ? null : num; + }, + + /** + * 获取长整数 + */ + getLong(key: string): number | null { + return this.getInt(key); + }, + + /** + * 获取浮点数 + */ + getDouble(key: string): number | null { + const value = this.get(key); + if (value === null) return null; + const num = parseFloat(value); + return isNaN(num) ? null : num; + }, + + /** + * 获取浮点数 + */ + getFloat(key: string): number | null { + return this.getDouble(key); + }, + + /** + * 删除数据 + */ + delete(key: string): void { + memoryCache.delete(key); + loadFileCache(); + delete fileCache[key]; + saveFileCache(); + }, + + /** + * 清除所有缓存 + */ + clear(): void { + memoryCache.clear(); + fileCache = {}; + saveFileCache(); + }, + + /** + * 清除书源相关变量 + */ + clearSourceVariables(): void { + const prefixes = ['v_', 'userInfo_', 'loginHeader_', 'sourceVariable_']; + + // 清除内存缓存 + for (const key of memoryCache.keys()) { + if (prefixes.some(p => key.startsWith(p))) { + memoryCache.delete(key); + } + } + + // 清除文件缓存 + loadFileCache(); + for (const key of Object.keys(fileCache)) { + if (prefixes.some(p => key.startsWith(p))) { + delete fileCache[key]; + } + } + saveFileCache(); + }, + + /** + * 获取缓存统计 + */ + getStats(): { memoryCount: number; fileCount: number; filePath: string } { + loadFileCache(); + return { + memoryCount: memoryCache.size, + fileCount: Object.keys(fileCache).length, + filePath: CACHE_FILE, + }; + }, + + /** + * 列出所有键 + */ + keys(): string[] { + loadFileCache(); + const allKeys = new Set(); + for (const key of memoryCache.keys()) { + allKeys.add(key); + } + for (const key of Object.keys(fileCache)) { + allKeys.add(key); + } + return Array.from(allKeys); + }, +}; + +// 导出默认实例 +export default CacheManager; diff --git a/src/main/debug/cookie-manager.ts b/src/main/debug/cookie-manager.ts new file mode 100644 index 0000000..6c4ebb9 --- /dev/null +++ b/src/main/debug/cookie-manager.ts @@ -0,0 +1,181 @@ +/** + * CookieManager - Cookie 管理器 + * 参考 Legado CookieStore.kt 实现 + * + * 提供 Cookie 的存储、获取、删除功能 + */ + +import * as fs from 'fs'; +import * as path from 'path'; +import * as os from 'os'; + +// Cookie 文件路径 +const CACHE_DIR = path.join(os.homedir(), '.legado-source-debug'); +const COOKIE_FILE = path.join(CACHE_DIR, 'cookies.json'); + +// Cookie 存储 +let cookieStore: Record = {}; +let cookieLoaded = false; + +/** + * 确保缓存目录存在 + */ +function ensureCacheDir(): void { + if (!fs.existsSync(CACHE_DIR)) { + fs.mkdirSync(CACHE_DIR, { recursive: true }); + } +} + +/** + * 加载 Cookie + */ +function loadCookies(): void { + if (cookieLoaded) return; + + try { + ensureCacheDir(); + if (fs.existsSync(COOKIE_FILE)) { + const data = fs.readFileSync(COOKIE_FILE, 'utf8'); + cookieStore = JSON.parse(data); + } + } catch (e) { + console.error('[CookieManager] 加载 Cookie 失败:', e); + cookieStore = {}; + } + cookieLoaded = true; +} + +/** + * 保存 Cookie + */ +function saveCookies(): void { + try { + ensureCacheDir(); + fs.writeFileSync(COOKIE_FILE, JSON.stringify(cookieStore, null, 2)); + } catch (e) { + console.error('[CookieManager] 保存 Cookie 失败:', e); + } +} + +/** + * 从 URL 获取域名 + */ +function getDomain(url: string): string { + try { + const urlObj = new URL(url); + return urlObj.hostname; + } catch { + return url; + } +} + +/** + * Cookie 管理器 + * 参考 Legado CookieStore + */ +export const CookieStore = { + /** + * 设置 Cookie + * @param url URL 或域名 + * @param cookie Cookie 字符串 + */ + setCookie(url: string, cookie: string): void { + loadCookies(); + const domain = getDomain(url); + cookieStore[domain] = cookie; + saveCookies(); + }, + + /** + * 替换 Cookie(合并新旧 Cookie) + * @param url URL 或域名 + * @param cookie 新的 Cookie 字符串 + */ + replaceCookie(url: string, cookie: string): void { + loadCookies(); + const domain = getDomain(url); + const oldCookie = cookieStore[domain] || ''; + + // 解析旧 Cookie + const cookieMap: Record = {}; + oldCookie.split(';').forEach(part => { + const [key, value] = part.trim().split('='); + if (key) cookieMap[key] = value || ''; + }); + + // 合并新 Cookie + cookie.split(';').forEach(part => { + const [key, value] = part.trim().split('='); + if (key) cookieMap[key] = value || ''; + }); + + // 重新组合 + const newCookie = Object.entries(cookieMap) + .map(([k, v]) => v ? `${k}=${v}` : k) + .join('; '); + + cookieStore[domain] = newCookie; + saveCookies(); + }, + + /** + * 获取 Cookie + * @param url URL 或域名 + * @returns Cookie 字符串 + */ + getCookie(url: string): string { + loadCookies(); + const domain = getDomain(url); + return cookieStore[domain] || ''; + }, + + /** + * 获取指定 key 的 Cookie 值 + * @param url URL 或域名 + * @param key Cookie 名称 + * @returns Cookie 值 + */ + getKey(url: string, key: string): string { + const cookie = this.getCookie(url); + const match = cookie.match(new RegExp(`(?:^|;\\s*)${key}=([^;]*)`)); + return match ? match[1] : ''; + }, + + /** + * 删除 Cookie + * @param url URL 或域名 + */ + removeCookie(url: string): void { + loadCookies(); + const domain = getDomain(url); + delete cookieStore[domain]; + saveCookies(); + }, + + /** + * 清除所有 Cookie + */ + clear(): void { + cookieStore = {}; + saveCookies(); + }, + + /** + * 获取所有域名 + */ + getDomains(): string[] { + loadCookies(); + return Object.keys(cookieStore); + }, + + /** + * 检查是否包含指定 key + */ + contains(url: string, key: string): boolean { + const cookie = this.getCookie(url); + return cookie.includes(`${key}=`); + }, +}; + +// 导出默认实例 +export default CookieStore; diff --git a/src/main/debug/index.ts b/src/main/debug/index.ts index c6a8ed5..b125b28 100644 --- a/src/main/debug/index.ts +++ b/src/main/debug/index.ts @@ -1,5 +1,7 @@ export { SourceDebugger } from './source-debugger'; export type { BookSource, DebugResult, DebugLog, ParsedBook, ParsedChapter } from './source-debugger'; +export { YiciyuanDebugger, isYiciyuanSource } from './yiciyuan-debugger'; +export type { YiciyuanSource } from './yiciyuan-debugger'; export { httpRequest, parseHeaders } from './http-client'; export type { RequestOptions, RequestResult } from './http-client'; export { diff --git a/src/main/debug/rule-parser.ts b/src/main/debug/rule-parser.ts index b832b24..4f875ae 100644 --- a/src/main/debug/rule-parser.ts +++ b/src/main/debug/rule-parser.ts @@ -12,10 +12,32 @@ import { DOMParser } from '@xmldom/xmldom'; import * as http from 'http'; import * as https from 'https'; import { URL } from 'url'; +import { CacheManager } from './cache-manager'; +import { CookieStore } from './cookie-manager'; // HTTP 请求缓存 (用于 JS 中的同步请求模拟) const httpRequestCache = new Map }>(); +/** + * 修复 Legado 风格的 JSONPath + * Legado 使用 jayway jsonpath,支持以下特殊写法: + * 1. $.data.page[*]image -> $.data.page[*].image (省略点号) + * 2. $.data.[*] -> $.data[*] (多余的点号) + * 3. .chapters[*] -> $.chapters[*] (省略 $ 前缀) + */ +function fixLegadoJsonPath(path: string): string { + let fixed = path; + // 在 ] 后面如果紧跟字母或 $,自动添加点号 + fixed = fixed.replace(/\]([a-zA-Z_$])/g, '].$1'); + // 移除 .[ 中多余的点号,变成 [ + fixed = fixed.replace(/\.\[/g, '['); + // 如果以 . 开头,添加 $ 前缀 + if (fixed.startsWith('.')) { + fixed = '$' + fixed; + } + return fixed; +} + /** * 同步 HTTP 请求 (用于 JS 沙箱中) * 注意: 这是一个阻塞操作,仅用于规则解析 @@ -543,9 +565,26 @@ function selectWithLegadoSyntax( return $el.find(`#${id}`); } - // tag.xxx 或 tag.xxx.index 格式 + // tag.xxx 或 tag.xxx.index 或 tag.xxx!exclude 格式 if (selector.startsWith('tag.')) { - const parts = selector.substring(4).split('.'); + const afterTag = selector.substring(4); + + // 检查是否有排除语法 (tag.option!0 或 tag.option!0:2) + const excludeMatch = afterTag.match(/^([a-z0-9_-]+)!(.+)$/i); + if (excludeMatch) { + const tag = excludeMatch[1]; + const excludeExpr = excludeMatch[2]; + const allTags = $el.find(tag); + + // 解析排除的索引 + const excludeIndices = excludeExpr.split(':').map((n) => { + const idx = parseInt(n); + return idx < 0 ? allTags.length + idx : idx; + }); + return allTags.filter((i) => !excludeIndices.includes(i)); + } + + const parts = afterTag.split('.'); const tag = parts[0]; let allTags = $el.find(tag); @@ -814,6 +853,8 @@ function parseJson(json: string | object, rule: string): any[] { if (!path.startsWith('$')) { path = '$.' + path; } + // 修复 Legado 风格的 JSONPath + path = fixLegadoJsonPath(path); const results = JSONPath({ path, json: data, wrap: false }); @@ -1204,13 +1245,24 @@ function executeJs( } ): any { try { - // 转换 Rhino JS 语法为标准 ES6 - const convertedCode = convertRhinoToES6(code); - - // 创建沙箱环境 - 完整实现 Legado java 对象 - // 如果有 _jsResult,使用它作为 result(用于 bookUrl 等 JS 规则) + // 预处理 {{}} 变量 - 在 JS 执行前替换 + let preprocessedCode = code; const jsResult = context.variables._jsResult || context.result; + // 替换 {{$.xxx}} 格式的 JSONPath 变量 + preprocessedCode = preprocessedCode.replace(/\{\{\$\.([^}]+)\}\}/g, (_, path) => { + if (jsResult && typeof jsResult === 'object') { + // 简单的属性访问 + const value = path.split('.').reduce((obj: any, key: string) => obj?.[key], jsResult); + return value !== undefined ? String(value) : ''; + } + return ''; + }); + + // 转换 Rhino JS 语法为标准 ES6 + const convertedCode = convertRhinoToES6(preprocessedCode); + + // 创建沙箱环境 - 完整实现 Legado java 对象 const sandbox = { result: jsResult, src: context.src, @@ -1521,13 +1573,27 @@ function executeJs( }, // ==================== 时间格式化 ==================== - timeFormat: (time: number) => { - return new Date(time).toISOString().replace('T', ' ').replace('Z', ''); + timeFormat: (time: number | string) => { + try { + const timestamp = typeof time === 'string' ? parseInt(time) : time; + if (isNaN(timestamp) || !isFinite(timestamp)) return ''; + const date = new Date(timestamp); + if (isNaN(date.getTime())) return ''; + return date.toISOString().replace('T', ' ').replace('Z', ''); + } catch { + return ''; + } }, - timeFormatUTC: (time: number, format: string, sh: number) => { - const date = new Date(time + sh * 3600 * 1000); - // 简单格式化,完整实现需要 moment.js 或 date-fns - return date.toISOString(); + timeFormatUTC: (time: number | string, format: string, sh: number) => { + try { + const timestamp = typeof time === 'string' ? parseInt(time) : time; + if (isNaN(timestamp) || !isFinite(timestamp)) return ''; + const date = new Date(timestamp + (sh || 0) * 3600 * 1000); + if (isNaN(date.getTime())) return ''; + return date.toISOString(); + } catch { + return ''; + } }, // ==================== 中文转换 ==================== @@ -1661,6 +1727,7 @@ function executeJs( const content = mContent || context.variables['_content'] || context.src; const baseUrl = context.variables['_baseUrl'] || context.baseUrl; + try { // 解析规则 const parts = rule.split('@'); @@ -1674,11 +1741,16 @@ function executeJs( try { const json = JSON.parse(content); const { JSONPath } = require('jsonpath-plus'); - const jsonRule = rule.startsWith('@json:') ? rule.substring(6) : rule; + let jsonRule = rule.startsWith('@json:') ? rule.substring(6) : rule; + jsonRule = fixLegadoJsonPath(jsonRule); const results = JSONPath({ path: jsonRule, json, wrap: true }); - return Array.isArray(results) ? results : [results]; - } catch { + const resultArray = Array.isArray(results) ? results : [results]; + // 添加 toArray 方法以兼容 Legado 的 Java List + (resultArray as any).toArray = () => resultArray; + return resultArray; + } catch (e) { // 不是有效 JSON,继续用 HTML 解析 + // console.log('[getStringList] JSON parse error:', e); } } $ = cheerio.load(content); @@ -1711,7 +1783,10 @@ function executeJs( if (value) results.push(value); }); - return results.length > 0 ? results : null; + // 添加 toArray 方法以兼容 Legado 的 Java List + const resultWithToArray = results as any; + resultWithToArray.toArray = () => results; + return results.length > 0 ? resultWithToArray : null; } catch { return null; } @@ -1737,7 +1812,8 @@ function executeJs( try { const json = JSON.parse(content); const { JSONPath } = require('jsonpath-plus'); - const jsonRule = rule.startsWith('@json:') ? rule.substring(6) : rule; + let jsonRule = rule.startsWith('@json:') ? rule.substring(6) : rule; + jsonRule = fixLegadoJsonPath(jsonRule); const results = JSONPath({ path: jsonRule, json, wrap: false }); return Array.isArray(results) ? results[0]?.toString() || '' : results?.toString() || ''; } catch { @@ -1783,7 +1859,8 @@ function executeJs( } }, - // 获取元素列表 + // 获取元素列表 - 返回带有 attr() 方法的元素包装对象 + // 参考 Legado AnalyzeByJSoup.getElements() getElements: (rule: string, mContent?: any) => { if (!rule) return []; const cheerio = require('cheerio'); @@ -1797,7 +1874,8 @@ function executeJs( try { const json = JSON.parse(content); const { JSONPath } = require('jsonpath-plus'); - const jsonRule = rule.startsWith('@json:') ? rule.substring(6) : rule; + let jsonRule = rule.startsWith('@json:') ? rule.substring(6) : rule; + jsonRule = fixLegadoJsonPath(jsonRule); const results = JSONPath({ path: jsonRule, json, wrap: true }); return Array.isArray(results) ? results : [results]; } catch { @@ -1809,7 +1887,31 @@ function executeJs( $ = content; } - return $(rule).toArray(); + // 包装元素,添加 attr() 方法以兼容 Legado 的 JSoup Element + const elements = $(rule).toArray(); + return elements.map((el: any) => { + const $el = $(el); + return { + // 获取/设置属性 + attr: (name: string, value?: string) => { + if (value !== undefined) { + $el.attr(name, value); + return $el; + } + return $el.attr(name) || ''; + }, + // 获取文本 + text: () => $el.text(), + // 获取 HTML + html: () => $el.html() || '', + outerHtml: () => $.html($el), + // 获取子元素 + select: (selector: string) => $el.find(selector).toArray(), + // 原始元素 + _element: el, + _$: $el, + }; + }); } catch { return []; } @@ -2005,19 +2107,39 @@ function executeJs( }, // ==================== Cookie 和 Cache ==================== + // cookie 对象 - 使用持久化的 CookieStore cookie: { - getCookie: (tag: string, key?: string) => '', - setCookie: (tag: string, cookie: string) => {}, - removeCookie: (tag: string) => {}, + getCookie: (tag: string, key?: string) => { + if (key) { + return CookieStore.getKey(tag, key); + } + return CookieStore.getCookie(tag); + }, + setCookie: (tag: string, cookie: string) => { + CookieStore.setCookie(tag, cookie); + }, + replaceCookie: (tag: string, cookie: string) => { + CookieStore.replaceCookie(tag, cookie); + }, + removeCookie: (tag: string) => { + CookieStore.removeCookie(tag); + }, + contains: (tag: string, key: string) => { + return CookieStore.contains(tag, key); + }, }, + // cache 对象 - 使用持久化的 CacheManager cache: { - get: (key: string) => context.variables[`_cache_${key}`], - put: (key: string, value: any) => { - context.variables[`_cache_${key}`] = value; + get: (key: string) => CacheManager.get(key), + put: (key: string, value: any, saveTime?: number) => { + CacheManager.put(key, value, saveTime || 0); }, delete: (key: string) => { - delete context.variables[`_cache_${key}`]; + CacheManager.delete(key); }, + getInt: (key: string) => CacheManager.getInt(key), + getLong: (key: string) => CacheManager.getLong(key), + getDouble: (key: string) => CacheManager.getDouble(key), }, // ==================== 全局 Get/Put 函数 ==================== @@ -2032,13 +2154,14 @@ function executeJs( try { // 检查缓存 const cacheKey = `_reload_${url}`; - if (context.variables[cacheKey]) { - return context.variables[cacheKey]; + const cached = CacheManager.get(cacheKey); + if (cached) { + return cached; } // 从网络加载 const response = syncHttpRequest(url); if (response.body) { - context.variables[cacheKey] = response.body; + CacheManager.put(cacheKey, response.body, 3600); // 缓存1小时 return response.body; } return ''; @@ -2079,27 +2202,64 @@ function executeJs( }, }, - // source 对象(书源相关方法) + // source 对象(书源相关方法)- 参考 Legado BaseSource.kt source: { - get: (key: string) => context.variables[key], + // 获取保存的数据 - source.get(key) + get: (key: string) => context.variables[`v_${key}`] || context.variables[key] || '', + // 保存数据 - source.put(key, value) put: (key: string, value: any) => { - context.variables[key] = value; - return value; + context.variables[`v_${key}`] = String(value); + return String(value); }, + // 获取登录信息 getLoginInfoMap: () => context.variables['_loginInfo'] || {}, + getLoginInfo: () => context.variables['_loginInfoStr'] || null, putLoginInfo: (info: string) => { try { context.variables['_loginInfo'] = JSON.parse(info); - } catch {} + context.variables['_loginInfoStr'] = info; + return true; + } catch { + return false; + } }, + // 获取书源标识 getKey: () => context.variables['_sourceUrl'] || context.baseUrl || '', - setVariable: (data: string) => { - try { - Object.assign(context.variables, JSON.parse(data)); - } catch {} - return data; + getTag: () => context.variables['_sourceUrl'] || context.baseUrl || '', + // 设置自定义变量 - source.setVariable(jsonString) + setVariable: (data: string | null) => { + if (data) { + context.variables['_sourceVariable'] = data; + try { + // 同时解析为对象方便访问 + const parsed = JSON.parse(data); + if (typeof parsed === 'object') { + Object.assign(context.variables, parsed); + } + } catch {} + } else { + delete context.variables['_sourceVariable']; + } + }, + // 获取自定义变量 - source.getVariable() 返回整个变量字符串 + getVariable: () => context.variables['_sourceVariable'] || '', + // 登录头相关 + getLoginHeader: () => context.variables['_loginHeader'] || null, + getLoginHeaderMap: () => { + const header = context.variables['_loginHeader']; + if (!header) return null; + try { + return JSON.parse(header); + } catch { + return null; + } + }, + putLoginHeader: (header: string) => { + context.variables['_loginHeader'] = header; + }, + removeLoginHeader: () => { + delete context.variables['_loginHeader']; }, - getVariable: (key: string) => context.variables[key], }, // ==================== 全局工具函数 ==================== @@ -2119,6 +2279,11 @@ function executeJs( Date: Date, RegExp: RegExp, Buffer: Buffer, + Function: Function, + Error: Error, + // Base64 编解码 - 某些混淆代码需要 + atob: (str: string) => Buffer.from(str, 'base64').toString('utf8'), + btoa: (str: string) => Buffer.from(str, 'utf8').toString('base64'), console: { log: (...args: any[]) => console.log('[JS]', ...args), warn: (...args: any[]) => console.warn('[JS]', ...args), @@ -2126,6 +2291,21 @@ function executeJs( }, setTimeout: setTimeout, clearTimeout: clearTimeout, + setInterval: setInterval, + clearInterval: clearInterval, + + // Legado 内置函数 + // Url() - 返回书源 URL + Url: () => { + const sourceUrl = context.variables._sourceUrl || context.baseUrl || ''; + // 提取基础 URL(协议 + 域名) + try { + const url = new URL(sourceUrl); + return `${url.protocol}//${url.host}`; + } catch { + return sourceUrl; + } + }, // eval 函数支持 eval: (code: string) => { @@ -2139,16 +2319,57 @@ function executeJs( }, }; + // 添加 window 和 global 对象(指向 sandbox 自身) + // 某些混淆代码使用 Function("return this")() 获取全局对象 + (sandbox as any).window = sandbox; + (sandbox as any).global = sandbox; + (sandbox as any).globalThis = sandbox; + (sandbox as any).self = sandbox; + // 创建上下文 const vmContext = vm.createContext(sandbox); // 先加载 jsLib(如果有) + // jsLib 可能是 JSON 对象(指向远程 JS 文件的 URL)或直接的 JS 代码 const jsLib = context.variables['_jsLib']; if (jsLib) { try { - const convertedJsLib = convertRhinoToES6(jsLib); - const jsLibScript = new vm.Script(convertedJsLib); - jsLibScript.runInContext(vmContext, { timeout: 5000 }); + // 检查是否是 JSON 对象 + if (jsLib.trim().startsWith('{') && jsLib.trim().endsWith('}')) { + try { + const jsMap = JSON.parse(jsLib); + // 遍历 JSON 对象,下载并执行每个 JS 文件 + for (const [key, url] of Object.entries(jsMap)) { + if (typeof url === 'string' && (url.startsWith('http://') || url.startsWith('https://'))) { + // 从缓存或网络获取 JS 代码 + const cacheKey = `_jsLib_${url}`; + let jsCode = CacheManager.get(cacheKey); + if (!jsCode) { + const response = syncHttpRequest(url); + if (response.body) { + jsCode = response.body; + CacheManager.put(cacheKey, jsCode, 86400); // 缓存24小时 + } + } + if (jsCode) { + const convertedJsLib = convertRhinoToES6(jsCode); + const jsLibScript = new vm.Script(convertedJsLib); + jsLibScript.runInContext(vmContext, { timeout: 10000 }); + } + } + } + } catch (jsonError) { + // 不是有效的 JSON,作为普通 JS 代码执行 + const convertedJsLib = convertRhinoToES6(jsLib); + const jsLibScript = new vm.Script(convertedJsLib); + jsLibScript.runInContext(vmContext, { timeout: 5000 }); + } + } else { + // 直接作为 JS 代码执行 + const convertedJsLib = convertRhinoToES6(jsLib); + const jsLibScript = new vm.Script(convertedJsLib); + jsLibScript.runInContext(vmContext, { timeout: 5000 }); + } } catch (e) { console.error('[JS] jsLib execution error:', e); } @@ -2156,7 +2377,8 @@ function executeJs( // 执行代码(使用已转换的代码) const script = new vm.Script(convertedCode); - return script.runInContext(vmContext, { timeout: 5000 }); + const result = script.runInContext(vmContext, { timeout: 5000 }); + return result; } catch (error) { console.error('JS execution error:', error); return null; @@ -2255,6 +2477,19 @@ function processVariables( innerRule = innerRule.substring(2); // Default 规则 } + // 对于 JSONPath,先检查 variables 中是否有对应的值 + // 例如 {{$..comic_id}} 或 {{$.comic_id}},先检查 variables.comic_id + if (innerRule.startsWith('$.') || innerRule.startsWith('$..')) { + // 提取最后一个属性名 + const pathMatch = innerRule.match(/\.(\w+)$/); + if (pathMatch) { + const varName = pathMatch[1]; + if (context.variables[varName] !== undefined) { + return String(context.variables[varName]); + } + } + } + // 执行内部规则 const ctx: ParseContext = { body: context.body, @@ -2265,9 +2500,15 @@ function processVariables( return result.success && result.data ? String(result.data) : ''; }); - // 处理 {} - JSONPath 简写 + // 处理 {} - JSONPath 简写或变量引用 + // 注意:不处理看起来像 JSON 对象的内容(如 {'webView': true}) const singleBraceRegex = /\{([^{}]+)\}/g; - processed = processed.replace(singleBraceRegex, (_, path) => { + processed = processed.replace(singleBraceRegex, (match, path) => { + // 如果内容包含 ' 或 " 或 :,可能是 JSON 对象,保持原样 + if (path.includes("'") || path.includes('"') || path.includes(':')) { + return match; // 返回原始匹配,不做替换 + } + if (path.startsWith('$.')) { try { const data = JSON.parse(context.body); @@ -2277,7 +2518,11 @@ function processVariables( return ''; } } - return context.variables[path] || ''; + // 只处理看起来像变量名的内容(字母数字下划线) + if (/^[\w]+$/.test(path)) { + return context.variables[path] !== undefined ? String(context.variables[path]) : ''; + } + return match; // 不是有效变量名,保持原样 }); return processed; @@ -2361,26 +2606,67 @@ export function resolveUrl(url: string, baseUrl: string): string { * 解析规则分隔符 * 支持 || (或) 和 && (与) 和 %% (格式化) * 注意:不在 JS 代码块内部分割 + * + * 参考 Legado AnalyzeRule.kt 的规则解析 + * 规则格式: rule1||rule2@js:code 或 rule1&&rule2##regex##replacement + * + * 返回值增加 jsSuffix 字段,用于在所有规则执行完后应用 @js: 代码 */ export function splitRule(rule: string): { rules: string[]; operator: 'or' | 'and' | 'format'; + jsSuffix?: string; // @js: 后缀,应用于最终结果 + headerSuffix?: string; // @Header:{} 后缀,用于请求头(异次元格式) } { - // 如果包含 JS 代码块,不进行分割 - if (/[\s\S]*?<\/js>/i.test(rule) || rule.includes('@js:')) { + // 如果包含 代码块,不进行分割 + if (/[\s\S]*?<\/js>/i.test(rule)) { return { rules: [rule], operator: 'or' }; } - if (rule.includes('||')) { - return { rules: rule.split('||'), operator: 'or' }; + // 先处理 @Header:{} 后缀(异次元格式) + // 格式: rule@Header:{key:value} + let headerSuffix: string | undefined; + let ruleWithoutHeader = rule; + const headerMatch = rule.match(/@Header:\{[^}]+\}$/); + if (headerMatch) { + headerSuffix = headerMatch[0]; + ruleWithoutHeader = rule.substring(0, rule.length - headerSuffix.length).trim(); } - if (rule.includes('&&')) { - return { rules: rule.split('&&'), operator: 'and' }; + + // 处理 @js: 后缀 - 先分离 @js: 部分 + // 格式: rule1||rule2@js:code + // 应该解析为: 先执行 (rule1||rule2),然后将结果传递给 @js:code + let mainRule = ruleWithoutHeader; + let jsSuffix: string | undefined; + + // 查找 @js: 的位置 + const jsIndex = rule.indexOf('@js:'); + if (jsIndex > 0) { + const beforeJs = rule.substring(0, jsIndex); + // 检查 @js: 前面是否有 || 或 && 或 %% + if (beforeJs.includes('||') || beforeJs.includes('&&') || beforeJs.includes('%%')) { + mainRule = beforeJs; + jsSuffix = rule.substring(jsIndex); + } } - if (rule.includes('%%')) { - return { rules: rule.split('%%'), operator: 'format' }; + + let rules: string[]; + let operator: 'or' | 'and' | 'format' = 'or'; + + if (mainRule.includes('||')) { + rules = mainRule.split('||'); + operator = 'or'; + } else if (mainRule.includes('&&')) { + rules = mainRule.split('&&'); + operator = 'and'; + } else if (mainRule.includes('%%')) { + rules = mainRule.split('%%'); + operator = 'format'; + } else { + rules = [mainRule]; } - return { rules: [rule], operator: 'or' }; + + return { rules, operator, jsSuffix, headerSuffix }; } /** @@ -2399,7 +2685,9 @@ function executeSingleRule( // 处理换行符分隔的规则链 // 例如: "a.0@href\n@js:##regex##replacement###" // 第一条规则获取结果,后续规则对结果进行处理 - if (rule.includes('\n')) { + // 注意:如果规则包含 ... 标签,不进行换行分割 + const hasJsTag = /[\s\S]*?<\/js>/i.test(rule); + if (rule.includes('\n') && !hasJsTag) { let lines = rule.split('\n').map(l => l.trim()).filter(l => l); // 处理 @js: 后面紧跟换行符的情况 @@ -2581,7 +2869,7 @@ export function parseRule(ctx: ParseContext, rule: string): ParseResult { } try { - const { rules, operator } = splitRule(rule); + const { rules, operator, jsSuffix } = splitRule(rule); let results: any[] = []; const allResults: any[][] = []; // 用于 %% 格式化 @@ -2621,6 +2909,30 @@ export function parseRule(ctx: ParseContext, rule: string): ParseResult { } } + // 处理 @js: 后缀 - 将结果传递给 JS 代码 + if (jsSuffix && results.length > 0) { + const jsCode = jsSuffix.substring(4); // 去掉 @js: + const jsResults: any[] = []; + for (const result of results) { + try { + const jsContext = { + result: result, + src: ctx.body, + baseUrl: ctx.baseUrl, + variables: ctx.variables, + }; + const jsResult = executeJs(jsCode, jsContext); + if (jsResult !== null && jsResult !== undefined) { + jsResults.push(jsResult); + } + } catch (e) { + // JS 执行失败,保留原结果 + jsResults.push(result); + } + } + results = jsResults; + } + return { success: true, data: results.length === 1 ? results[0] : results, @@ -2671,9 +2983,42 @@ export function parseList( return shouldReverse ? results.reverse() : results; } + // 先处理 || 分隔符(或规则) + // 例如: "$..list[*]||$.data[*]" 应该先尝试第一个,如果没结果再尝试第二个 + if (actualRule.includes('||') && !actualRule.includes('@js:') && !//i.test(actualRule)) { + const orRules = actualRule.split('||'); + for (const orRule of orRules) { + const orResults = parseList({ ...ctx }, orRule.trim()); + if (orResults.length > 0) { + return shouldReverse ? orResults.reverse() : orResults; + } + } + return []; + } + // JSON 列表 - if (actualRule.startsWith('@json:') || actualRule.startsWith('$.')) { - results = parseJson(ctx.body, actualRule); + // 支持格式: @json:, $., data.xxx (异次元图源格式) + // 注意: 需要排除 Legado 语法前缀 (class., id., tag., text.) + // 还需要排除 HTML 标签.类名 格式 (如 ul.book-list, div.container) + const legadoPrefixes = ['class.', 'id.', 'tag.', 'text.']; + const isLegadoSyntax = legadoPrefixes.some(prefix => actualRule.startsWith(prefix)); + + // 检查是否是 HTML 标签.类名 格式(CSS 选择器) + // HTML 标签通常是短的小写字母,后面跟 . 和类名 + const htmlTags = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'menu', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'slot', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr']; + const firstPart = actualRule.split(/[.@#\[\s]/)[0].toLowerCase(); + const isHtmlTagSelector = htmlTags.includes(firstPart); + + const isJsonPath = actualRule.startsWith('@json:') || actualRule.startsWith('$.') || + (!isLegadoSyntax && !isHtmlTagSelector && /^[a-zA-Z_]\w*\./.test(actualRule)); + + if (isJsonPath) { + // 如果是 data.xxx 格式,转换为 $.data.xxx + let jsonRule = actualRule; + if (!jsonRule.startsWith('@json:') && !jsonRule.startsWith('$.') && /^[a-zA-Z_]\w*\./.test(jsonRule)) { + jsonRule = '$.' + jsonRule; + } + results = parseJson(ctx.body, jsonRule); results = Array.isArray(results) ? results : [results]; return shouldReverse ? results.reverse() : results; } @@ -2844,4 +3189,5 @@ export default { splitRule, syncHttpRequest, asyncHttpRequest, + createSymmetricCrypto, }; diff --git a/src/main/debug/source-debugger.ts b/src/main/debug/source-debugger.ts index 29a31cf..9a83233 100644 --- a/src/main/debug/source-debugger.ts +++ b/src/main/debug/source-debugger.ts @@ -193,9 +193,56 @@ export class SourceDebugger { private source: BookSource; private logs: DebugLog[] = []; private variables: Record = {}; + private initialized: boolean = false; constructor(source: BookSource) { this.source = source; + // 设置书源相关变量 + this.variables['_sourceUrl'] = source.bookSourceUrl; + this.variables['_sourceName'] = source.bookSourceName; + } + + /** + * 初始化书源 - 执行 loginUrl 中的初始化代码 + * 参考 Legado BaseSource.kt 的 login() 方法 + * + * 很多书源的 searchUrl 中会调用 eval(String(source.loginUrl)) + * 这会执行 loginUrl 中的代码来初始化变量 + */ + private async initSource(): Promise { + if (this.initialized) return; + this.initialized = true; + + const loginUrl = this.source.loginUrl; + if (!loginUrl) return; + + // 提取 JS 代码 + let jsCode: string | null = null; + if (loginUrl.startsWith('@js:')) { + jsCode = loginUrl.substring(4); + } else if (loginUrl.startsWith('')) { + const endIndex = loginUrl.lastIndexOf(''); + jsCode = loginUrl.substring(4, endIndex > 0 ? endIndex : loginUrl.length); + } else if (!loginUrl.startsWith('http')) { + // 不是 URL,可能是纯 JS 代码 + jsCode = loginUrl; + } + + if (jsCode) { + try { + // 使用 AnalyzeUrl 执行初始化,它会在构建 URL 时执行 JS + // 将 loginUrl 作为 URL 传入,让 AnalyzeUrl 处理 JS 执行 + const analyzeUrl = new AnalyzeUrl(`@js:${jsCode}`, { + source: this.source, + variables: this.variables, + baseUrl: this.getBaseUrl(), + }); + // AnalyzeUrl 构造时会执行 JS,变量会被更新到 this.variables + this.log('info', 'parse', '书源初始化完成'); + } catch (e: any) { + this.log('warning', 'parse', `书源初始化失败: ${e.message}`); + } + } } /** @@ -243,7 +290,14 @@ export class SourceDebugger { */ private extractUrlParams(url: string): void { try { - const urlObj = new URL(url); + // 先移除 Legado 格式的请求配置 (URL,{config}) + let cleanUrl = url; + const configMatch = url.match(/^(.+?),(\{[\s\S]*\})$/); + if (configMatch) { + cleanUrl = configMatch[1]; + } + + const urlObj = new URL(cleanUrl); // 提取查询参数 urlObj.searchParams.forEach((value, key) => { if (value && !this.variables[key]) { @@ -253,7 +307,7 @@ export class SourceDebugger { }); // 尝试从路径中提取 ID(常见模式:/book/123/, /comic/456/) - const pathMatch = url.match(/\/(\d+)\/?(?:\?|$)/); + const pathMatch = cleanUrl.match(/\/(\d+)\/?(?:\?|$)/); if (pathMatch && !this.variables['id']) { this.variables['id'] = pathMatch[1]; this.log('info', 'parse', `从 URL 路径提取 ID: ${pathMatch[1]}`); @@ -306,6 +360,8 @@ export class SourceDebugger { const d = new Date(time); return d.toISOString(); }, + // WebView UA + getWebViewUA: () => 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36', }, JSON, Date, @@ -356,17 +412,50 @@ export class SourceDebugger { return null; } - // JS 规则 - const jsCode = initRule.startsWith('@js:') ? initRule.substring(4) : initRule; + // JSONPath 规则 (以 $. 或 $[ 开头,或以 @json: 开头) + if (initRule.startsWith('$.') || initRule.startsWith('$[') || initRule.startsWith('@json:')) { + try { + const { JSONPath } = require('jsonpath-plus'); + const jsonRule = initRule.startsWith('@json:') ? initRule.substring(6) : initRule; + const json = JSON.parse(body); + const results = JSONPath({ path: jsonRule, json, wrap: false }); + return results; + } catch (e: any) { + console.error('[executeBookInfoInit] JSONPath error:', e.message); + return null; + } + } + + // JS 规则 (以 @js: 或 开头) + if (!initRule.startsWith('@js:') && !initRule.startsWith('')) { + // 不是 JS 规则,尝试作为 CSS 选择器处理 + try { + const cheerio = require('cheerio'); + const $ = cheerio.load(body); + const result = $(initRule).first(); + if (result.length) { + return result.html() || result.text(); + } + } catch {} + return null; + } + + const jsCode = initRule.startsWith('@js:') ? initRule.substring(4) : + initRule.replace(/<\/?js>/gi, ''); + + const { createSymmetricCrypto } = require('./rule-parser'); + const { JSONPath } = require('jsonpath-plus'); + const cheerio = require('cheerio'); + const self = this; const sandbox = { result: body, baseUrl: this.getBaseUrl(), source: this.source, java: { - get: (key: string) => this.variables[key], + get: (key: string) => self.variables[key], put: (key: string, value: any) => { - this.variables[key] = value; + self.variables[key] = value; return value; }, ajax: (url: string) => { @@ -380,9 +469,71 @@ export class SourceDebugger { base64Decode: (str: string) => Buffer.from(str, 'base64').toString('utf8'), base64Encode: (str: string) => Buffer.from(str).toString('base64'), md5Encode: (str: string) => crypto.createHash('md5').update(str).digest('hex'), + // AES 加解密 + aesBase64DecodeToString: (str: string, key: string, transformation: string, iv: string) => { + try { + return createSymmetricCrypto(transformation, key, iv).decryptStr(str); + } catch { return ''; } + }, + aesDecodeToString: (data: string, key: string, transformation: string, iv: string) => { + try { + return createSymmetricCrypto(transformation, key, iv).decryptStr(data); + } catch { return ''; } + }, + // 时间格式化 + timeFormat: (time: number | string) => { + try { + const timestamp = typeof time === 'string' ? parseInt(time) : time; + if (isNaN(timestamp) || !isFinite(timestamp)) return ''; + const date = new Date(timestamp); + if (isNaN(date.getTime())) return ''; + return date.toISOString().replace('T', ' ').replace('Z', ''); + } catch { return ''; } + }, + // getString - 从内容中提取字符串 + getString: (rule: string, mContent?: any, isUrl?: boolean) => { + if (!rule) return ''; + const content = mContent || body; + try { + // JSONPath 规则 + if (rule.startsWith('$.') || rule.startsWith('$[') || rule.startsWith('@json:')) { + const jsonRule = rule.startsWith('@json:') ? rule.substring(6) : rule; + const json = typeof content === 'string' ? JSON.parse(content) : content; + const results = JSONPath({ path: jsonRule, json, wrap: false }); + return Array.isArray(results) ? results[0]?.toString() || '' : results?.toString() || ''; + } + // CSS 选择器 + const $ = cheerio.load(content); + const parts = rule.split('@'); + const selector = parts.slice(0, -1).join('@') || parts[0]; + const attr = parts.length > 1 ? parts[parts.length - 1] : 'text'; + const el = $(selector).first(); + if (attr === 'text') return el.text().trim(); + if (attr === 'html') return el.html() || ''; + return el.attr(attr) || ''; + } catch { return ''; } + }, + // getStringList - 从内容中提取字符串列表 + getStringList: (rule: string, mContent?: any, isUrl?: boolean) => { + if (!rule) return []; + const content = mContent || body; + try { + if (rule.startsWith('$.') || rule.startsWith('$[') || rule.startsWith('@json:')) { + const jsonRule = rule.startsWith('@json:') ? rule.substring(6) : rule; + const json = typeof content === 'string' ? JSON.parse(content) : content; + const results = JSONPath({ path: jsonRule, json, wrap: true }); + const arr = Array.isArray(results) ? results : [results]; + (arr as any).toArray = () => arr; + return arr; + } + return []; + } catch { return []; } + }, }, JSON, console, + String, + Math, }; try { @@ -402,6 +553,9 @@ export class SourceDebugger { this.logs = []; try { + // 0. 初始化书源(执行 loginUrl 中的初始化代码) + await this.initSource(); + // 1. 使用 AnalyzeUrl 构建搜索URL (兼容 Legado 的 , @js:, {{}} 等语法) const analyzeUrl = this.buildSearchUrlAnalyze(keyword); if (!analyzeUrl) { @@ -690,9 +844,21 @@ export class SourceDebugger { const responseBody = requestResult.body || ''; // 使用 ruleExplore 或 ruleSearch 解析 - const ruleExplore = this.source.ruleExplore || this.source.ruleSearch; - if (!ruleExplore) { - this.log('warning', 'parse', '未配置发现规则,尝试使用搜索规则'); + // 参考 Legado BookList.kt: 当 exploreRule.bookList 为空时,使用 searchRule + let bookListRule: BookListRule | undefined; + + if (this.source.ruleExplore?.bookList) { + // exploreRule.bookList 不为空,使用 exploreRule + bookListRule = this.source.ruleExplore; + this.log('info', 'parse', '使用发现规则解析'); + } else if (this.source.ruleSearch?.bookList) { + // exploreRule.bookList 为空,回退到 searchRule + bookListRule = this.source.ruleSearch; + this.log('info', 'parse', '发现规则的 bookList 为空,使用搜索规则解析'); + } + + if (!bookListRule) { + this.log('warning', 'parse', '未配置发现规则和搜索规则'); return { success: true, logs: this.logs, @@ -713,11 +879,11 @@ export class SourceDebugger { }; // 解析书籍列表 - const bookList = parseList(ctx, ruleExplore.bookList || ''); + const bookList = parseList(ctx, bookListRule.bookList || ''); this.log( 'info', 'parse', - `书籍列表规则 "${ruleExplore.bookList}" 匹配到 ${bookList.length} 个元素` + `书籍列表规则 "${bookListRule.bookList}" 匹配到 ${bookList.length} 个元素` ); if (bookList.length === 0) { @@ -746,7 +912,7 @@ export class SourceDebugger { ]; for (const field of fields) { - const rule = ruleExplore[field]; + const rule = bookListRule[field]; if (rule) { const variables = isJsonElement ? { _jsResult: element } : {}; const result = parseFromElement( @@ -822,16 +988,89 @@ export class SourceDebugger { } else { // 普通 URL 处理 let url = bookUrl; + let customHeaders: Record = {}; + let method: 'GET' | 'POST' | 'PUT' | 'DELETE' = 'GET'; + let requestBody: string | undefined; + let useWebView = false; + + // 检查是否包含 Legado 格式的请求配置 (URL,{config}) + const configMatch = url.match(/^(.+?),(\{[\s\S]*\})$/); + if (configMatch) { + url = configMatch[1]; + try { + const config = JSON.parse(configMatch[2]); + if (config.headers) { + customHeaders = config.headers; + } + if (config.method) { + const m = config.method.toUpperCase(); + if (m === 'GET' || m === 'POST' || m === 'PUT' || m === 'DELETE') { + method = m; + } + } + if (config.body) { + requestBody = typeof config.body === 'string' ? config.body : JSON.stringify(config.body); + } + if (config.webView === true) { + useWebView = true; + } + } catch (e) { + // 解析失败,忽略配置 + } + } + if (!url.startsWith('http')) { url = this.getBaseUrl() + (url.startsWith('/') ? '' : '/') + url; } - this.log('info', 'request', `请求书籍详情: ${url}`); + this.log('info', 'request', `请求书籍详情: ${url}${useWebView ? ' (WebView)' : ''}`); - requestResult = await httpRequest({ - url, - headers: this.getHeaders(), - }); + if (useWebView) { + // 使用 WebView 获取渲染后的页面 + try { + const { webView } = require('./webview'); + const webViewResult = await webView({ + url, + headers: { ...this.getHeaders(), ...customHeaders }, + delayTime: 2000, + isMobile: this.isMobileSource(), + }); + + if (webViewResult.success) { + requestResult = { + success: true, + statusCode: 200, + body: webViewResult.body, + headers: {}, + responseTime: 0, + }; + this.log('success', 'request', 'WebView 渲染成功'); + } else { + this.log('warning', 'request', `WebView 失败: ${webViewResult.error},降级到普通请求`); + requestResult = await httpRequest({ + url, + method, + headers: { ...this.getHeaders(), ...customHeaders }, + body: requestBody, + }); + } + } catch (e: any) { + this.log('warning', 'request', `WebView 异常: ${e.message},降级到普通请求`); + requestResult = await httpRequest({ + url, + method, + headers: { ...this.getHeaders(), ...customHeaders }, + body: requestBody, + }); + } + } else { + requestResult = await httpRequest({ + url, + method, + headers: { ...this.getHeaders(), ...customHeaders }, + body: requestBody, + }); + } body = requestResult.body || ''; @@ -873,6 +1112,8 @@ export class SourceDebugger { if (initResult) { // 如果返回 JSON 对象,存储供后续规则使用 this.variables['_bookInfoInit'] = initResult; + // 同时存储为 _jsResult,供 {{$.xxx}} 变量替换使用 + this.variables['_jsResult'] = initResult; processedBody = typeof initResult === 'string' ? initResult : JSON.stringify(initResult); this.log('success', 'parse', 'bookInfoInit 预处理成功'); } @@ -970,16 +1211,89 @@ export class SourceDebugger { } else { // 普通 URL 处理 let url = tocUrl; + let customHeaders: Record = {}; + let method: 'GET' | 'POST' | 'PUT' | 'DELETE' = 'GET'; + let requestBody: string | undefined; + let useWebView = false; + + // 检查是否包含 Legado 格式的请求配置 (URL,{config}) + const configMatch = url.match(/^(.+?),(\{[\s\S]*\})$/); + if (configMatch) { + url = configMatch[1]; + try { + const config = JSON.parse(configMatch[2]); + if (config.headers) { + customHeaders = config.headers; + } + if (config.method) { + const m = config.method.toUpperCase(); + if (m === 'GET' || m === 'POST' || m === 'PUT' || m === 'DELETE') { + method = m; + } + } + if (config.body) { + requestBody = typeof config.body === 'string' ? config.body : JSON.stringify(config.body); + } + if (config.webView === true) { + useWebView = true; + } + } catch (e) { + // 解析失败,忽略配置 + } + } + if (!url.startsWith('http')) { url = this.getBaseUrl() + (url.startsWith('/') ? '' : '/') + url; } - this.log('info', 'request', `请求目录: ${url}`); + this.log('info', 'request', `请求目录: ${url}${useWebView ? ' (WebView)' : ''}`); - requestResult = await httpRequest({ - url, - headers: this.getHeaders(), - }); + if (useWebView) { + // 使用 WebView 获取渲染后的页面 + try { + const { webView } = require('./webview'); + const webViewResult = await webView({ + url, + headers: { ...this.getHeaders(), ...customHeaders }, + delayTime: 2000, + isMobile: this.isMobileSource(), + }); + + if (webViewResult.success) { + requestResult = { + success: true, + statusCode: 200, + body: webViewResult.body, + headers: {}, + responseTime: 0, + }; + this.log('success', 'request', 'WebView 渲染成功'); + } else { + this.log('warning', 'request', `WebView 失败: ${webViewResult.error},降级到普通请求`); + requestResult = await httpRequest({ + url, + method, + headers: { ...this.getHeaders(), ...customHeaders }, + body: requestBody, + }); + } + } catch (e: any) { + this.log('warning', 'request', `WebView 异常: ${e.message},降级到普通请求`); + requestResult = await httpRequest({ + url, + method, + headers: { ...this.getHeaders(), ...customHeaders }, + body: requestBody, + }); + } + } else { + requestResult = await httpRequest({ + url, + method, + headers: { ...this.getHeaders(), ...customHeaders }, + body: requestBody, + }); + } body = requestResult.body || ''; @@ -1114,6 +1428,27 @@ export class SourceDebugger { this.extractUrlParams(contentUrl); let url = contentUrl; + let customHeaders: Record = {}; + + // 检查是否包含 Legado 格式的请求配置 (URL,{config}) + const configMatch = url.match(/^(.+?),(\{[\s\S]*\})$/); + if (configMatch) { + url = configMatch[1]; + try { + // 将单引号替换为双引号以便 JSON 解析 + const configStr = configMatch[2].replace(/'/g, '"'); + const config = JSON.parse(configStr); + if (config.headers) { + customHeaders = config.headers; + } + if (config.webView === true) { + useWebView = true; + } + } catch (e) { + // 解析失败,忽略配置 + } + } + if (!url.startsWith('http')) { url = this.getBaseUrl() + (url.startsWith('/') ? '' : '/') + url; } @@ -1122,13 +1457,15 @@ export class SourceDebugger { let requestResult: RequestResult; + const headers = { ...this.getHeaders(), ...customHeaders }; + if (useWebView) { // 使用 WebView 获取渲染后的页面 try { const { webView } = require('./webview'); const webViewResult = await webView({ url, - headers: this.getHeaders(), + headers, delayTime: 2000, // 等待 JS 渲染 isMobile: this.isMobileSource(), // 根据书源自动判断 }); @@ -1147,20 +1484,20 @@ export class SourceDebugger { // 降级到普通请求 requestResult = await httpRequest({ url, - headers: this.getHeaders(), + headers, }); } } catch (e: any) { this.log('warning', 'request', `WebView 异常: ${e.message}`); requestResult = await httpRequest({ url, - headers: this.getHeaders(), + headers, }); } } else { requestResult = await httpRequest({ url, - headers: this.getHeaders(), + headers, }); } @@ -1245,12 +1582,18 @@ export class SourceDebugger { } // 根据书源类型处理内容 + // 注意:即使 bookSourceType 不是 IMAGE,如果内容包含 标签也按图片处理 const isImageSource = this.source.bookSourceType === BookSourceType.IMAGE; + const hasImgTags = content.includes(' } { + if (!rule) return { rule: '' }; + + let processedRule = rule; + let headers: Record | undefined; + + // 提取 @Header:{...} 后缀 + const headerMatch = processedRule.match(/@Header:\{([^}]+)\}$/); + if (headerMatch) { + processedRule = processedRule.replace(/@Header:\{[^}]+\}$/, '').trim(); + try { + // 解析 Header 内容 + const headerStr = headerMatch[1]; + headers = {}; + // 支持格式: key:value 或 key:"value" 或 "key":"value" + const pairs = headerStr.split(/[;,]/).filter(s => s.trim()); + for (const pair of pairs) { + const colonIdx = pair.indexOf(':'); + if (colonIdx > 0) { + let key = pair.substring(0, colonIdx).trim().replace(/^["']|["']$/g, ''); + let value = pair.substring(colonIdx + 1).trim().replace(/^["']|["']$/g, ''); + // 处理特殊值 + if (value === 'host') { + value = ''; // 将在运行时替换 + } + headers[key] = value; + } + } + } catch { + // 解析失败,忽略 + } + } + + // 处理多行规则 - 如果包含 @js: 则保留完整内容 + // 否则只取第一行(非空) + if (!processedRule.includes('@js:') && !processedRule.includes('')) { + const lines = processedRule.split('\n').map(l => l.trim()).filter(l => l); + if (lines.length > 0) { + processedRule = lines[0]; + } + } + + return { rule: processedRule, headers }; +} + +/** + * 异次元图源调试器 + */ +export class YiciyuanDebugger { + private source: YiciyuanSource; + private logs: DebugLog[] = []; + private variables: Record = {}; + + constructor(source: YiciyuanSource) { + this.source = source; + } + + /** + * 添加日志 + */ + private log( + level: DebugLog['level'], + category: DebugLog['category'], + message: string, + details?: string + ) { + const log: DebugLog = { + time: new Date().toISOString(), + level, + category, + message: `[异次元图源] ${message}`, + details, + }; + this.logs.push(log); + } + + /** + * 获取基础URL + */ + private getBaseUrl(): string { + try { + const url = new URL(this.source.bookSourceUrl); + return `${url.protocol}//${url.host}`; + } catch { + return this.source.bookSourceUrl; + } + } + + /** + * 获取请求头 + * 支持异次元的 httpUserAgent 和 Legado 的 header 字段 + * 注意:不设置默认 User-Agent,让 http-client.ts 中的默认值生效 + */ + private getHeaders(): Record { + const headers: Record = {}; + + // 优先使用 Legado 格式的 header(转换后可能保留) + const source = this.source as any; + if (source.header) { + try { + const parsed = JSON.parse(source.header); + Object.assign(headers, parsed); + } catch { + // 解析失败,忽略 + } + } + + // 异次元的 httpUserAgent(仅当书源明确指定时才使用) + if (this.source.httpUserAgent) { + headers['User-Agent'] = this.source.httpUserAgent; + } + + // 不设置默认 User-Agent,让 http-client.ts 中的 DEFAULT_HEADERS 生效 + // 这样可以保持与 Legado 调试器一致的行为 + + return headers; + } + + /** + * 构建搜索URL + * 替换 searchKey 和 searchPage + * 注意:不对关键词进行 URL 编码,保持与 Legado 一致 + * 某些网站(如笔趣漫画)不接受 URL 编码的中文 + */ + private buildSearchUrl(keyword: string, page: number = 1): string { + let url = this.source.ruleSearchUrl || ''; + // 不进行 URL 编码,直接替换关键词 + url = url.replace(/searchKey/g, keyword); + url = url.replace(/searchPage/g, String(page)); + + // 如果不是完整URL,添加基础URL + if (!url.startsWith('http')) { + url = this.getBaseUrl() + (url.startsWith('/') ? '' : '/') + url; + } + + return url; + } + + /** + * 从 URL 中提取参数 + */ + private extractUrlParams(url: string): void { + try { + const urlObj = new URL(url); + urlObj.searchParams.forEach((value, key) => { + if (value && !this.variables[key]) { + this.variables[key] = value; + this.log('info', 'parse', `从 URL 提取参数: ${key}=${value}`); + } + }); + } catch { + // URL 解析失败,忽略 + } + } + + /** + * 执行搜索测试 + */ + async debugSearch(keyword: string): Promise { + this.logs = []; + + try { + const url = this.buildSearchUrl(keyword); + const headers = this.getHeaders(); + this.log('info', 'request', `搜索: ${keyword}`); + this.log('info', 'request', `请求URL: ${url}`); + + const requestResult = await httpRequest({ + url, + headers, + }); + + if (!requestResult.success) { + this.log('error', 'request', `请求失败: ${requestResult.error}`); + return { success: false, logs: this.logs, error: requestResult.error }; + } + + this.log('success', 'request', `请求成功 ${requestResult.statusCode} (${requestResult.responseTime}ms)`); + + const body = requestResult.body || ''; + const books: any[] = []; + + // 解析搜索列表 + if (this.source.ruleSearchList) { + const { rule: listRule } = preprocessRule(this.source.ruleSearchList); + this.log('info', 'parse', `列表规则: "${listRule}"`); + + const ctx: ParseContext = { + body, + baseUrl: this.getBaseUrl(), + variables: this.variables, + }; + + const elements = parseList(ctx, listRule); + + if (elements && elements.length > 0) { + this.log('info', 'parse', `列表规则匹配到 ${elements.length} 个元素`); + + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + const book: any = {}; + + // 解析各字段(使用预处理去除 @Header 后缀) + if (this.source.ruleSearchName) { + const { rule } = preprocessRule(this.source.ruleSearchName); + const result = parseFromElement(element, rule, this.getBaseUrl(), this.variables); + book.name = result.success ? result.data : undefined; + } + + if (this.source.ruleSearchAuthor) { + const { rule } = preprocessRule(this.source.ruleSearchAuthor); + const result = parseFromElement(element, rule, this.getBaseUrl(), this.variables); + book.author = result.success ? result.data : undefined; + } + + if (this.source.ruleSearchKind) { + const { rule } = preprocessRule(this.source.ruleSearchKind); + const result = parseFromElement(element, rule, this.getBaseUrl(), this.variables); + book.kind = result.success ? result.data : undefined; + } + + if (this.source.ruleSearchLastChapter) { + const { rule } = preprocessRule(this.source.ruleSearchLastChapter); + const result = parseFromElement(element, rule, this.getBaseUrl(), this.variables); + book.lastChapter = result.success ? result.data : undefined; + } + + if (this.source.ruleSearchCoverUrl) { + const { rule } = preprocessRule(this.source.ruleSearchCoverUrl); + const result = parseFromElement(element, rule, this.getBaseUrl(), this.variables); + book.coverUrl = result.success ? resolveUrl(String(result.data), this.getBaseUrl()) : undefined; + } + + if (this.source.ruleSearchNoteUrl) { + const { rule } = preprocessRule(this.source.ruleSearchNoteUrl); + const result = parseFromElement(element, rule, this.getBaseUrl(), this.variables); + book.bookUrl = result.success ? resolveUrl(String(result.data), this.getBaseUrl()) : undefined; + } + + books.push(book); + + // 记录前几个结果 + if (i < 3) { + this.log('info', 'field', `[${i + 1}] ${book.name || '(无名称)'} - ${book.author || '(无作者)'}`); + } + } + } + } + + this.log('success', 'parse', `成功解析 ${books.length} 本书籍`); + + return { + success: true, + logs: this.logs, + requestResult, + parsedItems: books, + }; + } catch (error: any) { + this.log('error', 'error', `调试异常: ${error.message}`); + return { success: false, logs: this.logs, error: error.message }; + } + } + + /** + * 执行详情测试 + */ + async debugBookInfo(bookUrl: string): Promise { + this.logs = []; + this.extractUrlParams(bookUrl); + + try { + let url = bookUrl; + if (!url.startsWith('http')) { + url = this.getBaseUrl() + (url.startsWith('/') ? '' : '/') + url; + } + + this.log('info', 'request', `请求详情: ${url}`); + + const requestResult = await httpRequest({ + url, + headers: this.getHeaders(), + }); + + if (!requestResult.success) { + this.log('error', 'request', `请求失败: ${requestResult.error}`); + return { success: false, logs: this.logs, error: requestResult.error }; + } + + this.log('success', 'request', `请求成功 ${requestResult.statusCode} (${requestResult.responseTime}ms)`); + + const body = requestResult.body || ''; + const bookInfo: any = { bookUrl: url }; + + const ctx: ParseContext = { + body, + baseUrl: this.getBaseUrl(), + variables: this.variables, + }; + + // 解析各字段(使用预处理去除 @Header 后缀) + if (this.source.ruleBookName) { + const { rule } = preprocessRule(this.source.ruleBookName); + const result = parseRule(ctx, rule); + bookInfo.name = result.success ? result.data : undefined; + this.log('info', 'field', `name: ${bookInfo.name}`); + } + + if (this.source.ruleBookAuthor) { + const { rule } = preprocessRule(this.source.ruleBookAuthor); + const result = parseRule(ctx, rule); + bookInfo.author = result.success ? result.data : undefined; + this.log('info', 'field', `author: ${bookInfo.author}`); + } + + if (this.source.ruleIntroduce) { + const { rule } = preprocessRule(this.source.ruleIntroduce); + const result = parseRule(ctx, rule); + bookInfo.intro = result.success ? result.data : undefined; + const introStr = bookInfo.intro ? String(bookInfo.intro) : '(未获取)'; + this.log('info', 'field', `intro: ${introStr.substring(0, 100)}...`); + } + + if (this.source.ruleBookKind) { + const { rule } = preprocessRule(this.source.ruleBookKind); + const result = parseRule(ctx, rule); + bookInfo.kind = result.success ? result.data : undefined; + this.log('info', 'field', `kind: ${bookInfo.kind}`); + } + + if (this.source.ruleCoverUrl) { + const { rule } = preprocessRule(this.source.ruleCoverUrl); + const result = parseRule(ctx, rule); + bookInfo.coverUrl = result.success ? resolveUrl(String(result.data), this.getBaseUrl()) : undefined; + this.log('info', 'field', `coverUrl: ${bookInfo.coverUrl}`); + } + + if (this.source.ruleChapterUrl) { + const { rule } = preprocessRule(this.source.ruleChapterUrl); + const result = parseRule(ctx, rule); + bookInfo.tocUrl = result.success ? resolveUrl(String(result.data), this.getBaseUrl()) : undefined; + this.log('info', 'field', `tocUrl: ${bookInfo.tocUrl}`); + } + + return { + success: true, + logs: this.logs, + requestResult, + parsedItems: [bookInfo], + }; + } catch (error: any) { + this.log('error', 'error', `调试异常: ${error.message}`); + return { success: false, logs: this.logs, error: error.message }; + } + } + + /** + * 执行目录测试 + */ + async debugToc(tocUrl: string): Promise { + this.logs = []; + this.extractUrlParams(tocUrl); + + try { + let url = tocUrl; + if (!url.startsWith('http')) { + url = this.getBaseUrl() + (url.startsWith('/') ? '' : '/') + url; + } + + this.log('info', 'request', `请求目录页面: ${url}`); + + const requestResult = await httpRequest({ + url, + headers: this.getHeaders(), + }); + + if (!requestResult.success) { + this.log('error', 'request', `请求失败: ${requestResult.error}`); + return { success: false, logs: this.logs, error: requestResult.error }; + } + + this.log('success', 'request', `请求成功 ${requestResult.statusCode} (${requestResult.responseTime}ms)`); + + let body = requestResult.body || ''; + const chapters: any[] = []; + + // 如果有 ruleChapterUrl,先执行它获取API URL,然后请求API + if (this.source.ruleChapterUrl) { + const { rule } = preprocessRule(this.source.ruleChapterUrl); + this.log('info', 'parse', `执行目录URL规则: ${rule.substring(0, 100)}...`); + + const ctx: ParseContext = { + body, + baseUrl: this.getBaseUrl(), + variables: this.variables, + }; + + const urlResult = parseRule(ctx, rule); + if (urlResult.success && urlResult.data) { + const apiUrl = String(urlResult.data); + this.log('info', 'request', `请求目录API: ${apiUrl}`); + + const apiResult = await httpRequest({ + url: apiUrl, + headers: { + ...this.getHeaders(), + 'Referer': this.getBaseUrl(), + }, + }); + + if (apiResult.success) { + body = apiResult.body || ''; + this.log('success', 'request', `API请求成功 ${apiResult.statusCode}`); + } else { + this.log('warning', 'request', `API请求失败: ${apiResult.error}`); + } + } + } + + // 解析章节列表 + if (this.source.ruleChapterList) { + const { rule: listRule } = preprocessRule(this.source.ruleChapterList); + const ctx: ParseContext = { + body, + baseUrl: this.getBaseUrl(), + variables: this.variables, + }; + + const elements = parseList(ctx, listRule); + + if (elements && elements.length > 0) { + this.log('info', 'parse', `章节列表规则匹配到 ${elements.length} 个元素`); + + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + const chapter: any = {}; + + // 章节名称(使用预处理去除 @Header 后缀) + if (this.source.ruleChapterName) { + const { rule } = preprocessRule(this.source.ruleChapterName); + const result = parseFromElement(element, rule, this.getBaseUrl(), this.variables); + chapter.name = result.success ? result.data : undefined; + } + + // 章节URL(使用预处理去除 @Header 后缀) + if (this.source.ruleContentUrl) { + const { rule } = preprocessRule(this.source.ruleContentUrl); + const result = parseFromElement(element, rule, this.getBaseUrl(), this.variables); + chapter.url = result.success ? resolveUrl(String(result.data), this.getBaseUrl()) : undefined; + } + + chapters.push(chapter); + + // 记录部分结果 + if (i < 5 || i === elements.length - 1) { + this.log('info', 'parse', `[${i + 1}] 章节: ${chapter.name || '(无名称)'} | 链接: ${chapter.url || '(无链接)'}`); + } else if (i === 5) { + this.log('info', 'parse', `... 省略中间 ${elements.length - 6} 个章节 ...`); + } + } + } + } + + this.log('success', 'parse', `成功解析 ${chapters.length} 个章节`); + + return { + success: true, + logs: this.logs, + requestResult, + parsedItems: chapters, + }; + } catch (error: any) { + this.log('error', 'error', `调试异常: ${error.message}`); + return { success: false, logs: this.logs, error: error.message }; + } + } + + /** + * 执行正文测试 + */ + async debugContent(contentUrl: string): Promise { + this.logs = []; + this.extractUrlParams(contentUrl); + + try { + let url = contentUrl; + if (!url.startsWith('http')) { + url = this.getBaseUrl() + (url.startsWith('/') ? '' : '/') + url; + } + + this.log('info', 'request', `请求正文: ${url}`); + + const requestResult = await httpRequest({ + url, + headers: this.getHeaders(), + }); + + if (!requestResult.success) { + this.log('error', 'request', `请求失败: ${requestResult.error}`); + return { success: false, logs: this.logs, error: requestResult.error }; + } + + this.log('success', 'request', `请求成功 ${requestResult.statusCode} (${requestResult.responseTime}ms)`); + + const body = requestResult.body || ''; + let content = ''; + let imageUrls: string[] = []; + + // 解析正文内容(使用预处理去除 @Header 后缀) + if (this.source.ruleBookContent) { + const { rule } = preprocessRule(this.source.ruleBookContent); + const ctx: ParseContext = { + body, + baseUrl: this.getBaseUrl(), + variables: this.variables, + }; + + const result = parseRule(ctx, rule); + if (result.success) { + content = Array.isArray(result.data) ? result.data.join('\n') : String(result.data); + } + } + + this.log('info', 'field', `正文内容长度: ${content.length}`); + + // 图源模式:提取图片URL + this.log('info', 'parse', '图源模式'); + this.log('info', 'parse', `正文内容预览: ${content.substring(0, 200)}`); + + imageUrls = extractImageUrls(content, url); + + if (imageUrls.length > 0) { + this.log('info', 'field', `提取到 ${imageUrls.length} 张图片`); + } else { + this.log('warning', 'field', '未找到图片'); + } + + return { + success: true, + logs: this.logs, + requestResult, + parsedItems: [{ content }], + imageUrls, + }; + } catch (error: any) { + this.log('error', 'error', `调试异常: ${error.message}`); + return { success: false, logs: this.logs, error: error.message }; + } + } + + /** + * 执行发现测试 + */ + async debugExplore(exploreUrl: string): Promise { + this.logs = []; + + try { + let url = exploreUrl; + + // 处理发现URL格式:分类名::URL + if (url.includes('::')) { + const parts = url.split('::'); + url = parts[1] || parts[0]; + } + + // 替换页码 + url = url.replace(/searchPage/g, '1'); + + if (!url.startsWith('http')) { + url = this.getBaseUrl() + (url.startsWith('/') ? '' : '/') + url; + } + + this.log('info', 'request', `请求发现: ${url}`); + + const requestResult = await httpRequest({ + url, + headers: this.getHeaders(), + }); + + if (!requestResult.success) { + this.log('error', 'request', `请求失败: ${requestResult.error}`); + return { success: false, logs: this.logs, error: requestResult.error }; + } + + this.log('success', 'request', `请求成功 ${requestResult.statusCode} (${requestResult.responseTime}ms)`); + + const body = requestResult.body || ''; + const books: any[] = []; + + // 使用搜索规则解析(发现和搜索通常使用相同的列表规则) + if (this.source.ruleSearchList) { + const ctx: ParseContext = { + body, + baseUrl: this.getBaseUrl(), + variables: this.variables, + }; + + const elements = parseList(ctx, this.source.ruleSearchList); + + if (elements && elements.length > 0) { + this.log('info', 'parse', `列表规则匹配到 ${elements.length} 个元素`); + + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + const book: any = {}; + + if (this.source.ruleSearchName) { + const result = parseFromElement(element, this.source.ruleSearchName, this.getBaseUrl(), this.variables); + book.name = result.success ? result.data : undefined; + } + + if (this.source.ruleSearchCoverUrl) { + const result = parseFromElement(element, this.source.ruleSearchCoverUrl, this.getBaseUrl(), this.variables); + book.coverUrl = result.success ? resolveUrl(String(result.data), this.getBaseUrl()) : undefined; + } + + if (this.source.ruleSearchNoteUrl) { + const result = parseFromElement(element, this.source.ruleSearchNoteUrl, this.getBaseUrl(), this.variables); + book.bookUrl = result.success ? resolveUrl(String(result.data), this.getBaseUrl()) : undefined; + } + + books.push(book); + + if (i < 3) { + this.log('info', 'field', `[${i + 1}] ${book.name || '(无名称)'}`); + } + } + } + } + + this.log('success', 'parse', `成功解析 ${books.length} 本书籍`); + + return { + success: true, + logs: this.logs, + requestResult, + parsedItems: books, + }; + } catch (error: any) { + this.log('error', 'error', `调试异常: ${error.message}`); + return { success: false, logs: this.logs, error: error.message }; + } + } +} + +/** + * 检测是否为异次元图源 + */ +export function isYiciyuanSource(source: any): boolean { + if (!source) return false; + + // 异次元图源特有字段 + const yiciyuanFields = [ + 'ruleSearchUrl', + 'ruleSearchList', + 'ruleSearchName', + 'ruleSearchNoteUrl', + 'ruleBookContent', + 'ruleFindUrl', + 'ruleChapterUrl', + 'ruleIntroduce', + 'bookSingleThread', + 'httpUserAgent', + ]; + + // Legado 特有字段 + const legadoFields = [ + 'ruleSearch', + 'ruleExplore', + 'ruleBookInfo', + 'ruleToc', + 'ruleContent', + 'searchUrl', + 'exploreUrl', + ]; + + let yiciyuanCount = 0; + let legadoCount = 0; + + for (const field of yiciyuanFields) { + if (field in source && source[field] !== undefined && source[field] !== '') { + yiciyuanCount++; + } + } + + for (const field of legadoFields) { + if (field in source && source[field] !== undefined && source[field] !== '') { + legadoCount++; + } + } + + return yiciyuanCount > legadoCount; +} diff --git a/src/main/main.ts b/src/main/main.ts index 704d1a3..eeb6bca 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -13,9 +13,9 @@ import fs from 'fs'; import { app, BrowserWindow, shell, ipcMain, dialog } from 'electron'; import { autoUpdater } from 'electron-updater'; import log from 'electron-log'; -import MenuBuilder from './menu'; +// import MenuBuilder from './menu'; // 已禁用默认菜单 import { resolveHtmlPath } from './util'; -import { SourceDebugger, BookSource } from './debug'; +import { SourceDebugger, BookSource, YiciyuanDebugger, isYiciyuanSource } from './debug'; import { getAIService, ChatMessage } from './ai/ai-service'; class AppUpdater { @@ -40,14 +40,21 @@ ipcMain.on('ipc-example', async (event, arg) => { /** * 搜索测试 + * 自动识别源格式(Legado 或 异次元) */ ipcMain.handle( 'debug:search', - async (_event, source: BookSource, keyword: string) => { + async (_event, source: any, keyword: string) => { try { - const debugger_ = new SourceDebugger(source); - const result = await debugger_.debugSearch(keyword); - return result; + if (isYiciyuanSource(source)) { + const debugger_ = new YiciyuanDebugger(source); + const result = await debugger_.debugSearch(keyword); + return result; + } else { + const debugger_ = new SourceDebugger(source as BookSource); + const result = await debugger_.debugSearch(keyword); + return result; + } } catch (error: any) { return { success: false, @@ -60,14 +67,21 @@ ipcMain.handle( /** * 发现测试 + * 自动识别源格式(Legado 或 异次元) */ ipcMain.handle( 'debug:explore', - async (_event, source: BookSource, exploreUrl: string) => { + async (_event, source: any, exploreUrl: string) => { try { - const debugger_ = new SourceDebugger(source); - const result = await debugger_.debugExplore(exploreUrl); - return result; + if (isYiciyuanSource(source)) { + const debugger_ = new YiciyuanDebugger(source); + const result = await debugger_.debugExplore(exploreUrl); + return result; + } else { + const debugger_ = new SourceDebugger(source as BookSource); + const result = await debugger_.debugExplore(exploreUrl); + return result; + } } catch (error: any) { return { success: false, @@ -80,14 +94,21 @@ ipcMain.handle( /** * 书籍详情测试 + * 自动识别源格式(Legado 或 异次元) */ ipcMain.handle( 'debug:bookInfo', - async (_event, source: BookSource, bookUrl: string) => { + async (_event, source: any, bookUrl: string) => { try { - const debugger_ = new SourceDebugger(source); - const result = await debugger_.debugBookInfo(bookUrl); - return result; + if (isYiciyuanSource(source)) { + const debugger_ = new YiciyuanDebugger(source); + const result = await debugger_.debugBookInfo(bookUrl); + return result; + } else { + const debugger_ = new SourceDebugger(source as BookSource); + const result = await debugger_.debugBookInfo(bookUrl); + return result; + } } catch (error: any) { return { success: false, @@ -100,14 +121,21 @@ ipcMain.handle( /** * 目录测试 + * 自动识别源格式(Legado 或 异次元) */ ipcMain.handle( 'debug:toc', - async (_event, source: BookSource, tocUrl: string) => { + async (_event, source: any, tocUrl: string) => { try { - const debugger_ = new SourceDebugger(source); - const result = await debugger_.debugToc(tocUrl); - return result; + if (isYiciyuanSource(source)) { + const debugger_ = new YiciyuanDebugger(source); + const result = await debugger_.debugToc(tocUrl); + return result; + } else { + const debugger_ = new SourceDebugger(source as BookSource); + const result = await debugger_.debugToc(tocUrl); + return result; + } } catch (error: any) { return { success: false, @@ -120,14 +148,21 @@ ipcMain.handle( /** * 正文测试 + * 自动识别源格式(Legado 或 异次元) */ ipcMain.handle( 'debug:content', - async (_event, source: BookSource, contentUrl: string) => { + async (_event, source: any, contentUrl: string) => { try { - const debugger_ = new SourceDebugger(source); - const result = await debugger_.debugContent(contentUrl); - return result; + if (isYiciyuanSource(source)) { + const debugger_ = new YiciyuanDebugger(source); + const result = await debugger_.debugContent(contentUrl); + return result; + } else { + const debugger_ = new SourceDebugger(source as BookSource); + const result = await debugger_.debugContent(contentUrl); + return result; + } } catch (error: any) { return { success: false, @@ -412,6 +447,7 @@ const createWindow = async () => { show: false, width: 1024, height: 728, + title: 'SourceDebug - 书源调试器', icon: getAssetPath('icon.png'), webPreferences: { preload: app.isPackaged @@ -437,8 +473,8 @@ const createWindow = async () => { mainWindow = null; }); - const menuBuilder = new MenuBuilder(mainWindow); - menuBuilder.buildMenu(); + // 隐藏默认菜单栏 + mainWindow.setMenuBarVisibility(false); // Open urls in the user's browser mainWindow.webContents.setWindowOpenHandler((edata) => { diff --git a/src/main/services/puppeteer-service.ts b/src/main/services/puppeteer-service.ts index 2067b07..baa2b26 100644 --- a/src/main/services/puppeteer-service.ts +++ b/src/main/services/puppeteer-service.ts @@ -313,24 +313,85 @@ class PuppeteerService { } } + /** + * 智能截取文本内容 + * 如果内容过长,截取开头、中间、尾部三段 + * @param text 原始文本 + * @param maxLength 最大长度 + * @param sectionRatio 各段比例 [开头, 中间, 尾部],默认 [0.4, 0.3, 0.3] + */ + private smartTruncate( + text: string, + maxLength: number, + sectionRatio: [number, number, number] = [0.4, 0.3, 0.3] + ): string { + if (text.length <= maxLength) { + return text; + } + + const [headRatio, midRatio, tailRatio] = sectionRatio; + const headLen = Math.floor(maxLength * headRatio); + const midLen = Math.floor(maxLength * midRatio); + const tailLen = Math.floor(maxLength * tailRatio); + + // 开头部分 + const head = text.slice(0, headLen); + + // 中间部分(从文本中间位置开始) + const midStart = Math.floor((text.length - midLen) / 2); + const mid = text.slice(midStart, midStart + midLen); + + // 尾部部分 + const tail = text.slice(-tailLen); + + // 用分隔符连接,便于 AI 理解 + return `${head}\n\n... [省略 ${text.length - maxLength} 字符,以下为中间部分] ...\n\n${mid}\n\n... [以下为尾部] ...\n\n${tail}`; + } + /** * 简化内容,用于发送给 AI * @param maxHtmlLength 完整HTML的最大长度(默认30000字符) + * @param smartTruncateEnabled 是否启用智能截取(默认true) */ - simplifyContent(content: PageContent, maxHtmlLength = 30000): SimplifiedContent { + simplifyContent( + content: PageContent, + maxHtmlLength = 30000, + smartTruncateEnabled = true + ): SimplifiedContent { + // 处理完整页面 HTML + let html: string; + if (smartTruncateEnabled && content.bodyHtml.length > maxHtmlLength) { + html = this.smartTruncate(content.bodyHtml, maxHtmlLength); + } else { + html = content.bodyHtml.slice(0, maxHtmlLength); + } + + // 处理各区域 HTML + const maxSectionLength = 5000; + const sections = content.sections.map(s => ({ + name: s.name, + selector: s.selector, + html: smartTruncateEnabled && s.html.length > maxSectionLength + ? this.smartTruncate(s.html, maxSectionLength, [0.5, 0.2, 0.3]) + : s.html.slice(0, maxSectionLength) + })); + + // 处理示例文本 + const maxSampleLength = 500; + const samples = { + ...content.samples, + sampleText: smartTruncateEnabled && content.samples.sampleText.length > maxSampleLength + ? this.smartTruncate(content.samples.sampleText, maxSampleLength, [0.5, 0.2, 0.3]) + : content.samples.sampleText.slice(0, maxSampleLength) + }; + return { url: content.url, title: content.title, - // 完整页面HTML(限制长度) - html: content.bodyHtml.slice(0, maxHtmlLength), - // 关键区域(每个区域限制长度) - sections: content.sections.map(s => ({ - name: s.name, - selector: s.selector, - html: s.html.slice(0, 5000) - })), + html, + sections, features: content.features, - samples: content.samples, + samples, }; } diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 000a6a7..d61e6c0 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -2,6 +2,7 @@ import { useEffect } from 'react'; import { MantineProvider, ColorSchemeScript } from '@mantine/core'; import { Notifications } from '@mantine/notifications'; import { MainLayout } from './components/MainLayout'; +import { AppTourProvider } from './components/AppTour'; import { useBookSourceStore } from './stores/bookSourceStore'; import { theme } from './theme'; @@ -70,7 +71,9 @@ export default function App() { - + + + ); diff --git a/src/renderer/components/AIChatPanel.tsx b/src/renderer/components/AIChatPanel.tsx index 5af2eab..5e7ca8e 100644 --- a/src/renderer/components/AIChatPanel.tsx +++ b/src/renderer/components/AIChatPanel.tsx @@ -358,13 +358,20 @@ export function AIChatPanel() { if (state.aiAnalysisEnabled && state.testResult?.rawResponse) { const activeSource = state.sources.find(s => s.bookSourceUrl === state.activeSourceId); + // 根据源格式提取规则信息 const sourceInfo = activeSource ? JSON.stringify({ bookSourceUrl: activeSource.bookSourceUrl, bookSourceName: activeSource.bookSourceName, - ruleSearch: activeSource.ruleSearch, - ruleBookInfo: activeSource.ruleBookInfo, - ruleToc: activeSource.ruleToc, - ruleContent: activeSource.ruleContent, + // Legado 格式字段 + ...('ruleSearch' in activeSource && { ruleSearch: activeSource.ruleSearch }), + ...('ruleBookInfo' in activeSource && { ruleBookInfo: activeSource.ruleBookInfo }), + ...('ruleToc' in activeSource && { ruleToc: activeSource.ruleToc }), + ...('ruleContent' in activeSource && { ruleContent: activeSource.ruleContent }), + // 异次元格式字段 + ...('ruleSearchUrl' in activeSource && { ruleSearchUrl: activeSource.ruleSearchUrl }), + ...('ruleSearchList' in activeSource && { ruleSearchList: activeSource.ruleSearchList }), + ...('ruleChapterList' in activeSource && { ruleChapterList: activeSource.ruleChapterList }), + ...('ruleBookContent' in activeSource && { ruleBookContent: activeSource.ruleBookContent }), }, null, 2) : '无'; const trimmedResponse = smartTrimResponse(state.testResult.rawResponse, state.testMode); @@ -470,7 +477,7 @@ export function AIChatPanel() { )} - setShowSettings(!showSettings)}> + setShowSettings(!showSettings)} data-tour="ai-settings"> diff --git a/src/renderer/components/AppTour.tsx b/src/renderer/components/AppTour.tsx new file mode 100644 index 0000000..92a4a29 --- /dev/null +++ b/src/renderer/components/AppTour.tsx @@ -0,0 +1,335 @@ +import { useState, ReactNode } from 'react'; +import { TourProvider, useTour } from '@reactour/tour'; +import { Button, Group, Text, Stack, Badge, ThemeIcon, Box } from '@mantine/core'; +import { + IconRocket, + IconBook, + IconCode, + IconBug, + IconSparkles, + IconDeviceFloppy, + IconArrowRight, + IconArrowLeft, + IconCheck, + IconMessageChatbot, + IconSettings, + IconTransform, +} from '@tabler/icons-react'; + +// 本地存储 key +const TOUR_COMPLETED_KEY = 'app-tour-completed'; + +// 步骤内容组件 +const StepContent = ({ step }: { step: number }) => { + const contents = [ + // Step 0: 欢迎 + + + + + + 欢迎使用书源调试器 + + + 这是一个强大的 Legado / 异次元 书源调试工具,让我们快速了解核心功能。 + + 预计 1 分钟 + , + // Step 1: 书源管理 + + + + + + 书源管理 + + 在这里管理您的书源: + + • 点击 + 新建书源 + • 点击 📂 导入 JSON 文件 + • 点击书源名称切换编辑 + • 点击 全部保存 保存到文件 + + , + // Step 2: 图源转化 + + + + + + 图源格式转化 + 新功能 + + 支持 Legado 和异次元格式互转: + + • 点击书源旁的 转化按钮 + Legado → 异次元:自动转换规则格式 + 异次元 → Legado:反向转换 + • 转化后可在两种阅读器中使用 + + + 💡 转化是幂等的,多次转化结果一致 + + , + // Step 3: 编辑器 + + + + + + 多模式编辑器 + + 提供三种编辑模式: + + 文本:直接编辑 JSON 代码 + 表格:表单化编辑各字段 + 可视化:流程图展示规则结构 + + 💡 悬停字段名可查看帮助文档 + , + // Step 4: 调试面板 + + + + + + 规则测试器 + + 完整的调试流程: + + 搜索:测试关键词搜索 + 发现:测试分类浏览 + 详情/目录/正文:逐级测试 + + + 💡 右侧 AI 开关:开启后测试结果自动发送给 AI 分析 + + 💡 点击结果可自动跳转下一步测试 + , + // Step 5: AI 助手面板 + + + + + + AI 助手面板 + 重点功能 + + 智能分析与对话: + + • 输入网址自动识别书源规则 + • 测试结果自动发送给 AI 分析 + • AI 诊断规则问题并提供修复建议 + • 支持多轮对话,持续优化规则 + + + 💡 在输入框输入网站地址,AI 会自动分析页面结构生成规则 + + , + // Step 6: AI 配置 + + + + + + AI 服务配置 + + 配置 AI 服务商: + + • 点击 AI 面板顶部设置图标 + • 选择服务商(GitHub/DeepSeek/Kimi等) + • 填入对应的 API Key + • 选择合适的模型 + + + ⚙️ 推荐使用 GitHub Copilot 或 DeepSeek,性价比高 + + , + // Step 7: 保存 + + + + + + 保存书源 + + 编辑完成后记得保存: + + Ctrl+S 快速保存当前书源 + • 点击此按钮保存到内存/文件 + • 右下角「全部保存」批量导出 + + , + ]; + return contents[step] || null; +}; + +// 引导步骤配置 +const tourSteps = [ + { selector: '[data-tour="welcome"]', position: 'center' as const }, + { selector: '[data-tour="source-list"]', position: 'right' as const }, + { selector: '[data-tour="convert-btn"]', position: 'right' as const }, // 图源转化 + { selector: '[data-tour="editor"]', position: 'left' as const }, + { selector: '[data-tour="debug-panel"]', position: 'left' as const }, + { selector: '[data-tour="ai-toggle"]', position: 'bottom' as const }, // AI 助手面板 + { selector: '[data-tour="ai-settings"]', position: 'left' as const }, // AI 配置(设置按钮) + { selector: '[data-tour="save-btn"]', position: 'bottom' as const }, +]; + +// 自定义导航组件 +function TourNavigation() { + const { currentStep, setCurrentStep, steps, setIsOpen } = useTour(); + const isFirst = currentStep === 0; + const isLast = currentStep === steps.length - 1; + + const handlePrev = () => { + if (!isFirst) setCurrentStep(currentStep - 1); + }; + + const handleNext = () => { + if (isLast) { + localStorage.setItem(TOUR_COMPLETED_KEY, 'true'); + setIsOpen(false); + } else { + setCurrentStep(currentStep + 1); + } + }; + + const handleSkip = () => { + localStorage.setItem(TOUR_COMPLETED_KEY, 'true'); + setIsOpen(false); + }; + + return ( + + + + {currentStep + 1} / {steps.length} + + {!isLast && ( + + )} + + + {!isFirst && ( + + )} + + + + ); +} + +// 引导内容包装器 +function ContentComponent() { + const { currentStep } = useTour(); + return ( + + + + + ); +} + +// 检查是否首次启动 +const shouldShowTour = () => { + return !localStorage.getItem(TOUR_COMPLETED_KEY); +}; + +// Tour Provider 包装组件 +export function AppTourProvider({ children }: { children: ReactNode }) { + const stepsWithContent = tourSteps.map((step, index) => ({ + ...step, + content: , + })); + + // 计算初始状态 + const [initialOpen] = useState(() => shouldShowTour()); + + return ( + ({ + ...base, + backgroundColor: '#1a1b1e', + color: '#c1c2c5', + borderRadius: 12, + padding: 20, + maxWidth: 360, + boxShadow: '0 20px 40px rgba(0,0,0,0.4)', + border: '1px solid rgba(255,255,255,0.1)', + }), + maskArea: (base) => ({ + ...base, + rx: 8, + }), + maskWrapper: (base) => ({ + ...base, + color: 'rgba(0, 0, 0, 0.7)', + }), + badge: () => ({ + display: 'none', + }), + controls: () => ({ + display: 'none', + }), + close: () => ({ + display: 'none', + }), + }} + ContentComponent={ContentComponent} + onClickMask={() => {}} + padding={{ mask: 8, popover: [16, 12] }} + showNavigation={false} + showBadge={false} + showCloseButton={false} + > + {children} + + ); +} + +// 手动触发引导的 Hook +export function useAppTour() { + const tour = useTour(); + + const startTour = () => { + tour.setCurrentStep(0); + tour.setIsOpen(true); + }; + + const resetTour = () => { + localStorage.removeItem(TOUR_COMPLETED_KEY); + startTour(); + }; + + return { + startTour, + resetTour, + isOpen: tour.isOpen, + }; +} + +// 导出重置函数供外部使用 +export const resetAppTour = () => { + localStorage.removeItem(TOUR_COMPLETED_KEY); +}; diff --git a/src/renderer/components/CodeEditor.tsx b/src/renderer/components/CodeEditor.tsx index afefdfa..c55bbb1 100644 --- a/src/renderer/components/CodeEditor.tsx +++ b/src/renderer/components/CodeEditor.tsx @@ -17,6 +17,7 @@ import { } from '@tabler/icons-react'; import { useBookSourceStore } from '../stores/bookSourceStore'; import { SourceFormEditor } from './SourceFormEditor'; +import { SourceVisualizer } from './SourceVisualizer'; import { basicFields, searchRuleFields, @@ -199,26 +200,29 @@ export function CodeEditor() { {/* 标签页头部 */} ({ borderBottom: `1px solid ${colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]}`, backgroundColor: colorScheme === 'dark' ? theme.colors.dark[7] : theme.white, + width: '100%', })} > setEditorViewMode(v as 'text' | 'visual' | 'table')} - size="xs" + size="sm" + style={{ flex: '0 0 80%' }} data={[ - { label: 文本视图, value: 'text' }, - { label: 表格视图, value: 'table' }, - { label: 可视化, value: 'visual' }, + { label: 文本, value: 'text' }, + { label: 表格, value: 'table' }, + { label: 可视化, value: 'visual' }, ]} /> - @@ -263,11 +267,15 @@ export function CodeEditor() { )} - {editorViewMode === 'table' && } + {editorViewMode === 'table' && ( + + + + )} {editorViewMode === 'visual' && ( - - 可视化视图开发中... + + )} diff --git a/src/renderer/components/DebugConsole.tsx b/src/renderer/components/DebugConsole.tsx index e016c5d..d7f1796 100644 --- a/src/renderer/components/DebugConsole.tsx +++ b/src/renderer/components/DebugConsole.tsx @@ -20,6 +20,7 @@ import { } from '@tabler/icons-react'; import { useBookSourceStore } from '../stores/bookSourceStore'; import type { LogCategory, DebugLog } from '../types'; +import { SourceFormat, getSourceFormatLabel } from '../types'; const categoryLabels: Record = { request: '请求', @@ -36,8 +37,11 @@ const categoryColors: Record = { }; export function DebugConsole() { - const { debugLogs, logFilters, setLogFilters, clearLogs } = useBookSourceStore(); + const { debugLogs, logFilters, setLogFilters, clearLogs, getCurrentSourceFormat } = useBookSourceStore(); const { colorScheme } = useMantineColorScheme(); + + // 获取当前源格式 + const sourceFormat = getCurrentSourceFormat(); const scrollRef = useRef(null); const [expandedLogId, setExpandedLogId] = useState(null); @@ -156,6 +160,14 @@ export function DebugConsole() { > 调试日志 + {/* 源格式标签 */} + + {sourceFormat === SourceFormat.Yiciyuan ? '异次元图源' : 'Legado'} + {filteredLogs.length}/{debugLogs.length} diff --git a/src/renderer/components/DebugPanel.tsx b/src/renderer/components/DebugPanel.tsx index c58fa2a..66986c1 100644 --- a/src/renderer/components/DebugPanel.tsx +++ b/src/renderer/components/DebugPanel.tsx @@ -1,4 +1,4 @@ -import { useState, useMemo } from 'react'; +import { useState, useMemo, useEffect, useCallback } from 'react'; import { Box, Group, @@ -18,6 +18,7 @@ import { Loader, SegmentedControl, Tooltip, + Modal, useMantineColorScheme, } from '@mantine/core'; import { @@ -43,6 +44,12 @@ import { IconBolt, IconInfoCircle, IconAlertCircle, + IconChevronLeft, + IconX, + IconLayoutRows, + IconLayoutColumns, + IconPlayerSkipBack, + IconPlayerSkipForward, } from '@tabler/icons-react'; import { useBookSourceStore } from '../stores/bookSourceStore'; import type { BookItem, ChapterItem, TestMode } from '../types'; @@ -72,6 +79,8 @@ export function DebugPanel() { updateRequestHeader, aiAnalysisEnabled, setAiAnalysisEnabled, + chapterList, + currentChapterIndex, } = useBookSourceStore(); const { colorScheme } = useMantineColorScheme(); @@ -79,6 +88,11 @@ export function DebugPanel() { const [showHistory, setShowHistory] = useState(false); const [showRequestInfo, setShowRequestInfo] = useState(false); const [activeResultTab, setActiveResultTab] = useState('visual'); + + // 图片查看器状态 + const [imageViewerOpen, setImageViewerOpen] = useState(false); + const [currentImageIndex, setCurrentImageIndex] = useState(0); + const [viewMode, setViewMode] = useState<'horizontal' | 'vertical'>('horizontal'); // 横向翻页 / 纵向条漫 // 可视化数据 const visualData = useMemo(() => { @@ -159,6 +173,45 @@ export function DebugPanel() { return { books: [], chapters: [], content: '', imageUrls: [], bookDetail: null }; }, [testResult, testMode]); + // 图片查看器键盘快捷键 + const handleKeyDown = useCallback((e: KeyboardEvent) => { + if (!imageViewerOpen) return; + + if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { + setCurrentImageIndex(prev => Math.max(0, prev - 1)); + } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { + setCurrentImageIndex(prev => Math.min((visualData.imageUrls?.length || 1) - 1, prev + 1)); + } else if (e.key === 'Escape') { + setImageViewerOpen(false); + } + }, [imageViewerOpen, visualData.imageUrls?.length]); + + // 图片查看器鼠标滚轮(仅横向模式) + const handleWheel = useCallback((e: WheelEvent) => { + if (!imageViewerOpen || viewMode === 'vertical') return; + + e.preventDefault(); + if (e.deltaY > 0) { + // 向下滚动 -> 下一张 + setCurrentImageIndex(prev => Math.min((visualData.imageUrls?.length || 1) - 1, prev + 1)); + } else if (e.deltaY < 0) { + // 向上滚动 -> 上一张 + setCurrentImageIndex(prev => Math.max(0, prev - 1)); + } + }, [imageViewerOpen, viewMode, visualData.imageUrls?.length]); + + useEffect(() => { + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [handleKeyDown]); + + useEffect(() => { + if (imageViewerOpen && viewMode === 'horizontal') { + window.addEventListener('wheel', handleWheel, { passive: false }); + return () => window.removeEventListener('wheel', handleWheel); + } + }, [imageViewerOpen, viewMode, handleWheel]); + const handleTest = async () => { if (!testInput.trim()) { return; @@ -166,6 +219,29 @@ export function DebugPanel() { await runTest(); }; + // 上一章/下一章 + const hasPrevChapter = currentChapterIndex > 0; + const hasNextChapter = currentChapterIndex >= 0 && currentChapterIndex < chapterList.length - 1; + const currentChapterName = currentChapterIndex >= 0 && currentChapterIndex < chapterList.length + ? chapterList[currentChapterIndex].name + : ''; + + const handlePrevChapter = async () => { + if (hasPrevChapter) { + const prevChapter = chapterList[currentChapterIndex - 1]; + await runTestWithParams('content', prevChapter.url); + setCurrentImageIndex(0); + } + }; + + const handleNextChapter = async () => { + if (hasNextChapter) { + const nextChapter = chapterList[currentChapterIndex + 1]; + await runTestWithParams('content', nextChapter.url); + setCurrentImageIndex(0); + } + }; + const responseTimeText = testResult?.responseTime ? `${testResult.responseTime}ms` : ''; return ( @@ -585,12 +661,48 @@ export function DebugPanel() { ({ borderBottom: `1px solid ${colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]}` })}> 图片内容 ({visualData.imageUrls.length}张) + 点击图片放大查看 - + {visualData.imageUrls.map((url, index) => ( - + { + setCurrentImageIndex(index); + setImageViewerOpen(true); + }} + onMouseEnter={(e) => { + e.currentTarget.style.transform = 'scale(1.02)'; + e.currentTarget.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)'; + }} + onMouseLeave={(e) => { + e.currentTarget.style.transform = 'scale(1)'; + e.currentTarget.style.boxShadow = 'none'; + }} + > {`第${index + + {index + 1} + ))} @@ -646,6 +758,292 @@ export function DebugPanel() { + + {/* 图片查看器 Modal */} + setImageViewerOpen(false)} + size="xl" + fullScreen + padding={0} + withCloseButton={false} + styles={{ + body: { + height: '100%', + display: 'flex', + flexDirection: 'column', + backgroundColor: 'rgba(0, 0, 0, 0.95)', + }, + content: { + backgroundColor: 'transparent', + }, + }} + > + {visualData.imageUrls && visualData.imageUrls.length > 0 && ( + + {/* 顶部工具栏 */} + + + {/* 章节名称 */} + {currentChapterName && ( + + 📖 {currentChapterName} + + )} + + {currentChapterName && } + + + {viewMode === 'horizontal' ? `${currentImageIndex + 1} / ${visualData.imageUrls.length}` : `共 ${visualData.imageUrls.length} 页`} + + {/* 模式切换 */} + + + setViewMode('horizontal')} + > + + + + + setViewMode('vertical')} + > + + + + + + + + {viewMode === 'horizontal' ? '滚轮/方向键翻页' : '滚动浏览'} + + setImageViewerOpen(false)} + > + + + + + + {/* 横向翻页模式 */} + {viewMode === 'horizontal' && ( + + {/* 左侧控制区:上一章 + 上一页 */} + + {/* 上一章 */} + {hasPrevChapter && ( + + + + + + )} + {/* 上一页 */} + setCurrentImageIndex(prev => Math.max(0, prev - 1))} + disabled={currentImageIndex === 0} + > + + + + + {/* 图片 */} + {`第${currentImageIndex + + {/* 右侧控制区:下一页 + 下一章 */} + + {/* 下一页 */} + setCurrentImageIndex(prev => Math.min(visualData.imageUrls.length - 1, prev + 1))} + disabled={currentImageIndex === visualData.imageUrls.length - 1} + > + + + {/* 下一章 */} + {hasNextChapter && ( + + + + + + )} + + + )} + + {/* 纵向条漫模式 */} + {viewMode === 'vertical' && ( + + {/* 左侧上一章按钮 - 固定位置 */} + {hasPrevChapter && ( + + + + + + )} + + {/* 右侧下一章按钮 - 固定位置 */} + {hasNextChapter && ( + + + + + + )} + + {/* 滚动区域 */} + + + {visualData.imageUrls.map((url, index) => ( + + {`第${index + + ))} + + + + )} + + {/* 底部缩略图导航(仅横向模式显示) */} + {viewMode === 'horizontal' && ( + + + + {visualData.imageUrls.map((url, index) => ( + setCurrentImageIndex(index)} + style={{ + width: 60, + height: 80, + borderRadius: 4, + overflow: 'hidden', + cursor: 'pointer', + border: index === currentImageIndex ? '2px solid var(--mantine-color-teal-5)' : '2px solid transparent', + opacity: index === currentImageIndex ? 1 : 0.6, + transition: 'all 0.2s', + flexShrink: 0, + }} + > + {`缩略图${index + + ))} + + + + )} + + )} + ); } diff --git a/src/renderer/components/MainLayout.tsx b/src/renderer/components/MainLayout.tsx index 164b63d..f2a0705 100644 --- a/src/renderer/components/MainLayout.tsx +++ b/src/renderer/components/MainLayout.tsx @@ -94,7 +94,7 @@ export function MainLayout() { }, [toggleLeft, toggleRight, toggleBottom]); return ( - + {/* 顶部工具栏 */} - + + + {/* 中央编辑区:代码编辑器 */} - + + + {/* 右侧调试面板:测试器 */} @@ -133,7 +137,9 @@ export function MainLayout() { preferredSize={rightSize} visible={!isRightCollapsed} > - + + + {/* AI 对话面板 */} @@ -142,7 +148,9 @@ export function MainLayout() { preferredSize={aiSize} visible={!isAICollapsed} > - + + + diff --git a/src/renderer/components/SourceFormEditor.tsx b/src/renderer/components/SourceFormEditor.tsx index 82ed5e6..ab9377d 100644 --- a/src/renderer/components/SourceFormEditor.tsx +++ b/src/renderer/components/SourceFormEditor.tsx @@ -12,13 +12,15 @@ import { Select, Tabs, Tooltip, - ScrollArea, + Badge, useMantineColorScheme, } from '@mantine/core'; import { IconChevronDown, IconHelp } from '@tabler/icons-react'; import { useBookSourceStore } from '../stores/bookSourceStore'; -import bookSourceEditConfig, { type FieldConfig } from '../lib/bookSourceEditConfig'; -import type { BookSource } from '../types'; +import bookSourceEditConfig, { type FieldConfig, type SourceEditConfig } from '../lib/bookSourceEditConfig'; +import yiciyuanSourceEditConfig from '../lib/yiciyuanSourceEditConfig'; +import type { BookSource, AnySource } from '../types'; +import { detectSourceFormat, SourceFormat, getSourceFormatLabel } from '../types'; // 书源类型选项 const SOURCE_TYPES = ['文本', '音频', '图片', '文件']; @@ -103,7 +105,7 @@ export function SourceFormEditor() { const [activeTab, setActiveTab] = useState('base'); // 解析当前书源 - const currentSource = useMemo(() => { + const currentSource = useMemo(() => { if (!sourceCode) return null; try { return JSON.parse(sourceCode); @@ -112,6 +114,18 @@ export function SourceFormEditor() { } }, [sourceCode]); + // 检测当前源格式 + const sourceFormat = useMemo(() => { + return currentSource ? detectSourceFormat(currentSource) : SourceFormat.Legado; + }, [currentSource]); + + // 根据源格式选择编辑配置 + const editConfig = useMemo(() => { + return sourceFormat === SourceFormat.Yiciyuan + ? yiciyuanSourceEditConfig + : bookSourceEditConfig; + }, [sourceFormat]); + // 更新字段值 const updateField = useCallback( (field: FieldConfig, value: string | number | boolean) => { @@ -170,15 +184,38 @@ export function SourceFormEditor() { ); } - const tabs = Object.entries(bookSourceEditConfig); + const tabs = Object.entries(editConfig); return ( - - + + {/* 源格式标签 */} + ({ + borderBottom: `1px solid ${colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]}`, + backgroundColor: colorScheme === 'dark' ? theme.colors.dark[7] : theme.white, + flexShrink: 0, + })} + > + + {sourceFormat === SourceFormat.Yiciyuan ? '异次元图源' : 'Legado 书源'} + + + {currentSource?.bookSourceName || '未命名'} + + + + ({ borderBottom: `1px solid ${colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]}`, backgroundColor: colorScheme === 'dark' ? theme.colors.dark[7] : theme.white, + flexShrink: 0, })} > {tabs.map(([key, config]) => ( @@ -188,21 +225,19 @@ export function SourceFormEditor() { ))} - + {tabs.map(([key, config]) => ( - - - - {config.children.map((field) => ( - updateField(field, value)} - /> - ))} - - + + + {config.children.map((field) => ( + updateField(field, value)} + /> + ))} + ))} diff --git a/src/renderer/components/SourceSidebar.tsx b/src/renderer/components/SourceSidebar.tsx index 2372325..abdaa85 100644 --- a/src/renderer/components/SourceSidebar.tsx +++ b/src/renderer/components/SourceSidebar.tsx @@ -26,6 +26,7 @@ import { IconCircleCheck, } from '@tabler/icons-react'; import { useBookSourceStore } from '../stores/bookSourceStore'; +import { detectSourceFormat, SourceFormat, getSourceFormatLabel } from '../types'; export function SourceSidebar() { const { @@ -35,6 +36,8 @@ export function SourceSidebar() { createSource, importSources, deleteSource, + saveToFile, + loadedFilePath, } = useBookSourceStore(); const { colorScheme } = useMantineColorScheme(); @@ -125,6 +128,34 @@ export function SourceSidebar() { } }; + // 全部保存 + const handleSaveAll = async () => { + if (sources.length === 0) { + notifications.show({ + message: '没有书源需要保存', + color: 'blue', + }); + return; + } + + const result = await saveToFile(); + if (result) { + notifications.show({ + title: '保存成功', + message: loadedFilePath + ? `已保存 ${sources.length} 个书源到: ${loadedFilePath}` + : `已保存 ${sources.length} 个书源`, + color: 'teal', + }); + } else { + notifications.show({ + title: '保存失败', + message: '请检查文件权限或选择保存位置', + color: 'red', + }); + } + }; + return ( selectSource(source.bookSourceUrl)} > + {/* 源格式标签 */} + {(() => { + const format = detectSourceFormat(source); + const isYiciyuan = format === SourceFormat.Yiciyuan; + return ( + + {isYiciyuan ? '异次元' : 'Legado'} + + ); + })()} + {/* 启用状态指示器 */} ({ - flexShrink: 0, - borderRadius: '50%', - backgroundColor: source.enabled ? theme.colors.green[6] : theme.colors.red[6], - })} + style={(theme) => { + // 根据源格式检查启用状态 + const format = detectSourceFormat(source); + const isEnabled = format === SourceFormat.Yiciyuan + ? (source as any).enable + : (source as any).enabled; + return { + flexShrink: 0, + borderRadius: '50%', + backgroundColor: isEnabled ? theme.colors.green[6] : theme.colors.red[6], + }; + }} /> - diff --git a/src/renderer/components/SourceVisualizer.tsx b/src/renderer/components/SourceVisualizer.tsx new file mode 100644 index 0000000..369f609 --- /dev/null +++ b/src/renderer/components/SourceVisualizer.tsx @@ -0,0 +1,617 @@ +import { useMemo, useState } from 'react'; +import { + Box, + Group, + Stack, + Text, + Paper, + Badge, + Collapse, + ActionIcon, + ScrollArea, + Tooltip, + Code, + CopyButton, + useMantineColorScheme, +} from '@mantine/core'; +import { + IconChevronRight, + IconChevronDown, + IconWorld, + IconSearch, + IconCompass, + IconBook, + IconList, + IconFileText, + IconSettings, + IconKey, + IconCode, + IconCheck, + IconCopy, + IconAlertCircle, + IconCircleCheck, + IconCircleDashed, +} from '@tabler/icons-react'; +import { useBookSourceStore } from '../stores/bookSourceStore'; +import type { BookSource, AnySource } from '../types'; +import { detectSourceFormat, SourceFormat } from '../types'; + +// 规则分组配置 +interface RuleGroup { + key: string; + name: string; + icon: React.ReactNode; + color: string; + fields: { key: string; name: string; important?: boolean }[]; + namespace?: string; +} + +const legadoRuleGroups: RuleGroup[] = [ + { + key: 'basic', + name: '基本信息', + icon: , + color: 'blue', + fields: [ + { key: 'bookSourceUrl', name: '书源地址', important: true }, + { key: 'bookSourceName', name: '书源名称', important: true }, + { key: 'bookSourceGroup', name: '书源分组' }, + { key: 'bookSourceType', name: '书源类型' }, + { key: 'bookSourceComment', name: '书源说明' }, + { key: 'enabled', name: '是否启用' }, + { key: 'enabledExplore', name: '启用发现' }, + { key: 'header', name: '请求头' }, + { key: 'jsLib', name: 'JS库' }, + ], + }, + { + key: 'login', + name: '登录配置', + icon: , + color: 'orange', + fields: [ + { key: 'loginUrl', name: '登录地址' }, + { key: 'loginUi', name: '登录UI' }, + { key: 'loginCheckJs', name: '登录检测JS' }, + ], + }, + { + key: 'search', + name: '搜索规则', + icon: , + color: 'teal', + fields: [ + { key: 'searchUrl', name: '搜索地址', important: true }, + ], + }, + { + key: 'ruleSearch', + name: '搜索解析', + icon: , + color: 'teal', + namespace: 'ruleSearch', + fields: [ + { key: 'bookList', name: '书籍列表', important: true }, + { key: 'name', name: '书名规则', important: true }, + { key: 'author', name: '作者规则' }, + { key: 'intro', name: '简介规则' }, + { key: 'kind', name: '分类规则' }, + { key: 'lastChapter', name: '最新章节' }, + { key: 'coverUrl', name: '封面规则' }, + { key: 'bookUrl', name: '详情地址', important: true }, + ], + }, + { + key: 'explore', + name: '发现规则', + icon: , + color: 'grape', + fields: [ + { key: 'exploreUrl', name: '发现地址', important: true }, + ], + }, + { + key: 'ruleExplore', + name: '发现解析', + icon: , + color: 'grape', + namespace: 'ruleExplore', + fields: [ + { key: 'bookList', name: '书籍列表' }, + { key: 'name', name: '书名规则' }, + { key: 'author', name: '作者规则' }, + { key: 'intro', name: '简介规则' }, + { key: 'kind', name: '分类规则' }, + { key: 'lastChapter', name: '最新章节' }, + { key: 'coverUrl', name: '封面规则' }, + { key: 'bookUrl', name: '详情地址' }, + ], + }, + { + key: 'ruleBookInfo', + name: '详情规则', + icon: , + color: 'cyan', + namespace: 'ruleBookInfo', + fields: [ + { key: 'init', name: '预处理规则' }, + { key: 'name', name: '书名规则' }, + { key: 'author', name: '作者规则' }, + { key: 'intro', name: '简介规则' }, + { key: 'kind', name: '分类规则' }, + { key: 'lastChapter', name: '最新章节' }, + { key: 'coverUrl', name: '封面规则' }, + { key: 'tocUrl', name: '目录地址', important: true }, + ], + }, + { + key: 'ruleToc', + name: '目录规则', + icon: , + color: 'indigo', + namespace: 'ruleToc', + fields: [ + { key: 'chapterList', name: '章节列表', important: true }, + { key: 'chapterName', name: '章节名称', important: true }, + { key: 'chapterUrl', name: '章节地址', important: true }, + { key: 'isVolume', name: '卷标识' }, + { key: 'updateTime', name: '更新时间' }, + { key: 'nextTocUrl', name: '下一页目录' }, + ], + }, + { + key: 'ruleContent', + name: '正文规则', + icon: , + color: 'pink', + namespace: 'ruleContent', + fields: [ + { key: 'content', name: '正文内容', important: true }, + { key: 'nextContentUrl', name: '下一页正文' }, + { key: 'replaceRegex', name: '替换规则' }, + { key: 'imageStyle', name: '图片样式' }, + { key: 'webJs', name: 'WebView JS' }, + ], + }, +]; + +// 规则值显示组件 +function RuleValue({ value, maxLength = 100 }: { value: any; maxLength?: number }) { + const { colorScheme } = useMantineColorScheme(); + + if (value === undefined || value === null || value === '') { + return 未配置; + } + + const strValue = typeof value === 'object' ? JSON.stringify(value) : String(value); + const displayValue = strValue.length > maxLength ? strValue.substring(0, maxLength) + '...' : strValue; + const isLong = strValue.length > maxLength; + + // 检测规则类型 + const getRuleType = (val: string): { type: string; color: string } => { + if (val.startsWith('@js:') || val.startsWith('')) return { type: 'JS', color: 'yellow' }; + if (val.startsWith('$.') || val.startsWith('@json:')) return { type: 'JSON', color: 'blue' }; + if (val.startsWith('//') || val.startsWith('@xpath:')) return { type: 'XPath', color: 'grape' }; + if (val.startsWith('@css:') || val.includes('class.') || val.includes('tag.')) return { type: 'CSS', color: 'teal' }; + if (val.includes('{{') && val.includes('}}')) return { type: '模板', color: 'orange' }; + if (val.startsWith('http://') || val.startsWith('https://')) return { type: 'URL', color: 'cyan' }; + return { type: '文本', color: 'gray' }; + }; + + const ruleType = getRuleType(strValue); + + return ( + + + {ruleType.type} + + + + {displayValue} + + + + {({ copied, copy }) => ( + + {copied ? : } + + )} + + + ); +} + +// 规则组展开组件 +function RuleGroupPanel({ group, source }: { group: RuleGroup; source: any }) { + const [expanded, setExpanded] = useState(true); + const { colorScheme } = useMantineColorScheme(); + + // 获取字段值 + const getFieldValue = (fieldKey: string) => { + if (group.namespace) { + return source[group.namespace]?.[fieldKey]; + } + return source[fieldKey]; + }; + + // 统计已配置的字段数 + const configuredCount = group.fields.filter(f => { + const val = getFieldValue(f.key); + return val !== undefined && val !== null && val !== ''; + }).length; + + const totalCount = group.fields.length; + const hasConfig = configuredCount > 0; + + return ( + + setExpanded(!expanded)} + > + + {group.icon} + {group.name} + + {configuredCount}/{totalCount} + + + + {expanded ? : } + + + + + + {group.fields.map((field) => { + const value = getFieldValue(field.key); + const hasValue = value !== undefined && value !== null && value !== ''; + + return ( + ({ + borderTop: `1px solid ${colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[2]}`, + })} + > + + {hasValue ? ( + + ) : ( + + )} + + {field.name} + + + + + ); + })} + + + + ); +} + +// 流程图节点组件 +function FlowNode({ + icon, + title, + subtitle, + color, + status, + onClick, +}: { + icon: React.ReactNode; + title: string; + subtitle?: string; + color: string; + status: 'configured' | 'partial' | 'empty'; + onClick?: () => void; +}) { + const { colorScheme } = useMantineColorScheme(); + + const statusColors = { + configured: 'teal', + partial: 'yellow', + empty: 'gray', + }; + + return ( + + {icon} + {title} + {subtitle && {subtitle}} + + {status === 'configured' ? '已配置' : status === 'partial' ? '部分配置' : '未配置'} + + + ); +} + +// 连接线组件 +function FlowArrow() { + return ( + + + + + + ); +} + +export function SourceVisualizer() { + const { sourceCode, activeSourceId } = useBookSourceStore(); + const { colorScheme } = useMantineColorScheme(); + const [viewMode, setViewMode] = useState<'flow' | 'tree'>('flow'); + + // 解析当前书源 + const currentSource = useMemo(() => { + if (!sourceCode) return null; + try { + return JSON.parse(sourceCode); + } catch { + return null; + } + }, [sourceCode]); + + // 检测源格式 + const sourceFormat = useMemo(() => { + return currentSource ? detectSourceFormat(currentSource) : SourceFormat.Legado; + }, [currentSource]); + + // 计算各模块状态 + const getModuleStatus = (namespace?: string, requiredFields?: string[]) => { + if (!currentSource) return 'empty'; + const source = currentSource as any; + + if (namespace) { + const nsObj = source[namespace]; + if (!nsObj) return 'empty'; + + const fields = Object.values(nsObj).filter(v => v !== undefined && v !== null && v !== ''); + if (fields.length === 0) return 'empty'; + + if (requiredFields) { + const hasRequired = requiredFields.every(f => nsObj[f]); + return hasRequired ? 'configured' : 'partial'; + } + return 'configured'; + } + return 'empty'; + }; + + if (!activeSourceId) { + return ( + + 请选择一个书源 + + ); + } + + if (!currentSource) { + return ( + + + + JSON 格式错误 + + + ); + } + + const source = currentSource as BookSource; + + return ( + + {/* 头部 */} + ({ + borderBottom: `1px solid ${colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]}`, + backgroundColor: colorScheme === 'dark' ? theme.colors.dark[7] : theme.white, + flexShrink: 0, + })} + > + + + {source.bookSourceName || '未命名书源'} + + {sourceFormat === SourceFormat.Yiciyuan ? '异次元' : 'Legado'} + + + + setViewMode('flow')} + > + 流程图 + + setViewMode('tree')} + > + 规则树 + + + + + {/* 内容区 */} + + {viewMode === 'flow' ? ( + /* 流程图视图 */ + + 书源解析流程 + + {/* 搜索/发现流程 */} + + 入口 + + } + title="搜索" + subtitle={source.searchUrl ? '已配置' : '未配置'} + color="teal" + status={source.searchUrl ? 'configured' : 'empty'} + /> + + } + title="搜索解析" + color="teal" + status={getModuleStatus('ruleSearch', ['bookList', 'name', 'bookUrl'])} + /> + + + + + + } + title="发现" + subtitle={source.exploreUrl ? '已配置' : '未配置'} + color="grape" + status={source.exploreUrl ? 'configured' : 'empty'} + /> + + } + title="发现解析" + color="grape" + status={getModuleStatus('ruleExplore', ['bookList'])} + /> + + + + {/* 详情 -> 目录 -> 正文 */} + + 阅读流程 + + } + title="书籍详情" + color="cyan" + status={getModuleStatus('ruleBookInfo', ['tocUrl'])} + /> + + } + title="目录" + color="indigo" + status={getModuleStatus('ruleToc', ['chapterList', 'chapterName', 'chapterUrl'])} + /> + + } + title="正文" + color="pink" + status={getModuleStatus('ruleContent', ['content'])} + /> + + + + {/* 统计信息 */} + + 配置统计 + + {legadoRuleGroups.map(group => { + const source_ = currentSource as any; + const getVal = (key: string) => group.namespace ? source_[group.namespace]?.[key] : source_[key]; + const configured = group.fields.filter(f => { + const v = getVal(f.key); + return v !== undefined && v !== null && v !== ''; + }).length; + + return ( + + 0 ? group.color : 'gray'} + leftSection={group.icon} + > + {configured}/{group.fields.length} + + + ); + })} + + + + ) : ( + /* 规则树视图 */ + + {legadoRuleGroups.map(group => ( + + ))} + + )} + + + ); +} diff --git a/src/renderer/components/TopToolbar.tsx b/src/renderer/components/TopToolbar.tsx index 033319b..a3c6cdd 100644 --- a/src/renderer/components/TopToolbar.tsx +++ b/src/renderer/components/TopToolbar.tsx @@ -1,3 +1,4 @@ +import { useState } from 'react'; import { Group, ActionIcon, @@ -5,6 +6,7 @@ import { Text, Tooltip, Divider, + Menu, useMantineColorScheme, } from '@mantine/core'; import { notifications } from '@mantine/notifications'; @@ -12,7 +14,7 @@ import { IconPlus, IconFolderOpen, IconDeviceFloppy, - IconRefresh, + IconTransform, IconSettings, IconSparkles, IconLayoutSidebar, @@ -21,8 +23,13 @@ import { IconSun, IconMoon, IconTrash, + IconChevronDown, + IconHelp, } from '@tabler/icons-react'; import { useBookSourceStore } from '../stores/bookSourceStore'; +import { SourceFormat, detectSourceFormat, getSourceFormatLabel } from '../types'; +import { useAppTour } from './AppTour'; +import { convertSource } from '../utils/sourceConverter'; interface TopToolbarProps { isLeftCollapsed: boolean; @@ -58,14 +65,27 @@ export function TopToolbar({ } = useBookSourceStore(); const { colorScheme, toggleColorScheme } = useMantineColorScheme(); + const { resetTour } = useAppTour(); const activeSource = sources.find( (s) => s.bookSourceUrl === activeSourceId ); // 新建书源 - const handleCreate = () => { - createSource(); + const handleCreateLegado = () => { + createSource(SourceFormat.Legado); + notifications.show({ + message: '已创建 Legado 书源', + color: 'blue', + }); + }; + + const handleCreateYiciyuan = () => { + createSource(SourceFormat.Yiciyuan); + notifications.show({ + message: '已创建异次元图源', + color: 'grape', + }); }; // 导入书源 @@ -181,6 +201,44 @@ export function TopToolbar({ } }; + // 图源转换(仅支持图片类型) + const handleConvertSource = () => { + if (!activeSource) { + notifications.show({ + message: '请先选择一个书源', + color: 'yellow', + }); + return; + } + + const convertResult = convertSource(activeSource); + + // 检查转换是否成功 + if (!convertResult.success) { + notifications.show({ + title: '无法转换', + message: convertResult.error || '转换失败', + color: 'red', + }); + return; + } + + // 更新源代码并保存到列表 + const newCode = JSON.stringify(convertResult.result, null, 2); + const store = useBookSourceStore.getState(); + store.updateSourceCode(newCode); + store.saveCurrentSource(); // 保存到列表,触发类型更新 + + const fromLabel = convertResult.fromFormat === SourceFormat.Yiciyuan ? '异次元' : 'Legado'; + const toLabel = convertResult.toFormat === SourceFormat.Yiciyuan ? '异次元' : 'Legado'; + + notifications.show({ + title: '转换成功', + message: `已将 ${fromLabel} 图源转换为 ${toLabel} 格式`, + color: 'teal', + }); + }; + return ( - - - - - + {/* 新建书源下拉菜单 */} + + + + + + + + + + + + + 选择书源格式 + + + Legado 书源 + (文本/图片/音频) + + + + + 异次元图源 + (漫画专用) + + + + @@ -238,6 +319,7 @@ export function TopToolbar({ size="lg" onClick={handleSave} disabled={!isModified} + data-tour="save-btn" > @@ -246,19 +328,35 @@ export function TopToolbar({ - - - + + + {/* 中间标题 */} - Legado 书源调试器 + 书源调试器 {activeSource && ( <> - + {/* 显示源格式标签 */} + {(() => { + const format = detectSourceFormat(activeSource); + const isYiciyuan = format === SourceFormat.Yiciyuan; + return ( + + [{isYiciyuan ? '异次元' : 'Legado'}] + + ); + })()} {activeSource.bookSourceName} {isModified && ( @@ -275,6 +373,7 @@ export function TopToolbar({ size="xs" leftSection={} onClick={onToggleAI} + data-tour="ai-toggle" > AI识别 @@ -308,6 +407,12 @@ export function TopToolbar({ + + + + + + diff --git a/src/renderer/index.ejs b/src/renderer/index.ejs index 167cf37..1cc67bf 100644 --- a/src/renderer/index.ejs +++ b/src/renderer/index.ejs @@ -6,7 +6,7 @@ http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'" /> - Hello Electron React! + SourceDebug - 书源调试器
    diff --git a/src/renderer/lib/yiciyuanSourceEditConfig.ts b/src/renderer/lib/yiciyuanSourceEditConfig.ts new file mode 100644 index 0000000..678f29d --- /dev/null +++ b/src/renderer/lib/yiciyuanSourceEditConfig.ts @@ -0,0 +1,362 @@ +/** + * 异次元图源编辑配置 + * 参考: https://www.yckceo.com/yiciyuan/tuyuan/ + */ + +import type { FieldConfig, TabConfig, SourceEditConfig } from './bookSourceEditConfig'; + +const yiciyuanSourceEditConfig: SourceEditConfig = { + base: { + name: '基本', + children: [ + { + title: '源类型', + id: 'bookSourceType', + type: 'String', + hint: '源类型,如:漫画、小说', + }, + { + title: '源地址', + id: 'bookSourceUrl', + type: 'String', + hint: '源网站地址', + required: true, + }, + { + title: '源名称', + id: 'bookSourceName', + type: 'String', + hint: '源显示名称', + required: true, + }, + { + title: '源分组', + id: 'bookSourceGroup', + type: 'String', + hint: '源分组信息', + }, + { + title: '源备注', + id: 'sourceRemark', + type: 'String', + hint: '源备注说明', + }, + { + title: '是否启用', + id: 'enable', + type: 'Boolean', + hint: '是否启用此源', + }, + { + title: 'User-Agent', + id: 'httpUserAgent', + type: 'String', + hint: '自定义请求头User-Agent', + }, + { + title: '延迟时间', + id: 'bookDelayTime', + type: 'String', + hint: '请求延迟时间', + }, + { + title: '单线程', + id: 'bookSingleThread', + type: 'String', + hint: '是否单线程请求(是/否)', + }, + { + title: '序号', + id: 'serialNumber', + type: 'Number', + hint: '排序序号', + }, + { + title: '权重', + id: 'weight', + type: 'Number', + hint: '源权重', + }, + { + title: '登录地址', + id: 'loginUrl', + type: 'String', + hint: '登录页面地址', + }, + { + title: '登录结果', + id: 'loginUrlResult', + type: 'String', + hint: '登录结果处理', + }, + ], + }, + search: { + name: '搜索', + children: [ + { + title: '搜索地址', + id: 'ruleSearchUrl', + type: 'String', + hint: '搜索URL,使用searchKey代替关键字,searchPage代替页码', + }, + { + title: '搜索下一页', + id: 'ruleSearchUrlNext', + type: 'String', + hint: '搜索结果下一页URL', + }, + { + title: '列表规则', + id: 'ruleSearchList', + type: 'String', + hint: '搜索结果列表规则', + }, + { + title: '书名规则', + id: 'ruleSearchName', + type: 'String', + hint: '书名提取规则', + }, + { + title: '作者规则', + id: 'ruleSearchAuthor', + type: 'String', + hint: '作者提取规则', + }, + { + title: '分类规则', + id: 'ruleSearchKind', + type: 'String', + hint: '分类提取规则', + }, + { + title: '最新章节', + id: 'ruleSearchLastChapter', + type: 'String', + hint: '最新章节提取规则', + }, + { + title: '封面规则', + id: 'ruleSearchCoverUrl', + type: 'String', + hint: '封面URL提取规则', + }, + { + title: '封面解密', + id: 'ruleSearchCoverDecoder', + type: 'String', + hint: '封面解密规则', + }, + { + title: '详情地址', + id: 'ruleSearchNoteUrl', + type: 'String', + hint: '详情页URL提取规则', + }, + ], + }, + find: { + name: '发现', + children: [ + { + title: '发现地址', + id: 'ruleFindUrl', + type: 'String', + hint: '发现分类URL,格式:分类名::URL,多个用换行分隔', + }, + ], + }, + detail: { + name: '详情', + children: [ + { + title: 'URL匹配', + id: 'ruleBookUrlPattern', + type: 'String', + hint: '详情页URL匹配规则', + }, + { + title: '书名规则', + id: 'ruleBookName', + type: 'String', + hint: '书名提取规则', + }, + { + title: '作者规则', + id: 'ruleBookAuthor', + type: 'String', + hint: '作者提取规则', + }, + { + title: '分类规则', + id: 'ruleBookKind', + type: 'String', + hint: '分类提取规则', + }, + { + title: '最新章节', + id: 'ruleBookLastChapter', + type: 'String', + hint: '最新章节提取规则', + }, + { + title: '简介规则', + id: 'ruleIntroduce', + type: 'String', + hint: '简介提取规则', + }, + { + title: '封面规则', + id: 'ruleCoverUrl', + type: 'String', + hint: '封面URL提取规则', + }, + { + title: '封面解密', + id: 'ruleCoverDecoder', + type: 'String', + hint: '封面解密规则', + }, + ], + }, + toc: { + name: '目录', + children: [ + { + title: '目录地址', + id: 'ruleChapterUrl', + type: 'String', + hint: '目录页URL规则', + }, + { + title: '目录下一页', + id: 'ruleChapterUrlNext', + type: 'String', + hint: '目录下一页URL规则', + }, + { + title: '列表规则', + id: 'ruleChapterList', + type: 'String', + hint: '章节列表规则', + }, + { + title: '章节名称', + id: 'ruleChapterName', + type: 'String', + hint: '章节名称提取规则', + }, + { + title: '内容地址', + id: 'ruleContentUrl', + type: 'String', + hint: '章节内容URL提取规则', + }, + { + title: '章节ID', + id: 'ruleChapterId', + type: 'String', + hint: '章节ID提取规则', + }, + { + title: '父章节ID', + id: 'ruleChapterParentId', + type: 'String', + hint: '父章节ID规则(用于分卷)', + }, + { + title: '父章节名', + id: 'ruleChapterParentName', + type: 'String', + hint: '父章节名称规则(用于分卷)', + }, + ], + }, + content: { + name: '正文', + children: [ + { + title: '正文规则', + id: 'ruleBookContent', + type: 'String', + hint: '正文内容提取规则', + }, + { + title: '正文解密', + id: 'ruleBookContentDecoder', + type: 'String', + hint: '正文解密规则', + }, + { + title: '下一页', + id: 'ruleContentUrlNext', + type: 'String', + hint: '正文下一页URL规则', + }, + ], + }, +}; + +export default yiciyuanSourceEditConfig; + +// 获取异次元图源所有字段ID列表 +export function getYiciyuanFieldIds(): string[] { + const ids: string[] = []; + for (const tab of Object.values(yiciyuanSourceEditConfig)) { + for (const field of tab.children) { + ids.push(field.id); + } + } + return ids; +} + +// 创建默认的异次元图源 +export function createDefaultYiciyuanSource(): Record { + return { + bookSourceUrl: `temp://yiciyuan-${Date.now()}`, + bookSourceName: '新建异次元图源', + bookSourceGroup: '', + bookSourceType: '漫画', + sourceRemark: '', + enable: true, + serialNumber: 0, + weight: 0, + lastUpdateTime: Date.now(), + httpUserAgent: '', + bookDelayTime: '', + bookSingleThread: '否', + loginUrl: '', + loginUrlResult: '', + ruleSearchUrl: '', + ruleSearchUrlNext: '', + ruleSearchList: '', + ruleSearchName: '', + ruleSearchAuthor: '', + ruleSearchKind: '', + ruleSearchLastChapter: '', + ruleSearchCoverUrl: '', + ruleSearchCoverDecoder: '', + ruleSearchNoteUrl: '', + ruleFindUrl: '', + ruleBookUrlPattern: '', + ruleBookName: '', + ruleBookAuthor: '', + ruleBookKind: '', + ruleBookLastChapter: '', + ruleIntroduce: '', + ruleCoverUrl: '', + ruleCoverDecoder: '', + ruleChapterUrl: '', + ruleChapterUrlNext: '', + ruleChapterList: '', + ruleChapterName: '', + ruleContentUrl: '', + ruleChapterId: '', + ruleChapterParentId: '', + ruleChapterParentName: '', + ruleBookContent: '', + ruleBookContentDecoder: '', + ruleContentUrlNext: '', + }; +} diff --git a/src/renderer/stores/bookSourceStore.ts b/src/renderer/stores/bookSourceStore.ts index ac21029..245b414 100644 --- a/src/renderer/stores/bookSourceStore.ts +++ b/src/renderer/stores/bookSourceStore.ts @@ -1,4 +1,5 @@ import { create } from 'zustand'; +import { persist } from 'zustand/middleware'; import type { BookSource, DebugLog, @@ -7,8 +8,14 @@ import type { RequestHeader, LogCategory, ThemeMode, + YiciyuanSource, + AnySource, } from '../types'; -import { BookSourceType } from '../types'; +import { BookSourceType, SourceFormat, detectSourceFormat, getSourceFormatLabel } from '../types'; +import { createDefaultYiciyuanSource } from '../lib/yiciyuanSourceEditConfig'; + +// 本地存储 key +const STORAGE_KEY = 'book-source-store'; // 生成唯一ID(用于日志等) const generateId = () => Math.random().toString(36).substring(2, 15); @@ -94,8 +101,8 @@ declare global { } interface BookSourceState { - // 书源列表 - sources: BookSource[]; + // 书源列表(支持 Legado 和 异次元 两种格式) + sources: AnySource[]; // 当前选中的书源ID activeSourceId: string | null; // 当前编辑的代码 @@ -118,6 +125,10 @@ interface BookSourceState { isLoading: boolean; // 测试结果 testResult: TestResult | null; + // 章节列表(用于正文测试时切换章节) + chapterList: Array<{ name: string; url: string }>; + // 当前章节索引 + currentChapterIndex: number; // 请求头配置 requestHeaders: RequestHeader[]; // 编辑器视图模式 @@ -129,7 +140,7 @@ interface BookSourceState { // Actions selectSource: (url: string) => void; - createSource: () => BookSource; + createSource: (format?: SourceFormat) => AnySource; updateSourceCode: (code: string) => void; saveCurrentSource: () => boolean; saveToFile: () => Promise; @@ -155,6 +166,10 @@ interface BookSourceState { field: 'key' | 'value', value: string ) => void; + // 获取当前源的格式 + getCurrentSourceFormat: () => SourceFormat; + // 获取指定源的格式 + getSourceFormat: (url: string) => SourceFormat; } // 格式化解析数据用于显示 @@ -202,7 +217,9 @@ function formatParsedData( return []; } -export const useBookSourceStore = create()((set, get) => ({ +export const useBookSourceStore = create()( + persist( + (set, get) => ({ sources: [], activeSourceId: null, sourceCode: '', @@ -215,6 +232,8 @@ export const useBookSourceStore = create()((set, get) => ({ testHistory: [], isLoading: false, testResult: null, + chapterList: [], + currentChapterIndex: -1, requestHeaders: [ { key: 'User-Agent', @@ -224,7 +243,7 @@ export const useBookSourceStore = create()((set, get) => ({ ], editorViewMode: 'text', themeMode: 'light', - aiAnalysisEnabled: false, + aiAnalysisEnabled: true, selectSource: (url: string) => { const source = get().sources.find((s) => s.bookSourceUrl === url); @@ -235,8 +254,10 @@ export const useBookSourceStore = create()((set, get) => ({ }); }, - createSource: () => { - const newSource = createDefaultSource(); + createSource: (format: SourceFormat = SourceFormat.Legado) => { + const newSource = format === SourceFormat.Yiciyuan + ? createDefaultYiciyuanSource() as YiciyuanSource + : createDefaultSource(); set((state) => ({ sources: [...state.sources, newSource], activeSourceId: newSource.bookSourceUrl, @@ -450,7 +471,7 @@ export const useBookSourceStore = create()((set, get) => ({ throw new Error('调试API不可用,请在Electron环境中运行'); } - let currentSource: BookSource; + let currentSource: AnySource; try { currentSource = JSON.parse(state.sourceCode); } catch { @@ -519,6 +540,26 @@ export const useBookSourceStore = create()((set, get) => ({ testResultData.imageUrls = result.imageUrls; } + // 目录测试成功后保存章节列表 + if (state.testMode === 'toc' && Array.isArray(result.parsedItems)) { + const chapters = result.parsedItems + .map((item: any) => ({ + name: item.name || item.chapterName || item.title || '', + url: item.url || item.chapterUrl || item.href || '', + })) + .filter((ch: { name: string; url: string }) => ch.name && ch.url); + set({ chapterList: chapters, currentChapterIndex: -1 }); + } + + // 正文测试时更新当前章节索引 + if (state.testMode === 'content') { + const chapterList = get().chapterList; + const currentIndex = chapterList.findIndex(ch => ch.url === state.testInput); + if (currentIndex !== -1) { + set({ currentChapterIndex: currentIndex }); + } + } + set({ testResult: testResultData }); const itemCount = result.imageUrls?.length || @@ -560,9 +601,15 @@ export const useBookSourceStore = create()((set, get) => ({ toggleSourceEnabled: (url: string) => { set((state) => ({ - sources: state.sources.map((s) => - s.bookSourceUrl === url ? { ...s, enabled: !s.enabled } : s - ), + sources: state.sources.map((s) => { + if (s.bookSourceUrl !== url) return s; + // 根据源格式切换不同的启用字段 + const format = detectSourceFormat(s); + if (format === SourceFormat.Yiciyuan) { + return { ...s, enable: !(s as YiciyuanSource).enable }; + } + return { ...s, enabled: !(s as BookSource).enabled }; + }), })); }, @@ -630,17 +677,45 @@ export const useBookSourceStore = create()((set, get) => ({ ), })); }, -})); + + // 获取当前源的格式 + getCurrentSourceFormat: () => { + const state = get(); + if (!state.activeSourceId) return SourceFormat.Legado; + const source = state.sources.find(s => s.bookSourceUrl === state.activeSourceId); + return source ? detectSourceFormat(source) : SourceFormat.Legado; + }, + + // 获取指定源的格式 + getSourceFormat: (url: string) => { + const source = get().sources.find(s => s.bookSourceUrl === url); + return source ? detectSourceFormat(source) : SourceFormat.Legado; + }, +}), + { + name: STORAGE_KEY, + // 只持久化需要保存的字段 + partialize: (state) => ({ + sources: state.sources, + testHistory: state.testHistory, + requestHeaders: state.requestHeaders, + editorViewMode: state.editorViewMode, + themeMode: state.themeMode, + aiAnalysisEnabled: state.aiAnalysisEnabled, + }), + } + ) +); // 声明 window.debugApi 类型 declare global { interface Window { debugApi?: { - search: (source: BookSource, keyword: string) => Promise; - explore: (source: BookSource, exploreUrl: string) => Promise; - bookInfo: (source: BookSource, bookUrl: string) => Promise; - toc: (source: BookSource, tocUrl: string) => Promise; - content: (source: BookSource, contentUrl: string) => Promise; + search: (source: AnySource, keyword: string) => Promise; + explore: (source: AnySource, exploreUrl: string) => Promise; + bookInfo: (source: AnySource, bookUrl: string) => Promise; + toc: (source: AnySource, tocUrl: string) => Promise; + content: (source: AnySource, contentUrl: string) => Promise; }; } } diff --git a/src/renderer/types/index.ts b/src/renderer/types/index.ts index 25b84ed..a2a0447 100644 --- a/src/renderer/types/index.ts +++ b/src/renderer/types/index.ts @@ -1,9 +1,15 @@ // ============================================ -// Legado 书源完整类型定义 -// 参考: https://github.com/gedoor/legado +// 书源类型定义 +// 支持 Legado 和 异次元 两种格式 // ============================================ -// 书源类型枚举 +// 源格式枚举(用于区分 Legado 和 异次元) +export enum SourceFormat { + Legado = 'legado', + Yiciyuan = 'yiciyuan', +} + +// 书源类型枚举(Legado 格式) export enum BookSourceType { Text = 0, // 文本 Audio = 1, // 音频 @@ -211,3 +217,133 @@ export interface ChapterItem { // 主题类型 export type ThemeMode = 'light' | 'dark' | 'system'; + +// ============================================ +// 异次元图源类型定义 +// 参考: https://www.yckceo.com/yiciyuan/tuyuan/ +// ============================================ + +// 异次元图源主体定义 +export interface YiciyuanSource { + // ===== 基本信息 ===== + bookSourceUrl: string; // 源地址(主键) + bookSourceName: string; // 源名称 + bookSourceGroup?: string; // 源分组 + bookSourceType: string; // 源类型(漫画/小说等) + sourceRemark?: string; // 源备注 + + // ===== 状态控制 ===== + enable: boolean; // 是否启用 + serialNumber?: number; // 序号 + weight?: number; // 权重 + lastUpdateTime?: number; // 最后更新时间 + + // ===== 请求配置 ===== + httpUserAgent?: string; // User-Agent + bookDelayTime?: string; // 延迟时间 + bookSingleThread?: string; // 单线程(是/否) + + // ===== 登录相关 ===== + loginUrl?: string; // 登录地址 + loginUrlResult?: string; // 登录结果 + + // ===== 搜索规则 ===== + ruleSearchUrl?: string; // 搜索地址 + ruleSearchUrlNext?: string; // 搜索下一页 + ruleSearchList?: string; // 搜索列表规则 + ruleSearchName?: string; // 书名规则 + ruleSearchAuthor?: string; // 作者规则 + ruleSearchKind?: string; // 分类规则 + ruleSearchLastChapter?: string; // 最新章节规则 + ruleSearchCoverUrl?: string; // 封面规则 + ruleSearchCoverDecoder?: string; // 封面解密 + ruleSearchNoteUrl?: string; // 详情地址规则 + + // ===== 发现规则 ===== + ruleFindUrl?: string; // 发现地址(多行) + + // ===== 详情规则 ===== + ruleBookUrlPattern?: string; // URL匹配规则 + ruleBookName?: string; // 书名规则 + ruleBookAuthor?: string; // 作者规则 + ruleBookKind?: string; // 分类规则 + ruleBookLastChapter?: string; // 最新章节规则 + ruleIntroduce?: string; // 简介规则 + ruleCoverUrl?: string; // 封面规则 + ruleCoverDecoder?: string; // 封面解密 + + // ===== 目录规则 ===== + ruleChapterUrl?: string; // 目录地址规则 + ruleChapterUrlNext?: string; // 目录下一页 + ruleChapterList?: string; // 章节列表规则 + ruleChapterName?: string; // 章节名称规则 + ruleContentUrl?: string; // 章节内容地址规则 + ruleChapterId?: string; // 章节ID规则 + ruleChapterParentId?: string; // 父章节ID + ruleChapterParentName?: string; // 父章节名称 + + // ===== 正文规则 ===== + ruleBookContent?: string; // 正文内容规则 + ruleBookContentDecoder?: string; // 正文解密 + ruleContentUrlNext?: string; // 正文下一页 +} + +// 通用源类型(可以是 Legado 或 异次元) +export type AnySource = BookSource | YiciyuanSource; + +// 源格式检测函数类型 +export type SourceFormatDetector = (source: any) => SourceFormat; + +// 检测源格式的工具函数 +export function detectSourceFormat(source: any): SourceFormat { + if (!source) return SourceFormat.Legado; + + // 异次元图源特有字段 + const yiciyuanFields = [ + 'ruleSearchUrl', + 'ruleSearchList', + 'ruleSearchName', + 'ruleSearchNoteUrl', + 'ruleBookContent', + 'ruleFindUrl', + 'ruleChapterUrl', + 'ruleIntroduce', + 'bookSingleThread', + 'httpUserAgent', + ]; + + // Legado 特有字段 + const legadoFields = [ + 'ruleSearch', + 'ruleExplore', + 'ruleBookInfo', + 'ruleToc', + 'ruleContent', + 'searchUrl', + 'exploreUrl', + ]; + + // 统计匹配的字段数 + let yiciyuanCount = 0; + let legadoCount = 0; + + for (const field of yiciyuanFields) { + if (field in source && source[field] !== undefined && source[field] !== '') { + yiciyuanCount++; + } + } + + for (const field of legadoFields) { + if (field in source && source[field] !== undefined && source[field] !== '') { + legadoCount++; + } + } + + // 根据匹配数量判断格式 + return yiciyuanCount > legadoCount ? SourceFormat.Yiciyuan : SourceFormat.Legado; +} + +// 获取源格式的显示名称 +export function getSourceFormatLabel(format: SourceFormat): string { + return format === SourceFormat.Yiciyuan ? '异次元' : 'Legado'; +} diff --git a/src/renderer/utils/sourceConverter.test.ts b/src/renderer/utils/sourceConverter.test.ts new file mode 100644 index 0000000..a6524d6 --- /dev/null +++ b/src/renderer/utils/sourceConverter.test.ts @@ -0,0 +1,265 @@ +/** + * 书源转换测试 + * 测试 Legado <-> 异次元 转换的正确性和幂等性 + */ + +import { legadoToYiciyuan, yiciyuanToLegado, convertSource } from './sourceConverter'; +import { BookSource, BookSourceType, SourceFormat, detectSourceFormat } from '../types'; + +// 测试用的 Legado 书源(笔趣漫画) +const testLegadoSource: BookSource = { + "bookSourceComment": "// Error: 1233发现失效\n\n部分漫画封面无法显示,有兴趣的大佬帮忙完善一下\n[✅已验证]", + "bookSourceGroup": "漫画,发现失效", + "bookSourceName": "笔趣漫画", + "bookSourceType": BookSourceType.Image, + "bookSourceUrl": "https://www.biqumh.com", + "bookUrlPattern": "https://www.biqumh.com/index.php/comic/.*", + "customOrder": 0, + "enabled": true, + "enabledCookieJar": false, + "enabledExplore": true, + "header": "{\n\t \"Accept\": \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"Referer\": \"https://www.biqumh.com/\"\n}", + "lastUpdateTime": 1765176029555, + "respondTime": 183379, + "weight": 0, + "searchUrl": "/index.php/search?key={{key}}", + "ruleSearch": { + "bookList": ".common-comic-item", + "bookUrl": ".comic__title a@href", + "coverUrl": "img@data-original", + "intro": ".comic-feature@text", + "lastChapter": ".comic-update a@text##待浏览", + "name": ".comic__title a@text" + }, + "ruleBookInfo": { + "author": ".comic-author .name@text", + "coverUrl": ".de-info__bg@style##url\\('(.*?)'\\)##$1###", + "intro": ".intro-total@text", + "kind": ".comic-status span a@text", + "name": ".j-comic-title@text" + }, + "ruleToc": { + "chapterList": ".chapter__list-box li a", + "chapterName": "text", + "chapterUrl": "href" + }, + "ruleContent": { + "content": "@js:\nconst imgs = java.getElements(\".rd-article-wr img\")\nimgs.forEach(e => {\n e.attr(\"src\", e.attr(\"data-original\"))\n})\nimgs" + }, + "ruleExplore": { + "author": "$.author", + "bookList": "$.data", + "bookUrl": "$.url", + "coverUrl": "$.pic", + "intro": "$.content", + "kind": "$.serialize&&$.tags&&$.addtime", + "lastChapter": "$.chapter_name", + "name": "$.name" + } +}; + +/** + * 测试单次转换 + */ +function testSingleConversion() { + console.log('=== 测试单次转换 ===\n'); + + // Legado -> 异次元 + const yiciyuanResult = legadoToYiciyuan(testLegadoSource); + console.log('1. Legado -> 异次元:'); + console.log(' searchUrl:', testLegadoSource.searchUrl); + console.log(' -> ruleSearchUrl:', yiciyuanResult.ruleSearchUrl); + console.log(' ruleSearch.bookList:', testLegadoSource.ruleSearch?.bookList); + console.log(' -> ruleSearchList:', yiciyuanResult.ruleSearchList); + console.log(' ruleContent.content:', testLegadoSource.ruleContent?.content?.substring(0, 50) + '...'); + console.log(' -> ruleBookContent:', yiciyuanResult.ruleBookContent?.substring(0, 50) + '...'); + + // 检测格式 + const format1 = detectSourceFormat(yiciyuanResult); + console.log(' 转换后格式检测:', format1); + console.log(' 期望: yiciyuan, 实际:', format1 === SourceFormat.Yiciyuan ? '✅ 正确' : '❌ 错误'); + + // 异次元 -> Legado + const legadoResult = yiciyuanToLegado(yiciyuanResult); + console.log('\n2. 异次元 -> Legado:'); + console.log(' ruleSearchUrl:', yiciyuanResult.ruleSearchUrl); + console.log(' -> searchUrl:', legadoResult.searchUrl); + console.log(' ruleSearchList:', yiciyuanResult.ruleSearchList); + console.log(' -> ruleSearch.bookList:', legadoResult.ruleSearch?.bookList); + + // 检测格式 + const format2 = detectSourceFormat(legadoResult); + console.log(' 转换后格式检测:', format2); + console.log(' 期望: legado, 实际:', format2 === SourceFormat.Legado ? '✅ 正确' : '❌ 错误'); + + return { yiciyuanResult, legadoResult }; +} + +/** + * 测试多次转换的幂等性 + */ +function testIdempotency() { + console.log('\n=== 测试多次转换幂等性 ===\n'); + + let current: any = testLegadoSource; + const conversions: string[] = ['Legado']; + + // 进行 6 次转换 + for (let i = 0; i < 6; i++) { + const { result, fromFormat, toFormat } = convertSource(current); + current = result; + conversions.push(toFormat === SourceFormat.Yiciyuan ? '异次元' : 'Legado'); + } + + console.log('转换链:', conversions.join(' -> ')); + + // 检查关键字段 + console.log('\n关键字段对比:'); + + // 搜索URL + const originalSearchUrl = testLegadoSource.searchUrl; + const finalSearchUrl = current.searchUrl || current.ruleSearchUrl; + console.log('1. 搜索URL:'); + console.log(' 原始:', originalSearchUrl); + console.log(' 最终:', finalSearchUrl); + + // 检查占位符是否正确 + const hasCorrectPlaceholder = + (finalSearchUrl?.includes('{{key}}') && conversions[conversions.length - 1] === 'Legado') || + (finalSearchUrl?.includes('searchKey') && conversions[conversions.length - 1] === '异次元'); + console.log(' 占位符:', hasCorrectPlaceholder ? '✅ 正确' : '❌ 错误'); + + // 搜索列表规则 + const originalBookList = testLegadoSource.ruleSearch?.bookList; + const finalBookList = current.ruleSearch?.bookList || current.ruleSearchList; + console.log('\n2. 搜索列表规则:'); + console.log(' 原始:', originalBookList); + console.log(' 最终:', finalBookList); + console.log(' 一致性:', originalBookList === finalBookList ? '✅ 一致' : '⚠️ 有变化'); + + // 正文规则 + const originalContent = testLegadoSource.ruleContent?.content; + const finalContent = current.ruleContent?.content || current.ruleBookContent; + console.log('\n3. 正文规则:'); + console.log(' 原始:', originalContent?.substring(0, 60) + '...'); + console.log(' 最终:', finalContent?.substring(0, 60) + '...'); + // 比较去除前缀后的内容 + const normalizedOriginal = originalContent?.replace(/^@js:/i, '').trim(); + const normalizedFinal = finalContent?.replace(/^@js:/i, '').trim(); + console.log(' 一致性:', normalizedOriginal === normalizedFinal ? '✅ 一致' : '⚠️ 有变化'); + + return current; +} + +/** + * 测试转换后能否正常解析 + */ +function testConversionValidity() { + console.log('\n=== 测试转换有效性 ===\n'); + + const yiciyuanResult = legadoToYiciyuan(testLegadoSource) as any; + + console.log('转换后的异次元图源关键字段:'); + console.log(' bookSourceUrl:', yiciyuanResult.bookSourceUrl); + console.log(' bookSourceName:', yiciyuanResult.bookSourceName); + console.log(' ruleSearchUrl:', yiciyuanResult.ruleSearchUrl); + console.log(' ruleSearchList:', yiciyuanResult.ruleSearchList); + console.log(' ruleSearchName:', yiciyuanResult.ruleSearchName); + console.log(' ruleSearchNoteUrl:', yiciyuanResult.ruleSearchNoteUrl); + console.log(' ruleSearchCoverUrl:', yiciyuanResult.ruleSearchCoverUrl); + console.log(' ruleChapterList:', yiciyuanResult.ruleChapterList); + console.log(' ruleChapterName:', yiciyuanResult.ruleChapterName); + console.log(' ruleContentUrl:', yiciyuanResult.ruleContentUrl); + console.log(' ruleBookContent:', yiciyuanResult.ruleBookContent?.substring(0, 80) + '...'); + + // 验证 header 是否保留 + console.log('\n请求头保留检查:'); + console.log(' 原始 header:', testLegadoSource.header?.substring(0, 60) + '...'); + console.log(' 转换后 header:', yiciyuanResult.header ? yiciyuanResult.header.substring(0, 60) + '...' : '(空)'); + const headerPreserved = yiciyuanResult.header === testLegadoSource.header; + console.log(' header 保留:', headerPreserved ? '✅ 正确' : '❌ 丢失'); + + // 验证必要字段 + const requiredFields = [ + 'bookSourceUrl', + 'bookSourceName', + 'ruleSearchUrl', + 'ruleSearchList', + 'ruleSearchName', + 'ruleSearchNoteUrl' + ]; + + console.log('\n必要字段检查:'); + let allValid = true; + for (const field of requiredFields) { + const value = (yiciyuanResult as any)[field]; + const valid = value && value.length > 0; + console.log(` ${field}: ${valid ? '✅' : '❌'} ${value || '(空)'}`); + if (!valid) allValid = false; + } + + return allValid && headerPreserved; +} + +/** + * 测试非图片类型书源的转换限制 + */ +function testNonImageSourceRestriction() { + console.log('\n=== 测试非图片类型限制 ===\n'); + + // 创建一个文字类型书源 + const textSource: BookSource = { + ...testLegadoSource, + bookSourceType: BookSourceType.Text, // 0 = 文字 + bookSourceName: '测试文字书源', + }; + + const result = convertSource(textSource); + console.log('文字类型书源转换:'); + console.log(' success:', result.success); + console.log(' error:', result.error); + console.log(' 结果:', !result.success ? '✅ 正确拒绝' : '❌ 应该拒绝'); + + // 创建一个音频类型书源 + const audioSource: BookSource = { + ...testLegadoSource, + bookSourceType: BookSourceType.Audio, // 1 = 音频 + bookSourceName: '测试音频书源', + }; + + const audioResult = convertSource(audioSource); + console.log('\n音频类型书源转换:'); + console.log(' success:', audioResult.success); + console.log(' error:', audioResult.error); + console.log(' 结果:', !audioResult.success ? '✅ 正确拒绝' : '❌ 应该拒绝'); + + // 图片类型应该允许 + const imageSource: BookSource = { + ...testLegadoSource, + bookSourceType: BookSourceType.Image, // 2 = 图片 + }; + + const imageResult = convertSource(imageSource); + console.log('\n图片类型书源转换:'); + console.log(' success:', imageResult.success); + console.log(' 结果:', imageResult.success ? '✅ 正确允许' : '❌ 应该允许'); + + return !result.success && !audioResult.success && imageResult.success; +} + +// 运行测试 +console.log('========================================'); +console.log('书源转换测试'); +console.log('========================================\n'); + +testSingleConversion(); +testIdempotency(); +const isValid = testConversionValidity(); +const isRestrictionValid = testNonImageSourceRestriction(); + +console.log('\n========================================'); +console.log('测试结果:'); +console.log(' 转换功能:', isValid ? '✅ 通过' : '❌ 失败'); +console.log(' 类型限制:', isRestrictionValid ? '✅ 通过' : '❌ 失败'); +console.log(' 总体:', (isValid && isRestrictionValid) ? '✅ 全部通过' : '❌ 有失败'); +console.log('========================================'); diff --git a/src/renderer/utils/sourceConverter.ts b/src/renderer/utils/sourceConverter.ts new file mode 100644 index 0000000..70d4bff --- /dev/null +++ b/src/renderer/utils/sourceConverter.ts @@ -0,0 +1,481 @@ +/** + * 书源格式转换工具 + * 支持 Legado 图源 <-> 异次元图源 互转 + * + * 关键差异: + * 1. 搜索URL占位符:异次元用 searchKey/searchPage,Legado用 {{key}}/{{page}} + * 2. 规则语法:异次元可带 @Header:{} 后缀,Legado用 @css:/@json:/@xpath: 前缀 + * 3. 属性取值:异次元用 tag.a@text,Legado用 a@text 或 CSS选择器 + */ + +import { + BookSource, + YiciyuanSource, + BookSourceType, + SourceFormat, + detectSourceFormat +} from '../types'; + +// ============================================ +// 规则语法转换 +// ============================================ + +/** + * Legado 规则 -> 异次元规则 + * - 移除 @css:/@json:/@xpath: 前缀(异次元自动识别) + * - 处理复合规则(||, &&, @@) + * + * 注意:保持幂等性,多次转换结果不变 + */ +function legadoRuleToYiciyuan(rule: string | undefined): string { + if (!rule) return ''; + + let result = rule.trim(); + + // 移除 Legado 规则类型前缀(异次元自动识别) + // 但保留 @js: 因为两者都支持 + result = result.replace(/^@(css|json|xpath):/i, ''); + + // 格式两者都支持,保持不变以确保幂等性 + // 不再转换为 @js: 格式,因为会导致多次转换出问题 + + return result; +} + +/** + * 异次元规则 -> Legado 规则 + * - 保持规则基本不变(Legado 解析器兼容性较好) + * - 保留 @Header:{} 后缀(本项目的解析器会处理它) + * + * 注意:保持幂等性,多次转换结果不变 + * 重要:不移除 @Header:{} 后缀,以保证往返转换的完整性 + */ +function yiciyuanRuleToLegado(rule: string | undefined): string { + if (!rule) return ''; + + // 保持原样,不做任何修改 + // @Header:{} 后缀会被本项目的解析器正确处理 + return rule.trim(); +} + +/** + * Legado 搜索URL -> 异次元搜索URL + * {{key}} -> searchKey + * {{page}} -> searchPage + * ,{ -> 分离 POST 参数 + * + * 注意:先替换带运算符的占位符,避免部分匹配 + */ +function legadoSearchUrlToYiciyuan(url: string | undefined): string { + if (!url) return ''; + + let result = url.trim(); + + // 如果已经是异次元格式,直接返回(幂等性) + if (result.includes('searchKey') || result.includes('searchPage')) { + return result; + } + + // 处理 POST 请求格式(先处理,因为 JSON 中也有占位符) + // Legado: url,{"method":"POST","body":"key={{key}}"} + // 异次元: url@post->key=searchKey + const postMatch = result.match(/^(.+?),\s*(\{.+\})$/s); + if (postMatch) { + const baseUrl = postMatch[1]; + try { + const config = JSON.parse(postMatch[2]); + if (config.method?.toUpperCase() === 'POST' && config.body) { + let body = config.body; + // 先替换带运算符的,再替换普通的 + body = body.replace(/\{\{page-1\}\}/g, 'searchPage-1'); + body = body.replace(/\{\{page\+1\}\}/g, 'searchPage+1'); + body = body.replace(/\{\{page\}\}/g, 'searchPage'); + body = body.replace(/\{\{key\}\}/g, 'searchKey'); + result = `${baseUrl}@post->${body}`; + return result; + } + } catch { + // JSON 解析失败,继续普通处理 + } + } + + // 替换占位符(先替换带运算符的,避免部分匹配) + result = result.replace(/\{\{page-1\}\}/g, 'searchPage-1'); + result = result.replace(/\{\{page\+1\}\}/g, 'searchPage+1'); + result = result.replace(/\{\{page\}\}/g, 'searchPage'); + result = result.replace(/\{\{key\}\}/g, 'searchKey'); + + return result; +} + +/** + * 异次元搜索URL -> Legado 搜索URL + * searchKey -> {{key}} + * searchPage -> {{page}} + * @post-> -> POST 配置 + * + * 注意:先替换带运算符的占位符,避免部分匹配 + */ +function yiciyuanSearchUrlToLegado(url: string | undefined): string { + if (!url) return ''; + + let result = url.trim(); + + // 如果已经是 Legado 格式,直接返回(幂等性) + if (result.includes('{{key}}') || result.includes('{{page}}')) { + return result; + } + + // 处理 POST 请求格式 + // 异次元: url@post->key=searchKey + // Legado: url,{"method":"POST","body":"key={{key}}"} + const postMatch = result.match(/^(.+?)@post->(.+)$/i); + if (postMatch) { + const baseUrl = postMatch[1]; + let body = postMatch[2]; + // 先替换带运算符的,再替换普通的 + body = body.replace(/searchPage-1/g, '{{page-1}}'); + body = body.replace(/searchPage\+1/g, '{{page+1}}'); + body = body.replace(/searchPage(?!-|\+)/g, '{{page}}'); + body = body.replace(/searchKey/g, '{{key}}'); + result = `${baseUrl},{"method":"POST","body":"${body}"}`; + return result; + } + + // 替换占位符(先替换带运算符的,避免部分匹配) + // 使用负向前瞻确保 searchPage 后面不是 - 或 + + result = result.replace(/searchPage-1/g, '{{page-1}}'); + result = result.replace(/searchPage\+1/g, '{{page+1}}'); + result = result.replace(/searchPage(?!-|\+)/g, '{{page}}'); + result = result.replace(/searchKey/g, '{{key}}'); + + return result; +} + +/** + * Legado 发现URL -> 异次元发现URL + */ +function legadoExploreUrlToYiciyuan(url: string | undefined): string { + if (!url) return ''; + + let result = url.trim(); + + // 如果已经是异次元格式,直接返回(幂等性) + if (result.includes('searchPage')) { + return result; + } + + // 先替换带运算符的,避免部分匹配 + result = result.replace(/\{\{page-1\}\}/g, 'searchPage-1'); + result = result.replace(/\{\{page\+1\}\}/g, 'searchPage+1'); + result = result.replace(/\{\{page\}\}/g, 'searchPage'); + + return result; +} + +/** + * 异次元发现URL -> Legado 发现URL + */ +function yiciyuanExploreUrlToLegado(url: string | undefined): string { + if (!url) return ''; + + let result = url.trim(); + + // 如果已经是 Legado 格式,直接返回(幂等性) + if (result.includes('{{page}}')) { + return result; + } + + // 先替换带运算符的,避免部分匹配 + result = result.replace(/searchPage-1/g, '{{page-1}}'); + result = result.replace(/searchPage\+1/g, '{{page+1}}'); + result = result.replace(/searchPage(?!-|\+)/g, '{{page}}'); + + return result; +} + +// ============================================ +// 主转换函数 +// ============================================ + +/** + * Legado 图源 -> 异次元图源 + * + * 注意:异次元格式没有 header 字段,但我们在转换结果中保留它 + * 以便异次元调试器能正确处理请求头 + */ +export function legadoToYiciyuan(source: BookSource): YiciyuanSource { + // 解析 header,提取 User-Agent + const headerObj = parseHeaderJson(source.header); + + const result: YiciyuanSource & { header?: string } = { + // 基本信息 + bookSourceUrl: source.bookSourceUrl || '', + bookSourceName: source.bookSourceName || '', + bookSourceGroup: source.bookSourceGroup || '', + bookSourceType: '漫画', + sourceRemark: source.bookSourceComment || '', + + // 状态控制 + enable: source.enabled !== false, + serialNumber: source.customOrder || 0, + weight: source.weight || 0, + lastUpdateTime: source.lastUpdateTime || Date.now(), + + // 请求配置 + httpUserAgent: headerObj['User-Agent'] || '', + + // 登录相关 + loginUrl: source.loginUrl || '', + + // 搜索规则 - 转换URL和规则语法 + ruleSearchUrl: legadoSearchUrlToYiciyuan(source.searchUrl), + ruleSearchList: legadoRuleToYiciyuan(source.ruleSearch?.bookList), + ruleSearchName: legadoRuleToYiciyuan(source.ruleSearch?.name), + ruleSearchAuthor: legadoRuleToYiciyuan(source.ruleSearch?.author), + ruleSearchKind: legadoRuleToYiciyuan(source.ruleSearch?.kind), + ruleSearchLastChapter: legadoRuleToYiciyuan(source.ruleSearch?.lastChapter), + ruleSearchCoverUrl: legadoRuleToYiciyuan(source.ruleSearch?.coverUrl), + ruleSearchNoteUrl: legadoRuleToYiciyuan(source.ruleSearch?.bookUrl), + + // 发现规则 + ruleFindUrl: legadoExploreUrlToYiciyuan(source.exploreUrl), + + // 详情规则 + ruleBookUrlPattern: source.bookUrlPattern || '', + ruleBookName: legadoRuleToYiciyuan(source.ruleBookInfo?.name), + ruleBookAuthor: legadoRuleToYiciyuan(source.ruleBookInfo?.author), + ruleBookKind: legadoRuleToYiciyuan(source.ruleBookInfo?.kind), + ruleBookLastChapter: legadoRuleToYiciyuan(source.ruleBookInfo?.lastChapter), + ruleIntroduce: legadoRuleToYiciyuan(source.ruleBookInfo?.intro), + ruleCoverUrl: legadoRuleToYiciyuan(source.ruleBookInfo?.coverUrl), + + // 目录规则 + ruleChapterUrl: legadoRuleToYiciyuan(source.ruleBookInfo?.tocUrl), + ruleChapterUrlNext: legadoRuleToYiciyuan(source.ruleToc?.nextTocUrl), + ruleChapterList: legadoRuleToYiciyuan(source.ruleToc?.chapterList), + ruleChapterName: legadoRuleToYiciyuan(source.ruleToc?.chapterName), + ruleContentUrl: legadoRuleToYiciyuan(source.ruleToc?.chapterUrl), + + // 正文规则 + ruleBookContent: legadoRuleToYiciyuan(source.ruleContent?.content), + ruleContentUrlNext: legadoRuleToYiciyuan(source.ruleContent?.nextContentUrl), + }; + + // 保留原始 header(异次元调试器会使用它) + if (source.header) { + (result as any).header = source.header; + } + + // 清理空字段 + return cleanEmptyFields(result) as YiciyuanSource; +} + +/** + * 异次元图源 -> Legado 图源 + */ +export function yiciyuanToLegado(source: YiciyuanSource): BookSource { + const result: BookSource = { + // 基本信息 + bookSourceUrl: source.bookSourceUrl || '', + bookSourceName: source.bookSourceName || '', + bookSourceGroup: source.bookSourceGroup || '', + bookSourceType: BookSourceType.Image, // 图片类型 + bookSourceComment: source.sourceRemark || '', + + // 状态控制 + enabled: source.enable !== false, + enabledExplore: !!source.ruleFindUrl, + customOrder: source.serialNumber || 0, + weight: source.weight || 0, + + // 时间信息 + lastUpdateTime: source.lastUpdateTime || Date.now(), + respondTime: 0, + + // 请求头 + header: source.httpUserAgent + ? JSON.stringify({ 'User-Agent': source.httpUserAgent }) + : undefined, + + // 登录相关 + loginUrl: source.loginUrl || undefined, + + // 搜索配置 - 转换URL和规则语法 + searchUrl: yiciyuanSearchUrlToLegado(source.ruleSearchUrl), + ruleSearch: { + bookList: yiciyuanRuleToLegado(source.ruleSearchList), + name: yiciyuanRuleToLegado(source.ruleSearchName), + author: yiciyuanRuleToLegado(source.ruleSearchAuthor), + kind: yiciyuanRuleToLegado(source.ruleSearchKind), + lastChapter: yiciyuanRuleToLegado(source.ruleSearchLastChapter), + coverUrl: yiciyuanRuleToLegado(source.ruleSearchCoverUrl), + bookUrl: yiciyuanRuleToLegado(source.ruleSearchNoteUrl), + }, + + // 发现配置 + exploreUrl: yiciyuanExploreUrlToLegado(source.ruleFindUrl), + ruleExplore: { + // 异次元通常搜索和发现共用规则 + bookList: yiciyuanRuleToLegado(source.ruleSearchList), + name: yiciyuanRuleToLegado(source.ruleSearchName), + author: yiciyuanRuleToLegado(source.ruleSearchAuthor), + kind: yiciyuanRuleToLegado(source.ruleSearchKind), + lastChapter: yiciyuanRuleToLegado(source.ruleSearchLastChapter), + coverUrl: yiciyuanRuleToLegado(source.ruleSearchCoverUrl), + bookUrl: yiciyuanRuleToLegado(source.ruleSearchNoteUrl), + }, + + // 详情规则 + bookUrlPattern: source.ruleBookUrlPattern || undefined, + ruleBookInfo: { + name: yiciyuanRuleToLegado(source.ruleBookName), + author: yiciyuanRuleToLegado(source.ruleBookAuthor), + kind: yiciyuanRuleToLegado(source.ruleBookKind), + lastChapter: yiciyuanRuleToLegado(source.ruleBookLastChapter), + intro: yiciyuanRuleToLegado(source.ruleIntroduce), + coverUrl: yiciyuanRuleToLegado(source.ruleCoverUrl), + tocUrl: yiciyuanRuleToLegado(source.ruleChapterUrl), + }, + + // 目录规则 + ruleToc: { + chapterList: yiciyuanRuleToLegado(source.ruleChapterList), + chapterName: yiciyuanRuleToLegado(source.ruleChapterName), + chapterUrl: yiciyuanRuleToLegado(source.ruleContentUrl), + nextTocUrl: yiciyuanRuleToLegado(source.ruleChapterUrlNext), + }, + + // 正文规则 + ruleContent: { + content: yiciyuanRuleToLegado(source.ruleBookContent), + nextContentUrl: yiciyuanRuleToLegado(source.ruleContentUrlNext), + imageStyle: 'FULL', // 图源默认全宽显示 + }, + }; + + // 保留原始 header(如果异次元源中有的话,可能是从 Legado 转换来的) + const sourceAny = source as any; + if (sourceAny.header) { + result.header = sourceAny.header; + } + + // 清理空字段 + return cleanEmptyFields(result) as BookSource; +} + +/** + * 转换结果类型 + */ +export interface ConvertResult { + success: boolean; + result?: any; + fromFormat: SourceFormat; + toFormat: SourceFormat; + error?: string; +} + +/** + * 检查是否为图片类型书源 + * Legado: bookSourceType === 2 + * 异次元: bookSourceType === '漫画' 或类似 + */ +function isImageSource(source: any): boolean { + // Legado 格式 + if (typeof source.bookSourceType === 'number') { + return source.bookSourceType === BookSourceType.Image; // 2 + } + // 异次元格式 + if (typeof source.bookSourceType === 'string') { + return ['漫画', '图片', 'comic', 'image'].includes(source.bookSourceType.toLowerCase()); + } + return false; +} + +/** + * 自动检测并转换源格式 + * 只支持图片类型书源的转换 + */ +export function convertSource(source: any): ConvertResult { + const fromFormat = detectSourceFormat(source); + + // 检查是否为图片类型 + if (!isImageSource(source)) { + const typeName = source.bookSourceType === 0 ? '文字' + : source.bookSourceType === 1 ? '音频' + : source.bookSourceType === 3 ? '文件' + : `未知(${source.bookSourceType})`; + return { + success: false, + fromFormat, + toFormat: fromFormat === SourceFormat.Yiciyuan ? SourceFormat.Legado : SourceFormat.Yiciyuan, + error: `只支持图片类型书源转换,当前书源类型为:${typeName}`, + }; + } + + if (fromFormat === SourceFormat.Yiciyuan) { + return { + success: true, + result: yiciyuanToLegado(source as YiciyuanSource), + fromFormat: SourceFormat.Yiciyuan, + toFormat: SourceFormat.Legado, + }; + } else { + return { + success: true, + result: legadoToYiciyuan(source as BookSource), + fromFormat: SourceFormat.Legado, + toFormat: SourceFormat.Yiciyuan, + }; + } +} + +// ============================================ +// 工具函数 +// ============================================ + +/** + * 解析 header JSON 获取指定字段 + */ +function parseHeader(header: string | undefined, key: string): string { + if (!header) return ''; + try { + const parsed = JSON.parse(header); + return parsed[key] || ''; + } catch { + return ''; + } +} + +/** + * 解析 header JSON 为对象 + */ +function parseHeaderJson(header: string | undefined): Record { + if (!header) return {}; + try { + return JSON.parse(header); + } catch { + return {}; + } +} + +/** + * 清理对象中的空字段 + */ +function cleanEmptyFields(obj: any): any { + const result: any = {}; + for (const [key, value] of Object.entries(obj)) { + if (value === undefined || value === null || value === '') { + continue; + } + if (typeof value === 'object' && !Array.isArray(value)) { + const cleaned = cleanEmptyFields(value); + if (Object.keys(cleaned).length > 0) { + result[key] = cleaned; + } + } else { + result[key] = value; + } + } + return result; +} diff --git a/test-20-sources.ts b/test-20-sources.ts new file mode 100644 index 0000000..8a78c9e --- /dev/null +++ b/test-20-sources.ts @@ -0,0 +1,501 @@ +/** + * 测试20个异次元图源 + * 从 https://www.yck2025.com/yiciyuan/tuyuan/index.html 挑选 + * 修复了 class.xxx 格式被错误识别为 JSON 路径的问题 + */ +import { YiciyuanDebugger, isYiciyuanSource } from './src/main/debug/yiciyuan-debugger'; + +// 20个测试图源(优化后的配置) +const testSources = [ + // 1. 包子漫画cn (已验证可用) + { + name: "包子漫画cn", + source: { + "bookSourceName": "包子漫画cn", + "bookSourceUrl": "https://cn.bzmanga.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://cn.bzmanga.com/search?q=searchKey", + "ruleSearchList": ".comics-card", + "ruleSearchName": ".comics-card__title@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "amp-img@src", + "ruleSearchAuthor": ".tags@text", + "ruleBookName": "h1.comics-detail__title@text", + "ruleBookAuthor": "h2.comics-detail__author@text", + "ruleIntroduce": "p.comics-detail__desc@text", + "ruleCoverUrl": ".pure-u-1-1 amp-img@src", + "ruleChapterList": ".comics-chapters__item", + "ruleChapterName": "text", + "ruleContentUrl": "href" + }, + keyword: "海贼王" + }, + // 2. G站漫画 (已验证可用) + { + name: "G站漫画", + source: { + "bookSourceName": "◯ G站", + "bookSourceUrl": "https://m.g-mh.org", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", + "ruleSearchUrl": "https://m.g-mh.org/s/searchKey", + "ruleSearchList": ".slicarda&&.pb-2", + "ruleSearchName": "h3@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": "img@src", + "ruleBookAuthor": ".text-small@a@text", + "ruleIntroduce": ".line-clamp-4@text", + "ruleChapterUrl": "@js:\nid = \"#bookmarkData\"; ai = \"data-mid\";\ni = org.jsoup.Jsoup.parse(result).select(id).attr(ai);\np = \"https://api-get-v2.mgsearcher.com/api/\";\nu = p + \"manga/get?mid=\" + i + \"&mode=all\";\njava.put(\"id\", i);\nu", + "ruleChapterList": "data.chapters", + "ruleChapterName": "$.attributes.title", + "ruleContentUrl": "$.id\n@js:\np = \"https://api-get-v2.mgsearcher.com/api/\";\na = \"chapter/getinfo?m=\" + java.get(\"id\") + \"&c=\";\nu = p + a + result;\nu" + }, + keyword: "斗罗" + }, + // 3. 腾讯漫画 + { + name: "腾讯漫画", + source: { + "bookSourceName": "腾讯漫画", + "bookSourceUrl": "https://m.ac.qq.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0", + "ruleSearchUrl": "https://m.ac.qq.com/search/result?word=searchKey", + "ruleSearchList": "class.comic-item", + "ruleSearchName": "class.comic-title@text", + "ruleSearchNoteUrl": "class.comic-link@href", + "ruleSearchCoverUrl": "class.comic-cover@tag.img@src", + "ruleSearchKind": "class.comic-tag@text", + "ruleSearchLastChapter": "class.comic-update@text", + "ruleBookName": "li.head-info-title@h1@text", + "ruleBookAuthor": "li.author-wr@text", + "ruleIntroduce": "class.head-info-desc@text", + "ruleCoverUrl": "div.head-banner@img@src" + }, + keyword: "斗破苍穹" + }, + // 4. 酷看漫画 + { + name: "酷看漫画", + source: { + "bookSourceName": "酷看漫画", + "bookSourceUrl": "https://www.kukk.net", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://www.kukk.net/search?keyword=searchKey", + "ruleSearchList": "class.mh-item", + "ruleSearchName": "tag.h2@text", + "ruleSearchNoteUrl": "tag.a@href", + "ruleSearchCoverUrl": "class.mh-cover@style", + "ruleSearchLastChapter": "class.chapter@tag.a@text", + "ruleBookName": "class.info@h1@text", + "ruleBookAuthor": "class.subtitle.1@text", + "ruleIntroduce": "class.content@text", + "ruleCoverUrl": "class.cover@tag.img.0@src", + "ruleChapterList": "id.detail-list-select@tag.a", + "ruleChapterName": "text", + "ruleContentUrl": "href" + }, + keyword: "火影" + }, + // 5. 风车漫画 + { + name: "风车漫画", + source: { + "bookSourceName": "风车漫画", + "bookSourceUrl": "https://m.qyy158.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android) Mobile", + "ruleSearchUrl": "https://m.qyy158.com/search/?searchkey=searchKey", + "ruleSearchList": "class.block-content@tag.li||class.cartoon-block-box@tag.li", + "ruleSearchName": "class.article-info@tag.a.0@text||class.cart-info@tag.p@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "tag.img@src", + "ruleSearchAuthor": "class.article-info@tag.a.1@text", + "ruleBookAuthor": "tag.p.2@text", + "ruleIntroduce": "class.article-desc@text", + "ruleChapterList": "class.chapter-list@tag.a", + "ruleChapterName": "text", + "ruleContentUrl": "href", + "ruleBookContent": "img.lazy-img@data-original" + }, + keyword: "斗罗" + }, + // 6. 波洞漫画 + { + name: "波洞漫画", + source: { + "bookSourceName": "波洞", + "bookSourceUrl": "http://ikmmh.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1", + "ruleSearchUrl": "http://ikmmh.com/search?searchkey=searchKey", + "ruleSearchList": "id.js_comicSortList@tag.li", + "ruleSearchName": "class.title@text", + "ruleSearchNoteUrl": "tag.a@href", + "ruleSearchCoverUrl": "img.img@src", + "ruleSearchLastChapter": "span.chapter@text", + "ruleBookName": "[property=\"og:title\"]@content", + "ruleBookAuthor": "[property=\"og:cartoon:author\"]@content", + "ruleIntroduce": "[property=\"og:description\"]@content", + "ruleCoverUrl": "meta[property=\"og:image\"]@content" + }, + keyword: "海贼王" + }, + // 7. 漫客栈 + { + name: "漫客栈", + source: { + "bookSourceName": "漫客栈-A", + "bookSourceUrl": "http://comic.mkzhan.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 12; Redmi K30 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Mobile Safari/537.36", + "ruleSearchUrl": "https://comic.mkzhan.com/search/keyword/?keyword=searchKey&page_num=1&page_size=20", + "ruleSearchList": "$.data.list.*", + "ruleSearchName": "$.title", + "ruleSearchNoteUrl": "https://comic.mkzhan.com/comic/info/?comic_id={$.comic_id}", + "ruleSearchCoverUrl": "$.cover", + "ruleSearchAuthor": "$.author_title", + "ruleSearchLastChapter": "$.chapter_title", + "ruleBookName": "$.data.title", + "ruleBookLastChapter": "$.data.chapter_title", + "ruleIntroduce": "$.data.content", + "ruleChapterList": "$.data.*", + "ruleChapterName": "$.title", + "ruleChapterUrl": "https://comic.mkzhan.com/chapter/?comic_id={$.data.comic_id}" + }, + keyword: "斗破" + }, + // 8. 知音漫客 + { + name: "知音漫客", + source: { + "bookSourceName": "知音漫客📱💡", + "bookSourceUrl": "https://m.zymk.cn", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", + "ruleSearchUrl": "https://m.zymk.cn/sort/all.html?key=searchKey", + "ruleSearchList": "class.comic-sort@tag.li", + "ruleSearchName": "tag.h3@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "tag.img@data-src", + "ruleSearchLastChapter": "tag.span.0@text", + "ruleBookName": "h1.name@text", + "ruleBookAuthor": "class.author@text", + "ruleIntroduce": "class.comic-detail@tag.p.0@text", + "ruleCoverUrl": ".cover-bg img@data-src", + "ruleBookKind": "class.tags-box@text" + }, + keyword: "斗罗" + }, + // 9. 包子漫画₁ + { + name: "包子漫画₁", + source: { + "bookSourceName": "包子漫画₁", + "bookSourceUrl": "https://cn.baozimh.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://cn.baozimh.com/search?q=searchKey", + "ruleSearchList": ".comics-card", + "ruleSearchName": ".comics-card__title@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "amp-img@src", + "ruleSearchAuthor": ".tags@text", + "ruleBookName": "h1.comics-detail__title@text", + "ruleBookAuthor": "h2.comics-detail__author@text", + "ruleIntroduce": "p.comics-detail__desc@text", + "ruleCoverUrl": ".pure-u-1-1 amp-img@src" + }, + keyword: "一拳超人" + }, + // 10. 漫画1234 + { + name: "漫画1234", + source: { + "bookSourceName": "漫画1234", + "bookSourceUrl": "https://www.hmh1234.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://www.hmh1234.com/search?keyword=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style", + "ruleBookName": ".info h1@text", + "ruleIntroduce": ".content@text" + }, + keyword: "海贼王" + }, + // 11. 来漫画 + { + name: "来漫画", + source: { + "bookSourceName": "来漫画", + "bookSourceUrl": "https://www.laimanhua8.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://www.laimanhua8.com/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "火影" + }, + // 12. 漫画屋 + { + name: "漫画屋", + source: { + "bookSourceName": "漫画屋", + "bookSourceUrl": "https://www.mhua5.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://www.mhua5.com/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "斗破" + }, + // 13. 漫百库 + { + name: "漫百库", + source: { + "bookSourceName": "漫百库", + "bookSourceUrl": "https://www.manhuabaiku.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://www.manhuabaiku.com/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "进击的巨人" + }, + // 14. 聚合漫画屋 + { + name: "聚合漫画屋", + source: { + "bookSourceName": "聚合漫画屋", + "bookSourceUrl": "https://www.52hah.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://www.52hah.com/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "海贼王" + }, + // 15. ACG漫画网 + { + name: "ACG漫画网", + source: { + "bookSourceName": "ACG漫画网", + "bookSourceUrl": "https://www.acgomh.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://www.acgomh.com/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "鬼灭之刃" + }, + // 16. 笔趣阁漫画 + { + name: "笔趣阁漫画", + source: { + "bookSourceName": "笔趣阁漫画", + "bookSourceUrl": "https://www.biqug.org", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://www.biqug.org/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "斗罗" + }, + // 17. 仙漫网 + { + name: "仙漫网", + source: { + "bookSourceName": "仙漫网", + "bookSourceUrl": "https://m.gaonaojin.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://m.gaonaojin.com/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "火影" + }, + // 18. 好漫8 + { + name: "好漫8", + source: { + "bookSourceName": "好漫8", + "bookSourceUrl": "http://www.haoman8.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "http://www.haoman8.com/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "海贼王" + }, + // 19. 拼拼漫画 + { + name: "拼拼漫画", + source: { + "bookSourceName": "拼拼漫画📱🍙", + "bookSourceUrl": "https://m.pinmh.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://m.pinmh.com/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "斗破" + }, + // 20. 亲亲漫画 + { + name: "亲亲漫画", + source: { + "bookSourceName": "亲亲漫画-M", + "bookSourceUrl": "https://m.acgqd.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://m.acgqd.com/search/?keywords=searchKey", + "ruleSearchList": ".mh-item", + "ruleSearchName": "h2.title@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": ".mh-cover@style" + }, + keyword: "火影" + } +]; + +async function testSource(item: { name: string; source: any; keyword: string }, index: number) { + const startTime = Date.now(); + console.log(`\n[${index + 1}/20] 📚 ${item.name}`); + console.log(` 🔗 ${item.source.bookSourceUrl}`); + + // 检测源格式 + const isYiciyuan = isYiciyuanSource(item.source); + if (!isYiciyuan) { + console.log(` ⚠️ 非异次元格式,跳过`); + return { name: item.name, success: false, reason: '非异次元格式', time: 0 }; + } + + const debugger_ = new YiciyuanDebugger(item.source); + + try { + // 搜索测试 + const searchResult = await debugger_.debugSearch(item.keyword); + const elapsed = Date.now() - startTime; + + if (!searchResult.success) { + console.log(` ❌ 搜索失败: ${searchResult.error?.substring(0, 50) || '未知错误'}`); + return { name: item.name, success: false, reason: searchResult.error?.substring(0, 30) || '搜索失败', time: elapsed }; + } + + const bookCount = searchResult.parsedItems?.length || 0; + if (bookCount === 0) { + console.log(` ⚠️ 搜索无结果 (${elapsed}ms)`); + return { name: item.name, success: false, reason: '无搜索结果', time: elapsed }; + } + + console.log(` ✅ 找到 ${bookCount} 本漫画 (${elapsed}ms)`); + + // 显示前2个结果 + searchResult.parsedItems!.slice(0, 2).forEach((book: any, i: number) => { + console.log(` [${i + 1}] ${book.name || '(无名称)'}`); + }); + + return { name: item.name, success: true, bookCount, time: elapsed }; + } catch (error: any) { + const elapsed = Date.now() - startTime; + console.log(` ❌ 异常: ${error.message?.substring(0, 50) || '未知错误'}`); + return { name: item.name, success: false, reason: error.message?.substring(0, 30) || '异常', time: elapsed }; + } +} + +async function main() { + console.log('╔══════════════════════════════════════════════════════════════╗'); + console.log('║ 异次元图源批量测试 (20个图源) ║'); + console.log('║ 测试时间: ' + new Date().toLocaleString() + ' ║'); + console.log('╚══════════════════════════════════════════════════════════════╝'); + + const results: any[] = []; + let successCount = 0; + let failCount = 0; + + for (let i = 0; i < testSources.length; i++) { + const result = await testSource(testSources[i], i); + results.push(result); + if (result.success) successCount++; + else failCount++; + } + + // 汇总结果 + console.log('\n'); + console.log('╔══════════════════════════════════════════════════════════════╗'); + console.log('║ 测试结果汇总 ║'); + console.log('╠══════════════════════════════════════════════════════════════╣'); + + // 成功的图源 + console.log('║ ✅ 成功的图源: ║'); + for (const r of results.filter(r => r.success)) { + const info = `${r.name} (${r.bookCount}本, ${r.time}ms)`; + console.log(`║ ${info.padEnd(54)} ║`); + } + + console.log('╠══════════════════════════════════════════════════════════════╣'); + console.log('║ ❌ 失败的图源: ║'); + for (const r of results.filter(r => !r.success)) { + const info = `${r.name}: ${r.reason || '未知'}`; + console.log(`║ ${info.padEnd(54)} ║`); + } + + console.log('╠══════════════════════════════════════════════════════════════╣'); + console.log(`║ 📊 总计: ${successCount} 成功 / ${failCount} 失败 / ${results.length} 总数 ║`); + console.log(`║ 📈 成功率: ${((successCount / results.length) * 100).toFixed(1)}% ║`); + console.log('╚══════════════════════════════════════════════════════════════╝'); +} + +main().catch(console.error); diff --git a/test-9comic-detail.ts b/test-9comic-detail.ts new file mode 100644 index 0000000..848f7ee --- /dev/null +++ b/test-9comic-detail.ts @@ -0,0 +1,59 @@ +/** + * 测试好看漫画详情页解析 + */ +import { httpRequest } from './src/main/debug/http-client'; +import { parseRule, ParseContext } from './src/main/debug/rule-parser'; + +async function test() { + const url = 'https://www.9comic.cn/comic22/book/show?id=103&imei=aanid10d'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + console.log('响应长度:', body.length); + console.log('响应预览:', body.substring(0, 500)); + + // 测试 init 规则 + const initRule = '$.data'; + const ctx: ParseContext = { + body, + baseUrl: url, + variables: {} + }; + + console.log('\n=== 测试 init 规则 ==='); + const initResult = parseRule(ctx, initRule); + console.log('init 结果:', initResult.success ? '成功' : '失败'); + if (initResult.data) { + const initData = initResult.data; + console.log('init 数据类型:', typeof initData); + if (typeof initData === 'object') { + console.log('init 数据 keys:', Object.keys(initData)); + console.log('init 数据 id:', (initData as any).id); + } + } + + // 测试 tocUrl 规则 + console.log('\n=== 测试 tocUrl 规则 ==='); + const tocUrlRule = 'https://www.9comic.cn/comic22/book/listChapter?imei=aanid10d10df686793008&id={{$.id}}&p=1&n=10000'; + + // 使用 init 结果作为 body + if (initResult.data) { + const ctx2: ParseContext = { + body: typeof initResult.data === 'string' ? initResult.data : JSON.stringify(initResult.data), + baseUrl: url, + variables: { + _jsResult: initResult.data + } + }; + + const tocUrlResult = parseRule(ctx2, tocUrlRule); + console.log('tocUrl 结果:', tocUrlResult); + } +} + +test().catch(console.error); diff --git a/test-9comic-toc.ts b/test-9comic-toc.ts new file mode 100644 index 0000000..404071c --- /dev/null +++ b/test-9comic-toc.ts @@ -0,0 +1,46 @@ +/** + * 测试好看漫画目录解析 + */ +import { httpRequest } from './src/main/debug/http-client'; +import { parseList, parseFromElement, ParseContext } from './src/main/debug/rule-parser'; + +async function test() { + // 先获取详情 + const detailUrl = 'https://www.9comic.cn/comic22/book/show?id=102&imei=aanid10d10df686793008'; + console.log('请求详情:', detailUrl); + + const detailResult = await httpRequest({ url: detailUrl }); + if (!detailResult.success) { + console.log('详情请求失败:', detailResult.error); + return; + } + + console.log('详情响应长度:', detailResult.body?.length); + + // 解析 JSON + const json = JSON.parse(detailResult.body || '{}'); + console.log('data 数组长度:', json.data?.length); + + if (json.data?.length > 0) { + console.log('第一章:', JSON.stringify(json.data[0])); + } + + // 测试 parseList + const ctx: ParseContext = { + body: detailResult.body || '', + baseUrl: 'https://www.9comic.cn', + variables: {} + }; + + const chapters = parseList(ctx, '$.data[*]'); + console.log('\nparseList 结果:', chapters.length, '章'); + + if (chapters.length > 0) { + const first: any = chapters[0]; + console.log('第一章对象:', JSON.stringify(first).substring(0, 200)); + console.log('第一章 id:', first.id); + console.log('第一章 name:', first.name); + } +} + +test().catch(console.error); diff --git a/test-9comic.ts b/test-9comic.ts new file mode 100644 index 0000000..b257039 --- /dev/null +++ b/test-9comic.ts @@ -0,0 +1,60 @@ +/** + * 测试好看漫画解析 + */ +import { httpRequest } from './src/main/debug/http-client'; +import { parseList, parseFromElement, ParseContext } from './src/main/debug/rule-parser'; + +async function test() { + const url = 'https://www.9comic.cn/comic22/so/comic?keyword=一人之下&p=&ver=2.0'; + + console.log('请求:', url); + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + console.log('响应状态:', result.statusCode); + console.log('响应长度:', result.body?.length); + + // 解析 JSON + try { + const json = JSON.parse(result.body || ''); + console.log('\nJSON 结构:'); + console.log(' code:', json.code); + console.log(' data.type:', json.data?.type); + console.log(' data.list 长度:', json.data?.list?.length); + + if (json.data?.list?.length > 0) { + console.log(' 第一项:', JSON.stringify(json.data.list[0]).substring(0, 200)); + } + } catch (e) { + console.log('JSON 解析失败'); + } + + // 测试 parseList + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://www.9comic.cn', + variables: {} + }; + + const rules = [ + '$..list[*]', + '$.data.list[*]', + '$..list[*]||$.data[*]', + ]; + + console.log('\n=== parseList 测试 ==='); + for (const rule of rules) { + const items = parseList(ctx, rule); + console.log(`规则 "${rule}": ${items.length} 个元素`); + if (items.length > 0) { + const first: any = items[0]; + console.log(` 第一项 title: ${first.title}`); + } + } +} + +test().catch(console.error); diff --git a/test-actual-parselist.ts b/test-actual-parselist.ts new file mode 100644 index 0000000..5d6a062 --- /dev/null +++ b/test-actual-parselist.ts @@ -0,0 +1,45 @@ +/** + * 直接测试实际的 parseList 函数 + */ +import { parseList, ParseContext } from './src/main/debug/rule-parser'; +import { httpRequest } from './src/main/debug/http-client'; + +async function test() { + const result = await httpRequest({ + url: 'https://m.ac.qq.com/search/result?word=斗破苍穹', + headers: { + 'User-Agent': 'Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0' + } + }); + + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://m.ac.qq.com', + variables: {} + }; + + console.log('body 长度:', ctx.body.length); + console.log('body 包含 comic-item:', ctx.body.includes('comic-item')); + console.log('body 包含 class="comic-item":', ctx.body.includes('class="comic-item"')); + + // 测试各种规则 + const rules = [ + 'class.comic-item', + '.comic-item', + 'div.comic-item', + ]; + + for (const rule of rules) { + console.log(`\n规则 "${rule}":`); + const elements = parseList(ctx, rule); + console.log(` 结果数量: ${elements.length}`); + if (elements.length > 0) { + console.log(` 第一个元素类型: ${typeof elements[0]}`); + if (typeof elements[0] === 'object' && elements[0].html) { + console.log(` 第一个元素 HTML 长度: ${elements[0].html()?.length}`); + } + } + } +} + +test().catch(console.error); diff --git a/test-actual-parselist2.ts b/test-actual-parselist2.ts new file mode 100644 index 0000000..c59ebcc --- /dev/null +++ b/test-actual-parselist2.ts @@ -0,0 +1,53 @@ +/** + * 直接调用实际的 parseList 并添加调试 + */ +import * as cheerio from 'cheerio'; +import { parseList, ParseContext } from './src/main/debug/rule-parser'; + +const html = ` + +`; + +// 直接测试 cheerio +const $ = cheerio.load(html); +console.log('=== 直接 Cheerio 测试 ==='); +console.log('$("ul.book-list"):', $('ul.book-list').length); +console.log('$("ul.book-list").find("li"):', $('ul.book-list').find('li').length); +console.log('$.root().find("ul.book-list"):', $.root().find('ul.book-list').length); + +// 测试 parseList +const ctx: ParseContext = { + body: html, + baseUrl: 'https://example.com', + variables: {} +}; + +console.log('\n=== parseList 测试 ==='); + +// 测试不同的规则格式 +const rules = [ + 'ul.book-list', // 只有第一部分 + 'tag.li', // 只有 tag.li + 'ul.book-list@tag.li', // 完整规则 + '.book-list@tag.li', // 使用 .class 格式 + 'class.book-list@tag.li', // 使用 class. 格式 + 'ul li', // 纯 CSS +]; + +for (const rule of rules) { + const items = parseList(ctx, rule); + console.log(`规则 "${rule}": ${items.length} 个元素`); +} + +// 检查 body 是否正确 +console.log('\n=== ctx.body 检查 ==='); +console.log('body 长度:', ctx.body.length); +console.log('body 包含 ul.book-list:', ctx.body.includes('ul')); +console.log('body 包含 book-list:', ctx.body.includes('book-list')); diff --git a/test-aes.ts b/test-aes.ts new file mode 100644 index 0000000..4e6f22b --- /dev/null +++ b/test-aes.ts @@ -0,0 +1,28 @@ +/** + * 测试 AES 解密 + */ +import * as crypto from 'crypto'; + +const encryptedData = 'c/f4Fd66w+9jIZ3U1lba/j7dmWGDZVgsfdKDK2klm2e2fQn7NH0Zud5KZITBZq8kMLlY5YI2PyHs89bYfh7sLN8U/6eyRl5bE8LawDsu4byx+DQvBfv6e1WVNtKxWyH823aDNa4Ab2YahHjyrk/3UYgpYc/UYT+G1OMrogT+fnwd+biZ+iyWsoD+pif8YvGpFk/zkseAeFETYPjYp/7UAgc+RtXj1ujwYIhGIP7j5VaKKei+mY/UNtITQBxYyK3uzDMtdx2/bM/zXxw4+ArbRXO5DRHZm124QH1r5BwmDClPoiQHttvqKRrgBRLMF6rqbkQIHTJB7jlYON+EN6NWHVICeWOJG2upFaQiqMROpEFWViA8uvj9R55ZE3mzSezFXHOLvW9QvYWhvl6G8Rh+in80M+wdVThOIEc/cbgspCxRmGxExpzh6x5H/Z2wk5eYhj3o028m6qvI/Z6ptZEXDC6PiUeCgu/4w0o'; + +const key = '4548ded8c9e02690'; +const iv = '1992360ee9bc4f8f'; + +try { + const keyBuffer = Buffer.from(key, 'utf8'); + const ivBuffer = Buffer.from(iv, 'utf8'); + const inputBuffer = Buffer.from(encryptedData, 'base64'); + + console.log('Key length:', keyBuffer.length); + console.log('IV length:', ivBuffer.length); + console.log('Input length:', inputBuffer.length); + + const decipher = crypto.createDecipheriv('aes-128-cbc', keyBuffer, ivBuffer); + const decrypted = Buffer.concat([decipher.update(inputBuffer), decipher.final()]); + + console.log('\n解密成功!'); + console.log('解密后长度:', decrypted.length); + console.log('解密后预览:', decrypted.toString('utf8').substring(0, 500)); +} catch (e: any) { + console.log('解密失败:', e.message); +} diff --git a/test-all-legado-sources.ts b/test-all-legado-sources.ts new file mode 100644 index 0000000..bd0ffcc --- /dev/null +++ b/test-all-legado-sources.ts @@ -0,0 +1,257 @@ +/** + * 测试全部 Legado 书源完整流程 + * 搜索 -> 详情 -> 目录 -> 正文 + */ +import * as fs from 'fs'; +import { SourceDebugger } from './src/main/debug/source-debugger'; + +// 读取书源文件 +const sourcesJson = fs.readFileSync('shareBookSource(1).json', 'utf8'); +const allSources = JSON.parse(sourcesJson); + +interface TestResult { + index: number; + name: string; + url: string; + search: boolean; + searchError?: string; + searchCount?: number; + detail: boolean; + detailError?: string; + toc: boolean; + tocError?: string; + tocCount?: number; + content: boolean; + contentError?: string; + contentCount?: number; + elapsed?: number; +} + +async function testSource(source: any, index: number): Promise { + const startTime = Date.now(); + const result: TestResult = { + index, + name: source.bookSourceName, + url: source.bookSourceUrl, + search: false, + detail: false, + toc: false, + content: false, + }; + + const debugger_ = new SourceDebugger(source); + // 根据书源选择合适的关键词 + const keywords: Record = { + '好看漫画': '一人之下', + '快看漫画': '一人之下', + '知音漫客': '斗罗', + '名著阅读(优)': '封神', + }; + const keyword = keywords[source.bookSourceName] || '斗破苍穹'; + + try { + // 1. 搜索测试 + const searchResult = await debugger_.debugSearch(keyword); + + if (!searchResult.success) { + result.searchError = (searchResult.error || '搜索失败').substring(0, 30); + result.elapsed = Date.now() - startTime; + return result; + } + + const books = searchResult.parsedItems || []; + if (books.length === 0) { + result.searchError = '无搜索结果'; + result.elapsed = Date.now() - startTime; + return result; + } + + result.search = true; + result.searchCount = books.length; + + // 获取第一本书的URL + const firstBook: any = books[0]; + const bookUrl = firstBook.bookUrl || firstBook.noteUrl; + if (!bookUrl) { + result.detailError = '无书籍URL'; + result.elapsed = Date.now() - startTime; + return result; + } + + // 2. 详情测试 + const detailResult = await debugger_.debugBookInfo(bookUrl); + + if (!detailResult.success) { + result.detailError = (detailResult.error || '详情失败').substring(0, 30); + result.elapsed = Date.now() - startTime; + return result; + } + + result.detail = true; + const bookInfo: any = detailResult.parsedItems; + + // 获取目录URL + const tocUrl = bookInfo?.tocUrl || bookUrl; + + // 3. 目录测试 + const tocResult = await debugger_.debugToc(tocUrl); + + if (!tocResult.success) { + result.tocError = (tocResult.error || '目录失败').substring(0, 30); + result.elapsed = Date.now() - startTime; + return result; + } + + const chapters = tocResult.parsedItems || []; + if (chapters.length === 0) { + result.tocError = '无章节'; + result.elapsed = Date.now() - startTime; + return result; + } + + result.toc = true; + result.tocCount = chapters.length; + + // 获取第一章URL + const firstChapter: any = chapters[0]; + const chapterUrl = firstChapter.url || firstChapter.chapterUrl; + if (!chapterUrl) { + result.contentError = '无章节URL'; + result.elapsed = Date.now() - startTime; + return result; + } + + // 4. 正文测试 + const contentResult = await debugger_.debugContent(chapterUrl); + + if (!contentResult.success) { + result.contentError = (contentResult.error || '正文失败').substring(0, 30); + result.elapsed = Date.now() - startTime; + return result; + } + + const content = contentResult.parsedItems; + const images = Array.isArray(content) ? content : (content ? [content] : []); + + if (images.length === 0) { + result.contentError = '无图片'; + result.elapsed = Date.now() - startTime; + return result; + } + + result.content = true; + result.contentCount = images.length; + + } catch (error: any) { + if (!result.search) result.searchError = error.message?.substring(0, 30); + else if (!result.detail) result.detailError = error.message?.substring(0, 30); + else if (!result.toc) result.tocError = error.message?.substring(0, 30); + else result.contentError = error.message?.substring(0, 30); + } + + result.elapsed = Date.now() - startTime; + return result; +} + +function getStatus(r: TestResult): string { + if (r.search && r.detail && r.toc && r.content) return '🎉完美'; + if (r.search && r.detail && r.toc) return '⚠️正文'; + if (r.search && r.detail) return '⚠️目录'; + if (r.search) return '⚠️详情'; + return '❌搜索'; +} + +function getFailReason(r: TestResult): string { + if (!r.search) return r.searchError || '搜索失败'; + if (!r.detail) return r.detailError || '详情失败'; + if (!r.toc) return r.tocError || '目录失败'; + if (!r.content) return r.contentError || '正文失败'; + return ''; +} + +async function main() { + console.log('╔══════════════════════════════════════════════════════════════════════╗'); + console.log('║ Legado 书源完整流程测试 (全部 ' + allSources.length + ' 个) ║'); + console.log('║ 搜索 → 详情 → 目录 → 正文 ║'); + console.log('║ ' + new Date().toLocaleString() + ' ║'); + console.log('╚══════════════════════════════════════════════════════════════════════╝\n'); + + const results: TestResult[] = []; + + for (let i = 0; i < allSources.length; i++) { + const source = allSources[i]; + const name = source.bookSourceName.substring(0, 14).padEnd(14); + process.stdout.write(`[${String(i + 1).padStart(2)}/${allSources.length}] ${name} `); + + try { + const result = await testSource(source, i + 1); + results.push(result); + + const s = result.search ? '✅' : '❌'; + const d = result.detail ? '✅' : '❌'; + const t = result.toc ? '✅' : '❌'; + const c = result.content ? '✅' : '❌'; + const status = getStatus(result); + const time = result.elapsed ? `${result.elapsed}ms` : ''; + + if (result.search && result.detail && result.toc && result.content) { + console.log(`${s}${d}${t}${c} ${status} (${time})`); + } else { + const reason = getFailReason(result); + console.log(`${s}${d}${t}${c} ${status} - ${reason}`); + } + } catch (error: any) { + console.log(`❌❌❌❌ 异常 - ${error.message?.substring(0, 30)}`); + results.push({ + index: i + 1, + name: source.bookSourceName, + url: source.bookSourceUrl, + search: false, + searchError: error.message?.substring(0, 30), + detail: false, + toc: false, + content: false, + }); + } + } + + // 统计 + const total = results.length; + const searchOk = results.filter(r => r.search).length; + const detailOk = results.filter(r => r.detail).length; + const tocOk = results.filter(r => r.toc).length; + const contentOk = results.filter(r => r.content).length; + const fullOk = results.filter(r => r.search && r.detail && r.toc && r.content).length; + + console.log('\n' + '═'.repeat(70)); + console.log(' 测 试 结 果 汇 总'); + console.log('═'.repeat(70)); + + console.log(`\n📊 统计:`); + console.log(` 搜索成功: ${searchOk}/${total} (${(searchOk/total*100).toFixed(1)}%)`); + console.log(` 详情成功: ${detailOk}/${total} (${(detailOk/total*100).toFixed(1)}%)`); + console.log(` 目录成功: ${tocOk}/${total} (${(tocOk/total*100).toFixed(1)}%)`); + console.log(` 正文成功: ${contentOk}/${total} (${(contentOk/total*100).toFixed(1)}%)`); + console.log(` 完整通过: ${fullOk}/${total} (${(fullOk/total*100).toFixed(1)}%)`); + + // 成功的书源 + console.log('\n✅ 完整通过的书源:'); + results.filter(r => r.search && r.detail && r.toc && r.content).forEach(r => { + console.log(` [${r.index}] ${r.name} - ${r.tocCount}章 ${r.contentCount}图`); + }); + + // 失败的书源 + console.log('\n❌ 失败的书源:'); + results.filter(r => !(r.search && r.detail && r.toc && r.content)).forEach(r => { + const reason = getFailReason(r); + console.log(` [${r.index}] ${r.name} - ${getStatus(r)} ${reason}`); + }); + + console.log('\n' + '═'.repeat(70)); + + // 保存结果到文件 + fs.writeFileSync('test-results.json', JSON.stringify(results, null, 2)); + console.log('结果已保存到 test-results.json'); +} + +main().catch(console.error); diff --git a/test-all-results.json b/test-all-results.json new file mode 100644 index 0000000..a96b914 --- /dev/null +++ b/test-all-results.json @@ -0,0 +1,285 @@ +[ + { + "index": 1, + "name": "笔趣漫画", + "status": "pass", + "keyword": "斗破" + }, + { + "index": 2, + "name": "🥝猕猴桃漫画", + "status": "search", + "keyword": "斗破", + "error": "详情失败" + }, + { + "index": 3, + "name": "🎨禁漫天堂[国内]", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 4, + "name": "武芊漫画", + "status": "pass", + "keyword": "漫画" + }, + { + "index": 5, + "name": "名著阅读(优)", + "status": "pass", + "keyword": "三国" + }, + { + "index": 6, + "name": "🎨COLA漫画💓", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 7, + "name": "🎨Komiic漫画💓", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 8, + "name": "🎨MYCOMIC💓", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 9, + "name": "🎨包子漫画💞", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 10, + "name": "🎨看漫画💓", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 11, + "name": "🎨漫画台💓", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 12, + "name": "🎨G站漫画💞", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 13, + "name": "🎨笔趣阁💞", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 14, + "name": "🎨漫画屋💞", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 15, + "name": "🎨如漫画💓", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 16, + "name": "🎨新新漫画💞", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 17, + "name": "🎨皮皮漫画💞", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 18, + "name": "G社漫画/包子漫画", + "status": "detail", + "keyword": "斗破", + "error": "无章节" + }, + { + "index": 19, + "name": "🎨木马漫画💓", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 20, + "name": "🌠 漫画吧网", + "status": "pass", + "keyword": "斗破" + }, + { + "index": 21, + "name": "🌈绅士漫画", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 22, + "name": "🎨禁漫天堂💞", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 23, + "name": "好看漫画", + "status": "pass", + "keyword": "斗破" + }, + { + "index": 24, + "name": "全免漫画(优)", + "status": "detail", + "keyword": "斗破", + "error": "无章节" + }, + { + "index": 25, + "name": "彩绘漫画(优)", + "status": "detail", + "keyword": "三国", + "error": "无章节" + }, + { + "index": 26, + "name": "看漫画吧(优)", + "status": "pass", + "keyword": "三国" + }, + { + "index": 27, + "name": "知音漫客", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 28, + "name": "爱看漫画", + "status": "detail", + "keyword": "三国", + "error": "无章节" + }, + { + "index": 29, + "name": "酸奶漫画", + "status": "pass", + "keyword": "斗破" + }, + { + "index": 30, + "name": "星辰漫画", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 31, + "name": "全免漫画", + "status": "detail", + "keyword": "斗破", + "error": "无章节" + }, + { + "index": 32, + "name": "嘤嘤漫画(英文)", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 33, + "name": "爱看漫画", + "status": "detail", + "keyword": "三国", + "error": "无章节" + }, + { + "index": 34, + "name": "酸奶漫画", + "status": "pass", + "keyword": "斗破" + }, + { + "index": 35, + "name": "漫客栈子", + "status": "content", + "keyword": "漫画", + "error": "无内容" + }, + { + "index": 36, + "name": "爱看漫画", + "status": "pass", + "keyword": "三国" + }, + { + "index": 37, + "name": "知音漫客", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 38, + "name": "全免漫画", + "status": "detail", + "keyword": "斗破", + "error": "无章节" + }, + { + "index": 39, + "name": "快看漫画", + "status": "search", + "keyword": "斗破", + "error": "详情失败" + }, + { + "index": 40, + "name": "菠萝漫画", + "status": "fail", + "error": "无搜索结果" + }, + { + "index": 41, + "name": "快看漫画", + "status": "search", + "keyword": "斗破", + "error": "详情失败" + }, + { + "index": 42, + "name": "漫客栈吧", + "status": "pass", + "keyword": "漫画" + }, + { + "index": 43, + "name": "快看漫画", + "status": "search", + "keyword": "斗破", + "error": "详情失败" + }, + { + "index": 44, + "name": "漫客栈子", + "status": "content", + "keyword": "斗破", + "error": "无内容" + }, + { + "index": 45, + "name": "快看漫画", + "status": "fail", + "error": "无搜索结果" + } +] \ No newline at end of file diff --git a/test-baozi-chapter.ts b/test-baozi-chapter.ts new file mode 100644 index 0000000..1185a6c --- /dev/null +++ b/test-baozi-chapter.ts @@ -0,0 +1,63 @@ +/** + * 调试包子漫画章节 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; +import { parseList, ParseContext } from './src/main/debug/rule-parser'; + +async function test() { + const url = 'https://cn.bzmanga.com/comic/hzw-one-piece'; + const result = await httpRequest({ + url, + headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const $ = cheerio.load(result.body || ''); + + console.log('=== 页面结构 ==='); + console.log('.comics-chapters__item:', $('.comics-chapters__item').length); + console.log('.section-title:', $('.section-title').length); + + // 打印 section-title 内容 + $('.section-title').each((i, el) => { + console.log(` section-title[${i}]: ${$(el).text().trim()}`); + }); + + // 查找章节目录 + console.log('\n=== 章节目录 ==='); + const chapterItems = $('.comics-chapters__item'); + console.log('章节数量:', chapterItems.length); + + if (chapterItems.length > 0) { + console.log('\n前5个章节:'); + chapterItems.slice(0, 5).each((i, el) => { + console.log(` [${i + 1}] ${$(el).text().trim()} - ${$(el).attr('href')}`); + }); + } + + // 测试规则 + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://cn.bzmanga.com', + variables: {} + }; + + const rules = [ + '.comics-chapters__item', + 'class.comics-chapters__item', + 'a.comics-chapters__item', + ]; + + console.log('\n=== 规则测试 ==='); + for (const rule of rules) { + const elements = parseList(ctx, rule); + console.log(`规则 "${rule}": ${elements.length} 个元素`); + } +} + +test().catch(console.error); diff --git a/test-baozi-direct.ts b/test-baozi-direct.ts new file mode 100644 index 0000000..69e9ed3 --- /dev/null +++ b/test-baozi-direct.ts @@ -0,0 +1,43 @@ +/** + * 直接测试包子漫画请求 + */ +import https from 'https'; + +async function test() { + const url = 'https://cn.bzmanga.com/comic/hzw-one-piece'; + + return new Promise((resolve) => { + const req = https.get(url, { + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + }, + timeout: 30000, + }, (res) => { + console.log('状态码:', res.statusCode); + console.log('响应头:', res.headers); + + let data = ''; + res.on('data', chunk => data += chunk); + res.on('end', () => { + console.log('响应长度:', data.length); + console.log('响应预览:', data.substring(0, 500)); + resolve(null); + }); + }); + + req.on('error', (err) => { + console.log('请求错误:', err.message); + resolve(null); + }); + + req.on('timeout', () => { + console.log('请求超时'); + req.destroy(); + resolve(null); + }); + }); +} + +test(); diff --git a/test-batch-quick.ts b/test-batch-quick.ts new file mode 100644 index 0000000..5a529e5 --- /dev/null +++ b/test-batch-quick.ts @@ -0,0 +1,156 @@ +import * as fs from 'fs'; +import { SourceDebugger, DebugResult, ParsedBook, ParsedChapter } from './src/main/debug/source-debugger'; + +const sources = JSON.parse(fs.readFileSync('shareBookSource(1).json', 'utf8')); +const keywords = ['斗破', '妖神记', '一拳']; + +interface TestResult { + index: number; + name: string; + url: string; + search: 'pass' | 'fail' | 'network'; + detail: 'pass' | 'fail' | 'skip'; + toc: 'pass' | 'fail' | 'skip'; + content: 'pass' | 'fail' | 'skip'; + error?: string; +} + +async function testSource(index: number): Promise { + const source = sources[index]; + const result: TestResult = { + index, + name: source.bookSourceName, + url: source.bookSourceUrl, + search: 'fail', + detail: 'skip', + toc: 'skip', + content: 'skip', + }; + + const debugger_ = new SourceDebugger(source); + + // 尝试多个关键词 + for (const keyword of keywords) { + try { + const searchResult = await debugger_.debugSearch(keyword); + const books = searchResult.parsedItems as ParsedBook[]; + if (searchResult.success && books && books.length > 0) { + result.search = 'pass'; + + // 测试详情 + try { + const book = books[0]; + const detailResult = await debugger_.debugBookInfo(book.bookUrl || ''); + const detail = detailResult.parsedItems as ParsedBook[]; + if (detailResult.success && detail) { + result.detail = 'pass'; + + // 测试目录 + try { + const tocUrl = (detail as any).tocUrl || book.bookUrl || ''; + const tocResult = await debugger_.debugToc(tocUrl); + const chapters = tocResult.parsedItems as ParsedChapter[]; + if (tocResult.success && chapters && chapters.length > 0) { + result.toc = 'pass'; + + // 测试正文 + try { + const chapter = chapters[0]; + const contentResult = await debugger_.debugContent(chapter.url || ''); + const content = contentResult.parsedItems as string; + if (contentResult.success && content && content.length > 50) { + result.content = 'pass'; + } else if (contentResult.imageUrls && contentResult.imageUrls.length > 0) { + result.content = 'pass'; + } else { + result.content = 'fail'; + } + } catch (e: any) { + result.content = 'fail'; + } + } else { + result.toc = 'fail'; + } + } catch (e: any) { + result.toc = 'fail'; + } + } else { + result.detail = 'fail'; + } + } catch (e: any) { + result.detail = 'fail'; + } + break; // 搜索成功,跳出关键词循环 + } + } catch (e: any) { + if (e.message?.includes('ETIMEDOUT') || e.message?.includes('ECONNREFUSED') || + e.message?.includes('ENOTFOUND') || e.message?.includes('timeout')) { + result.search = 'network'; + result.error = 'network'; + } + } + } + + return result; +} + +async function main() { + console.log('开始批量测试...\n'); + + const results: TestResult[] = []; + const total = sources.length; + + for (let i = 0; i < total; i++) { + process.stdout.write(`\r测试进度: ${i + 1}/${total} - ${sources[i].bookSourceName.substring(0, 20)}...`); + + try { + const result = await Promise.race([ + testSource(i), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 60000)) + ]); + results.push(result); + } catch (e: any) { + results.push({ + index: i, + name: sources[i].bookSourceName, + url: sources[i].bookSourceUrl, + search: 'fail', + detail: 'skip', + toc: 'skip', + content: 'skip', + error: e.message?.substring(0, 50), + }); + // 保存中间结果 + require('fs').writeFileSync('batch-results.json', JSON.stringify(results, null, 2)); + } + } + + console.log('\n\n========== 测试结果汇总 ==========\n'); + + // 统计 + const passed = results.filter(r => r.content === 'pass').length; + const searchPassed = results.filter(r => r.search === 'pass').length; + const networkFailed = results.filter(r => r.search === 'network').length; + const failed = results.filter(r => r.search === 'fail').length; + + console.log(`✅ 完全通过: ${passed}/${total}`); + console.log(`🔍 搜索通过: ${searchPassed}/${total}`); + console.log(`🌐 网络问题: ${networkFailed}/${total}`); + console.log(`❌ 搜索失败: ${failed}/${total}`); + + console.log('\n--- 完全通过的书源 ---'); + results.filter(r => r.content === 'pass').forEach(r => { + console.log(` [${r.index}] ${r.name}`); + }); + + console.log('\n--- 搜索失败的书源 ---'); + results.filter(r => r.search === 'fail').forEach(r => { + console.log(` [${r.index}] ${r.name} ${r.error || ''}`); + }); + + // 保存结果 + fs.writeFileSync('batch-results.json', JSON.stringify(results, null, 2)); + console.log('\n结果已保存到 batch-results.json'); +} + +main().catch(console.error); diff --git a/test-batch-results.json b/test-batch-results.json new file mode 100644 index 0000000..ebae744 --- /dev/null +++ b/test-batch-results.json @@ -0,0 +1,261 @@ +[ + { + "index": 1, + "name": "笔趣漫画", + "status": "通过" + }, + { + "index": 2, + "name": "🥝猕猴桃漫画", + "status": "网络", + "error": "超时" + }, + { + "index": 3, + "name": "🎨禁漫天堂[国内]", + "status": "搜索", + "error": "无结果" + }, + { + "index": 4, + "name": "武芊漫画", + "status": "通过" + }, + { + "index": 5, + "name": "名著阅读(优)", + "status": "通过" + }, + { + "index": 6, + "name": "🎨COLA漫画💓", + "status": "搜索", + "error": "无结果" + }, + { + "index": 7, + "name": "🎨Komiic漫画💓", + "status": "搜索", + "error": "无结果" + }, + { + "index": 8, + "name": "🎨MYCOMIC💓", + "status": "搜索", + "error": "无结果" + }, + { + "index": 9, + "name": "🎨包子漫画💞", + "status": "搜索", + "error": "无结果" + }, + { + "index": 10, + "name": "🎨看漫画💓", + "status": "搜索", + "error": "无结果" + }, + { + "index": 11, + "name": "🎨漫画台💓", + "status": "搜索", + "error": "无结果" + }, + { + "index": 12, + "name": "🎨G站漫画💞", + "status": "搜索", + "error": "无结果" + }, + { + "index": 13, + "name": "🎨笔趣阁💞", + "status": "搜索", + "error": "无结果" + }, + { + "index": 14, + "name": "🎨漫画屋💞", + "status": "搜索", + "error": "无结果" + }, + { + "index": 15, + "name": "🎨如漫画💓", + "status": "网络", + "error": "超时" + }, + { + "index": 16, + "name": "🎨新新漫画💞", + "status": "网络", + "error": "超时" + }, + { + "index": 17, + "name": "🎨皮皮漫画💞", + "status": "搜索", + "error": "无结果" + }, + { + "index": 18, + "name": "G社漫画/包子漫画", + "status": "目录", + "error": "无章节" + }, + { + "index": 19, + "name": "🎨木马漫画💓", + "status": "搜索", + "error": "无结果" + }, + { + "index": 20, + "name": "🌠 漫画吧网", + "status": "通过" + }, + { + "index": 21, + "name": "🌈绅士漫画", + "status": "搜索", + "error": "无结果" + }, + { + "index": 22, + "name": "🎨禁漫天堂💞", + "status": "搜索", + "error": "无结果" + }, + { + "index": 23, + "name": "好看漫画", + "status": "通过" + }, + { + "index": 24, + "name": "全免漫画(优)", + "status": "目录", + "error": "无章节" + }, + { + "index": 25, + "name": "彩绘漫画(优)", + "status": "目录", + "error": "无章节" + }, + { + "index": 26, + "name": "看漫画吧(优)", + "status": "通过" + }, + { + "index": 27, + "name": "知音漫客", + "status": "搜索", + "error": "无结果" + }, + { + "index": 28, + "name": "爱看漫画", + "status": "目录", + "error": "无章节" + }, + { + "index": 29, + "name": "酸奶漫画", + "status": "通过" + }, + { + "index": 30, + "name": "星辰漫画", + "status": "搜索", + "error": "无结果" + }, + { + "index": 31, + "name": "全免漫画", + "status": "目录", + "error": "无章节" + }, + { + "index": 32, + "name": "嘤嘤漫画(英文)", + "status": "网络", + "error": "超时" + }, + { + "index": 33, + "name": "爱看漫画", + "status": "目录", + "error": "无章节" + }, + { + "index": 34, + "name": "酸奶漫画", + "status": "通过" + }, + { + "index": 35, + "name": "漫客栈子", + "status": "通过" + }, + { + "index": 36, + "name": "爱看漫画", + "status": "通过" + }, + { + "index": 37, + "name": "知音漫客", + "status": "搜索", + "error": "无结果" + }, + { + "index": 38, + "name": "全免漫画", + "status": "目录", + "error": "无章节" + }, + { + "index": 39, + "name": "快看漫画", + "status": "详情", + "error": "详情失败" + }, + { + "index": 40, + "name": "菠萝漫画", + "status": "搜索", + "error": "无结果" + }, + { + "index": 41, + "name": "快看漫画", + "status": "详情", + "error": "详情失败" + }, + { + "index": 42, + "name": "漫客栈吧", + "status": "通过" + }, + { + "index": 43, + "name": "快看漫画", + "status": "详情", + "error": "详情失败" + }, + { + "index": 44, + "name": "漫客栈子", + "status": "正文", + "error": "无内容" + }, + { + "index": 45, + "name": "快看漫画", + "status": "搜索", + "error": "无结果" + } +] \ No newline at end of file diff --git a/test-batch.ts b/test-batch.ts new file mode 100644 index 0000000..83a8459 --- /dev/null +++ b/test-batch.ts @@ -0,0 +1,134 @@ +/** + * 批量快速测试所有书源 + */ +import * as fs from 'fs'; +import { SourceDebugger } from './src/main/debug/source-debugger'; + +const sourcesJson = fs.readFileSync('shareBookSource(1).json', 'utf8'); +const allSources = JSON.parse(sourcesJson); + +// 每个书源的测试关键词 +const keywords: Record = { + 4: '封神', // 名著阅读 + 22: '一人之下', // 好看漫画 +}; + +interface Result { + index: number; + name: string; + search: boolean; + detail: boolean; + toc: boolean; + content: boolean; + error?: string; +} + +async function testSource(index: number): Promise { + const source = allSources[index]; + const keyword = keywords[index] || '斗破苍穹'; + const result: Result = { + index: index + 1, + name: source.bookSourceName, + search: false, + detail: false, + toc: false, + content: false, + }; + + const debugger_ = new SourceDebugger(source); + + try { + // 搜索 + const searchResult = await debugger_.debugSearch(keyword); + if (!searchResult.success || !searchResult.parsedItems?.length) { + result.error = searchResult.error || '无搜索结果'; + return result; + } + result.search = true; + + const firstBook: any = searchResult.parsedItems[0]; + if (!firstBook.bookUrl) { + result.error = '无书籍URL'; + return result; + } + + // 详情 + const detailResult = await debugger_.debugBookInfo(firstBook.bookUrl); + if (!detailResult.success) { + result.error = detailResult.error || '详情失败'; + return result; + } + result.detail = true; + + const bookInfo: any = detailResult.parsedItems; + const tocUrl = bookInfo?.tocUrl || firstBook.bookUrl; + + // 目录 + const tocResult = await debugger_.debugToc(tocUrl); + if (!tocResult.success || !tocResult.parsedItems?.length) { + result.error = tocResult.error || '无章节'; + return result; + } + result.toc = true; + + const firstChapter: any = tocResult.parsedItems[0]; + if (!firstChapter.url) { + result.error = '无章节URL'; + return result; + } + + // 正文 + const contentResult = await debugger_.debugContent(firstChapter.url); + const content = contentResult.parsedItems; + const images = Array.isArray(content) ? content : (content ? [content] : []); + + if (!contentResult.success || images.length === 0) { + result.error = contentResult.error || '无图片'; + return result; + } + result.content = true; + + } catch (e: any) { + result.error = e.message?.substring(0, 50); + } + + return result; +} + +async function main() { + console.log('开始批量测试...\n'); + + const results: Result[] = []; + + for (let i = 0; i < allSources.length; i++) { + const name = allSources[i].bookSourceName.substring(0, 16).padEnd(16); + process.stdout.write(`[${String(i + 1).padStart(2)}] ${name} `); + + const result = await testSource(i); + results.push(result); + + const s = result.search ? '✅' : '❌'; + const d = result.detail ? '✅' : '❌'; + const t = result.toc ? '✅' : '❌'; + const c = result.content ? '✅' : '❌'; + + if (result.content) { + console.log(`${s}${d}${t}${c} 🎉`); + } else { + console.log(`${s}${d}${t}${c} ${result.error || ''}`); + } + } + + // 统计 + const success = results.filter(r => r.content).length; + const searchOk = results.filter(r => r.search).length; + + console.log('\n' + '═'.repeat(60)); + console.log(`搜索成功: ${searchOk}/${results.length}`); + console.log(`完整通过: ${success}/${results.length} (${(success/results.length*100).toFixed(1)}%)`); + + // 保存结果 + fs.writeFileSync('batch-results.json', JSON.stringify(results, null, 2)); +} + +main().catch(console.error); diff --git a/test-convert-request.ts b/test-convert-request.ts new file mode 100644 index 0000000..2942e9c --- /dev/null +++ b/test-convert-request.ts @@ -0,0 +1,221 @@ +/** + * 武芊漫画全流程测试 + * 测试转化后:搜索、详情、目录、正文 + */ + +import { convertSource } from './src/renderer/utils/sourceConverter'; +import { BookSource, BookSourceType, SourceFormat, detectSourceFormat } from './src/renderer/types'; +import { SourceDebugger } from './src/main/debug/source-debugger'; +import { YiciyuanDebugger, isYiciyuanSource } from './src/main/debug/yiciyuan-debugger'; + +// 武芊漫画书源 +const wuqianSource: BookSource = { + bookSourceComment: "\n[✅已验证]", + bookSourceGroup: "源仓库,漫画 书源", + bookSourceName: "武芊漫画", + bookSourceType: BookSourceType.Image, + bookSourceUrl: "https://comic.mkzcdn.com", + customOrder: 100, + enabled: true, + enabledExplore: true, + exploreUrl: "@js:\nlet url = 'https://comic.mkzcdn.com/search/filter/?audience=0&order=sort&page_num={{page}}&page_size=18&theme_id=class'\nlet class_name=\"全部&修真&霸总&恋爱&校园&冒险&搞笑&生活&热血&架空&后宫&玄幻&悬疑&恐怖&灵异&动作&科幻&战争&古风&穿越&竞技&励志&同人&真人\".split(\"&\");\nlet class_url=\"0&2&1&3&4&5&6&7&8&9&10&12&13&14&15&16&17&18&19&20&21&23&24&26\".split(\"&\")\n\nlet sort_name='推荐&最热&最新'.split(\"&\")\nlet sort_url='3&1&2'.split(\"&\")\nlet model = (title,url,num)=>{\n return {title:title,url:url,style:{layout_flexGroup:1,layout_flexBasisPercent:num}}\n}\n\ntop=[{\"title\":\"热门人气\",\"url\":\"https://comic.mkzcdn.com/search/filter/?order=1&page_num={{page}}&page_size=12\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"更新时间\",\"url\":\"https://comic.mkzcdn.com/search/filter/?order=2&page_num={{page}}&page_size=12\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}}]\n\n\n\nlet list = []\nlist=list.concat(top)\n\nfor (let i = 0; i < sort_name.length; i++) {\n list.push(model(sort_name[i],\"\",1))\n for (let j = 0; j < class_name.length; j++) {\n let t = url.replace(\"sort\",`${sort_url[i]}`).replace(\"class\",`${class_url[j]}`)\n list.push(model(class_name[j],t,0.15))\n }\n}\nJSON.stringify(list)", + header: "", + lastUpdateTime: Date.now(), + respondTime: 0, + weight: 0, + searchUrl: "https://comic.mkzcdn.com/search/keyword/?keyword={{key}}&page_num={{page}}&page_size=20", + ruleSearch: { + author: "$.author_title", + bookList: "$..list[*]", + bookUrl: "https://comic.mkzcdn.com/comic/info/?comic_id={{$.comic_id}}", + coverUrl: "$.cover", + intro: "$.feature", + lastChapter: "$.chapter_title", + name: "$.title" + }, + ruleBookInfo: { + init: "", + intro: "$..content##^##
    ", + kind: "$..theme_id\n@js:\nlet class_name=\"全部&修真&霸总&恋爱&校园&冒险&搞笑&生活&热血&架空&后宫&玄幻&悬疑&恐怖&灵异&动作&科幻&战争&古风&穿越&竞技&励志&同人&真人\".split(\"&\");\nlet class_url=\"0&2&1&3&4&5&6&7&8&9&10&12&13&14&15&16&17&18&19&20&21&23&24&26\".split(\"&\")\n\nlet res=Array.from(result)[0].split(\",\")\n\nfor(var i=0;inew Date()?\"❗️未发布\":\"\")" + }, + ruleContent: { + content: "$.data[*].image\n@js:\nresult.split(\"\\n\").map(x=>'').join(\"\\n\")" + } +}; + +/** + * 使用项目调试器测试书源 + */ +async function testWithDebugger(source: any, label: string): Promise<{ success: boolean; count: number; logs: string[] }> { + const isYiciyuan = isYiciyuanSource(source); + const formatLabel = isYiciyuan ? '异次元' : 'Legado'; + + console.log(`\n=== ${label} (${formatLabel}调试器) ===\n`); + + let result: any; + + if (isYiciyuan) { + const debugger_ = new YiciyuanDebugger(source); + result = await debugger_.debugSearch('我的'); + } else { + const debugger_ = new SourceDebugger(source); + result = await debugger_.debugSearch('我的'); + } + + // 输出日志 + const logs: string[] = []; + if (result.logs) { + result.logs.forEach((log: any) => { + const msg = `[${log.type}] ${log.message}`; + logs.push(msg); + console.log(msg); + }); + } + + const count = result.parsedItems?.length || 0; + console.log(`\n结果: ${result.success ? '✅' : '❌'} 解析到 ${count} 条数据`); + + return { success: result.success && count > 0, count, logs }; +} + +/** + * 执行 N 次转换 + */ +function convertNTimes(source: any, times: number): any { + let current = source; + for (let i = 0; i < times; i++) { + const result = convertSource(current); + if (result.success) { + current = result.result; + } else { + console.log(`转换失败: ${result.error}`); + return current; + } + } + return current; +} + +async function runTests() { + console.log('========================================'); + console.log('武芊漫画全流程测试'); + console.log('========================================'); + + // 1. 转换书源 + console.log('\n=== 1. 转换书源 ==='); + const convertResult = convertSource(wuqianSource); + if (!convertResult.success) { + console.log('❌ 转换失败:', convertResult.error); + return; + } + const yiciyuanSource = convertResult.result; + console.log('✅ 转换成功'); + console.log('格式:', isYiciyuanSource(yiciyuanSource) ? '异次元' : 'Legado'); + console.log('ruleSearchUrl:', yiciyuanSource.ruleSearchUrl); + console.log('ruleSearchList:', yiciyuanSource.ruleSearchList); + + // 2. 测试搜索 + console.log('\n=== 2. 测试搜索 ==='); + + // 先直接请求看看响应 + const { httpRequest } = require('./src/main/debug/http-client'); + const testUrl = 'https://comic.mkzcdn.com/search/keyword/?keyword=漫画&page_num=1&page_size=20'; + const testResult = await httpRequest({ url: testUrl }); + console.log('直接请求响应长度:', testResult.body?.length); + console.log('响应内容预览:', testResult.body?.substring(0, 500)); + + // 测试 JSON 解析 + const { parseList } = require('./src/main/debug/rule-parser'); + const testBody = testResult.body; + const testCtx = { body: testBody, baseUrl: 'https://comic.mkzcdn.com', variables: {} }; + const testElements = parseList(testCtx, '$..list[*]'); + console.log('\nparseList 测试结果:', testElements?.length || 0); + if (testElements && testElements.length > 0) { + console.log('第一个元素:', JSON.stringify(testElements[0]).substring(0, 200)); + } + + const yiciyuanDebugger = new YiciyuanDebugger(yiciyuanSource); + const searchResult: any = await yiciyuanDebugger.debugSearch('漫画'); + + console.log('\n搜索结果:', searchResult.success ? '✅' : '❌'); + console.log('解析数量:', searchResult.parsedItems?.length || 0); + + // 打印搜索日志 + console.log('\n--- 搜索日志 ---'); + searchResult.logs?.slice(0, 8).forEach((log: any) => { + console.log(`[${log.type}] ${log.message}`); + }); + + if (searchResult.parsedItems && searchResult.parsedItems.length > 0) { + const firstBook = searchResult.parsedItems[0]; + console.log('\n第一本书:', firstBook.name); + console.log('书籍URL:', firstBook.bookUrl); + + // 3. 测试详情 + if (firstBook.bookUrl) { + console.log('\n=== 3. 测试详情 ==='); + + const bookInfoResult: any = await yiciyuanDebugger.debugBookInfo(firstBook.bookUrl); + console.log('详情结果:', bookInfoResult.success ? '✅' : '❌'); + if (bookInfoResult.parsedItems?.[0]) { + console.log('书名:', bookInfoResult.parsedItems[0].name); + console.log('简介:', bookInfoResult.parsedItems[0].intro?.substring(0, 50) + '...'); + } + + // 打印详情日志 + bookInfoResult.logs?.slice(0, 5).forEach((log: any) => { + console.log(`[${log.type}] ${log.message}`); + }); + + // 4. 测试目录 + console.log('\n=== 4. 测试目录 ==='); + const tocResult: any = await yiciyuanDebugger.debugToc(firstBook.bookUrl); + console.log('目录结果:', tocResult.success ? '✅' : '❌'); + console.log('章节数量:', tocResult.parsedItems?.length || 0); + + // 打印目录日志 + tocResult.logs?.slice(0, 5).forEach((log: any) => { + console.log(`[${log.type}] ${log.message}`); + }); + + if (tocResult.parsedItems && tocResult.parsedItems.length > 0) { + const firstChapter = tocResult.parsedItems[0]; + console.log('\n第一章:', firstChapter.name || firstChapter.title); + console.log('章节URL:', firstChapter.url || firstChapter.chapterUrl); + + // 5. 测试正文 + const chapterUrl = firstChapter.url || firstChapter.chapterUrl; + if (chapterUrl) { + console.log('\n=== 5. 测试正文 ==='); + const contentResult: any = await yiciyuanDebugger.debugContent(chapterUrl); + console.log('正文结果:', contentResult.success ? '✅' : '❌'); + + // 打印正文日志 + contentResult.logs?.slice(0, 5).forEach((log: any) => { + console.log(`[${log.type}] ${log.message}`); + }); + + if (contentResult.imageUrls && contentResult.imageUrls.length > 0) { + console.log('图片数量:', contentResult.imageUrls.length); + console.log('第一张图片:', contentResult.imageUrls[0]?.substring(0, 80) + '...'); + } + } + } + } + } + + // 汇总 + console.log('\n========================================'); + console.log('测试汇总'); + console.log('========================================'); + console.log('搜索:', searchResult.success && (searchResult.parsedItems?.length || 0) > 0 ? '✅' : '❌'); +} + +runTests(); diff --git a/test-convert-rhino.ts b/test-convert-rhino.ts new file mode 100644 index 0000000..caacf85 --- /dev/null +++ b/test-convert-rhino.ts @@ -0,0 +1,46 @@ +/** + * 测试 convertRhinoToES6 + */ + +function convertRhinoToES6(code: string): string { + let result = code; + + // 1. 转换 let 表达式: let (x = value) expr -> ((x) => expr)(value) + result = result.replace( + /let\s*\(\s*(\w+)\s*=\s*([^)]+)\)\s*([^;{\n)]+)/g, + (match, varName, value, expr) => { + const cleanExpr = expr.trim(); + return `((${varName}) => ${cleanExpr})(${value})`; + } + ); + + // 2. 转换 for each 语法: for each (x in arr) -> for (let x of arr) + result = result.replace( + /for\s+each\s*\(\s*((?:var|let|const)?\s*\w+)\s+in\s+/g, + 'for ($1 of ' + ); + + // 3. 转换 Java 风格的数组声明 + result = result.replace(/new\s+[\w.]+\[\]/g, '[]'); + + // 4. 转换 with 语句中的 JavaImporter + result = result.replace(/with\s*\(\s*\w+\s*\)\s*\{/g, '{'); + + // 5. 处理 Java 类型转换 + result = result.replace(/\(java\.lang\.String\)\s*(\w+)/g, 'String($1)'); + result = result.replace(/\(java\.lang\.Integer\)\s*(\w+)/g, 'parseInt($1)'); + + return result; +} + +const code = ` +var mid=src.match(/data\\-mid\\="(\\d+)"/)[1]; +java.put("mid",mid) +var r=\`https://api-get-v2.mgsearcher.com/api/manga/get?mid=\${mid}&mode=all\` +r; +`; + +console.log('原始代码:', code); +const converted = convertRhinoToES6(code); +console.log('转换后:', converted); +console.log('是否相同:', code === converted); diff --git a/test-debug-flow.ts b/test-debug-flow.ts new file mode 100644 index 0000000..75531cf --- /dev/null +++ b/test-debug-flow.ts @@ -0,0 +1,223 @@ +/** + * 测试应用内的调试流程 + * 模拟转换后在应用中执行搜索的完整流程 + */ + +import { convertSource } from './src/renderer/utils/sourceConverter'; +import { BookSource, BookSourceType, SourceFormat, detectSourceFormat } from './src/renderer/types'; + +// 原始 Legado 书源(笔趣漫画) +const testLegadoSource: BookSource = { + bookSourceComment: "笔趣漫画", + bookSourceGroup: "漫画", + bookSourceName: "笔趣漫画", + bookSourceType: BookSourceType.Image, + bookSourceUrl: "https://www.biqumh.com", + customOrder: 0, + enabled: true, + enabledExplore: true, + header: '{\n\t "Accept": "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01",\n "X-Requested-With": "XMLHttpRequest",\n "Referer": "https://www.biqumh.com/"\n}', + lastUpdateTime: Date.now(), + respondTime: 0, + weight: 0, + searchUrl: "/index.php/search?key={{key}}", + ruleSearch: { + bookList: ".common-comic-item", + bookUrl: ".comic__title a@href", + coverUrl: "img@data-original", + intro: ".comic-feature@text", + lastChapter: ".comic-update a@text##待浏览", + name: ".comic__title a@text" + }, + ruleBookInfo: { + author: ".comic-author .name@text", + coverUrl: ".de-info__bg@style##url\\('(.*?)'\\)##$1###", + intro: ".intro-total@text", + kind: ".comic-status span a@text", + name: ".j-comic-title@text" + }, + ruleToc: { + chapterList: ".chapter__list-box li a", + chapterName: "text", + chapterUrl: "href" + }, + ruleContent: { + content: "@js:\nconst imgs = java.getElements(\".rd-article-wr img\")\nimgs.forEach(e => {\n e.attr(\"src\", e.attr(\"data-original\"))\n})\nimgs" + } +}; + +/** + * 模拟异次元调试器的 preprocessRule 函数 + */ +function preprocessRule(rule: string | undefined): { rule: string; headers?: Record } { + if (!rule) return { rule: '' }; + + let processedRule = rule; + let headers: Record | undefined; + + // 提取 @Header:{...} 后缀 + const headerMatch = processedRule.match(/@Header:\{([^}]+)\}$/); + if (headerMatch) { + processedRule = processedRule.replace(/@Header:\{[^}]+\}$/, '').trim(); + try { + const headerStr = headerMatch[1]; + headers = {}; + const pairs = headerStr.split(/[;,]/).filter(s => s.trim()); + for (const pair of pairs) { + const colonIdx = pair.indexOf(':'); + if (colonIdx > 0) { + let key = pair.substring(0, colonIdx).trim().replace(/^["']|["']$/g, ''); + let value = pair.substring(colonIdx + 1).trim().replace(/^["']|["']$/g, ''); + if (value === 'host') { + value = ''; + } + headers[key] = value; + } + } + } catch { + // 解析失败,忽略 + } + } + + // 处理多行规则 - 如果包含 @js: 则保留完整内容 + // 否则只取第一行(非空) + if (!processedRule.includes('@js:') && !processedRule.includes('')) { + const lines = processedRule.split('\n').map(l => l.trim()).filter(l => l); + if (lines.length > 0) { + processedRule = lines[0]; + } + } + + return { rule: processedRule, headers }; +} + +console.log('========================================'); +console.log('调试流程测试'); +console.log('========================================\n'); + +// 1. 转换书源 +console.log('=== 1. 转换书源 ===\n'); +const convertResult = convertSource(testLegadoSource); +if (!convertResult.success) { + console.log('转换失败:', convertResult.error); + process.exit(1); +} + +const yiciyuanSource = convertResult.result; +console.log('转换成功,格式:', detectSourceFormat(yiciyuanSource) === SourceFormat.Yiciyuan ? '异次元' : 'Legado'); + +// 2. 检查转换后的关键字段 +console.log('\n=== 2. 转换后的关键字段 ===\n'); +console.log('ruleSearchUrl:', yiciyuanSource.ruleSearchUrl); +console.log('ruleSearchList:', yiciyuanSource.ruleSearchList); +console.log('ruleSearchName:', yiciyuanSource.ruleSearchName); +console.log('ruleSearchNoteUrl:', yiciyuanSource.ruleSearchNoteUrl); +console.log('header:', yiciyuanSource.header ? '✅ 保留' : '❌ 丢失'); + +// 3. 模拟 preprocessRule 处理 +console.log('\n=== 3. preprocessRule 处理结果 ===\n'); + +const fields = [ + { name: 'ruleSearchList', value: yiciyuanSource.ruleSearchList }, + { name: 'ruleSearchName', value: yiciyuanSource.ruleSearchName }, + { name: 'ruleSearchNoteUrl', value: yiciyuanSource.ruleSearchNoteUrl }, + { name: 'ruleSearchCoverUrl', value: yiciyuanSource.ruleSearchCoverUrl }, +]; + +for (const field of fields) { + const original = field.value || ''; + const { rule: processed, headers } = preprocessRule(field.value); + + console.log(`${field.name}:`); + console.log(` 原始: "${original}"`); + console.log(` 处理后: "${processed}"`); + if (headers) { + console.log(` headers:`, headers); + } + + // 检查是否有问题 + if (original && !processed) { + console.log(` ⚠️ 警告: 处理后为空!`); + } else if (original !== processed && !headers) { + console.log(` ⚠️ 注意: 规则被修改`); + } else { + console.log(` ✅ 正常`); + } + console.log(''); +} + +// 4. 检查是否有换行符问题 +console.log('=== 4. 换行符检查 ===\n'); +for (const field of fields) { + const value = field.value || ''; + if (value.includes('\n')) { + console.log(`${field.name}: ⚠️ 包含换行符`); + console.log(` 内容: ${JSON.stringify(value)}`); + } else { + console.log(`${field.name}: ✅ 无换行符`); + } +} + +// 5. 检查 isYiciyuanSource 判断 +console.log('\n=== 5. isYiciyuanSource 判断 ===\n'); + +function isYiciyuanSource(source: any): boolean { + if (!source) return false; + + const yiciyuanFields = [ + 'ruleSearchUrl', + 'ruleSearchList', + 'ruleSearchName', + 'ruleSearchNoteUrl', + 'ruleBookContent', + 'ruleFindUrl', + 'ruleChapterUrl', + 'ruleIntroduce', + 'bookSingleThread', + 'httpUserAgent', + ]; + + const legadoFields = [ + 'ruleSearch', + 'ruleExplore', + 'ruleBookInfo', + 'ruleToc', + 'ruleContent', + 'searchUrl', + 'exploreUrl', + ]; + + let yiciyuanCount = 0; + let legadoCount = 0; + + console.log('异次元字段检查:'); + for (const field of yiciyuanFields) { + const hasField = field in source && source[field] !== undefined && source[field] !== ''; + if (hasField) { + yiciyuanCount++; + console.log(` ${field}: ✅ 存在`); + } + } + + console.log('\nLegado字段检查:'); + for (const field of legadoFields) { + const hasField = field in source && source[field] !== undefined && source[field] !== ''; + if (hasField) { + legadoCount++; + console.log(` ${field}: ✅ 存在`); + } + } + + console.log(`\n异次元字段数: ${yiciyuanCount}`); + console.log(`Legado字段数: ${legadoCount}`); + console.log(`判断结果: ${yiciyuanCount > legadoCount ? '异次元' : 'Legado'}`); + + return yiciyuanCount > legadoCount; +} + +const isYiciyuan = isYiciyuanSource(yiciyuanSource); +console.log(`\n最终判断: ${isYiciyuan ? '使用异次元调试器' : '使用Legado调试器'}`); + +console.log('\n========================================'); +console.log('测试完成'); +console.log('========================================'); diff --git a/test-debug-issues.ts b/test-debug-issues.ts new file mode 100644 index 0000000..c8b1de7 --- /dev/null +++ b/test-debug-issues.ts @@ -0,0 +1,244 @@ +/** + * 调试各图源的具体问题 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; +import { parseList, parseFromElement, ParseContext } from './src/main/debug/rule-parser'; + +// 1. 包子漫画 - 目录规则问题 +async function debugBaozi() { + console.log('\n=== 包子漫画 目录调试 ==='); + + const url = 'https://cn.bzmanga.com/comic/hzw-one-piece'; + const result = await httpRequest({ url, headers: { 'User-Agent': 'Mozilla/5.0' } }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const $ = cheerio.load(result.body || ''); + + // 测试各种目录选择器 + console.log('选择器测试:'); + console.log(' .comics-chapters__item:', $('.comics-chapters__item').length); + console.log(' .section-title:', $('.section-title').length); + console.log(' a[href*="chapter"]:', $('a[href*="chapter"]').length); + + // 打印章节目录区域 + const chapterItems = $('.comics-chapters__item'); + if (chapterItems.length > 0) { + console.log('\n前3个章节:'); + chapterItems.slice(0, 3).each((i, el) => { + console.log(` [${i + 1}] ${$(el).text().trim()} - ${$(el).attr('href')}`); + }); + } +} + +// 2. 腾讯漫画 - 目录规则问题 +async function debugTencent() { + console.log('\n=== 腾讯漫画 目录调试 ==='); + + const url = 'https://m.ac.qq.com/comic/index/id/531040'; + const result = await httpRequest({ + url, + headers: { 'User-Agent': 'Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const $ = cheerio.load(result.body || ''); + + console.log('选择器测试:'); + console.log(' class.chapter-wrap:', $('[class*="chapter"]').length); + console.log(' .chapter-wrap:', $('.chapter-wrap').length); + console.log(' .chapter-wrap a:', $('.chapter-wrap a').length); + console.log(' .chapter-list:', $('.chapter-list').length); + console.log(' .chapter-list a:', $('.chapter-list a').length); + console.log(' a[href*="chapter"]:', $('a[href*="chapter"]').length); + + // 查找所有包含 chapter 的类 + const chapterClasses: string[] = []; + $('[class*="chapter"]').each((_, el) => { + const cls = $(el).attr('class'); + if (cls && !chapterClasses.includes(cls)) chapterClasses.push(cls); + }); + console.log('包含chapter的类:', chapterClasses.slice(0, 10)); + + // 打印页面中的链接 + const links = $('a[href*="/chapter/"]'); + if (links.length > 0) { + console.log('\n章节链接:'); + links.slice(0, 5).each((i, el) => { + console.log(` [${i + 1}] ${$(el).text().trim().substring(0, 30)} - ${$(el).attr('href')}`); + }); + } +} + +// 3. 漫画屋 - 正文规则问题 +async function debugMhua() { + console.log('\n=== 漫画屋 正文调试 ==='); + + // 先获取目录 + const detailUrl = 'https://www.mhua5.com/index.php/comic/doupocangkong'; + const detailResult = await httpRequest({ + url: detailUrl, + headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 9) AppleWebKit/537.36' } + }); + + if (!detailResult.success) { + console.log('详情请求失败:', detailResult.error); + return; + } + + const $detail = cheerio.load(detailResult.body || ''); + + // 获取第一章链接 + const chapterList = $detail('.clearfix li a'); + console.log('章节数量:', chapterList.length); + + if (chapterList.length === 0) { + // 尝试其他选择器 + console.log('尝试其他选择器:'); + console.log(' ul li a:', $detail('ul li a').length); + console.log(' .chapter-list a:', $detail('.chapter-list a').length); + console.log(' a[href*="chapter"]:', $detail('a[href*="chapter"]').length); + return; + } + + const firstChapterHref = chapterList.last().attr('href'); + console.log('第一章链接:', firstChapterHref); + + if (!firstChapterHref) return; + + const chapterUrl = firstChapterHref.startsWith('http') ? firstChapterHref : 'https://www.mhua5.com' + firstChapterHref; + console.log('完整URL:', chapterUrl); + + // 获取正文 + const contentResult = await httpRequest({ + url: chapterUrl, + headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 9) AppleWebKit/537.36' } + }); + + if (!contentResult.success) { + console.log('正文请求失败:', contentResult.error); + return; + } + + const $content = cheerio.load(contentResult.body || ''); + + console.log('\n正文选择器测试:'); + console.log(' class.comic-list:', $content('.comic-list').length); + console.log(' .comic-list li:', $content('.comic-list li').length); + console.log(' .comic-list img:', $content('.comic-list img').length); + console.log(' img[data-src]:', $content('img[data-src]').length); + console.log(' img[src]:', $content('img[src]').length); + + // 打印图片 + const images = $content('.comic-list img, img[data-src]'); + if (images.length > 0) { + console.log('\n前3张图片:'); + images.slice(0, 3).each((i, el) => { + console.log(` [${i + 1}] src=${$content(el).attr('src')?.substring(0, 50)} data-src=${$content(el).attr('data-src')?.substring(0, 50)}`); + }); + } +} + +// 4. 漫畫狗 - 目录规则问题 (!0 排除语法) +async function debugDogeManga() { + console.log('\n=== 漫畫狗 目录调试 ==='); + + const url = 'https://dogemanga.com/m/3E6-dFJl'; + const result = await httpRequest({ + url, + headers: { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const $ = cheerio.load(result.body || ''); + + console.log('选择器测试:'); + console.log(' .site-selector:', $('.site-selector').length); + console.log(' .site-selector option:', $('.site-selector option').length); + console.log(' select option:', $('select option').length); + + // 规则: -class.site-selector@tag.option!0 + // 意思是: 倒序,class.site-selector 下的 option,排除第0个 + const options = $('.site-selector option'); + if (options.length > 0) { + console.log('\n章节选项 (前5个):'); + options.slice(0, 5).each((i, el) => { + console.log(` [${i}] ${$(el).text().trim().substring(0, 30)} - value=${$(el).attr('value')}`); + }); + } +} + +// 5. 知音漫客 - 详情URL重复问题 +async function debugZymk() { + console.log('\n=== 知音漫客 详情调试 ==='); + + // 搜索结果中的URL有重复问题 + const searchUrl = 'https://m.zymk.cn/sort/all.html'; + const result = await httpRequest({ + url: searchUrl, + headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const $ = cheerio.load(result.body || ''); + + // 测试搜索列表规则 + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://m.zymk.cn', + variables: {} + }; + + const elements = parseList(ctx, '.comic-sort li'); + console.log('列表元素数量:', elements.length); + + if (elements.length > 0) { + const firstEl = elements[0]; + + // 测试各种URL规则 + const urlRules = [ + '.comic-item a@href', + '.thumbnail a@href', + 'a@href', + 'tag.a.0@href' + ]; + + console.log('\nURL规则测试:'); + for (const rule of urlRules) { + const urlResult = parseFromElement(firstEl, rule, 'https://m.zymk.cn', {}); + console.log(` "${rule}": ${urlResult.success ? urlResult.data : '失败'}`); + } + + // 打印元素HTML + if (firstEl.html) { + console.log('\n第一个元素HTML:'); + console.log(firstEl.html()?.substring(0, 500)); + } + } +} + +async function main() { + await debugBaozi(); + await debugTencent(); + await debugMhua(); + await debugDogeManga(); + await debugZymk(); +} + +main().catch(console.error); diff --git a/test-debug-parselist-internal.ts b/test-debug-parselist-internal.ts new file mode 100644 index 0000000..d79abd0 --- /dev/null +++ b/test-debug-parselist-internal.ts @@ -0,0 +1,243 @@ +/** + * 在 parseList 内部添加调试 + */ +import * as cheerio from 'cheerio'; +import { httpRequest } from './src/main/debug/http-client'; + +// 复制 splitRule +function splitRule(rule: string): { rules: string[]; operator: 'or' | 'and' | 'format' } { + if (/[\s\S]*?<\/js>/i.test(rule) || rule.includes('@js:')) { + return { rules: [rule], operator: 'or' }; + } + if (rule.includes('||')) { + return { rules: rule.split('||'), operator: 'or' }; + } + if (rule.includes('&&')) { + return { rules: rule.split('&&'), operator: 'and' }; + } + if (rule.includes('%%')) { + return { rules: rule.split('%%'), operator: 'format' }; + } + return { rules: [rule], operator: 'or' }; +} + +// 复制 parseIndexExpression +function parseIndexExpression(expr: string, length: number): number[] { + const indices: number[] = []; + const parts = expr.split(':'); + + if (parts.length === 1) { + const idx = parseInt(parts[0]); + if (!isNaN(idx)) { + indices.push(idx < 0 ? length + idx : idx); + } + } else { + let start = parts[0] ? parseInt(parts[0]) : 0; + let end = parts[1] ? parseInt(parts[1]) : length; + const step = parts[2] ? parseInt(parts[2]) : 1; + + if (start < 0) start = length + start; + if (end < 0) end = length + end; + + for (let i = start; step > 0 ? i < end : i > end; i += step) { + if (i >= 0 && i < length) indices.push(i); + } + } + + return indices; +} + +// 复制 selectWithLegadoSyntax +function selectWithLegadoSyntax( + $: cheerio.CheerioAPI, + $el: cheerio.Cheerio, + selector: string +): cheerio.Cheerio { + console.log(` [selectWithLegadoSyntax] selector="${selector}", $el.length=${$el.length}`); + + // children + if (selector === 'children') { + return $el.children(); + } + + // 数组索引 + if (selector.startsWith('[') && selector.endsWith(']')) { + const expr = selector.slice(1, -1); + if (/[=~^$*|]/.test(expr) || /^[a-zA-Z]/.test(expr)) { + return $el.find(selector); + } + const children = $el.children(); + const indices = parseIndexExpression(expr, children.length); + const result = $(); + for (const idx of indices) { + result.add(children.eq(idx)); + } + return result.length > 0 ? result : children.filter((i) => indices.includes(i)); + } + + // text.xxx + if (selector.startsWith('text.')) { + const searchText = selector.substring(5); + return $el.find('*').filter((_, el) => { + const text = $(el).clone().children().remove().end().text(); + return text.includes(searchText); + }); + } + + // class.xxx + if (selector.startsWith('class.')) { + const afterClass = selector.substring(6); + console.log(` [selectWithLegadoSyntax] class. detected, afterClass="${afterClass}"`); + + let className = afterClass; + let indexPart: string | null = null; + + const indexMatch = afterClass.match(/\.(-?\d+|\[.+\])$/); + if (indexMatch) { + className = afterClass.substring(0, afterClass.length - indexMatch[0].length); + indexPart = indexMatch[1]; + } + + const classSelector = className.split(/\s+/).map(c => `.${c}`).join(''); + console.log(` [selectWithLegadoSyntax] classSelector="${classSelector}"`); + + const found = $el.find(classSelector); + console.log(` [selectWithLegadoSyntax] found.length=${found.length}`); + + if (indexPart) { + if (/^-?\d+$/.test(indexPart)) { + const index = parseInt(indexPart); + return index < 0 ? found.eq(found.length + index) : found.eq(index); + } + if (indexPart.startsWith('[')) { + const indices = parseIndexExpression(indexPart.slice(1, -1), found.length); + return found.filter((i) => indices.includes(i)); + } + } + + if (found.length === 0 && $el.hasClass) { + const allMatch = className.split(/\s+/).every(c => $el.hasClass(c)); + if (allMatch) return $el; + } + return found; + } + + // id.xxx + if (selector.startsWith('id.')) { + const id = selector.substring(3); + return $el.find(`#${id}`); + } + + // tag.xxx + if (selector.startsWith('tag.')) { + const parts = selector.substring(4).split('.'); + const tag = parts[0]; + let allTags = $el.find(tag); + + if (parts.length > 1) { + const indexPart = parts.slice(1).join('.'); + if (/^-?\d+$/.test(indexPart)) { + const index = parseInt(indexPart); + return index < 0 ? allTags.eq(allTags.length + index) : allTags.eq(index); + } + } + return allTags; + } + + // 默认 CSS 选择器 + console.log(` [selectWithLegadoSyntax] 使用默认 CSS 选择器`); + const result = $el.find(selector); + console.log(` [selectWithLegadoSyntax] 默认选择器结果: ${result.length}`); + return result; +} + +// 模拟 parseList +function parseList(body: string, rule: string): any[] { + console.log(`\n[parseList] rule="${rule}"`); + + let shouldReverse = false; + let actualRule = rule.trim(); + + if (actualRule.startsWith('-')) { + shouldReverse = true; + actualRule = actualRule.substring(1).trim(); + } + + let results: any[] = []; + + // 正则 + if (actualRule.startsWith(':')) { + console.log('[parseList] 正则模式'); + return []; + } + + // JSON + if (actualRule.startsWith('@json:') || actualRule.startsWith('$.') || /^[a-zA-Z_]\w*\./.test(actualRule)) { + console.log('[parseList] JSON 模式检测'); + // 检查是否真的是 JSON 模式 + // class.xxx 不应该匹配这个条件 + console.log(` actualRule.startsWith('@json:'): ${actualRule.startsWith('@json:')}`); + console.log(` actualRule.startsWith('$.'): ${actualRule.startsWith('$.')}`); + console.log(` /^[a-zA-Z_]\\w*\\./.test(actualRule): ${/^[a-zA-Z_]\w*\./.test(actualRule)}`); + + // 这里是问题!class.comic-item 匹配了 /^[a-zA-Z_]\w*\./ 正则 + // 因为 "class" 是字母开头,后面跟着 "." + return []; + } + + console.log('[parseList] CSS 模式'); + const $ = cheerio.load(body); + const { rules, operator } = splitRule(actualRule); + console.log(`[parseList] splitRule 结果: rules=${JSON.stringify(rules)}, operator=${operator}`); + + for (const r of rules) { + const ruleElements: cheerio.Cheerio[] = []; + const parts = r.split('@'); + console.log(`[parseList] 处理规则 "${r}", parts=${JSON.stringify(parts)}`); + + let $current: cheerio.Cheerio = $.root(); + + for (const part of parts) { + if (!part) continue; + $current = selectWithLegadoSyntax($, $current, part); + } + + $current.each((_, el) => { + ruleElements.push($(el)); + }); + + console.log(`[parseList] 规则 "${r}" 匹配到 ${ruleElements.length} 个元素`); + + if (operator === 'or' && ruleElements.length > 0) { + results = ruleElements; + break; + } else if (operator === 'and') { + results = results.concat(ruleElements); + } else { + results = ruleElements; + } + } + + return shouldReverse ? results.reverse() : results; +} + +async function test() { + const result = await httpRequest({ + url: 'https://m.ac.qq.com/search/result?word=斗破苍穹', + headers: { + 'User-Agent': 'Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0' + } + }); + + const body = result.body || ''; + + console.log('=== 测试 class.comic-item ==='); + const r1 = parseList(body, 'class.comic-item'); + console.log(`结果: ${r1.length}`); + + console.log('\n=== 测试 .comic-item ==='); + const r2 = parseList(body, '.comic-item'); + console.log(`结果: ${r2.length}`); +} + +test().catch(console.error); diff --git a/test-debug-search-url.ts b/test-debug-search-url.ts new file mode 100644 index 0000000..8364b67 --- /dev/null +++ b/test-debug-search-url.ts @@ -0,0 +1,39 @@ +/** + * 调试书源搜索URL构建 + */ +import * as fs from 'fs'; +import { buildSearchUrl } from './src/main/debug/analyze-url'; + +const sourcesJson = fs.readFileSync('shareBookSource(1).json', 'utf8'); +const allSources = JSON.parse(sourcesJson); + +const keyword = '斗破苍穹'; + +console.log('调试书源搜索URL构建\n'); + +for (let i = 0; i < allSources.length; i++) { + const source = allSources[i]; + const name = source.bookSourceName.substring(0, 20).padEnd(20); + + try { + const analyzeUrl = buildSearchUrl(source, keyword, 1, {}); + + if (!analyzeUrl) { + console.log(`[${i + 1}] ${name} ❌ 无搜索URL`); + continue; + } + + const url = analyzeUrl.getUrl(); + const method = analyzeUrl.getMethod(); + + if (!url || url === 'null' || url === 'undefined') { + console.log(`[${i + 1}] ${name} ❌ URL为空`); + } else if (url.startsWith('') || url.includes('@js:')) { + console.log(`[${i + 1}] ${name} ⚠️ JS未执行: ${url.substring(0, 50)}...`); + } else { + console.log(`[${i + 1}] ${name} ✅ ${method} ${url.substring(0, 60)}...`); + } + } catch (error: any) { + console.log(`[${i + 1}] ${name} ❌ 异常: ${error.message?.substring(0, 40)}`); + } +} diff --git a/test-debug-search.ts b/test-debug-search.ts new file mode 100644 index 0000000..cf541ae --- /dev/null +++ b/test-debug-search.ts @@ -0,0 +1,146 @@ +/** + * 调试搜索规则解析 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; + +async function debugTencentComic() { + console.log('=== 腾讯漫画搜索调试 ===\n'); + + const url = 'https://m.ac.qq.com/search/result?word=斗破苍穹'; + console.log('请求URL:', url); + + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0' + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + console.log('响应状态:', result.statusCode); + console.log('响应长度:', result.body?.length); + + const $ = cheerio.load(result.body || ''); + + // 尝试不同的选择器 + console.log('\n--- 选择器测试 ---'); + console.log('class.comic-item:', $('class.comic-item').length); + console.log('.comic-item:', $('.comic-item').length); + console.log('[class="comic-item"]:', $('[class="comic-item"]').length); + console.log('[class*="comic-item"]:', $('[class*="comic-item"]').length); + console.log('.mod-search-result:', $('.mod-search-result').length); + console.log('.search-result:', $('.search-result').length); + + // 打印页面结构 + console.log('\n--- 页面结构 ---'); + console.log('body children:', $('body').children().length); + + // 查找所有包含 comic 的类 + const comicClasses: string[] = []; + $('[class*="comic"]').each((_, el) => { + const cls = $(el).attr('class'); + if (cls && !comicClasses.includes(cls)) { + comicClasses.push(cls); + } + }); + console.log('包含comic的类:', comicClasses.slice(0, 10)); + + // 打印前500字符 + console.log('\n--- 响应预览 ---'); + console.log(result.body?.substring(0, 1000)); +} + +async function debugZymk() { + console.log('\n\n=== 知音漫客搜索调试 ===\n'); + + const url = 'https://m.zymk.cn/sort/all.html?key=斗罗'; + console.log('请求URL:', url); + + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + console.log('响应状态:', result.statusCode); + console.log('响应长度:', result.body?.length); + + const $ = cheerio.load(result.body || ''); + + console.log('\n--- 选择器测试 ---'); + console.log('class.comic-sort:', $('class.comic-sort').length); + console.log('.comic-sort:', $('.comic-sort').length); + console.log('.comic-sort li:', $('.comic-sort li').length); + console.log('.comic-list:', $('.comic-list').length); + console.log('.comic-item:', $('.comic-item').length); + + // 查找所有包含 comic 的类 + const comicClasses: string[] = []; + $('[class*="comic"]').each((_, el) => { + const cls = $(el).attr('class'); + if (cls && !comicClasses.includes(cls)) { + comicClasses.push(cls); + } + }); + console.log('包含comic的类:', comicClasses.slice(0, 10)); +} + +async function debugMkzhan() { + console.log('\n\n=== 漫客栈API搜索调试 ===\n'); + + const url = 'https://comic.mkzhan.com/search/keyword/?keyword=斗破&page_num=1&page_size=20'; + console.log('请求URL:', url); + + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Linux; Android 12; Redmi K30 Pro) AppleWebKit/537.36' + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + console.log('响应状态:', result.statusCode); + console.log('响应长度:', result.body?.length); + + // 尝试解析JSON + try { + const json = JSON.parse(result.body || ''); + console.log('JSON解析成功'); + console.log('顶层键:', Object.keys(json)); + if (json.data) { + console.log('data键:', Object.keys(json.data)); + if (json.data.list) { + console.log('list长度:', json.data.list.length); + if (json.data.list.length > 0) { + console.log('第一项:', JSON.stringify(json.data.list[0], null, 2).substring(0, 500)); + } + } + } + } catch (e) { + console.log('JSON解析失败'); + console.log('响应预览:', result.body?.substring(0, 500)); + } +} + +async function main() { + await debugTencentComic(); + await debugZymk(); + await debugMkzhan(); +} + +main().catch(console.error); diff --git a/test-debug-select.ts b/test-debug-select.ts new file mode 100644 index 0000000..0ad5dce --- /dev/null +++ b/test-debug-select.ts @@ -0,0 +1,50 @@ +/** + * 深入调试 selectWithLegadoSyntax + */ +import * as cheerio from 'cheerio'; + +const html = ` + +`; + +const $ = cheerio.load(html); +const $root = $.root(); + +console.log('=== 基础测试 ==='); +console.log('$root.find("ul"):', $root.find('ul').length); +console.log('$root.find("ul.book-list"):', $root.find('ul.book-list').length); +console.log('$root.find(".book-list"):', $root.find('.book-list').length); + +// 检查 root 的内容 +console.log('\n=== root 内容 ==='); +console.log('$root.html():', $root.html()?.substring(0, 200)); + +// 检查 children +console.log('\n=== children ==='); +console.log('$root.children():', $root.children().length); +$root.children().each((i, el) => { + console.log(` [${i}] ${el.type} ${(el as any).name || ''}`); +}); + +// 直接在 body 上查找 +console.log('\n=== 在 body 上查找 ==='); +const $body = $('body'); +console.log('$body.length:', $body.length); +console.log('$body.find("ul.book-list"):', $body.find('ul.book-list').length); + +// 在 html 上查找 +const $html = $('html'); +console.log('\n=== 在 html 上查找 ==='); +console.log('$html.length:', $html.length); +console.log('$html.find("ul.book-list"):', $html.find('ul.book-list').length); + +// 直接使用 $ 查找 +console.log('\n=== 直接 $ 查找 ==='); +console.log('$("ul.book-list"):', $('ul.book-list').length); diff --git a/test-exclude-syntax.ts b/test-exclude-syntax.ts new file mode 100644 index 0000000..0b0a940 --- /dev/null +++ b/test-exclude-syntax.ts @@ -0,0 +1,54 @@ +/** + * 测试排除语法 !0 + */ +import { parseList, ParseContext, parseFromElement } from './src/main/debug/rule-parser'; +import { httpRequest } from './src/main/debug/http-client'; + +async function test() { + // 测试漫畫狗的目录规则 + const url = 'https://dogemanga.com/m/3E6-dFJl'; + const result = await httpRequest({ + url, + headers: { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://dogemanga.com', + variables: {} + }; + + // 测试各种规则 + const rules = [ + 'class.site-selector@tag.option', // 不排除 + 'class.site-selector@tag.option!0', // 排除第0个 + '-class.site-selector@tag.option!0', // 倒序 + 排除第0个 + '.site-selector option', // CSS 选择器 + '.site-selector option:not(:first-child)', // CSS 排除 + ]; + + for (const rule of rules) { + console.log(`\n规则: "${rule}"`); + const elements = parseList(ctx, rule); + console.log(` 结果数量: ${elements.length}`); + + if (elements.length > 0) { + // 打印前3个 + for (let i = 0; i < Math.min(3, elements.length); i++) { + const el = elements[i]; + if (el.text) { + console.log(` [${i}] ${el.text().trim().substring(0, 30)}`); + } else if (typeof el === 'object') { + console.log(` [${i}] ${JSON.stringify(el).substring(0, 50)}`); + } + } + } + } +} + +test().catch(console.error); diff --git a/test-execute-js-debug.ts b/test-execute-js-debug.ts new file mode 100644 index 0000000..18d4fa5 --- /dev/null +++ b/test-execute-js-debug.ts @@ -0,0 +1,94 @@ +/** + * 直接调试 executeJs + */ +import * as vm from 'vm'; + +// 从 rule-parser.ts 复制的简化版 executeJs +function executeJs( + code: string, + context: { + result: any; + src: string; + baseUrl: string; + variables: Record; + } +): any { + try { + console.log('[executeJs] 输入代码:', code.substring(0, 100) + '...'); + console.log('[executeJs] src 长度:', context.src.length); + + // 预处理 {{}} 变量 - 在 JS 执行前替换 + let preprocessedCode = code; + const jsResult = context.variables._jsResult || context.result; + + // 替换 {{$.xxx}} 格式的 JSONPath 变量 + preprocessedCode = preprocessedCode.replace(/\{\{\$\.([^}]+)\}\}/g, (_, path) => { + if (jsResult && typeof jsResult === 'object') { + const value = path.split('.').reduce((obj: any, key: string) => obj?.[key], jsResult); + return value !== undefined ? String(value) : ''; + } + return ''; + }); + + console.log('[executeJs] 预处理后代码:', preprocessedCode.substring(0, 100) + '...'); + + const sandbox: any = { + result: jsResult, + src: context.src, + baseUrl: context.baseUrl, + java: { + put: (key: string, value: any) => { + context.variables[key] = value; + console.log(`[executeJs] java.put("${key}", "${value}")`); + }, + get: (key: string) => context.variables[key], + }, + console, + }; + + const vmContext = vm.createContext(sandbox); + const script = new vm.Script(preprocessedCode); + const result = script.runInContext(vmContext, { timeout: 5000 }); + console.log('[executeJs] 执行结果:', result); + return result; + } catch (error: any) { + console.error('[executeJs] 执行错误:', error.message); + return null; + } +} + +// 测试 +import { httpRequest } from './src/main/debug/http-client'; + +async function test() { + const url = 'https://manhuafree.com/manga/doupocangqiong-zhiyinmankerenxiang'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + console.log('响应长度:', body.length); + + const jsCode = ` +var mid=src.match(/data\\-mid\\="(\\d+)"/)[1]; +java.put("mid",mid) +var r=\`https://api-get-v2.mgsearcher.com/api/manga/get?mid=\${mid}&mode=all\` +r; +`; + + console.log('\nJS 代码:', jsCode); + + const execResult = executeJs(jsCode, { + result: null, + src: body, + baseUrl: url, + variables: {} + }); + + console.log('\n最终结果:', execResult); +} + +test().catch(console.error); diff --git a/test-full-flow.ts b/test-full-flow.ts new file mode 100644 index 0000000..6316e8d --- /dev/null +++ b/test-full-flow.ts @@ -0,0 +1,324 @@ +/** + * 完整流程测试:搜索 -> 详情 -> 目录 -> 正文 + * 测试成功的图源 + */ +import { YiciyuanDebugger } from './src/main/debug/yiciyuan-debugger'; + +const testSources = [ + { + name: "包子漫画cn", + source: { + "bookSourceName": "包子漫画cn", + "bookSourceUrl": "https://cn.bzmanga.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://cn.bzmanga.com/search?q=searchKey", + "ruleSearchList": ".comics-card", + "ruleSearchName": ".comics-card__title@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "amp-img@src", + "ruleSearchAuthor": ".tags@text", + "ruleBookName": "h1.comics-detail__title@text", + "ruleBookAuthor": "h2.comics-detail__author@text", + "ruleIntroduce": "p.comics-detail__desc@text", + "ruleCoverUrl": ".pure-u-1-1 amp-img@src", + "ruleChapterList": ".comics-chapters__item", + "ruleChapterName": "text", + "ruleContentUrl": "href", + "ruleBookContent": "amp-img@src" + }, + keyword: "海贼王" + }, + { + name: "G站漫画", + source: { + "bookSourceName": "◯ G站", + "bookSourceUrl": "https://m.g-mh.org", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", + "ruleSearchUrl": "https://m.g-mh.org/s/searchKey", + "ruleSearchList": ".slicarda&&.pb-2", + "ruleSearchName": "h3@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": "img@src", + "ruleBookAuthor": ".text-small@a@text", + "ruleIntroduce": ".line-clamp-4@text", + "ruleChapterUrl": "@js:\nid = \"#bookmarkData\"; ai = \"data-mid\";\ni = org.jsoup.Jsoup.parse(result).select(id).attr(ai);\np = \"https://api-get-v2.mgsearcher.com/api/\";\nu = p + \"manga/get?mid=\" + i + \"&mode=all\";\njava.put(\"id\", i);\nu", + "ruleChapterList": "data.chapters", + "ruleChapterName": "$.attributes.title", + "ruleContentUrl": "$.id\n@js:\np = \"https://api-get-v2.mgsearcher.com/api/\";\na = \"chapter/getinfo?m=\" + java.get(\"id\") + \"&c=\";\nu = p + a + result;\nu", + "ruleBookContent": "@js:\nsrc = JSON.parse(result).data.info.images.images;\np = \"https://f40-1-4.g-mh.online\";\nimg = src.map(i => p + i.url);\nimg" + }, + keyword: "斗罗" + }, + { + name: "腾讯漫画", + source: { + "bookSourceName": "腾讯漫画", + "bookSourceUrl": "https://m.ac.qq.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0", + "ruleSearchUrl": "https://m.ac.qq.com/search/result?word=searchKey", + "ruleSearchList": "class.comic-item", + "ruleSearchName": "class.comic-title@text", + "ruleSearchNoteUrl": "class.comic-link@href", + "ruleSearchCoverUrl": "class.comic-cover@tag.img@src", + "ruleSearchKind": "class.comic-tag@text", + "ruleBookName": "li.head-info-title@h1@text", + "ruleBookAuthor": "li.author-wr@text", + "ruleIntroduce": "class.head-info-desc@text", + "ruleCoverUrl": "div.head-banner@img@src", + "ruleChapterList": "class.chapter-list@tag.a", + "ruleChapterName": "class.chapter-title@text||text", + "ruleContentUrl": "href", + "ruleBookContent": "class.comic-page@tag.img@data-src" + }, + keyword: "斗破苍穹" + }, + { + name: "酷看漫画", + source: { + "bookSourceName": "酷看漫画", + "bookSourceUrl": "https://www.kukk.net", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://www.kukk.net/search?keyword=searchKey", + "ruleSearchList": "class.mh-item", + "ruleSearchName": "tag.h2@text", + "ruleSearchNoteUrl": "tag.a@href", + "ruleSearchCoverUrl": "class.mh-cover@style", + "ruleSearchLastChapter": "class.chapter@tag.a@text", + "ruleBookName": "class.info@h1@text", + "ruleBookAuthor": "class.subtitle.1@text", + "ruleIntroduce": "class.content@text", + "ruleCoverUrl": "class.cover@tag.img.0@src", + "ruleChapterList": "id.detail-list-select@tag.a", + "ruleChapterName": "text", + "ruleContentUrl": "href", + "ruleBookContent": "class.comiclist@tag.img@data-src" + }, + keyword: "火影" + }, + { + name: "漫画屋", + source: { + "bookSourceName": "漫画屋", + "bookSourceUrl": "https://www.mhua5.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 9; PACM00 Build/QP1A.190711.020) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.79 Mobile Safari/537.36", + "ruleSearchUrl": "https://www.mhua5.com/index.php/search?key=searchKey", + "ruleSearchList": "class.comic-list-item clearfix||class.comic-item", + "ruleSearchName": "class.comic-name@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "class.cover@data-src", + "ruleSearchAuthor": "class.comic-author@text", + "ruleBookName": "class.comic-name@h1@text", + "ruleBookAuthor": "class.au-name@text", + "ruleIntroduce": "class.comic-intro@text", + "ruleCoverUrl": "class.box-back@style", + "ruleChapterList": "-class.list-wrap@tag.a", + "ruleChapterName": "text", + "ruleContentUrl": "href", + "ruleBookContent": "class.comic-list@tag.img@data-src||class.comic-list@tag.img@src" + }, + keyword: "斗破苍穹" + }, + { + name: "漫畫狗", + source: { + "bookSourceName": "漫畫狗", + "bookSourceUrl": "https://dogemanga.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36", + "ruleSearchUrl": "https://dogemanga.com/?q=searchKey&o=0", + "ruleSearchList": ".col-12", + "ruleSearchName": "tag.h5@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "tag.img@src", + "ruleSearchAuthor": "tag.h6@text", + "ruleBookName": "tag.h3@text", + "ruleBookAuthor": "tag.h4@text", + "ruleIntroduce": "class.text-truncate@text", + "ruleCoverUrl": "class.site-manga__cover-image@src", + "ruleChapterList": "-class.site-selector@tag.option!0", + "ruleChapterName": "text", + "ruleContentUrl": "value", + "ruleBookContent": "class.site-reader__image@data-page-image-url" + }, + keyword: "进击的巨人" + }, + { + name: "知音漫客", + source: { + "bookSourceName": "知音漫客📱💡", + "bookSourceUrl": "https://m.zymk.cn", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://m.zymk.cn/sort/all.html", + "ruleSearchList": ".comic-sort li", + "ruleSearchName": ".thumbnail a@title", + "ruleSearchNoteUrl": ".thumbnail a@href", + "ruleSearchCoverUrl": ".thumbnail img@data-src", + "ruleBookName": "h1.name@text", + "ruleBookAuthor": "class.author@text", + "ruleIntroduce": "class.comic-detail@tag.p.0@text", + "ruleCoverUrl": ".cover-bg img@data-src", + "ruleChapterList": "-class.chapterlist@tag.li", + "ruleChapterName": "tag.a@title", + "ruleContentUrl": "tag.a@href", + "ruleBookContent": "class.comic-page@tag.img@data-original||class.comic-contain@tag.img@data-src" + }, + keyword: "凤逆天下" + } +]; + +async function testFullFlow(item: typeof testSources[0]) { + console.log('\n' + '═'.repeat(70)); + console.log(`📚 ${item.name}`); + console.log(`🔗 ${item.source.bookSourceUrl}`); + console.log('═'.repeat(70)); + + const debugger_ = new YiciyuanDebugger(item.source); + + // 1. 搜索测试 + console.log('\n【1. 搜索测试】'); + console.log(` 关键词: ${item.keyword}`); + + const searchResult = await debugger_.debugSearch(item.keyword); + if (!searchResult.success || !searchResult.parsedItems?.length) { + console.log(` ❌ 搜索失败: ${searchResult.error || '无结果'}`); + return { name: item.name, search: false, detail: false, toc: false, content: false }; + } + + const books = searchResult.parsedItems; + console.log(` ✅ 找到 ${books.length} 本漫画`); + books.slice(0, 3).forEach((book: any, i: number) => { + console.log(` [${i + 1}] ${book.name || '(无名称)'}`); + }); + + // 获取第一本书的URL + const firstBook = books[0]; + const bookUrl = firstBook.bookUrl; + if (!bookUrl) { + console.log(' ⚠️ 无法获取书籍URL'); + return { name: item.name, search: true, detail: false, toc: false, content: false }; + } + + // 2. 详情测试 + console.log('\n【2. 详情测试】'); + console.log(` URL: ${bookUrl.substring(0, 60)}...`); + + const detailResult = await debugger_.debugBookInfo(bookUrl); + if (!detailResult.success) { + console.log(` ❌ 详情失败: ${detailResult.error}`); + return { name: item.name, search: true, detail: false, toc: false, content: false }; + } + + const bookInfo: any = detailResult.parsedItems; + console.log(` ✅ 详情获取成功`); + console.log(` 书名: ${bookInfo?.name || '(未获取)'}`); + console.log(` 作者: ${bookInfo?.author || '(未获取)'}`); + const intro = bookInfo?.intro ? String(bookInfo.intro) : ''; + console.log(` 简介: ${intro.substring(0, 50)}...`); + + // 3. 目录测试 + console.log('\n【3. 目录测试】'); + + const tocResult = await debugger_.debugToc(bookUrl); + if (!tocResult.success || !tocResult.parsedItems?.length) { + console.log(` ❌ 目录失败: ${tocResult.error || '无章节'}`); + return { name: item.name, search: true, detail: true, toc: false, content: false }; + } + + const chapters = tocResult.parsedItems; + console.log(` ✅ 共 ${chapters.length} 个章节`); + chapters.slice(0, 3).forEach((ch: any, i: number) => { + console.log(` [${i + 1}] ${ch.name || '(无名称)'}`); + }); + + // 获取第一章的URL + const firstChapter = chapters[0]; + const chapterUrl = firstChapter.url; + if (!chapterUrl) { + console.log(' ⚠️ 无法获取章节URL'); + return { name: item.name, search: true, detail: true, toc: true, content: false }; + } + + // 4. 正文测试 + console.log('\n【4. 正文测试】'); + console.log(` 章节: ${firstChapter.name || '第一章'}`); + + const contentResult = await debugger_.debugContent(chapterUrl); + if (!contentResult.success) { + console.log(` ❌ 正文失败: ${contentResult.error}`); + return { name: item.name, search: true, detail: true, toc: true, content: false }; + } + + const content = contentResult.parsedItems; + const images = Array.isArray(content) ? content : (content ? [content] : []); + + if (images.length === 0) { + console.log(` ⚠️ 未获取到图片`); + return { name: item.name, search: true, detail: true, toc: true, content: false }; + } + + console.log(` ✅ 获取到 ${images.length} 张图片`); + images.slice(0, 3).forEach((img: any, i: number) => { + const imgUrl = String(img); + console.log(` [${i + 1}] ${imgUrl.substring(0, 50)}...`); + }); + + return { name: item.name, search: true, detail: true, toc: true, content: true }; +} + +async function main() { + console.log('╔══════════════════════════════════════════════════════════════════════╗'); + console.log('║ 异次元图源完整流程测试 ║'); + console.log('║ 搜索 → 详情 → 目录 → 正文 ║'); + console.log('║ ' + new Date().toLocaleString() + ' ║'); + console.log('╚══════════════════════════════════════════════════════════════════════╝'); + + const results: any[] = []; + + for (const source of testSources) { + try { + const result = await testFullFlow(source); + results.push(result); + } catch (error: any) { + console.log(`\n❌ ${source.name} 测试异常: ${error.message}`); + results.push({ name: source.name, search: false, detail: false, toc: false, content: false }); + } + } + + // 汇总 + console.log('\n\n' + '═'.repeat(70)); + console.log(' 测 试 结 果 汇 总'); + console.log('═'.repeat(70)); + console.log('\n图源名称 搜索 详情 目录 正文 状态'); + console.log('─'.repeat(70)); + + let fullSuccess = 0; + for (const r of results) { + const s = r.search ? '✅' : '❌'; + const d = r.detail ? '✅' : '❌'; + const t = r.toc ? '✅' : '❌'; + const c = r.content ? '✅' : '❌'; + const allPass = r.search && r.detail && r.toc && r.content; + const status = allPass ? '🎉 完美' : (r.search ? '⚠️ 部分' : '❌ 失败'); + if (allPass) fullSuccess++; + console.log(`${r.name.padEnd(16)} ${s} ${d} ${t} ${c} ${status}`); + } + + console.log('─'.repeat(70)); + console.log(`\n📊 完整通过: ${fullSuccess}/${results.length} 个图源`); + console.log('═'.repeat(70)); +} + +main().catch(console.error); diff --git a/test-gshe-tocurl.ts b/test-gshe-tocurl.ts new file mode 100644 index 0000000..99f1c8b --- /dev/null +++ b/test-gshe-tocurl.ts @@ -0,0 +1,52 @@ +/** + * 测试 G社漫画 tocUrl 规则解析 + */ +import { httpRequest } from './src/main/debug/http-client'; +import { parseRule, ParseContext } from './src/main/debug/rule-parser'; + +async function test() { + const url = 'https://manhuafree.com/manga/doupocangqiong-zhiyinmankerenxiang'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + console.log('响应长度:', body.length); + + // tocUrl 规则 + const tocUrlRule = ` +var mid=src.match(/data\\-mid\\="(\\d+)"/)[1]; +java.put("mid",mid) +var r=\`https://api-get-v2.mgsearcher.com/api/manga/get?mid=\${mid}&mode=all\` +r; +`; + + console.log('\ntocUrl 规则:', tocUrlRule); + + const ctx: ParseContext = { + body, + baseUrl: url, + variables: {} + }; + + const parseResult = parseRule(ctx, tocUrlRule); + console.log('\n解析结果:', parseResult); + + if (parseResult.success && parseResult.data) { + console.log('\n解析出的 tocUrl:', parseResult.data); + + // 尝试请求这个 URL + const tocResult = await httpRequest({ url: String(parseResult.data) }); + if (tocResult.success) { + console.log('\ntocUrl 响应长度:', tocResult.body?.length); + console.log('tocUrl 响应预览:', tocResult.body?.substring(0, 500)); + } else { + console.log('\ntocUrl 请求失败:', tocResult.error); + } + } +} + +test().catch(console.error); diff --git a/test-gshe-tocurl2.ts b/test-gshe-tocurl2.ts new file mode 100644 index 0000000..7a9d340 --- /dev/null +++ b/test-gshe-tocurl2.ts @@ -0,0 +1,57 @@ +/** + * 测试 G社漫画 tocUrl 规则解析 - 详细调试 + */ +import { httpRequest } from './src/main/debug/http-client'; +import { parseRule, ParseContext } from './src/main/debug/rule-parser'; + +async function test() { + const url = 'https://manhuafree.com/manga/doupocangqiong-zhiyinmankerenxiang'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + console.log('响应长度:', body.length); + + // 检查 data-mid 是否存在 + const midMatch = body.match(/data-mid="(\d+)"/); + console.log('data-mid 匹配:', midMatch ? midMatch[1] : '未找到'); + + // 简化的 tocUrl 规则测试 + const simpleRule = ` +var mid = src.match(/data-mid="(\\d+)"/)[1]; +java.put("mid", mid); +"https://api-get-v2.mgsearcher.com/api/manga/get?mid=" + mid + "&mode=all"; +`; + + console.log('\n简化规则:', simpleRule); + + const ctx: ParseContext = { + body, + baseUrl: url, + variables: {} + }; + + const parseResult = parseRule(ctx, simpleRule); + console.log('\n解析结果:', JSON.stringify(parseResult, null, 2)); + + // 测试原始规则 + const originalRule = ` + +var mid=src.match(/data\\-mid\\="(\\d+)"/)[1]; +java.put("mid",mid) +var r=\`https://api-get-v2.mgsearcher.com/api/manga/get?mid=\${mid}&mode=all\` +r; + +`; + + console.log('\n原始规则:', originalRule); + + const parseResult2 = parseRule(ctx, originalRule); + console.log('\n原始规则解析结果:', JSON.stringify(parseResult2, null, 2)); +} + +test().catch(console.error); diff --git a/test-gshe.ts b/test-gshe.ts new file mode 100644 index 0000000..22ef5cc --- /dev/null +++ b/test-gshe.ts @@ -0,0 +1,44 @@ +/** + * 测试 G社漫画目录 + */ +import { httpRequest } from './src/main/debug/http-client'; + +async function test() { + const url = 'https://manhuafree.com/manga/doupocangqiong-zhiyinmankerenxiang'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + console.log('长度:', body.length); + + // 搜索 chapters + const idx = body.indexOf('chapters'); + if (idx > 0) { + console.log('chapters 上下文:', body.substring(idx - 50, idx + 200)); + } + + // 搜索 JSON 数据 + const scriptMatch = body.match(/]*>.*?chapters.*?<\/script>/s); + if (scriptMatch) { + console.log('\n找到包含 chapters 的 script:', scriptMatch[0].substring(0, 500)); + } + + // 搜索 __NUXT__ + const nuxtMatch = body.match(/__NUXT__\s*=\s*(\{[\s\S]*?\});?\s*<\/script>/); + if (nuxtMatch) { + console.log('\n找到 __NUXT__ 数据'); + try { + // 尝试解析 + const nuxtData = eval('(' + nuxtMatch[1] + ')'); + console.log('NUXT keys:', Object.keys(nuxtData)); + } catch (e: any) { + console.log('解析失败:', e.message); + } + } +} + +test().catch(console.error); diff --git a/test-gshe2.ts b/test-gshe2.ts new file mode 100644 index 0000000..80b712e --- /dev/null +++ b/test-gshe2.ts @@ -0,0 +1,51 @@ +/** + * 测试 G社漫画目录页面 + */ +import { httpRequest } from './src/main/debug/http-client'; + +async function test() { + const url = 'https://manhuafree.com/manga/doupocangqiong-zhiyinmankerenxiang'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + console.log('响应长度:', body.length); + + // 搜索 JSON 数据 + const nuxtMatch = body.match(/__NUXT__\s*=\s*\(function\([^)]*\)\{return\s*(\{[\s\S]*?\})\s*\}\(/); + if (nuxtMatch) { + console.log('\n找到 __NUXT__ 数据'); + console.log('数据预览:', nuxtMatch[1].substring(0, 500)); + } + + // 搜索 chapters + const chaptersMatch = body.match(/chapters["\s]*:["\s]*\[/); + if (chaptersMatch) { + console.log('\n找到 chapters 数组'); + const idx = body.indexOf(chaptersMatch[0]); + console.log('上下文:', body.substring(idx, idx + 300)); + } + + // 搜索 data-mid + const midMatch = body.match(/data-mid="(\d+)"/); + if (midMatch) { + console.log('\n找到 data-mid:', midMatch[1]); + } + + // 搜索 script 标签中的 JSON + const scriptMatches = body.match(/]*>([\s\S]*?)<\/script>/g); + if (scriptMatches) { + for (const script of scriptMatches) { + if (script.includes('chapters')) { + console.log('\n包含 chapters 的 script:', script.substring(0, 500)); + break; + } + } + } +} + +test().catch(console.error); diff --git a/test-gstation-api.ts b/test-gstation-api.ts new file mode 100644 index 0000000..023aea8 --- /dev/null +++ b/test-gstation-api.ts @@ -0,0 +1,48 @@ +/** + * 测试G站API响应格式 + */ +import { httpRequest } from './src/main/debug/http-client'; + +async function testApi() { + const url = 'https://api-get-v2.mgsearcher.com/api/manga/get?mid=133&mode=all'; + + console.log('请求API:', url); + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36', + 'Referer': 'https://m.g-mh.org/', + }, + }); + + if (result.success) { + console.log('请求成功'); + const body = result.body || ''; + console.log('响应长度:', body.length); + + // 尝试解析JSON + try { + const json = JSON.parse(body); + console.log('JSON解析成功'); + console.log('顶层键:', Object.keys(json)); + + if (json.data) { + console.log('data键:', Object.keys(json.data)); + if (json.data.chapters) { + console.log('chapters类型:', typeof json.data.chapters); + console.log('chapters长度:', Array.isArray(json.data.chapters) ? json.data.chapters.length : 'N/A'); + if (Array.isArray(json.data.chapters) && json.data.chapters.length > 0) { + console.log('第一个章节:', JSON.stringify(json.data.chapters[0], null, 2)); + } + } + } + } catch (e: any) { + console.log('JSON解析失败:', e.message); + console.log('响应前500字符:', body.substring(0, 500)); + } + } else { + console.log('请求失败:', result.error); + } +} + +testApi().catch(console.error); diff --git a/test-gstation.ts b/test-gstation.ts new file mode 100644 index 0000000..042769d --- /dev/null +++ b/test-gstation.ts @@ -0,0 +1,149 @@ +/** + * G站漫画调试测试 + */ +import { YiciyuanDebugger } from './src/main/debug/yiciyuan-debugger'; + +// G站完整图源配置 +const gStationSource = { + "bookDelayTime": "", + "bookSingleThread": "否", + "bookSourceGroup": "◯ 漫画", + "bookSourceName": "◯ G站", + "bookSourceType": "漫画", + "bookSourceUrl": "https://m.g-mh.org", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", + "lastUpdateTime": 0, + "loginUrl": "", + "loginUrlResult": "", + "ruleBookAuthor": ".text-small@a@text", + "ruleBookContent": "@js:\nsrc = JSON.parse(result).data.info.images.images;\np = \"https://f40-1-4.g-mh.online\";\nimg = src.map(i => p + i.url);\nimg@Header:{Referer:\"https://baozimh.org/\"}", + "ruleBookContentDecoder": "", + "ruleBookKind": ".text-sm@.p-1@text#\\,", + "ruleBookLastChapter": "", + "ruleBookName": "", + "ruleBookUrlPattern": "", + "ruleChapterId": "", + "ruleChapterList": "data.chapters", + "ruleChapterName": "$.attributes.title\n@js:\na = \" \" + result", + "ruleChapterParentId": "", + "ruleChapterParentName": "", + "ruleChapterUrl": "@js:\nid = \"#bookmarkData\"; ai = \"data-mid\";\ni = org.jsoup.Jsoup.parse(result).select(id).attr(ai);\np = \"https://api-get-v2.mgsearcher.com/api/\";\nu = p + \"manga/get?mid=\" + i + \"&mode=all\";\njava.put(\"id\", i);\nu@Header:{Referer:host}", + "ruleChapterUrlNext": "", + "ruleContentUrl": "$.id\n@js:\np = \"https://api-get-v2.mgsearcher.com/api/\";\na = \"chapter/getinfo?m=\" + java.get(\"id\") + \"&c=\";\nu = p + a + result;\nu@Header:{Referer:host}", + "ruleContentUrlNext": "", + "ruleCoverDecoder": "", + "ruleCoverUrl": "", + "ruleFindUrl": "◯ 主页 ::https://m.g-mh.org/\n\n⚬ 系统 ::/manga-tag/xitong/page/searchPage\n \n⚬ 重生 ::/manga-tag/zhongsheng/page/searchPage", + "ruleIntroduce": ".line-clamp-4@text#\\\\n", + "ruleSearchAuthor": "", + "ruleSearchCoverDecoder": "", + "ruleSearchCoverUrl": "img@src\n@js:\nresult = String(result).replace(/w=(\\d+)/, \"w=320\");\n@Header:{Referer:host}", + "ruleSearchKind": "", + "ruleSearchLastChapter": "", + "ruleSearchList": ".slicarda&&.pb-2", + "ruleSearchName": "h3@text\n@js:\njava.put(\"name\",result);", + "ruleSearchNoteUrl": "a@href", + "ruleSearchUrl": "https://m.g-mh.org/s/searchKey", + "ruleSearchUrlNext": "", + "serialNumber": 6, + "sourceRemark": "可能要魔法", + "weight": 8102 +}; + +async function testGStation() { + console.log('G站漫画完整测试'); + console.log('测试时间:', new Date().toLocaleString()); + console.log(''); + + const debugger_ = new YiciyuanDebugger(gStationSource); + + // 1. 搜索测试 + console.log('=== 1. 搜索测试 ==='); + const searchResult = await debugger_.debugSearch('斗罗大陆'); + console.log(`搜索结果: ${searchResult.success ? '成功' : '失败'}`); + + let bookUrl = ''; + if (searchResult.parsedItems && searchResult.parsedItems.length > 0) { + console.log(`找到 ${searchResult.parsedItems.length} 本漫画`); + searchResult.parsedItems.slice(0, 5).forEach((book: any, i: number) => { + console.log(` [${i + 1}] ${book.name} - ${book.bookUrl}`); + }); + bookUrl = searchResult.parsedItems[0].bookUrl || ''; + } else { + console.log('搜索日志:'); + searchResult.logs.forEach(log => { + console.log(` [${log.category}] ${log.message}`); + }); + } + console.log(''); + + // 2. 详情测试 + if (bookUrl) { + console.log('=== 2. 详情测试 ==='); + console.log(`URL: ${bookUrl}`); + const detailResult = await debugger_.debugBookInfo(bookUrl); + console.log(`详情结果: ${detailResult.success ? '成功' : '失败'}`); + + if (detailResult.success && detailResult.parsedItems?.length) { + const info = detailResult.parsedItems[0]; + console.log(` 书名: ${info.name || '(未获取)'}`); + console.log(` 作者: ${info.author || '(未获取)'}`); + const introStr = Array.isArray(info.intro) ? info.intro.join(' ') : String(info.intro || '(未获取)'); + console.log(` 简介: ${introStr.substring(0, 50)}...`); + } else { + console.log(` ⚠️ 详情获取失败`); + } + + // 显示详情日志 + console.log('\n详情解析日志:'); + detailResult.logs.slice(-10).forEach(log => { + console.log(` [${log.category}] ${log.message}`); + }); + console.log(''); + + // 3. 目录测试 - G站需要先获取API数据 + console.log('=== 3. 目录测试 ==='); + const tocResult = await debugger_.debugToc(bookUrl); + console.log(`目录结果: ${tocResult.success ? '成功' : '失败'}`); + + let chapterUrl = ''; + if (tocResult.parsedItems && tocResult.parsedItems.length > 0) { + console.log(`共 ${tocResult.parsedItems.length} 个章节`); + tocResult.parsedItems.slice(0, 5).forEach((chapter: any, i: number) => { + console.log(` [${i + 1}] ${chapter.name || '(无名称)'} - ${chapter.url || '(无URL)'}`); + if (i === 0) chapterUrl = chapter.url || ''; + }); + } else { + console.log('目录解析日志:'); + tocResult.logs.forEach(log => { + console.log(` [${log.category}] ${log.message}`); + }); + } + console.log(''); + + // 4. 正文测试 + if (chapterUrl) { + console.log('=== 4. 正文测试 ==='); + console.log(`章节URL: ${chapterUrl}`); + const contentResult = await debugger_.debugContent(chapterUrl); + console.log(`正文结果: ${contentResult.success ? '成功' : '失败'}`); + + if (contentResult.imageUrls && contentResult.imageUrls.length > 0) { + console.log(`图片数量: ${contentResult.imageUrls.length}`); + contentResult.imageUrls.slice(0, 3).forEach((url: string, i: number) => { + console.log(` [${i + 1}] ${url.substring(0, 80)}...`); + }); + } else { + console.log('正文解析日志:'); + contentResult.logs.forEach(log => { + console.log(` [${log.category}] ${log.message}`); + }); + } + } + } + + console.log('\n测试完成!'); +} + +testGStation().catch(console.error); diff --git a/test-js-debug.ts b/test-js-debug.ts new file mode 100644 index 0000000..6a0b0a6 --- /dev/null +++ b/test-js-debug.ts @@ -0,0 +1,65 @@ +/** + * 直接测试 JS 执行 + */ +import * as vm from 'vm'; + +// 模拟 executeJs 的简化版本 +function testExecuteJs(code: string, src: string) { + console.log('=== 测试 JS 执行 ==='); + console.log('代码:', code); + console.log('src 长度:', src.length); + + const variables: Record = {}; + + const sandbox: any = { + src, + result: null, + baseUrl: 'https://manhuafree.com', + java: { + put: (key: string, value: any) => { + variables[key] = value; + console.log(`java.put("${key}", "${value}")`); + }, + get: (key: string) => variables[key], + }, + console, + }; + + try { + const context = vm.createContext(sandbox); + const script = new vm.Script(code); + const result = script.runInContext(context, { timeout: 5000 }); + console.log('执行结果:', result); + console.log('variables:', variables); + return result; + } catch (e: any) { + console.log('执行错误:', e.message); + return null; + } +} + +// 测试用的 HTML +const html = `
    `; + +// 测试 1: 简单正则 +console.log('\n=== 测试 1: 简单正则 ==='); +testExecuteJs(` +var mid = src.match(/data-mid="(\\d+)"/)[1]; +mid; +`, html); + +// 测试 2: 带转义的正则 +console.log('\n=== 测试 2: 带转义的正则 ==='); +testExecuteJs(` +var mid = src.match(/data\\-mid\\="(\\d+)"/)[1]; +mid; +`, html); + +// 测试 3: 完整规则 +console.log('\n=== 测试 3: 完整规则 ==='); +testExecuteJs(` +var mid=src.match(/data\\-mid\\="(\\d+)"/)[1]; +java.put("mid",mid) +var r=\`https://api-get-v2.mgsearcher.com/api/manga/get?mid=\${mid}&mode=all\` +r; +`, html); diff --git a/test-js-exec.ts b/test-js-exec.ts new file mode 100644 index 0000000..9fdbf0b --- /dev/null +++ b/test-js-exec.ts @@ -0,0 +1,42 @@ +/** + * 测试 JS 执行 + */ +import * as vm from 'vm'; + +const code = ` +var mid=src.match(/data\\-mid\\="(\\d+)"/)[1]; +java.put("mid",mid) +var r=\`https://api-get-v2.mgsearcher.com/api/manga/get?mid=\${mid}&mode=all\` +r; +`; + +const src = `
    `; + +console.log('代码:', code); +console.log('src:', src); + +const variables: Record = {}; + +const sandbox = { + src, + result: null, + baseUrl: 'https://manhuafree.com', + java: { + put: (key: string, value: any) => { + variables[key] = value; + console.log(`java.put("${key}", "${value}")`); + }, + get: (key: string) => variables[key], + }, + console, +}; + +try { + const context = vm.createContext(sandbox); + const script = new vm.Script(code); + const result = script.runInContext(context); + console.log('\n执行结果:', result); + console.log('variables:', variables); +} catch (e: any) { + console.log('执行错误:', e.message); +} diff --git a/test-keywords.ts b/test-keywords.ts new file mode 100644 index 0000000..f545b90 --- /dev/null +++ b/test-keywords.ts @@ -0,0 +1,27 @@ +/** + * 测试不同关键词 + */ +import { httpRequest } from './src/main/debug/http-client'; + +const tests = [ + { name: '武芊漫画', url: 'https://comic.mkzcdn.com/search/keyword/?keyword=一人之下&page_num=1&page_size=20' }, + { name: '好看漫画', url: 'https://www.9comic.cn/comic22/so/comic?keyword=一人之下&p=&ver=2.0' }, + { name: '知音漫客', url: 'https://m.zymk.cn/sort/all.html?key=斗罗' }, + { name: '漫客栈子', url: 'https://comic.mkzhan.com/search/keyword/?keyword=一人之下&page_num=1&page_size=20' }, + { name: '快看漫画', url: 'https://search.kkmh.com/search/complex?q=一人之下' }, +]; + +async function test() { + for (const t of tests) { + console.log(`\n${t.name}: ${t.url.substring(0, 60)}...`); + const result = await httpRequest({ url: t.url }); + if (result.success) { + console.log(` 状态: ${result.statusCode}, 长度: ${result.body?.length}`); + console.log(` 预览: ${result.body?.substring(0, 200)}`); + } else { + console.log(` 失败: ${result.error}`); + } + } +} + +test().catch(console.error); diff --git a/test-mhua-chapter.ts b/test-mhua-chapter.ts new file mode 100644 index 0000000..938a2dc --- /dev/null +++ b/test-mhua-chapter.ts @@ -0,0 +1,77 @@ +/** + * 调试漫画屋章节URL + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; +import { parseList, parseFromElement, ParseContext } from './src/main/debug/rule-parser'; + +async function test() { + const detailUrl = 'https://www.mhua5.com/index.php/comic/doupocangkong'; + const result = await httpRequest({ + url: detailUrl, + headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 9) AppleWebKit/537.36' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const $ = cheerio.load(result.body || ''); + + // 查找章节列表结构 + console.log('=== 章节列表结构 ==='); + console.log('.clearfix:', $('.clearfix').length); + console.log('.clearfix li:', $('.clearfix li').length); + console.log('.clearfix li a:', $('.clearfix li a').length); + + // 打印第一个 li 的结构 + const firstLi = $('.clearfix li').first(); + console.log('\n第一个 li HTML:'); + console.log(firstLi.html()); + + // 测试规则 + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://www.mhua5.com', + variables: {} + }; + + // 规则: -class.clearfix@li + console.log('\n=== 测试规则 ==='); + const rules = [ + '-class.clearfix@li', + '-class.clearfix@tag.li', + '.clearfix li', + 'ul.clearfix li', + ]; + + for (const rule of rules) { + const elements = parseList(ctx, rule); + console.log(`\n规则 "${rule}": ${elements.length} 个元素`); + + if (elements.length > 0) { + const firstEl = elements[0]; + + // 测试从元素中获取 href + const urlRules = [ + 'tag.a@href', + 'a@href', + '@href', + 'href', + ]; + + for (const urlRule of urlRules) { + const urlResult = parseFromElement(firstEl, urlRule, 'https://www.mhua5.com', {}); + console.log(` URL规则 "${urlRule}": ${urlResult.success ? urlResult.data : '失败 - ' + urlResult.error}`); + } + + // 打印元素HTML + if (firstEl.html) { + console.log(` 元素HTML: ${firstEl.html()?.substring(0, 200)}`); + } + } + } +} + +test().catch(console.error); diff --git a/test-mhua-structure.ts b/test-mhua-structure.ts new file mode 100644 index 0000000..1c1ac22 --- /dev/null +++ b/test-mhua-structure.ts @@ -0,0 +1,76 @@ +/** + * 分析漫画屋页面结构 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; + +async function test() { + const detailUrl = 'https://www.mhua5.com/index.php/comic/doupocangkong'; + const result = await httpRequest({ + url: detailUrl, + headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 9) AppleWebKit/537.36' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const $ = cheerio.load(result.body || ''); + + // 查找包含章节链接的区域 + console.log('=== 查找章节区域 ==='); + + // 查找所有包含 /index.php/chapter/ 的链接 + const chapterLinks = $('a[href*="/chapter/"]'); + console.log('章节链接数量:', chapterLinks.length); + + if (chapterLinks.length > 0) { + console.log('\n前5个章节链接:'); + chapterLinks.slice(0, 5).each((i, el) => { + console.log(` [${i + 1}] ${$(el).text().trim()} - ${$(el).attr('href')}`); + }); + + // 查找父元素 + const firstLink = chapterLinks.first(); + const parent = firstLink.parent(); + const grandParent = parent.parent(); + + console.log('\n链接的父元素:'); + console.log(' parent tag:', parent.prop('tagName')); + console.log(' parent class:', parent.attr('class')); + console.log(' grandParent tag:', grandParent.prop('tagName')); + console.log(' grandParent class:', grandParent.attr('class')); + } + + // 查找 chapter-list 或类似的类 + console.log('\n=== 查找章节列表容器 ==='); + const containers = [ + '.chapter-list', + '.chapters', + '.comic-chapters', + '[class*="chapter"]', + '.list-wrap', + ]; + + for (const sel of containers) { + const els = $(sel); + if (els.length > 0) { + console.log(`${sel}: ${els.length} 个`); + console.log(` 子元素 a 数量: ${els.find('a').length}`); + } + } + + // 打印页面中所有 ul 的类名和 li 数量 + console.log('\n=== 所有 ul 元素 ==='); + $('ul').each((i, el) => { + const cls = $(el).attr('class') || '(无类名)'; + const liCount = $(el).children('li').length; + const aCount = $(el).find('a[href*="/chapter/"]').length; + if (aCount > 0) { + console.log(` ul.${cls}: ${liCount} 个 li, ${aCount} 个章节链接`); + } + }); +} + +test().catch(console.error); diff --git a/test-multiple-sources.ts b/test-multiple-sources.ts new file mode 100644 index 0000000..a4f3e15 --- /dev/null +++ b/test-multiple-sources.ts @@ -0,0 +1,238 @@ +/** + * 多图源测试 + * 测试最新的异次元图源 + */ +import { YiciyuanDebugger, isYiciyuanSource } from './src/main/debug/yiciyuan-debugger'; + +// 测试图源列表 +const testSources = [ + { + name: "包子漫画cn", + source: { + "bookSourceName": "包子漫画cn", + "bookSourceUrl": "https://cn.bzmanga.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://cn.bzmanga.com/search?q=searchKey", + "ruleSearchList": ".comics-card", + "ruleSearchName": ".comics-card__title@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "amp-img@src", + "ruleBookName": "h1.comics-detail__title@text", + "ruleBookAuthor": "h2.comics-detail__author@text", + "ruleIntroduce": "p.comics-detail__desc@text", + "ruleCoverUrl": ".pure-u-1-1 amp-img@src", + "ruleChapterList": ".comics-chapters__item", + "ruleChapterName": "text", + "ruleContentUrl": "a@href", + "ruleBookContent": "amp-img@src" + }, + keyword: "海贼王" + }, + { + name: "如漫画", + source: { + "bookSourceName": "如漫画", + "bookSourceUrl": "http://rumanhua1.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", + "ruleSearchUrl": "http://rumanhua1.com/s@k=searchKey", + "ruleSearchList": "$.data[*]", + "ruleSearchName": ".name", + "ruleSearchNoteUrl": "http://rumanhua1.com/{$.id}", + "ruleSearchCoverUrl": ".imgurl", + "ruleSearchAuthor": ".authorName", + "ruleBookName": "tag.h1@text", + "ruleBookAuthor": "tag.p.2@text", + "ruleIntroduce": ".cartoon-introduction@text", + "ruleCoverUrl": ".book-cover img@data-src", + "ruleChapterList": ".chaplist-box a", + "ruleChapterName": "text", + "ruleContentUrl": "@href", + "ruleBookContent": ".readerContainer img@src" + }, + keyword: "斗罗" + }, + { + name: "鸟鸟韩漫", + source: { + "bookSourceName": "鸟鸟韩漫", + "bookSourceUrl": "https://nnhanman5.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Safari/537.36", + "ruleSearchUrl": "https://nnhanman5.com/catalog.php?key=searchKey", + "ruleSearchList": "class.comic-list .comic-item", + "ruleSearchName": "class.comic-title@text", + "ruleSearchNoteUrl": "tag.a@href", + "ruleSearchCoverUrl": "class.comic-cover img@data-src|src", + "ruleBookName": "tag.h1@text", + "ruleIntroduce": "class.comic-desc@text", + "ruleBookKind": "class.tag-list a@text", + "ruleCoverUrl": "class.comic-cover img@src", + "ruleChapterList": "class.chapter-list li a", + "ruleChapterName": "text", + "ruleContentUrl": "@js:baseUrl", + "ruleBookContent": "class.image-list img@data-src|src" + }, + keyword: "漫画" + }, + { + name: "G站漫画", + source: { + "bookSourceName": "◯ G站", + "bookSourceUrl": "https://m.g-mh.org", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", + "ruleSearchUrl": "https://m.g-mh.org/s/searchKey", + "ruleSearchList": ".slicarda&&.pb-2", + "ruleSearchName": "h3@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": "img@src", + "ruleBookAuthor": ".text-small@a@text", + "ruleIntroduce": ".line-clamp-4@text", + "ruleBookKind": ".text-sm@.p-1@text", + "ruleChapterUrl": "@js:\nid = \"#bookmarkData\"; ai = \"data-mid\";\ni = org.jsoup.Jsoup.parse(result).select(id).attr(ai);\np = \"https://api-get-v2.mgsearcher.com/api/\";\nu = p + \"manga/get?mid=\" + i + \"&mode=all\";\njava.put(\"id\", i);\nu", + "ruleChapterList": "data.chapters", + "ruleChapterName": "$.attributes.title", + "ruleContentUrl": "$.id\n@js:\np = \"https://api-get-v2.mgsearcher.com/api/\";\na = \"chapter/getinfo?m=\" + java.get(\"id\") + \"&c=\";\nu = p + a + result;\nu", + "ruleBookContent": "@js:\nsrc = JSON.parse(result).data.info.images.images;\np = \"https://f40-1-4.g-mh.online\";\nimg = src.map(i => p + i.url);\nimg" + }, + keyword: "火影" + }, + { + name: "WNACG", + source: { + "bookSourceName": "WNACG", + "bookSourceUrl": "https://www.wnacg.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Safari/537.36", + "ruleSearchUrl": "https://www.wnacg.com/search/index.php?sname=searchKey&page=searchPage", + "ruleSearchList": "css:.gallary_item", + "ruleSearchName": "css:.title@text", + "ruleSearchNoteUrl": "css:a@href", + "ruleSearchCoverUrl": "css:.pic_box img@src", + "ruleSearchAuthor": "css:.info@text", + "ruleBookName": "css:h2.uwconn@text", + "ruleBookAuthor": "css:.uwuinfo li:nth-child(1)@text", + "ruleIntroduce": "css:.uwuinfo@text", + "ruleCoverUrl": "css:.uwthumb img@src", + "ruleChapterList": "css:.pic_box a", + "ruleChapterName": "attr:title", + "ruleContentUrl": "attr:href", + "ruleBookContent": "css:.pic_box img@src" + }, + keyword: "原神" + } +]; + +async function testSource(item: { name: string; source: any; keyword: string }) { + console.log('\n' + '═'.repeat(60)); + console.log(`📚 ${item.name}`); + console.log(`🔗 ${item.source.bookSourceUrl}`); + console.log('═'.repeat(60)); + + // 检测源格式 + const isYiciyuan = isYiciyuanSource(item.source); + console.log(`📋 格式: ${isYiciyuan ? '异次元图源 ✓' : 'Legado图源'}`); + + if (!isYiciyuan) { + console.log('⚠️ 跳过非异次元图源'); + return { name: item.name, success: false, reason: '非异次元格式' }; + } + + const debugger_ = new YiciyuanDebugger(item.source); + + try { + // 搜索测试 + console.log(`\n🔍 搜索: "${item.keyword}"`); + const searchResult = await debugger_.debugSearch(item.keyword); + + if (!searchResult.success) { + console.log(`❌ 搜索失败: ${searchResult.error}`); + return { name: item.name, success: false, reason: searchResult.error }; + } + + const bookCount = searchResult.parsedItems?.length || 0; + console.log(`✅ 找到 ${bookCount} 本漫画`); + + if (bookCount > 0) { + // 显示前3个结果 + searchResult.parsedItems!.slice(0, 3).forEach((book: any, i: number) => { + console.log(` [${i + 1}] ${book.name || '(无名称)'}`); + }); + + // 测试详情 + const firstBook = searchResult.parsedItems![0]; + if (firstBook.bookUrl) { + console.log(`\n📖 详情测试: ${firstBook.name}`); + const detailResult = await debugger_.debugBookInfo(firstBook.bookUrl); + + if (detailResult.success && detailResult.parsedItems?.length) { + const info = detailResult.parsedItems[0]; + console.log(` 书名: ${info.name || '(未获取)'}`); + console.log(` 作者: ${info.author || '(未获取)'}`); + console.log(` 简介: ${(info.intro || '(未获取)').substring(0, 50)}...`); + } else { + console.log(` ⚠️ 详情获取失败`); + } + + // 测试目录 + console.log(`\n📑 目录测试`); + const tocResult = await debugger_.debugToc(firstBook.bookUrl); + + if (tocResult.success && tocResult.parsedItems?.length) { + console.log(` ✅ 共 ${tocResult.parsedItems.length} 个章节`); + tocResult.parsedItems.slice(0, 3).forEach((ch: any, i: number) => { + console.log(` [${i + 1}] ${ch.name || '(无名称)'}`); + }); + } else { + console.log(` ⚠️ 目录获取失败`); + } + } + } + + return { name: item.name, success: true, bookCount }; + } catch (error: any) { + console.log(`❌ 异常: ${error.message}`); + return { name: item.name, success: false, reason: error.message }; + } +} + +async function main() { + console.log('╔════════════════════════════════════════════════════════════╗'); + console.log('║ 异次元图源批量测试 ║'); + console.log('║ 测试时间: ' + new Date().toLocaleString() + ' ║'); + console.log('╚════════════════════════════════════════════════════════════╝'); + + const results: any[] = []; + + for (const item of testSources) { + const result = await testSource(item); + results.push(result); + } + + // 汇总结果 + console.log('\n'); + console.log('╔════════════════════════════════════════════════════════════╗'); + console.log('║ 测试结果汇总 ║'); + console.log('╠════════════════════════════════════════════════════════════╣'); + + let successCount = 0; + for (const r of results) { + const status = r.success ? '✅' : '❌'; + const detail = r.success ? `${r.bookCount} 本` : r.reason?.substring(0, 20) || '失败'; + console.log(`║ ${status} ${r.name.padEnd(15)} ${detail.padEnd(30)} ║`); + if (r.success) successCount++; + } + + console.log('╠════════════════════════════════════════════════════════════╣'); + console.log(`║ 总计: ${successCount}/${results.length} 个图源测试通过 ║`); + console.log('╚════════════════════════════════════════════════════════════╝'); +} + +main().catch(console.error); diff --git a/test-parse-list.ts b/test-parse-list.ts new file mode 100644 index 0000000..7bd5e55 --- /dev/null +++ b/test-parse-list.ts @@ -0,0 +1,140 @@ +/** + * 测试 parseList 函数 + */ +import { parseList, ParseContext, parseFromElement } from './src/main/debug/rule-parser'; +import { httpRequest } from './src/main/debug/http-client'; + +async function testTencentParsing() { + console.log('═══════════════════════════════════════════════════════════'); + console.log(' 测试腾讯漫画规则解析'); + console.log('═══════════════════════════════════════════════════════════\n'); + + const url = 'https://m.ac.qq.com/search/result?word=斗破苍穹'; + + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0' + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://m.ac.qq.com', + variables: {} + }; + + // 测试不同的列表规则 + const listRules = [ + 'class.comic-item', + '.comic-item', + 'tag.div@class.comic-item', + ]; + + for (const rule of listRules) { + console.log(`\n--- 测试规则: "${rule}" ---`); + const elements = parseList(ctx, rule); + console.log(`结果数量: ${elements.length}`); + + if (elements.length > 0) { + // 测试从元素中解析字段 + const firstEl = elements[0]; + console.log('第一个元素类型:', typeof firstEl); + + // 测试名称解析 + const nameRules = [ + 'class.comic-title@text', + '.comic-title@text', + 'tag.p@class.comic-title@text' + ]; + + for (const nameRule of nameRules) { + const nameResult = parseFromElement(firstEl, nameRule, 'https://m.ac.qq.com', {}); + console.log(` 名称规则 "${nameRule}": ${nameResult.success ? nameResult.data : '失败'}`); + } + + // 测试链接解析 + const urlRules = [ + 'class.comic-link@href', + '.comic-link@href', + 'tag.a@class.comic-link@href' + ]; + + for (const urlRule of urlRules) { + const urlResult = parseFromElement(firstEl, urlRule, 'https://m.ac.qq.com', {}); + console.log(` 链接规则 "${urlRule}": ${urlResult.success ? urlResult.data : '失败'}`); + } + } + } +} + +async function testZymkParsing() { + console.log('\n\n═══════════════════════════════════════════════════════════'); + console.log(' 测试知音漫客规则解析'); + console.log('═══════════════════════════════════════════════════════════\n'); + + // 知音漫客的搜索页面需要特殊处理 + // 先获取分类页面测试 + const url = 'https://m.zymk.cn/sort/all.html'; + + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36' + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + console.log('响应长度:', result.body?.length); + + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://m.zymk.cn', + variables: {} + }; + + // 测试不同的列表规则 + const listRules = [ + 'class.comic-sort@tag.li', + '.comic-sort li', + 'ul.comic-sort li', + 'class.order-list@tag.li', + '.order-list li', + 'tag.ul@tag.li' + ]; + + for (const rule of listRules) { + console.log(`\n--- 测试规则: "${rule}" ---`); + const elements = parseList(ctx, rule); + console.log(`结果数量: ${elements.length}`); + } + + // 打印页面中的 ul 和 li 结构 + console.log('\n--- 页面结构分析 ---'); + const cheerio = await import('cheerio'); + const $ = cheerio.load(result.body || ''); + + $('ul').each((i, ul) => { + const cls = $(ul).attr('class') || '(无类名)'; + const liCount = $(ul).find('li').length; + if (liCount > 0) { + console.log(`ul.${cls}: ${liCount} 个 li`); + } + }); +} + +async function main() { + await testTencentParsing(); + await testZymkParsing(); +} + +main().catch(console.error); diff --git a/test-parse-or.ts b/test-parse-or.ts new file mode 100644 index 0000000..6340f6b --- /dev/null +++ b/test-parse-or.ts @@ -0,0 +1,67 @@ +/** + * 测试 parseList 对 || 分隔符的处理 + */ +import { parseList, ParseContext } from './src/main/debug/rule-parser'; + +// 好看漫画的响应 +const jsonBody = `{"code":200,"msg":"success","time":1764815363,"data":{"type":2,"name":"搜索","list":[{"id":130,"title":"高术通神","author":"仟绘动漫"}]}}`; + +const ctx: ParseContext = { + body: jsonBody, + baseUrl: 'https://www.9comic.cn', + variables: {} +}; + +const rules = [ + '$..list[*]', + '$.data[*]', + '$..list[*]||$.data[*]', + '@json:$..list[*]', + '@json:$.data.list[*]', +]; + +console.log('=== JSON 解析测试 ==='); +console.log('JSON:', jsonBody.substring(0, 100)); + +for (const rule of rules) { + const items = parseList(ctx, rule); + console.log(`\n规则 "${rule}":`); + console.log(` 结果数量: ${items.length}`); + if (items.length > 0) { + console.log(` 第一项: ${JSON.stringify(items[0]).substring(0, 100)}`); + } +} + +// 酸奶漫画的 HTML +const htmlBody = ` + +`; + +const htmlCtx: ParseContext = { + body: htmlBody, + baseUrl: 'https://m.1kkk.com', + variables: {} +}; + +const htmlRules = [ + 'ul.book-list@tag.li', + '.book-list li', + 'class.book-list@tag.li', + '.book-list .item', +]; + +console.log('\n\n=== HTML 解析测试 ==='); +console.log('HTML:', htmlBody.substring(0, 100)); + +for (const rule of htmlRules) { + const items = parseList(htmlCtx, rule); + console.log(`\n规则 "${rule}":`); + console.log(` 结果数量: ${items.length}`); +} diff --git a/test-parse-rule-debug.ts b/test-parse-rule-debug.ts new file mode 100644 index 0000000..bc645cb --- /dev/null +++ b/test-parse-rule-debug.ts @@ -0,0 +1,45 @@ +/** + * 直接调试 parseRule + */ +import { httpRequest } from './src/main/debug/http-client'; +import { parseRule, ParseContext, splitRule } from './src/main/debug/rule-parser'; + +async function test() { + const url = 'https://manhuafree.com/manga/doupocangqiong-zhiyinmankerenxiang'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + console.log('响应长度:', body.length); + console.log('包含 data-mid:', body.includes('data-mid')); + + // 测试 splitRule + const rule = ` +var mid=src.match(/data\\-mid\\="(\\d+)"/)[1]; +java.put("mid",mid) +var r=\`https://api-get-v2.mgsearcher.com/api/manga/get?mid=\${mid}&mode=all\` +r; +`; + + console.log('\n规则:', rule); + + const splitResult = splitRule(rule); + console.log('\nsplitRule 结果:', splitResult); + + // 测试 parseRule + const ctx: ParseContext = { + body, + baseUrl: url, + variables: {} + }; + + console.log('\n调用 parseRule...'); + const parseResult = parseRule(ctx, rule); + console.log('parseRule 结果:', parseResult); +} + +test().catch(console.error); diff --git a/test-parselist-debug.ts b/test-parselist-debug.ts new file mode 100644 index 0000000..c59ef12 --- /dev/null +++ b/test-parselist-debug.ts @@ -0,0 +1,86 @@ +/** + * 调试 parseList 函数 + */ +import * as cheerio from 'cheerio'; +import { httpRequest } from './src/main/debug/http-client'; + +// 复制 splitRule 函数 +function splitRule(rule: string): { rules: string[]; operator: 'and' | 'or' | 'none' } { + // 检查是否有 || 或 && 分隔符 + if (rule.includes('||')) { + return { rules: rule.split('||').map(r => r.trim()), operator: 'or' }; + } + if (rule.includes('&&')) { + return { rules: rule.split('&&').map(r => r.trim()), operator: 'and' }; + } + return { rules: [rule], operator: 'none' }; +} + +// 复制 selectWithLegadoSyntax 的 class. 部分 +function selectClass($: cheerio.CheerioAPI, $el: cheerio.Cheerio, selector: string): cheerio.Cheerio { + const afterClass = selector.substring(6); + + let className = afterClass; + let indexPart: string | null = null; + + const indexMatch = afterClass.match(/\.(-?\d+|\[.+\])$/); + if (indexMatch) { + className = afterClass.substring(0, afterClass.length - indexMatch[0].length); + indexPart = indexMatch[1]; + } + + const classSelector = className.split(/\s+/).map(c => `.${c}`).join(''); + console.log(' selectClass - className:', className, 'classSelector:', classSelector); + + const found = $el.find(classSelector); + console.log(' selectClass - found:', found.length); + + return found; +} + +async function test() { + const result = await httpRequest({ + url: 'https://m.ac.qq.com/search/result?word=斗破苍穹', + headers: { + 'User-Agent': 'Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0' + } + }); + + const body = result.body || ''; + const actualRule = 'class.comic-item'; + + console.log('=== 模拟 parseList 执行 ===\n'); + console.log('规则:', actualRule); + + const $ = cheerio.load(body); + + const { rules, operator } = splitRule(actualRule); + console.log('splitRule 结果:', { rules, operator }); + + for (const r of rules) { + console.log('\n处理规则:', r); + + const parts = r.split('@'); + console.log('parts:', parts); + + let $current: cheerio.Cheerio = $.root(); + console.log('初始 $current 长度:', $current.length); + + for (const part of parts) { + if (!part) continue; + console.log('\n处理 part:', part); + + if (part.startsWith('class.')) { + $current = selectClass($, $current, part); + } else { + $current = $current.find(part); + } + + console.log('处理后 $current 长度:', $current.length); + } + + console.log('\n最终结果数量:', $current.length); + } +} + +test().catch(console.error); diff --git a/test-parselist-debug2.ts b/test-parselist-debug2.ts new file mode 100644 index 0000000..d62cad2 --- /dev/null +++ b/test-parselist-debug2.ts @@ -0,0 +1,59 @@ +/** + * 调试 parseList 对 ul.book-list@tag.li 的处理 + */ +import * as cheerio from 'cheerio'; +import { parseList, ParseContext } from './src/main/debug/rule-parser'; + +const html = ` + +`; + +const ctx: ParseContext = { + body: html, + baseUrl: 'https://example.com', + variables: {} +}; + +const rules = [ + 'ul.book-list@tag.li', + 'ul.book-list li', + '.book-list@tag.li', + 'class.book-list@tag.li', +]; + +console.log('=== parseList 测试 ==='); +for (const rule of rules) { + const items = parseList(ctx, rule); + console.log(`规则 "${rule}": ${items.length} 个元素`); +} + +// 手动测试 @ 分割 +console.log('\n=== @ 分割测试 ==='); +const rule = 'ul.book-list@tag.li'; +const parts = rule.split('@'); +console.log('parts:', parts); + +const $ = cheerio.load(html); +let $current: cheerio.Cheerio = $.root(); + +for (const part of parts) { + console.log(`处理 part: "${part}"`); + console.log(` 当前元素数量: ${$current.length}`); + + // 模拟 selectWithLegadoSyntax + if (part.startsWith('tag.')) { + const tag = part.substring(4); + $current = $current.find(tag); + console.log(` tag.${tag} -> find("${tag}"): ${$current.length}`); + } else { + $current = $current.find(part); + console.log(` find("${part}"): ${$current.length}`); + } +} diff --git a/test-parselist-trace.ts b/test-parselist-trace.ts new file mode 100644 index 0000000..4f1af16 --- /dev/null +++ b/test-parselist-trace.ts @@ -0,0 +1,125 @@ +/** + * 追踪 parseList 执行过程 + */ +import * as cheerio from 'cheerio'; + +const html = ` + +`; + +// 复制 parseList 的逻辑并添加调试 +function parseListDebug(body: string, rule: string) { + console.log(`\n=== parseList("${rule}") ===`); + + if (!rule || !rule.trim()) { + console.log(' -> 规则为空'); + return []; + } + + let shouldReverse = false; + let actualRule = rule.trim(); + + // 检查是否需要倒置列表 + if (actualRule.startsWith('-')) { + shouldReverse = true; + actualRule = actualRule.substring(1).trim(); + console.log(' -> 需要倒置'); + } + + let results: any[] = []; + + // 正则 AllInOne 模式 + if (actualRule.startsWith(':')) { + console.log(' -> 正则 AllInOne 模式'); + return []; + } + + // 先处理 || 分隔符 + if (actualRule.includes('||') && !actualRule.includes('@js:')) { + console.log(' -> || 分隔符模式'); + return []; + } + + // JSON 列表检测 + const legadoPrefixes = ['class.', 'id.', 'tag.', 'text.']; + const isLegadoSyntax = legadoPrefixes.some(prefix => actualRule.startsWith(prefix)); + const isJsonPath = actualRule.startsWith('@json:') || actualRule.startsWith('$.') || + (!isLegadoSyntax && /^[a-zA-Z_]\w*\./.test(actualRule)); + + console.log(` -> isLegadoSyntax: ${isLegadoSyntax}`); + console.log(` -> isJsonPath: ${isJsonPath}`); + + if (isJsonPath) { + console.log(' -> JSON 路径模式'); + return []; + } + + // CSS 列表 + console.log(' -> CSS 列表模式'); + const $ = cheerio.load(body); + + // splitRule + let splitRules = [actualRule]; + let operator = 'or'; + if (actualRule.includes('||')) { + splitRules = actualRule.split('||'); + operator = 'or'; + } else if (actualRule.includes('&&')) { + splitRules = actualRule.split('&&'); + operator = 'and'; + } + console.log(` -> splitRules: ${JSON.stringify(splitRules)}, operator: ${operator}`); + + for (const r of splitRules) { + const ruleElements: cheerio.Cheerio[] = []; + + // 使用 @ 分割 + const parts = r.split('@'); + console.log(` -> parts: ${JSON.stringify(parts)}`); + + let $current: cheerio.Cheerio = $.root(); + console.log(` -> 初始 $current.length: ${$current.length}`); + + for (const part of parts) { + if (!part) continue; + console.log(` -> 处理 part: "${part}"`); + + // 模拟 selectWithLegadoSyntax + if (part.startsWith('class.')) { + const afterClass = part.substring(6); + const classSelector = afterClass.split(/\s+/).map(c => `.${c}`).join(''); + $current = $current.find(classSelector); + console.log(` -> class.xxx: find("${classSelector}"): ${$current.length}`); + } else if (part.startsWith('tag.')) { + const tag = part.substring(4).split('.')[0]; + $current = $current.find(tag); + console.log(` -> tag.xxx: find("${tag}"): ${$current.length}`); + } else { + $current = $current.find(part); + console.log(` -> CSS: find("${part}"): ${$current.length}`); + } + } + + $current.each((_, el) => { + ruleElements.push($(el)); + }); + + console.log(` -> ruleElements.length: ${ruleElements.length}`); + results = ruleElements; + } + + return results; +} + +// 测试 +parseListDebug(html, 'ul.book-list'); +parseListDebug(html, 'ul.book-list@tag.li'); +parseListDebug(html, '.book-list@tag.li'); +parseListDebug(html, 'class.book-list@tag.li'); diff --git a/test-process-js-rule.ts b/test-process-js-rule.ts new file mode 100644 index 0000000..9981f04 --- /dev/null +++ b/test-process-js-rule.ts @@ -0,0 +1,119 @@ +/** + * 直接测试 processJsRule 和 executeJs + */ +import * as vm from 'vm'; + +// 简化版 executeJs +function executeJs( + code: string, + context: { + result: any; + src: string; + baseUrl: string; + variables: Record; + } +): any { + try { + console.log('[executeJs] 代码长度:', code.length); + console.log('[executeJs] src 长度:', context.src.length); + + const sandbox: any = { + result: context.result, + src: context.src, + baseUrl: context.baseUrl, + java: { + put: (key: string, value: any) => { + context.variables[key] = value; + }, + get: (key: string) => context.variables[key], + }, + console, + }; + + const vmContext = vm.createContext(sandbox); + const script = new vm.Script(code); + const result = script.runInContext(vmContext, { timeout: 5000 }); + console.log('[executeJs] 结果:', result); + return result; + } catch (error: any) { + console.error('[executeJs] 错误:', error.message); + return null; + } +} + +// 简化版 processJsRule +function processJsRule( + rule: string, + context: { + result: any; + src: string; + baseUrl: string; + variables: Record; + } +): { processed: string; hasJs: boolean; jsResult: any } { + let processed = rule; + let hasJs = false; + let jsResult: any = null; + + console.log('[processJsRule] 输入规则长度:', rule.length); + console.log('[processJsRule] 输入规则预览:', rule.substring(0, 100)); + + // 处理 ... + const jsTagRegex = /([\s\S]*?)<\/js>/gi; + let match; + while ((match = jsTagRegex.exec(rule)) !== null) { + hasJs = true; + const jsCode = match[1]; + console.log('[processJsRule] 提取 JS 代码长度:', jsCode.length); + console.log('[processJsRule] 提取 JS 代码预览:', jsCode.substring(0, 100)); + jsResult = executeJs(jsCode, context); + console.log('[processJsRule] JS 执行结果:', jsResult); + processed = processed.replace( + match[0], + jsResult !== null ? String(jsResult) : '' + ); + } + + console.log('[processJsRule] hasJs:', hasJs); + console.log('[processJsRule] jsResult:', jsResult); + console.log('[processJsRule] processed:', processed.substring(0, 100)); + + return { processed, hasJs, jsResult }; +} + +// 测试 +import { httpRequest } from './src/main/debug/http-client'; + +async function test() { + const url = 'https://manhuafree.com/manga/doupocangqiong-zhiyinmankerenxiang'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + console.log('响应长度:', body.length); + + const rule = ` +var mid=src.match(/data\\-mid\\="(\\d+)"/)[1]; +java.put("mid",mid) +var r=\`https://api-get-v2.mgsearcher.com/api/manga/get?mid=\${mid}&mode=all\` +r; +`; + + console.log('\n规则:', rule); + + const context = { + result: null, + src: body, + baseUrl: url, + variables: {} + }; + + const processResult = processJsRule(rule, context); + console.log('\n最终结果:', processResult); +} + +test().catch(console.error); diff --git a/test-process-js.ts b/test-process-js.ts new file mode 100644 index 0000000..e029a44 --- /dev/null +++ b/test-process-js.ts @@ -0,0 +1,54 @@ +/** + * 测试 processJsRule + */ + +// 模拟 processJsRule +function processJsRule(rule: string) { + let processed = rule; + let hasJs = false; + let jsResult: any = null; + + // 处理 ... + const jsTagRegex = /([\s\S]*?)<\/js>/gi; + let match; + while ((match = jsTagRegex.exec(rule)) !== null) { + hasJs = true; + const jsCode = match[1]; + console.log('提取的 JS 代码:', JSON.stringify(jsCode)); + console.log('匹配的完整内容:', JSON.stringify(match[0])); + // jsResult = executeJs(jsCode, context); + jsResult = 'MOCK_RESULT'; + processed = processed.replace( + match[0], + jsResult !== null ? String(jsResult) : '' + ); + } + + return { processed, hasJs, jsResult }; +} + +// 测试规则 +const rule1 = ` +var mid = src.match(/data-mid="(\\d+)"/)[1]; +java.put("mid", mid); +"https://api-get-v2.mgsearcher.com/api/manga/get?mid=" + mid + "&mode=all"; +`; + +console.log('=== 测试规则 1 ==='); +console.log('输入:', JSON.stringify(rule1)); +const result1 = processJsRule(rule1); +console.log('结果:', result1); + +const rule2 = ` + +var mid=src.match(/data\\-mid\\="(\\d+)"/)[1]; +java.put("mid",mid) +var r=\`https://api-get-v2.mgsearcher.com/api/manga/get?mid=\${mid}&mode=all\` +r; + +`; + +console.log('\n=== 测试规则 2 ==='); +console.log('输入:', JSON.stringify(rule2)); +const result2 = processJsRule(rule2); +console.log('结果:', result2); diff --git a/test-qmmh.ts b/test-qmmh.ts new file mode 100644 index 0000000..be53c20 --- /dev/null +++ b/test-qmmh.ts @@ -0,0 +1,36 @@ +/** + * 测试全免漫画 API + */ +import { httpRequest } from './src/main/debug/http-client'; + +async function test() { + const url = 'https://api-cdn.kaimanhua.com/comic-api/v2/comic/getcomicdata?comic_id=86351&client-type=android&productname=qmmh&client-channel=xiaomi&platformname=android&client-version=1.4.8'; + + console.log('请求:', url); + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'okhttp/4.9.1', + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + console.log('响应长度:', result.body?.length); + console.log('响应预览:', result.body?.substring(0, 500)); + + // 尝试解析 JSON + try { + const json = JSON.parse(result.body || '{}'); + console.log('\nJSON keys:', Object.keys(json)); + console.log('data keys:', Object.keys(json.data || {})); + console.log('chapters:', json.data?.chapters?.length); + } catch (e: any) { + console.log('JSON 解析失败:', e.message); + } +} + +test().catch(console.error); diff --git a/test-quick.ts b/test-quick.ts new file mode 100644 index 0000000..1b421a2 --- /dev/null +++ b/test-quick.ts @@ -0,0 +1,148 @@ +/** + * 快速测试多个书源 + */ +import * as fs from 'fs'; +import { SourceDebugger } from './src/main/debug/source-debugger'; + +interface TestResult { + index: number; + name: string; + search: boolean; + detail: boolean; + toc: boolean; + content: boolean; + error?: string; +} + +async function testSource(source: any, index: number, keyword: string): Promise { + const result: TestResult = { + index: index + 1, + name: source.bookSourceName || `书源${index}`, + search: false, + detail: false, + toc: false, + content: false, + }; + + const debugger_ = new SourceDebugger(source); + const timeout = 15000; // 15秒超时 + + try { + // 搜索测试 + const searchPromise = debugger_.debugSearch(keyword); + const searchResult = await Promise.race([ + searchPromise, + new Promise((_, reject) => setTimeout(() => reject(new Error('搜索超时')), timeout)) + ]) as any; + + if (!searchResult.success || !searchResult.parsedItems?.length) { + result.error = searchResult.error || '无搜索结果'; + return result; + } + result.search = true; + + // 详情测试 + const bookUrl = searchResult.parsedItems[0].bookUrl; + const detailPromise = debugger_.debugBookInfo(bookUrl); + const detailResult = await Promise.race([ + detailPromise, + new Promise((_, reject) => setTimeout(() => reject(new Error('详情超时')), timeout)) + ]) as any; + + if (!detailResult.success) { + result.error = detailResult.error || '详情失败'; + return result; + } + result.detail = true; + + // 目录测试 + const tocUrl = detailResult.parsedItems?.[0]?.tocUrl || bookUrl; + const tocPromise = debugger_.debugToc(tocUrl); + const tocResult = await Promise.race([ + tocPromise, + new Promise((_, reject) => setTimeout(() => reject(new Error('目录超时')), timeout)) + ]) as any; + + if (!tocResult.success || !tocResult.parsedItems?.length) { + result.error = tocResult.error || '无章节'; + return result; + } + result.toc = true; + + // 正文测试 + const chapterUrl = tocResult.parsedItems[0]?.url; // 属性名是 url 不是 chapterUrl + if (!chapterUrl) { + result.error = '章节URL为空'; + return result; + } + const contentPromise = debugger_.debugContent(chapterUrl); + const contentResult = await Promise.race([ + contentPromise, + new Promise((_, reject) => setTimeout(() => reject(new Error('正文超时')), timeout)) + ]) as any; + + if (!contentResult.success) { + result.error = contentResult.error || '正文失败'; + return result; + } + + // 检查是否有内容(图片或文本) + const hasContent = contentResult.parsedItems?.some((item: any) => { + const content = item.content || item; + if (typeof content === 'string') { + return content.includes(' 50; + } + return false; + }); + + if (!hasContent && !contentResult.parsedItems?.length) { + result.error = '无图片'; + return result; + } + result.content = true; + + } catch (e: any) { + result.error = e.message; + } + + return result; +} + +async function main() { + const sourcesFile = 'shareBookSource(1).json'; + const sources = JSON.parse(fs.readFileSync(sourcesFile, 'utf8')); + + // 测试指定的书源索引 + const testIndices = [0, 4, 19, 22, 28, 33]; // 笔趣漫画, 名著阅读, 漫画吧网(WebView), 好看漫画, 酸奶漫画, 酸奶漫画2 + const keyword = '斗破'; + + console.log(`\n测试 ${testIndices.length} 个书源,关键词: ${keyword}\n`); + + const results: TestResult[] = []; + + for (const idx of testIndices) { + const source = sources[idx]; + console.log(`[${idx + 1}] ${source.bookSourceName}...`); + const result = await testSource(source, idx, keyword); + results.push(result); + + const status = result.content ? '✅' : result.toc ? '📖' : result.detail ? '📋' : result.search ? '🔍' : '❌'; + console.log(` ${status} ${result.error || '全部通过'}`); + } + + // 统计 + const passed = results.filter(r => r.content).length; + const searchOk = results.filter(r => r.search).length; + const detailOk = results.filter(r => r.detail).length; + const tocOk = results.filter(r => r.toc).length; + + console.log(`\n========== 测试结果 ==========`); + console.log(`搜索成功: ${searchOk}/${results.length}`); + console.log(`详情成功: ${detailOk}/${results.length}`); + console.log(`目录成功: ${tocOk}/${results.length}`); + console.log(`完整通过: ${passed}/${results.length} (${(passed/results.length*100).toFixed(1)}%)`); +} + +main().catch(console.error); diff --git a/test-reliable-sources.ts b/test-reliable-sources.ts new file mode 100644 index 0000000..46e4991 --- /dev/null +++ b/test-reliable-sources.ts @@ -0,0 +1,317 @@ +/** + * 测试可靠的异次元图源 + * 专注于国内可直接访问的图源 + */ +import { YiciyuanDebugger, isYiciyuanSource } from './src/main/debug/yiciyuan-debugger'; + +// 精选可靠图源 +const testSources = [ + // 1. 包子漫画cn (已验证) + { + name: "包子漫画cn", + source: { + "bookSourceName": "包子漫画cn", + "bookSourceUrl": "https://cn.bzmanga.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://cn.bzmanga.com/search?q=searchKey", + "ruleSearchList": ".comics-card", + "ruleSearchName": ".comics-card__title@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "amp-img@src", + "ruleBookName": "h1.comics-detail__title@text", + "ruleBookAuthor": "h2.comics-detail__author@text", + "ruleIntroduce": "p.comics-detail__desc@text", + "ruleChapterList": ".comics-chapters__item", + "ruleChapterName": "text", + "ruleContentUrl": "href" + }, + keyword: "海贼王" + }, + // 2. G站漫画 (已验证) + { + name: "G站漫画", + source: { + "bookSourceName": "◯ G站", + "bookSourceUrl": "https://m.g-mh.org", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", + "ruleSearchUrl": "https://m.g-mh.org/s/searchKey", + "ruleSearchList": ".slicarda&&.pb-2", + "ruleSearchName": "h3@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchCoverUrl": "img@src", + "ruleBookAuthor": ".text-small@a@text", + "ruleIntroduce": ".line-clamp-4@text", + "ruleChapterUrl": "@js:\nid = \"#bookmarkData\"; ai = \"data-mid\";\ni = org.jsoup.Jsoup.parse(result).select(id).attr(ai);\np = \"https://api-get-v2.mgsearcher.com/api/\";\nu = p + \"manga/get?mid=\" + i + \"&mode=all\";\njava.put(\"id\", i);\nu", + "ruleChapterList": "data.chapters", + "ruleChapterName": "$.attributes.title" + }, + keyword: "斗罗" + }, + // 3. 漫画屋 + { + name: "漫画屋", + source: { + "bookSourceName": "漫画屋", + "bookSourceUrl": "https://www.mhua5.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 9; PACM00 Build/QP1A.190711.020) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.79 Mobile Safari/537.36", + "ruleSearchUrl": "https://www.mhua5.com/index.php/search?key=searchKey", + "ruleSearchList": "class.comic-list-item clearfix||class.comic-item", + "ruleSearchName": "class.comic-name@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "class.cover@data-src", + "ruleSearchAuthor": "class.comic-author@text", + "ruleSearchLastChapter": "class.comic-tip@text", + "ruleBookName": "class.comic-name@h1@text", + "ruleBookAuthor": "class.au-name@text", + "ruleIntroduce": "class.comic-intro@text", + "ruleChapterList": "-class.clearfix@li", + "ruleChapterName": "tag.a@text", + "ruleContentUrl": "tag.a@href" + }, + keyword: "斗破苍穹" + }, + // 4. 奇漫屋 + { + name: "奇漫屋", + source: { + "bookSourceName": "奇漫屋₁", + "bookSourceUrl": "http://m.qiman53.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android) Mobile", + "ruleSearchUrl": "http://m.qiman53.com/spotlight?keyword=searchKey", + "ruleSearchList": ".comic-list-item", + "ruleSearchName": ".comic-name>a@text", + "ruleSearchNoteUrl": ".comic-name>a@href", + "ruleSearchCoverUrl": ".cover>img@src", + "ruleSearchAuthor": ".comic-author@text", + "ruleBookName": "class.box-back2@tag.h1@text", + "ruleBookAuthor": "class.txtItme.-4@text", + "ruleIntroduce": "class.comic-intro@text", + "ruleCoverUrl": "class.box-back1@tag.img@src" + }, + keyword: "火影" + }, + // 5. 漫畫狗 + { + name: "漫畫狗", + source: { + "bookSourceName": "漫畫狗", + "bookSourceUrl": "https://dogemanga.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36", + "ruleSearchUrl": "https://dogemanga.com/?q=searchKey&o=0", + "ruleSearchList": ".col-12", + "ruleSearchName": "tag.h5@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "tag.img@src", + "ruleSearchAuthor": "tag.h6@text", + "ruleBookName": "tag.h3@text", + "ruleBookAuthor": "tag.h4@text", + "ruleIntroduce": "class.text-truncate@text" + }, + keyword: "进击的巨人" + }, + // 6. 腾讯漫画 + { + name: "腾讯漫画", + source: { + "bookSourceName": "腾讯漫画", + "bookSourceUrl": "https://m.ac.qq.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0", + "ruleSearchUrl": "https://m.ac.qq.com/search/result?word=searchKey", + "ruleSearchList": "class.comic-item", + "ruleSearchName": "class.comic-title@text", + "ruleSearchNoteUrl": "class.comic-link@href", + "ruleSearchCoverUrl": "class.comic-cover@tag.img@src", + "ruleSearchKind": "class.comic-tag@text", + "ruleBookName": "li.head-info-title@h1@text", + "ruleBookAuthor": "li.author-wr@text", + "ruleIntroduce": "class.head-info-desc@text" + }, + keyword: "斗破苍穹" + }, + // 7. 知音漫客 - 使用分类页面作为搜索(该站搜索需要JS) + { + name: "知音漫客", + source: { + "bookSourceName": "知音漫客📱💡", + "bookSourceUrl": "https://m.zymk.cn", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36", + "ruleSearchUrl": "https://m.zymk.cn/sort/all.html", + "ruleSearchList": ".comic-sort li", + "ruleSearchName": ".comic-item a@title", + "ruleSearchNoteUrl": ".comic-item a@href", + "ruleSearchCoverUrl": ".comic-item img@data-src", + "ruleBookName": "h1.name@text", + "ruleBookAuthor": "class.author@text", + "ruleIntroduce": "class.comic-detail@tag.p.0@text" + }, + keyword: "斗罗" + }, + // 8. 漫客栈API + { + name: "漫客栈API", + source: { + "bookSourceName": "漫客栈-A", + "bookSourceUrl": "http://comic.mkzhan.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 12; Redmi K30 Pro) AppleWebKit/537.36", + "ruleSearchUrl": "https://comic.mkzhan.com/search/keyword/?keyword=searchKey&page_num=1&page_size=20", + "ruleSearchList": "$.data.list.*", + "ruleSearchName": "$.title", + "ruleSearchNoteUrl": "https://comic.mkzhan.com/comic/info/?comic_id={$.comic_id}", + "ruleSearchCoverUrl": "$.cover", + "ruleSearchAuthor": "$.author_title", + "ruleBookName": "$.data.title", + "ruleIntroduce": "$.data.content" + }, + keyword: "斗破" + }, + // 9. 波洞漫画 + { + name: "波洞漫画", + source: { + "bookSourceName": "波洞", + "bookSourceUrl": "http://ikmmh.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15", + "ruleSearchUrl": "http://ikmmh.com/search?searchkey=searchKey", + "ruleSearchList": "id.js_comicSortList@tag.li", + "ruleSearchName": "class.title@text", + "ruleSearchNoteUrl": "tag.a@href", + "ruleSearchCoverUrl": "img.img@src", + "ruleBookName": "[property=\"og:title\"]@content", + "ruleBookAuthor": "[property=\"og:cartoon:author\"]@content", + "ruleIntroduce": "[property=\"og:description\"]@content" + }, + keyword: "海贼王" + }, + // 10. 酷看漫画 + { + name: "酷看漫画", + source: { + "bookSourceName": "酷看漫画", + "bookSourceUrl": "https://www.kukk.net", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://www.kukk.net/search?keyword=searchKey", + "ruleSearchList": "class.mh-item", + "ruleSearchName": "tag.h2@text", + "ruleSearchNoteUrl": "tag.a@href", + "ruleSearchCoverUrl": "class.mh-cover@style", + "ruleBookName": "class.info@h1@text", + "ruleBookAuthor": "class.subtitle.1@text", + "ruleIntroduce": "class.content@text" + }, + keyword: "火影" + } +]; + +interface TestResult { + name: string; + success: boolean; + bookCount?: number; + time: number; + reason?: string; + firstBook?: string; +} + +async function testSource(item: { name: string; source: any; keyword: string }, index: number): Promise { + const startTime = Date.now(); + process.stdout.write(`[${String(index + 1).padStart(2, '0')}/10] ${item.name.padEnd(12)} `); + + if (!isYiciyuanSource(item.source)) { + console.log('⚠️ 非异次元格式'); + return { name: item.name, success: false, reason: '非异次元格式', time: 0 }; + } + + const debugger_ = new YiciyuanDebugger(item.source); + + try { + const searchResult = await debugger_.debugSearch(item.keyword); + const elapsed = Date.now() - startTime; + + if (!searchResult.success) { + const errMsg = searchResult.error?.substring(0, 25) || '未知错误'; + console.log(`❌ ${errMsg} (${elapsed}ms)`); + return { name: item.name, success: false, reason: errMsg, time: elapsed }; + } + + const bookCount = searchResult.parsedItems?.length || 0; + if (bookCount === 0) { + console.log(` 无结果 (${elapsed}ms)`); + return { name: item.name, success: false, reason: '无搜索结果', time: elapsed }; + } + + const firstBook = String(searchResult.parsedItems![0].name || '(无名称)'); + console.log(` ${bookCount}本 "${firstBook.substring(0, 15)}" (${elapsed}ms)`); + return { name: item.name, success: true, bookCount, time: elapsed, firstBook }; + } catch (error: any) { + const elapsed = Date.now() - startTime; + const errMsg = error.message?.substring(0, 25) || '异常'; + console.log(` ${errMsg} (${elapsed}ms)`); + return { name: item.name, success: false, reason: errMsg, time: elapsed }; + } +} + +async function main() { + console.log(''); + console.log('╔═══════════════════════════════════════════════════════════╗'); + console.log('║ 异次元图源可用性测试 (10个精选图源) ║'); + console.log('║ ' + new Date().toLocaleString() + ' ║'); + console.log('╚═══════════════════════════════════════════════════════════╝'); + console.log(''); + + const results: TestResult[] = []; + + for (let i = 0; i < testSources.length; i++) { + const result = await testSource(testSources[i], i); + results.push(result); + } + + const successResults = results.filter(r => r.success); + const failResults = results.filter(r => !r.success); + + console.log(''); + console.log('═══════════════════════════════════════════════════════════'); + console.log(' 测 试 结 果 汇 总'); + console.log('═══════════════════════════════════════════════════════════'); + + if (successResults.length > 0) { + console.log(''); + console.log('✅ 可用图源:'); + for (const r of successResults) { + console.log(` • ${r.name} - ${r.bookCount}本 (${r.time}ms)`); + } + } + + if (failResults.length > 0) { + console.log(''); + console.log('❌ 不可用图源:'); + for (const r of failResults) { + console.log(` • ${r.name} - ${r.reason}`); + } + } + + console.log(''); + console.log('───────────────────────────────────────────────────────────'); + console.log(`📊 统计: ${successResults.length}/${results.length} 可用 (${((successResults.length / results.length) * 100).toFixed(0)}%)`); + console.log('═══════════════════════════════════════════════════════════'); +} + +main().catch(console.error); diff --git a/test-results.json b/test-results.json new file mode 100644 index 0000000..b14d5f7 --- /dev/null +++ b/test-results.json @@ -0,0 +1,511 @@ +[ + { + "index": 1, + "name": "笔趣漫画", + "url": "https://www.biqumh.com", + "search": true, + "detail": true, + "toc": true, + "content": true, + "searchCount": 6, + "tocCount": 645, + "contentCount": 29, + "elapsed": 12950 + }, + { + "index": 2, + "name": "🥝猕猴桃漫画", + "url": "https://www.mwwz.cc", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "read ECONNRESET", + "elapsed": 266 + }, + { + "index": 3, + "name": "🎨禁漫天堂[国内]", + "url": "https://jmcomicqa.cc", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "搜索失败", + "elapsed": 1449 + }, + { + "index": 4, + "name": "武芊漫画", + "url": "https://comic.mkzcdn.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 153 + }, + { + "index": 5, + "name": "名著阅读(优)", + "url": "https://api.520diandu.com/", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 310 + }, + { + "index": 6, + "name": "🎨COLA漫画💓", + "url": "https://www.colamanga.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 1003 + }, + { + "index": 7, + "name": "🎨Komiic漫画💓", + "url": "https://komiic.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "搜索失败", + "elapsed": 814 + }, + { + "index": 8, + "name": "🎨MYCOMIC💓", + "url": "https://mycomic.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "搜索失败", + "elapsed": 634 + }, + { + "index": 9, + "name": "🎨包子漫画💞", + "url": "https://www.baozimh.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "搜索失败", + "elapsed": 3153 + }, + { + "index": 10, + "name": "🎨看漫画💓", + "url": "https://m.kanman.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 115 + }, + { + "index": 11, + "name": "🎨漫画台💓", + "url": "https://m.manhuatai.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "certificate has expired", + "elapsed": 147 + }, + { + "index": 12, + "name": "🎨G站漫画💞", + "url": "https://godamanga.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 2909 + }, + { + "index": 13, + "name": "🎨笔趣阁💞", + "url": "https://www.biqug.org", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 1985 + }, + { + "index": 14, + "name": "🎨漫画屋💞", + "url": "https://www.mhua5.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 1229 + }, + { + "index": 15, + "name": "🎨如漫画💓", + "url": "https://www.rumanhua.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 19403 + }, + { + "index": 16, + "name": "🎨新新漫画💞", + "url": "https://www.77mh.nl", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "connect ETIMEDOUT 91.208.75.17", + "elapsed": 21057 + }, + { + "index": 17, + "name": "🎨皮皮漫画💞", + "url": "http://www.pipimanhua.net", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "getaddrinfo ENOTFOUND www.ququ", + "elapsed": 1368 + }, + { + "index": 18, + "name": "G社漫画/包子漫画", + "url": "https://manhuafree.com", + "search": true, + "detail": true, + "toc": false, + "content": false, + "searchCount": 20, + "tocError": "无章节", + "elapsed": 944 + }, + { + "index": 19, + "name": "🎨木马漫画💓", + "url": "https://www.muamh.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 2162 + }, + { + "index": 20, + "name": "🌠 漫画吧网", + "url": "https://www.manhuaba.com/", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 1110 + }, + { + "index": 21, + "name": "🌈绅士漫画", + "url": "https://绅士漫画.luoyacheng.ip-ddns.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 3 + }, + { + "index": 22, + "name": "🎨禁漫天堂💞", + "url": "https://jmcomic.ltd", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 3056 + }, + { + "index": 23, + "name": "好看漫画", + "url": "https://www.9comic.cn/", + "search": true, + "detail": true, + "toc": true, + "content": false, + "searchCount": 1, + "tocCount": 37, + "contentError": "无图片", + "elapsed": 920 + }, + { + "index": 24, + "name": "全免漫画(优)", + "url": "https://api-cdn.kaimanhua.com/", + "search": true, + "detail": false, + "toc": false, + "content": false, + "searchCount": 5, + "detailError": "详情失败", + "elapsed": 257 + }, + { + "index": 25, + "name": "彩绘漫画(优)", + "url": "https://m.kanman.com#Haxc1107", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 100 + }, + { + "index": 26, + "name": "看漫画吧(优)", + "url": "http://m.kanman.com/", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 75 + }, + { + "index": 27, + "name": "知音漫客", + "url": "https://m.zymk.cn/", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 144 + }, + { + "index": 28, + "name": "爱看漫画", + "url": "https://m.kanman.com/", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 34 + }, + { + "index": 29, + "name": "酸奶漫画", + "url": "https://m.1kkk.com/", + "search": true, + "detail": true, + "toc": true, + "content": true, + "searchCount": 20, + "tocCount": 15, + "contentCount": 12, + "elapsed": 13318 + }, + { + "index": 30, + "name": "星辰漫画", + "url": "https://m.gmh1234.com/", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "read ECONNRESET", + "elapsed": 248 + }, + { + "index": 31, + "name": "全免漫画", + "url": "https://api-cdn.kaimanhua.com/##@遇知", + "search": true, + "detail": false, + "toc": false, + "content": false, + "searchCount": 5, + "detailError": "详情失败", + "elapsed": 287 + }, + { + "index": 32, + "name": "嘤嘤漫画(英文)", + "url": "https://mangaonlineteam.com/", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "connect ETIMEDOUT 149.50.116.1", + "elapsed": 21070 + }, + { + "index": 33, + "name": "爱看漫画", + "url": "https://m.kanman.com已校验", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 87 + }, + { + "index": 34, + "name": "酸奶漫画", + "url": "https://m.1kkk.com", + "search": true, + "detail": true, + "toc": true, + "content": true, + "searchCount": 20, + "tocCount": 15, + "contentCount": 11, + "elapsed": 12914 + }, + { + "index": 35, + "name": "漫客栈子", + "url": "http://comic.mkzhan.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 113 + }, + { + "index": 36, + "name": "爱看漫画", + "url": "http://m.kanman.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 150 + }, + { + "index": 37, + "name": "知音漫客", + "url": "https://m.zymk.cn", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 129 + }, + { + "index": 38, + "name": "全免漫画", + "url": "https://api-cdn.kaimanhua.com", + "search": true, + "detail": false, + "toc": false, + "content": false, + "searchCount": 5, + "detailError": "详情失败", + "elapsed": 276 + }, + { + "index": 39, + "name": "快看漫画", + "url": "http://m.kuaikanmanhua.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 362 + }, + { + "index": 40, + "name": "菠萝漫画", + "url": "https://api.sfacg.com#漫画", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 346 + }, + { + "index": 41, + "name": "快看漫画", + "url": "https://m.kuaikanmanhua.com/", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 201 + }, + { + "index": 42, + "name": "漫客栈吧", + "url": "https://comic.mkzhan.com/", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 31 + }, + { + "index": 43, + "name": "快看漫画", + "url": "http://m.kuaikanmanhua.com#Haxc1107", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 182 + }, + { + "index": 44, + "name": "漫客栈子", + "url": "https://www.mkzhan.com#♤Haxc", + "search": true, + "detail": true, + "toc": true, + "content": false, + "searchCount": 12, + "tocCount": 27, + "contentError": "正文失败", + "elapsed": 873 + }, + { + "index": 45, + "name": "快看漫画", + "url": "https://api.kkmh.com", + "search": false, + "detail": false, + "toc": false, + "content": false, + "searchError": "无搜索结果", + "elapsed": 593 + } +] \ No newline at end of file diff --git a/test-select-debug.ts b/test-select-debug.ts new file mode 100644 index 0000000..7bf27d0 --- /dev/null +++ b/test-select-debug.ts @@ -0,0 +1,86 @@ +/** + * 调试 selectWithLegadoSyntax + */ +import * as cheerio from 'cheerio'; + +const html = ` + +`; + +const $ = cheerio.load(html); + +// 模拟 selectWithLegadoSyntax 的完整逻辑 +function selectWithLegadoSyntax( + $: cheerio.CheerioAPI, + $el: cheerio.Cheerio, + selector: string +): cheerio.Cheerio { + console.log(` selectWithLegadoSyntax: selector="${selector}"`); + + // class.xxx 格式 + if (selector.startsWith('class.')) { + console.log(' -> class.xxx 格式'); + const afterClass = selector.substring(6); + const classSelector = afterClass.split(/\s+/).map(c => `.${c}`).join(''); + const found = $el.find(classSelector); + console.log(` -> find("${classSelector}"): ${found.length}`); + return found; + } + + // id.xxx 格式 + if (selector.startsWith('id.')) { + console.log(' -> id.xxx 格式'); + const id = selector.substring(3); + return $el.find(`#${id}`); + } + + // tag.xxx 格式 + if (selector.startsWith('tag.')) { + console.log(' -> tag.xxx 格式'); + const tag = selector.substring(4).split('.')[0]; + const found = $el.find(tag); + console.log(` -> find("${tag}"): ${found.length}`); + return found; + } + + // 纯标签名.index 格式,如 a.0, p.1, div.-1 + if (/^[a-z]+\.-?\d+$/i.test(selector)) { + console.log(' -> 纯标签名.index 格式'); + const match = selector.match(/^([a-z]+)\.(-?\d+)$/i); + if (match) { + const tag = match[1]; + const index = parseInt(match[2]); + const allTags = $el.find(tag); + return index < 0 ? allTags.eq(allTags.length + index) : allTags.eq(index); + } + } + + // 普通 CSS 选择器 + console.log(' -> 普通 CSS 选择器'); + const found = $el.find(selector); + console.log(` -> find("${selector}"): ${found.length}`); + return found; +} + +// 测试 +console.log('=== 测试 ul.book-list@tag.li ==='); +const rule = 'ul.book-list@tag.li'; +const parts = rule.split('@'); +console.log('parts:', parts); + +let $current: cheerio.Cheerio = $.root(); +for (const part of parts) { + if (!part) continue; + console.log(`\n处理 part: "${part}"`); + $current = selectWithLegadoSyntax($, $current, part); + console.log(` 结果数量: ${$current.length}`); +} + +console.log('\n最终结果:', $current.length); diff --git a/test-selector.ts b/test-selector.ts new file mode 100644 index 0000000..7bb6ef9 --- /dev/null +++ b/test-selector.ts @@ -0,0 +1,39 @@ +/** + * 测试选择器 + */ +import * as cheerio from 'cheerio'; +import { httpRequest } from './src/main/debug/http-client'; + +async function test() { + const result = await httpRequest({ + url: 'https://m.ac.qq.com/search/result?word=斗破苍穹', + headers: { + 'User-Agent': 'Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0' + } + }); + + const $ = cheerio.load(result.body || ''); + + console.log('测试选择器:'); + console.log('$.root().find(".comic-item"):', $.root().find('.comic-item').length); + console.log('$(".comic-item"):', $('.comic-item').length); + console.log('$("body").find(".comic-item"):', $('body').find('.comic-item').length); + + // 模拟 selectWithLegadoSyntax 的行为 + const selector = 'class.comic-item'; + const afterClass = selector.substring(6); // 'comic-item' + const classSelector = afterClass.split(/\s+/).map(c => `.${c}`).join(''); // '.comic-item' + + console.log('\n模拟 selectWithLegadoSyntax:'); + console.log('afterClass:', afterClass); + console.log('classSelector:', classSelector); + console.log('$.root().find(classSelector):', $.root().find(classSelector).length); + + // 检查 $.root() 的内容 + console.log('\n$.root() 信息:'); + console.log('$.root().html() 长度:', $.root().html()?.length); + console.log('$.root().children() 数量:', $.root().children().length); + console.log('$.root().children() 第一个标签:', $.root().children().first().prop('tagName')); +} + +test().catch(console.error); diff --git a/test-source-one.ts b/test-source-one.ts new file mode 100644 index 0000000..b1e9653 --- /dev/null +++ b/test-source-one.ts @@ -0,0 +1,182 @@ +/** + * 逐个测试书源 + */ +import * as fs from 'fs'; +import { SourceDebugger } from './src/main/debug/source-debugger'; +import { buildSearchUrl } from './src/main/debug/analyze-url'; +import { httpRequest } from './src/main/debug/http-client'; + +const sourcesJson = fs.readFileSync('shareBookSource(1).json', 'utf8'); +const allSources = JSON.parse(sourcesJson); + +// 测试指定索引的书源 +const testIndex = parseInt(process.argv[2] || '0'); +const keyword = process.argv[3] || '斗破苍穹'; + +async function testSource(index: number, keyword: string) { + const source = allSources[index]; + if (!source) { + console.log(`书源 ${index} 不存在`); + return; + } + + console.log('═'.repeat(70)); + console.log(`📚 [${index + 1}] ${source.bookSourceName}`); + console.log(`🔗 ${source.bookSourceUrl}`); + console.log(`🔍 关键词: ${keyword}`); + console.log('═'.repeat(70)); + + // 1. 检查搜索URL + console.log('\n【1. 搜索URL构建】'); + console.log(`原始 searchUrl: ${source.searchUrl?.substring(0, 100)}...`); + + try { + const analyzeUrl = buildSearchUrl(source, keyword, 1, {}); + if (analyzeUrl) { + const url = analyzeUrl.getUrl(); + const method = analyzeUrl.getMethod(); + console.log(`构建后 URL: ${url?.substring(0, 100)}...`); + console.log(`方法: ${method}`); + + if (!url || url === 'null' || url === 'undefined') { + console.log('❌ URL 构建失败'); + return; + } + } else { + console.log('❌ 无法构建搜索URL'); + return; + } + } catch (e: any) { + console.log(`❌ URL构建异常: ${e.message}`); + return; + } + + // 2. 执行搜索 + console.log('\n【2. 搜索测试】'); + const debugger_ = new SourceDebugger(source); + + try { + const searchResult = await debugger_.debugSearch(keyword); + + if (!searchResult.success) { + console.log(`❌ 搜索失败: ${searchResult.error}`); + // 打印日志 + searchResult.logs?.slice(-5).forEach(log => { + console.log(` [${log.level}] ${log.message}`); + }); + return; + } + + const books = searchResult.parsedItems || []; + if (books.length === 0) { + console.log('❌ 无搜索结果'); + // 打印日志 + searchResult.logs?.slice(-10).forEach(log => { + console.log(` [${log.level}] ${log.message}`); + }); + return; + } + + console.log(`✅ 找到 ${books.length} 本书`); + const firstBook: any = books[0]; + console.log(` 第一本: ${firstBook.name || '(无名)'}`); + console.log(` URL: ${firstBook.bookUrl?.substring(0, 60) || '(无URL)'}`); + + if (!firstBook.bookUrl) { + console.log('❌ 无法获取书籍URL'); + return; + } + + // 3. 详情测试 + console.log('\n【3. 详情测试】'); + const detailResult = await debugger_.debugBookInfo(firstBook.bookUrl); + + if (!detailResult.success) { + console.log(`❌ 详情失败: ${detailResult.error}`); + detailResult.logs?.slice(-5).forEach(log => { + console.log(` [${log.level}] ${log.message}`); + }); + return; + } + + const bookInfo: any = Array.isArray(detailResult.parsedItems) + ? detailResult.parsedItems[0] + : detailResult.parsedItems; + console.log(`✅ 详情获取成功`); + console.log(` 书名: ${bookInfo?.name || '(未获取)'}`); + console.log(` 作者: ${bookInfo?.author || '(未获取)'}`); + + const tocUrl = bookInfo?.tocUrl || firstBook.bookUrl; + if (bookInfo?.tocUrl) { + console.log(` 目录URL: ${bookInfo.tocUrl.substring(0, 60)}...`); + } + + // 4. 目录测试 + console.log('\n【4. 目录测试】'); + const tocResult = await debugger_.debugToc(tocUrl); + + if (!tocResult.success) { + console.log(`❌ 目录失败: ${tocResult.error}`); + tocResult.logs?.slice(-5).forEach(log => { + console.log(` [${log.level}] ${log.message}`); + }); + return; + } + + const chapters = tocResult.parsedItems || []; + if (chapters.length === 0) { + console.log('❌ 无章节'); + tocResult.logs?.slice(-10).forEach(log => { + console.log(` [${log.level}] ${log.message}`); + }); + return; + } + + console.log(`✅ 共 ${chapters.length} 章`); + const firstChapter: any = chapters[0]; + console.log(` 第一章: ${firstChapter.name || '(无名)'}`); + // 显示完整 URL 以便调试 webView 配置 + console.log(` URL: ${firstChapter.url || '(无URL)'}`); + + if (!firstChapter.url) { + console.log('❌ 无法获取章节URL'); + return; + } + + // 5. 正文测试 + console.log('\n【5. 正文测试】'); + const contentResult = await debugger_.debugContent(firstChapter.url); + + if (!contentResult.success) { + console.log(`❌ 正文失败: ${contentResult.error}`); + contentResult.logs?.slice(-5).forEach(log => { + console.log(` [${log.level}] ${log.message}`); + }); + return; + } + + const content = contentResult.parsedItems; + const images = Array.isArray(content) ? content : (content ? [content] : []); + + if (images.length === 0) { + console.log('❌ 无图片'); + contentResult.logs?.slice(-10).forEach(log => { + console.log(` [${log.level}] ${log.message}`); + }); + return; + } + + console.log(`✅ ${images.length} 张图片`); + console.log(` 第一张: ${String(images[0]).substring(0, 80)}...`); + + console.log('\n' + '═'.repeat(70)); + console.log('🎉 全部测试通过!'); + console.log('═'.repeat(70)); + + } catch (e: any) { + console.log(`❌ 异常: ${e.message}`); + console.log(e.stack); + } +} + +testSource(testIndex, keyword); diff --git a/test-specific-sources.ts b/test-specific-sources.ts new file mode 100644 index 0000000..2be7b07 --- /dev/null +++ b/test-specific-sources.ts @@ -0,0 +1,103 @@ +/** + * 测试特定书源的搜索解析 + */ +import { httpRequest } from './src/main/debug/http-client'; +import { parseList, parseFromElement, ParseContext } from './src/main/debug/rule-parser'; +import * as fs from 'fs'; + +const sourcesJson = fs.readFileSync('shareBookSource(1).json', 'utf8'); +const allSources = JSON.parse(sourcesJson); + +// 测试几个有代表性的书源 +const testCases = [ + { index: 22, keyword: '斗破苍穹' }, // 好看漫画 + { index: 26, keyword: '斗罗大陆' }, // 知音漫客 + { index: 28, keyword: '斗破苍穹' }, // 酸奶漫画 + { index: 34, keyword: '斗破苍穹' }, // 漫客栈子 +]; + +async function testSource(source: any, keyword: string) { + console.log(`\n${'='.repeat(60)}`); + console.log(`📚 ${source.bookSourceName}`); + console.log(`🔗 ${source.bookSourceUrl}`); + + // 构建搜索URL + let searchUrl = source.searchUrl; + if (!searchUrl) { + console.log('❌ 无搜索URL'); + return; + } + + // 替换关键词和页码 + searchUrl = searchUrl + .replace(/\{\{key\}\}/g, encodeURIComponent(keyword)) + .replace(/\{\{page\}\}/g, '1'); + + // 处理相对URL + if (searchUrl.startsWith('/')) { + searchUrl = source.bookSourceUrl + searchUrl; + } + + console.log(`搜索URL: ${searchUrl}`); + + // 发送请求 + const result = await httpRequest({ + url: searchUrl, + headers: source.header ? JSON.parse(source.header) : {} + }); + + if (!result.success) { + console.log(`❌ 请求失败: ${result.error}`); + return; + } + + console.log(`✅ 响应: ${result.statusCode}, ${result.body?.length} 字节`); + + // 解析书籍列表 + const ruleSearch = source.ruleSearch; + if (!ruleSearch || !ruleSearch.bookList) { + console.log('❌ 无搜索规则'); + return; + } + + console.log(`书籍列表规则: ${ruleSearch.bookList}`); + + const ctx: ParseContext = { + body: result.body || '', + baseUrl: source.bookSourceUrl, + variables: {} + }; + + const bookList = parseList(ctx, ruleSearch.bookList); + console.log(`解析结果: ${bookList.length} 本书`); + + if (bookList.length > 0) { + const firstBook: any = bookList[0]; + console.log('\n第一本书:'); + + // 解析各字段 + const fields = ['name', 'author', 'coverUrl', 'bookUrl']; + for (const field of fields) { + const rule = ruleSearch[field]; + if (rule) { + const fieldResult = parseFromElement(firstBook, rule, source.bookSourceUrl, {}); + console.log(` ${field}: ${fieldResult.success ? String(fieldResult.data).substring(0, 60) : '失败 - ' + fieldResult.error}`); + } + } + } else { + // 打印响应预览帮助调试 + console.log('\n响应预览:'); + console.log(result.body?.substring(0, 500)); + } +} + +async function main() { + for (const tc of testCases) { + const source = allSources[tc.index]; + if (source) { + await testSource(source, tc.keyword); + } + } +} + +main().catch(console.error); diff --git a/test-tencent-zymk.ts b/test-tencent-zymk.ts new file mode 100644 index 0000000..8271b14 --- /dev/null +++ b/test-tencent-zymk.ts @@ -0,0 +1,154 @@ +/** + * 深入调试腾讯漫画和知音漫客 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; + +async function debugTencentComic() { + console.log('═══════════════════════════════════════════════════════════'); + console.log(' 腾讯漫画搜索调试'); + console.log('═══════════════════════════════════════════════════════════\n'); + + const url = 'https://m.ac.qq.com/search/result?word=斗破苍穹'; + console.log('请求URL:', url); + + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0' + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + console.log('响应状态:', result.statusCode); + console.log('响应长度:', result.body?.length); + + const $ = cheerio.load(result.body || ''); + + // 测试各种选择器 + console.log('\n--- 选择器测试 ---'); + console.log('.comic-item 数量:', $('.comic-item').length); + + // 解析搜索结果 + if ($('.comic-item').length > 0) { + console.log('\n--- 搜索结果 ---'); + $('.comic-item').each((i, el) => { + if (i >= 3) return; + const $item = $(el); + console.log(`[${i + 1}]`); + console.log(' 名称:', $item.find('.comic-title').text()); + console.log(' 链接:', $item.find('.comic-link').attr('href')); + console.log(' 封面:', $item.find('.comic-cover img').attr('src')); + console.log(' 标签:', $item.find('.comic-tag').text()); + console.log(' 更新:', $item.find('.comic-update').text()); + }); + } +} + +async function debugZymk() { + console.log('\n\n═══════════════════════════════════════════════════════════'); + console.log(' 知音漫客搜索调试'); + console.log('═══════════════════════════════════════════════════════════\n'); + + // 尝试不同的搜索URL + const urls = [ + 'https://m.zymk.cn/sort/all.html?key=斗罗', + 'https://m.zymk.cn/search.html?keyword=斗罗', + 'https://m.zymk.cn/search?keyword=斗罗', + 'https://www.zymk.cn/search.html?keyword=斗罗' + ]; + + for (const url of urls) { + console.log('\n--- 测试URL:', url, '---'); + + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36' + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + continue; + } + + console.log('响应状态:', result.statusCode); + console.log('响应长度:', result.body?.length); + + const $ = cheerio.load(result.body || ''); + + // 测试各种选择器 + console.log('选择器测试:'); + console.log(' .comic-sort li:', $('.comic-sort li').length); + console.log(' .comic-list li:', $('.comic-list li').length); + console.log(' .search-result li:', $('.search-result li').length); + console.log(' .list-comic li:', $('.list-comic li').length); + console.log(' ul li:', $('ul li').length); + + // 查找所有包含漫画相关的类 + const classes: string[] = []; + $('[class]').each((_, el) => { + const cls = $(el).attr('class'); + if (cls && (cls.includes('comic') || cls.includes('list') || cls.includes('search'))) { + if (!classes.includes(cls)) classes.push(cls); + } + }); + console.log('相关类名:', classes.slice(0, 15)); + + // 如果找到结果就停止 + if ($('.comic-sort li').length > 0 || $('.comic-list li').length > 0) { + console.log('\n--- 搜索结果 ---'); + const items = $('.comic-sort li, .comic-list li'); + items.each((i, el) => { + if (i >= 3) return; + const $item = $(el); + console.log(`[${i + 1}]`); + console.log(' HTML:', $item.html()?.substring(0, 200)); + }); + break; + } + + // 打印页面标题和部分内容 + console.log('页面标题:', $('title').text()); + console.log('页面预览:', result.body?.substring(0, 500)); + } +} + +async function debugZymkApi() { + console.log('\n\n═══════════════════════════════════════════════════════════'); + console.log(' 知音漫客API搜索调试'); + console.log('═══════════════════════════════════════════════════════════\n'); + + // 尝试API搜索 + const apiUrl = 'https://m.zymk.cn/app_api/v5/getsortlist/?key=斗罗&page=1'; + console.log('API URL:', apiUrl); + + const result = await httpRequest({ + url: apiUrl, + headers: { + 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36', + 'Referer': 'https://m.zymk.cn/' + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + console.log('响应状态:', result.statusCode); + console.log('响应:', result.body?.substring(0, 1000)); +} + +async function main() { + await debugTencentComic(); + await debugZymk(); + await debugZymkApi(); +} + +main().catch(console.error); diff --git a/test-ul-selector.ts b/test-ul-selector.ts new file mode 100644 index 0000000..288ebd7 --- /dev/null +++ b/test-ul-selector.ts @@ -0,0 +1,37 @@ +/** + * 测试 ul.book-list 选择器 + */ +import * as cheerio from 'cheerio'; + +const html = ` + +`; + +const $ = cheerio.load(html); + +console.log('=== Cheerio 选择器测试 ==='); +console.log('ul.book-list:', $('ul.book-list').length); +console.log('ul.book-list li:', $('ul.book-list li').length); +console.log('.book-list:', $('.book-list').length); +console.log('.book-list li:', $('.book-list li').length); + +// 模拟 selectWithLegadoSyntax 的行为 +const selector = 'ul.book-list'; +console.log('\n=== 选择器分析 ==='); +console.log('selector:', selector); +console.log('startsWith("class."):', selector.startsWith('class.')); +console.log('startsWith("tag."):', selector.startsWith('tag.')); +console.log('startsWith("id."):', selector.startsWith('id.')); + +// 直接使用 find +const root = $.root(); +console.log('\n=== find 测试 ==='); +console.log('root.find("ul.book-list"):', root.find('ul.book-list').length); +console.log('root.find("ul.book-list").find("li"):', root.find('ul.book-list').find('li').length); diff --git a/test-wuqian-search.ts b/test-wuqian-search.ts new file mode 100644 index 0000000..bbac92b --- /dev/null +++ b/test-wuqian-search.ts @@ -0,0 +1,64 @@ +/** + * 调试武芊漫画搜索 + */ +import { httpRequest } from './src/main/debug/http-client'; +import { parseList, ParseContext } from './src/main/debug/rule-parser'; + +async function test() { + const url = 'https://comic.mkzcdn.com/search/keyword/?keyword=斗破苍穹&page_num=1&page_size=20'; + + console.log('请求URL:', url); + + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + console.log('响应状态:', result.statusCode); + console.log('响应长度:', result.body?.length); + console.log('响应预览:', result.body?.substring(0, 500)); + + // 尝试解析 JSON + try { + const json = JSON.parse(result.body || ''); + console.log('\nJSON 结构:'); + console.log(' keys:', Object.keys(json)); + if (json.data) { + console.log(' data keys:', Object.keys(json.data)); + if (json.data.list) { + console.log(' list 长度:', json.data.list.length); + if (json.data.list.length > 0) { + console.log(' 第一项:', JSON.stringify(json.data.list[0], null, 2).substring(0, 500)); + } + } + } + } catch (e) { + console.log('JSON 解析失败'); + } + + // 测试 parseList + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://comic.mkzcdn.com', + variables: {} + }; + + const rules = [ + '$..list[*]', + '$.data.list[*]', + '@json:$.data.list[*]', + ]; + + console.log('\n=== parseList 测试 ==='); + for (const rule of rules) { + const items = parseList(ctx, rule); + console.log(`规则 "${rule}": ${items.length} 个元素`); + if (items.length > 0) { + console.log(' 第一项:', JSON.stringify(items[0]).substring(0, 200)); + } + } +} + +test().catch(console.error); diff --git a/test-yiciyuan-compat.ts b/test-yiciyuan-compat.ts new file mode 100644 index 0000000..03de17d --- /dev/null +++ b/test-yiciyuan-compat.ts @@ -0,0 +1,229 @@ +/** + * 异次元图源兼容性测试 + * 验证转换后的书源在异次元上能否正常工作 + */ + +import * as fs from 'fs'; +import { convertSource, yiciyuanToLegado, legadoToYiciyuan } from './src/renderer/utils/sourceConverter'; +import { SourceFormat, detectSourceFormat } from './src/renderer/types'; + +// 读取真实的异次元图源 +const yiciyuanSources = JSON.parse(fs.readFileSync('1765179391.json', 'utf-8')); + +console.log('========================================'); +console.log('异次元图源兼容性测试'); +console.log('========================================\n'); + +console.log(`共 ${yiciyuanSources.length} 个图源\n`); + +// 分析异次元特有语法 +function analyzeYiciyuanSyntax(source: any): string[] { + const features: string[] = []; + const allFields = JSON.stringify(source); + + // @Header:{} 后缀 + if (allFields.includes('@Header:')) { + features.push('@Header:{} 后缀'); + } + + // searchKey/searchPage 占位符 + if (allFields.includes('searchKey') || allFields.includes('searchPage')) { + features.push('searchKey/searchPage 占位符'); + } + + // 代码块 + if (allFields.includes('') || allFields.includes('')) { + features.push(' 代码块'); + } + + // @js: 代码 + if (allFields.includes('@js:')) { + features.push('@js: 代码'); + } + + // XPath 选择器 + if (allFields.includes('//')) { + features.push('XPath 选择器'); + } + + // JSON 路径 + if (allFields.includes('$.')) { + features.push('JSON 路径 $.'); + } + + // 反转列表 - 前缀 + if (/-[.#\[]/.test(allFields) || allFields.includes('-//') || allFields.includes('-$.')) { + features.push('- 反转列表'); + } + + // tag.xxx 选择器 + if (/tag\.\w+/.test(allFields)) { + features.push('tag.xxx 选择器'); + } + + // id.xxx 选择器 + if (/id\.\w+/.test(allFields)) { + features.push('id.xxx 选择器'); + } + + // || 或规则 + if (allFields.includes('||')) { + features.push('|| 或规则'); + } + + // && 与规则 + if (allFields.includes('&&')) { + features.push('&& 与规则'); + } + + // ## 替换规则 + if (allFields.includes('##')) { + features.push('## 替换规则'); + } + + return features; +} + +// 测试单个图源的转换 +function testSourceConversion(source: any, index: number): { + name: string; + format: string; + features: string[]; + convertSuccess: boolean; + roundTripSuccess: boolean; + keyFieldsPreserved: boolean; + issues: string[]; +} { + const name = source.bookSourceName || `图源${index}`; + const format = detectSourceFormat(source); + const features = analyzeYiciyuanSyntax(source); + const issues: string[] = []; + + // 1. 尝试转换 + const convertResult = convertSource(source); + const convertSuccess = convertResult.success; + + if (!convertSuccess) { + issues.push(`转换失败: ${convertResult.error}`); + return { name, format: format === SourceFormat.Yiciyuan ? '异次元' : 'Legado', features, convertSuccess, roundTripSuccess: false, keyFieldsPreserved: false, issues }; + } + + // 2. 往返转换测试 + const converted = convertResult.result; + const backResult = convertSource(converted); + const roundTripSuccess = backResult.success; + + if (!roundTripSuccess) { + issues.push(`往返转换失败: ${backResult.error}`); + } + + // 3. 检查关键字段是否保留 + const back = backResult.result; + let keyFieldsPreserved = true; + + // 检查搜索URL + const originalSearchUrl = source.ruleSearchUrl || source.searchUrl || ''; + const backSearchUrl = back?.ruleSearchUrl || back?.searchUrl || ''; + + // 标准化比较(去除格式差异) + const normalizeUrl = (url: string) => { + return url + .replace(/searchKey/g, '{{key}}') + .replace(/searchPage/g, '{{page}}') + .replace(/\{\{key\}\}/g, 'KEY') + .replace(/\{\{page\}\}/g, 'PAGE'); + }; + + if (normalizeUrl(originalSearchUrl) !== normalizeUrl(backSearchUrl)) { + keyFieldsPreserved = false; + issues.push(`搜索URL变化: "${originalSearchUrl}" -> "${backSearchUrl}"`); + } + + // 检查列表规则 + const originalList = source.ruleSearchList || source.ruleSearch?.bookList || ''; + const backList = back?.ruleSearchList || back?.ruleSearch?.bookList || ''; + if (originalList !== backList) { + keyFieldsPreserved = false; + issues.push(`列表规则变化: "${originalList}" -> "${backList}"`); + } + + // 检查 @Header 是否保留 + if (features.includes('@Header:{} 后缀')) { + const originalContent = source.ruleBookContent || ''; + const backContent = back?.ruleBookContent || back?.ruleContent?.content || ''; + if (originalContent.includes('@Header:') && !backContent.includes('@Header:')) { + issues.push('@Header:{} 后缀丢失'); + } + } + + return { + name, + format: format === SourceFormat.Yiciyuan ? '异次元' : 'Legado', + features, + convertSuccess, + roundTripSuccess, + keyFieldsPreserved, + issues + }; +} + +// 运行测试 +const results = yiciyuanSources.map((source: any, index: number) => testSourceConversion(source, index)); + +// 输出结果 +console.log('=== 图源分析 ===\n'); +results.forEach((r: any, i: number) => { + console.log(`${i + 1}. ${r.name} (${r.format})`); + console.log(` 特性: ${r.features.length > 0 ? r.features.join(', ') : '无特殊语法'}`); + console.log(` 转换: ${r.convertSuccess ? '✅' : '❌'} | 往返: ${r.roundTripSuccess ? '✅' : '❌'} | 字段保留: ${r.keyFieldsPreserved ? '✅' : '⚠️'}`); + if (r.issues.length > 0) { + r.issues.forEach((issue: string) => console.log(` ⚠️ ${issue}`)); + } + console.log(''); +}); + +// 统计 +console.log('=== 统计 ===\n'); +const totalCount = results.length; +const convertSuccessCount = results.filter((r: any) => r.convertSuccess).length; +const roundTripSuccessCount = results.filter((r: any) => r.roundTripSuccess).length; +const keyFieldsPreservedCount = results.filter((r: any) => r.keyFieldsPreserved).length; + +console.log(`总数: ${totalCount}`); +console.log(`转换成功: ${convertSuccessCount}/${totalCount} (${(convertSuccessCount/totalCount*100).toFixed(1)}%)`); +console.log(`往返成功: ${roundTripSuccessCount}/${totalCount} (${(roundTripSuccessCount/totalCount*100).toFixed(1)}%)`); +console.log(`字段保留: ${keyFieldsPreservedCount}/${totalCount} (${(keyFieldsPreservedCount/totalCount*100).toFixed(1)}%)`); + +// 特性统计 +console.log('\n=== 特性使用统计 ===\n'); +const featureCount: Record = {}; +results.forEach((r: any) => { + r.features.forEach((f: string) => { + featureCount[f] = (featureCount[f] || 0) + 1; + }); +}); +Object.entries(featureCount) + .sort((a, b) => b[1] - a[1]) + .forEach(([feature, count]) => { + console.log(` ${feature}: ${count}个图源使用`); + }); + +// 问题汇总 +const allIssues = results.flatMap((r: any) => r.issues); +if (allIssues.length > 0) { + console.log('\n=== 问题汇总 ===\n'); + const issueCount: Record = {}; + allIssues.forEach((issue: string) => { + const key = issue.split(':')[0]; + issueCount[key] = (issueCount[key] || 0) + 1; + }); + Object.entries(issueCount) + .sort((a, b) => b[1] - a[1]) + .forEach(([issue, count]) => { + console.log(` ${issue}: ${count}次`); + }); +} + +console.log('\n========================================'); +console.log('测试完成'); +console.log('========================================'); diff --git a/test-yiciyuan-debugger.ts b/test-yiciyuan-debugger.ts new file mode 100644 index 0000000..32fd765 --- /dev/null +++ b/test-yiciyuan-debugger.ts @@ -0,0 +1,100 @@ +/** + * 异次元图源调试器测试 + * 测试最新的异次元图源 + */ +import { YiciyuanDebugger, isYiciyuanSource } from './src/main/debug/yiciyuan-debugger'; + +// 测试图源列表 +const testSources = [ + { + "bookSourceName": "包子漫画cn", + "bookSourceUrl": "https://cn.bzmanga.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://cn.bzmanga.com/search?q=searchKey", + "ruleSearchList": ".comics-card", + "ruleSearchName": ".comics-card__title@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "amp-img@src", + "ruleBookName": "h1.comics-detail__title@text", + "ruleBookAuthor": "h2.comics-detail__author@text", + "ruleIntroduce": "p.comics-detail__desc@text", + "ruleCoverUrl": ".pure-u-1-1 amp-img@src", + "ruleChapterList": ".comics-chapters__item", + "ruleChapterName": "text", + "ruleContentUrl": "href", + "ruleBookContent": ".comic-contain img@src" + }, + { + "bookSourceName": "巴卡漫画", + "bookSourceUrl": "https://bakamh.ru", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; U; Android 16; zh-cn) AppleWebKit/537.36 Chrome/135.0.7049.79 Mobile Safari/537.36", + "ruleSearchUrl": "https://bakamh.ru/page/searchPage/?s=searchKey&post_type=wp-manga", + "ruleSearchList": "//*[@id=\"loop-content\"]/div", + "ruleSearchName": "//h3/a/text()", + "ruleSearchNoteUrl": "//h3/a/@href", + "ruleSearchCoverUrl": ".img-responsive@src", + "ruleBookName": "//h1/text()", + "ruleBookAuthor": "//div[5]/div[2]/div/a/text()", + "ruleIntroduce": "//div[11]/div/p/text()", + "ruleChapterList": "-//li[contains(@class, 'chapter-loveYou')]/a", + "ruleChapterName": "text", + "ruleContentUrl": "storage-chapter-url", + "ruleBookContent": "//img[@class=\"wp-manga-chapter-img\"]/@src" + } +]; + +async function testSource(source: any) { + console.log('\n' + '='.repeat(60)); + console.log(`测试图源: ${source.bookSourceName}`); + console.log(`源地址: ${source.bookSourceUrl}`); + console.log('='.repeat(60)); + + // 检测是否为异次元图源 + const isYiciyuan = isYiciyuanSource(source); + console.log(`源格式检测: ${isYiciyuan ? '异次元图源' : 'Legado图源'}`); + + if (!isYiciyuan) { + console.log('跳过非异次元图源'); + return; + } + + const debugger_ = new YiciyuanDebugger(source); + + // 测试搜索 + console.log('\n--- 搜索测试 ---'); + try { + const searchResult = await debugger_.debugSearch('漫画'); + console.log(`搜索结果: ${searchResult.success ? '成功' : '失败'}`); + if (searchResult.parsedItems && searchResult.parsedItems.length > 0) { + console.log(`找到 ${searchResult.parsedItems.length} 本漫画`); + // 显示前3个结果 + searchResult.parsedItems.slice(0, 3).forEach((book: any, i: number) => { + console.log(` [${i + 1}] ${book.name || '(无名称)'} - ${book.author || '(无作者)'}`); + if (book.bookUrl) console.log(` URL: ${book.bookUrl}`); + }); + } + // 显示日志 + searchResult.logs.slice(-5).forEach(log => { + console.log(` [${log.category}] ${log.message}`); + }); + } catch (error: any) { + console.log(`搜索异常: ${error.message}`); + } +} + +async function main() { + console.log('异次元图源调试器测试'); + console.log('测试时间:', new Date().toLocaleString()); + + for (const source of testSources) { + await testSource(source); + } + + console.log('\n测试完成'); +} + +main().catch(console.error); diff --git a/test-yiciyuan-full.ts b/test-yiciyuan-full.ts new file mode 100644 index 0000000..11c094d --- /dev/null +++ b/test-yiciyuan-full.ts @@ -0,0 +1,113 @@ +/** + * 异次元图源完整测试 + * 测试搜索、详情、目录、正文功能 + */ +import { YiciyuanDebugger, isYiciyuanSource } from './src/main/debug/yiciyuan-debugger'; + +// 包子漫画cn 图源 +const baoziSource = { + "bookSourceName": "包子漫画cn", + "bookSourceUrl": "https://cn.bzmanga.com", + "bookSourceType": "漫画", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "ruleSearchUrl": "https://cn.bzmanga.com/search?q=searchKey", + "ruleSearchList": ".comics-card", + "ruleSearchName": ".comics-card__title@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchCoverUrl": "amp-img@src", + "ruleBookName": "h1.comics-detail__title@text", + "ruleBookAuthor": "h2.comics-detail__author@text", + "ruleIntroduce": "p.comics-detail__desc@text", + "ruleCoverUrl": ".pure-u-1-1 amp-img@src", + "ruleChapterList": ".comics-chapters__item", + "ruleChapterName": "text", + "ruleContentUrl": "a@href", + "ruleBookContent": "amp-img@src" +}; + +async function runFullTest() { + console.log('异次元图源完整功能测试'); + console.log('测试时间:', new Date().toLocaleString()); + console.log('测试图源:', baoziSource.bookSourceName); + console.log(''); + + const debugger_ = new YiciyuanDebugger(baoziSource); + + // 1. 搜索测试 + console.log('=== 1. 搜索测试 ==='); + const searchResult = await debugger_.debugSearch('一拳超人'); + console.log(`搜索结果: ${searchResult.success ? '成功' : '失败'}`); + + let bookUrl = ''; + if (searchResult.parsedItems && searchResult.parsedItems.length > 0) { + console.log(`找到 ${searchResult.parsedItems.length} 本漫画`); + const firstBook = searchResult.parsedItems[0]; + console.log(`第一本: ${firstBook.name}`); + bookUrl = firstBook.bookUrl || ''; + console.log(`详情URL: ${bookUrl}`); + } + console.log(''); + + // 2. 详情测试 + if (bookUrl) { + console.log('=== 2. 详情测试 ==='); + const detailResult = await debugger_.debugBookInfo(bookUrl); + console.log(`详情结果: ${detailResult.success ? '成功' : '失败'}`); + + if (detailResult.parsedItems && detailResult.parsedItems.length > 0) { + const bookInfo = detailResult.parsedItems[0]; + console.log(`书名: ${bookInfo.name || '(未获取)'}`); + console.log(`作者: ${bookInfo.author || '(未获取)'}`); + console.log(`简介: ${(bookInfo.intro || '(未获取)').substring(0, 100)}...`); + console.log(`封面: ${bookInfo.coverUrl || '(未获取)'}`); + console.log(`目录URL: ${bookInfo.tocUrl || bookUrl}`); + } + console.log(''); + + // 3. 目录测试 + console.log('=== 3. 目录测试 ==='); + const tocResult = await debugger_.debugToc(bookUrl); + console.log(`目录结果: ${tocResult.success ? '成功' : '失败'}`); + + let chapterUrl = ''; + if (tocResult.parsedItems && tocResult.parsedItems.length > 0) { + console.log(`共 ${tocResult.parsedItems.length} 个章节`); + // 显示前5个章节 + tocResult.parsedItems.slice(0, 5).forEach((chapter: any, i: number) => { + console.log(` [${i + 1}] ${chapter.name || '(无名称)'}`); + if (i === 0) chapterUrl = chapter.url || ''; + }); + if (tocResult.parsedItems.length > 5) { + console.log(` ... 还有 ${tocResult.parsedItems.length - 5} 个章节`); + } + } + console.log(''); + + // 4. 正文测试 + if (chapterUrl) { + console.log('=== 4. 正文测试 ==='); + console.log(`章节URL: ${chapterUrl}`); + const contentResult = await debugger_.debugContent(chapterUrl); + console.log(`正文结果: ${contentResult.success ? '成功' : '失败'}`); + + if (contentResult.imageUrls && contentResult.imageUrls.length > 0) { + console.log(`图片数量: ${contentResult.imageUrls.length}`); + // 显示前3张图片URL + contentResult.imageUrls.slice(0, 3).forEach((url: string, i: number) => { + console.log(` [${i + 1}] ${url.substring(0, 80)}...`); + }); + } else { + console.log('未找到图片'); + // 显示日志帮助调试 + contentResult.logs.forEach(log => { + console.log(` [${log.category}] ${log.message}`); + }); + } + } + } + + console.log('\n测试完成!'); +} + +runFullTest().catch(console.error); diff --git a/test-yiciyuan-sources.json b/test-yiciyuan-sources.json new file mode 100644 index 0000000..7a6d1f2 --- /dev/null +++ b/test-yiciyuan-sources.json @@ -0,0 +1,227 @@ +[ + { + "bookDelayTime": "", + "bookSingleThread": "否", + "bookSourceGroup": "◯ 漫画", + "bookSourceName": "◯ 18H", + "bookSourceType": "漫画", + "bookSourceUrl": "https://18h.mm-cg.com", + "enable": false, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", + "lastUpdateTime": 0, + "loginUrl": "", + "loginUrlResult": "", + "ruleBookAuthor": "", + "ruleBookContent": "@js:\nimg = [];\n\np = /Large\\_cgurl\\[(\\d+)\\]\\s=\\s\".*?\"/g;\na = String(result).match(p);\nfor(i = 0; i < a.length; i++)\n{\n img.push(a[i].match(/\"(.*?)\"/)[1]);\n}\n\nimg@Header:{Referer:host}", + "ruleBookContentDecoder": "", + "ruleBookKind": ".changetextval@text", + "ruleBookLastChapter": "", + "ruleBookName": "", + "ruleBookUrlPattern": "", + "ruleChapterId": "", + "ruleChapterList": "@js:\nlist = [{\"text\": \"1\", \"href\": baseUrl}];", + "ruleChapterName": "text", + "ruleChapterParentId": "", + "ruleChapterParentName": "", + "ruleChapterUrl": "", + "ruleChapterUrlNext": "", + "ruleContentUrl": "href", + "ruleContentUrlNext": "", + "ruleCoverDecoder": "", + "ruleCoverUrl": "", + "ruleFindUrl": "◯ 首页::/zh/18H_list/all/searchPage.html\n\n⚪︎ 短篇::/zh/doujin_list/all/searchPage.html\n\n⚪︎ 随机::/zh/18H_random/all/index/searchPage.html", + "ruleIntroduce": ".archive-title!-1@tag.h1@text", + "ruleSearchAuthor": "", + "ruleSearchCoverDecoder": "", + "ruleSearchCoverUrl": "img@src", + "ruleSearchKind": "", + "ruleSearchLastChapter": "", + "ruleSearchList": ".post", + "ruleSearchName": "tag.a.1@text", + "ruleSearchNoteUrl": "a@href", + "ruleSearchUrl": "https://18h.mm-cg.com/zh/18H_search/all/searchKey/searchPage.html", + "ruleSearchUrlNext": "", + "serialNumber": 27, + "sourceRemark": "要魔法", + "weight": 0 + }, + { + "bookDelayTime": "", + "bookSingleThread": "否", + "bookSourceGroup": "◯ 漫画", + "bookSourceName": "◯ 177漫画", + "bookSourceType": "漫画", + "bookSourceUrl": "https://www.177picyy.com", + "enable": false, + "httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", + "lastUpdateTime": 0, + "loginUrl": "", + "loginUrlResult": "", + "ruleBookAuthor": "", + "ruleBookContent": ".single-content@img@data-lazy-src@Header:{Referer:host}", + "ruleBookContentDecoder": "", + "ruleBookKind": "", + "ruleBookLastChapter": "", + "ruleBookName": "", + "ruleBookUrlPattern": "", + "ruleChapterId": "", + "ruleChapterList": "@js:\nu = /class=\"page-links\"[\\s\\S]*?<\\/div>/;\na = String(result).match(u)[0];\np = a.match(/href=\".*?\"/g);\nlist = [];\nlist.push({\"text\": 1, \"href\": baseUrl});\nfor(i = 1; i < p.length - 1; i++)\n{\n\t\tlist.push({\n\t\t\t\"text\": String(i + 1),\n\t\t\t\"href\": p[i].match(/\"(.*?)\"/)[1]\n });\n}\nlist;", + "ruleChapterName": "text", + "ruleChapterParentId": "", + "ruleChapterParentName": "", + "ruleChapterUrl": "", + "ruleChapterUrlNext": "", + "ruleContentUrl": "href", + "ruleContentUrlNext": "", + "ruleCoverDecoder": "", + "ruleCoverUrl": "", + "ruleFindUrl": "◯ 中文::/html/category/tt/page/searchPage/\n\n⚪︎ 日文::/html/category/jj/page/searchPage/\n\n⚪︎ 全彩中文::/html/category/cg/cg-cn/page/searchPage/\n\n⚪︎ 全彩日文::/html/category/cg/cg-jp/page/searchPage/\n\n⚪︎ 全彩纯图::/html/category/cg/cg-no/page/searchPage/", + "ruleIntroduce": "@js:\na = java.get(\"h2\");", + "ruleSearchAuthor": "", + "ruleSearchCoverDecoder": "", + "ruleSearchCoverUrl": "img@src\n@js:\na = String(result);\np = a.replace(/w=(\\d+)/, \"w=810\");\np = p.replace(/h=(\\d+)/, \"h=1440\");\np;", + "ruleSearchKind": "tag.span.1@text", + "ruleSearchLastChapter": "", + "ruleSearchList": "id.main@.picture-box||id.main@article", + "ruleSearchName": "h2@text\n@js:\njava.put(\"h2\", result);", + "ruleSearchNoteUrl": "a@href", + "ruleSearchUrl": "https://www.177picyy.com/page/searchPage/?s=searchKey&cat=0", + "ruleSearchUrlNext": "", + "serialNumber": 38, + "sourceRemark": "要魔法", + "weight": 0 + }, + { + "bookSourceGroup": "漫画", + "bookSourceName": "包子漫画cn", + "bookSourceType": "漫画", + "bookSourceUrl": "https://cn.bzmanga.com", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", + "lastUpdateTime": 0, + "loginUrl": "", + "loginUrlResult": "", + "ruleBookAuthor": "h2.comics-detail__author@text", + "ruleBookContent": "@js:\nlet list = [];\nlet doc = org.jsoup.Jsoup.parse(result);\nfor (;;) {\n let arr = doc.select('amp-state[id^=\"chapter\"] > script').toArray().map(e => String(e));\n for (let x = 0; x < arr.length; x++) {\n let text = arr[x];\n let u = JSON.parse(arr[x].match(/(.*)<\\/script>/)[1].replace(/baozicdn/,'baozimh'));\n list.push(u.url);\n }\n nextNode = doc.select('#next-chapter');\n if (!String(nextNode.text()).match(/下一页/)) break;\n nextUrl = String(nextNode.attr('href'));\n doc = org.jsoup.Jsoup.connect(nextUrl).get();\n}\nlist;@Header:{Referer:\"https://cn.bzmanga.com/\"}", + "ruleBookContentDecoder": "", + "ruleBookKind": ".tag-list@span@text", + "ruleBookLastChapter": ".supporting-text span>a@text", + "ruleBookName": "h1.comics-detail__title@text", + "ruleChapterId": "", + "ruleChapterList": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\n(function (){\n rule1 = doc.select(\".section-title:contains(章节目录)~div .comics-chapters__item\");\n if (rule1.size() > 0) return rule1;\n rule2 = doc.select(\".section-title:contains(最新章节)~div .comics-chapters__item\")\n if (rule2.size() > 0) return rule2.toArray().reverse();\n return doc.select(\"div>span:contains(最新:) a\");\n})()", + "ruleChapterName": "text", + "ruleChapterParentId": "", + "ruleChapterParentName": "", + "ruleChapterUrl": "", + "ruleChapterUrlNext": "", + "ruleContentUrl": "href", + "ruleContentUrlNext": "", + "ruleCoverUrl": ".pure-u-1-1 amp-img@src", + "ruleFindUrl": "最新上架::https://cn.bzmanga.com/list/new\n中国::https://cn.bzmanga.com/classify?region=cn&page=searchPage\n日本::https://cn.bzmanga.com/classify?region=jp&page=searchPage", + "ruleIntroduce": "p.comics-detail__desc@text", + "ruleSearchAuthor": ".tags@text", + "ruleSearchCoverUrl": "amp-img@src", + "ruleSearchKind": "", + "ruleSearchLastChapter": "", + "ruleSearchList": ".comics-card", + "ruleSearchName": ".comics-card__title@text", + "ruleSearchNoteUrl": "tag.a.0@href", + "ruleSearchUrl": "https://cn.bzmanga.com/search?q=searchKey", + "ruleSearchUrlNext": "", + "serialNumber": 10090, + "sourceRemark": "修复目录问题", + "weight": 804 + }, + { + "bookDelayTime": "", + "bookSingleThread": "否", + "bookSourceGroup": "18🈲", + "bookSourceName": "巴卡漫画", + "bookSourceType": "漫画", + "bookSourceUrl": "https://bakamh.ru", + "enable": true, + "httpUserAgent": "Mozilla/5.0 (Linux; U; Android 16; zh-cn; 24129PN74C Build/BP2A.250605.031.A3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.7049.79 Mobile Safari/537.36 XiaoMi/MiuiBrowser/20.6.71104", + "lastUpdateTime": 0, + "loginUrl": "https://bakamh.ru/", + "loginUrlResult": "", + "ruleBookAuthor": "//div[5]/div[2]/div/a/text()", + "ruleBookContent": "//img[@class=\"wp-manga-chapter-img\"]/@src@Header:{\"sec-fetch-mode\":\"no-cors\";\"Accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7\"}", + "ruleBookContentDecoder": "", + "ruleBookKind": "//div[8]/div[2]/div/a/text()", + "ruleBookLastChapter": "", + "ruleBookName": "//h1/text()", + "ruleBookUrlPattern": "", + "ruleChapterId": "", + "ruleChapterList": "-//li[contains(@class, 'chapter-loveYou')]/a", + "ruleChapterName": "text", + "ruleChapterParentId": "", + "ruleChapterParentName": "", + "ruleChapterUrl": "", + "ruleChapterUrlNext": "", + "ruleContentUrl": "storage-chapter-url", + "ruleContentUrlNext": "", + "ruleCoverDecoder": "", + "ruleCoverUrl": "//div[2]/div/div/div/div[1]/div/div[1]/div/div[2]/div/div[1]/a/img/@src@Header:{\"sec-fetch-mode\":\"no-cors\";\"Accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7\"}", + "ruleFindUrl": "韩漫::manhwa/page/searchPage@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}\nBL漫画::bl/page/searchPage@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}", + "ruleIntroduce": "//div[11]/div/p/text()", + "ruleSearchAuthor": "", + "ruleSearchCoverDecoder": "", + "ruleSearchCoverUrl": ".img-responsive@src@Header:{\"sec-fetch-mode\":\"no-cors\";\"Accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7\"}", + "ruleSearchKind": "//div[3]/div[2]/a/text()", + "ruleSearchLastChapter": ".chapter-item@text", + "ruleSearchList": "//*[@id=\"loop-content\"]/div", + "ruleSearchName": "//h3/a/text()", + "ruleSearchNoteUrl": "//h3/a/@href@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}", + "ruleSearchUrl": "https://bakamh.ru/page/searchPage/?s=searchKey&post_type=wp-manga@Header:{\"sec-fetch-mode\":\"navigate\";\"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"}", + "ruleSearchUrlNext": "", + "serialNumber": 166, + "sourceRemark": "发布页\nhttps://bakamh.app", + "weight": 9999 + }, + { + "bookDelayTime": "", + "bookSingleThread": "否", + "bookSourceGroup": "", + "bookSourceName": "再漫画", + "bookSourceType": "漫画", + "bookSourceUrl": "https://v4api.zaimanhua.com", + "enable": true, + "httpUserAgent": "Dart/3.4 (dart:io)", + "lastUpdateTime": 0, + "loginUrl": "https://zaimanhua.com", + "loginUrlResult": "", + "ruleBookAuthor": "", + "ruleBookContent": "*.data.page_url.*@Header:{referer=\"https://www.zaimanhua.com/\"}", + "ruleBookContentDecoder": "", + "ruleBookKind": "$.data.data.status&&$.data.data.types", + "ruleBookLastChapter": "$.data.data.last_update_chapter_name", + "ruleBookName": "", + "ruleBookUrlPattern": "", + "ruleChapterId": "", + "ruleChapterList": "-$.data.data.chapters.*.data.*", + "ruleChapterName": "$.chapter_title", + "ruleChapterParentId": "", + "ruleChapterParentName": "", + "ruleChapterUrl": "", + "ruleChapterUrlNext": "", + "ruleContentUrl": "$.chapter_id", + "ruleContentUrlNext": "", + "ruleCoverDecoder": "", + "ruleCoverUrl": "", + "ruleFindUrl": "最近更新::https://v4api.zaimanhua.com/app/v1/comic/update/list/0/searchPage\n人气排行::https://v4api.zaimanhua.com/app/v1/comic/rank/list?tag_id=0&by_time=3&rank_type=0&page=searchPage", + "ruleIntroduce": "$.data.data.description", + "ruleSearchAuthor": "$.authors", + "ruleSearchCoverDecoder": "", + "ruleSearchCoverUrl": "$.cover", + "ruleSearchKind": "$.types", + "ruleSearchLastChapter": "$.last_name", + "ruleSearchList": "$.data.list||$.data", + "ruleSearchName": "$.title", + "ruleSearchNoteUrl": "$.id&&$.comic_id", + "ruleSearchUrl": "https://v4api.zaimanhua.com/app/v1/search/index?keyword=searchKey&source=0&page=searchPage&size=20", + "ruleSearchUrlNext": "", + "serialNumber": 1, + "sourceRemark": "可能是dmzj的平替", + "weight": 0 + } +] diff --git a/test-zymk-chapterlist.ts b/test-zymk-chapterlist.ts new file mode 100644 index 0000000..fdd4a86 --- /dev/null +++ b/test-zymk-chapterlist.ts @@ -0,0 +1,60 @@ +/** + * 调试知音漫客章节列表 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; + +async function test() { + const url = 'https://m.zymk.cn/101/'; + const result = await httpRequest({ + url, + headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const $ = cheerio.load(result.body || ''); + + // 查找 .chapterlist + console.log('=== .chapterlist 分析 ==='); + const chapterlist = $('.chapterlist'); + console.log('.chapterlist 数量:', chapterlist.length); + + if (chapterlist.length > 0) { + console.log('.chapterlist li 数量:', chapterlist.find('li').length); + console.log('.chapterlist a 数量:', chapterlist.find('a').length); + + // 打印 HTML + console.log('\n.chapterlist HTML (前1000字符):'); + console.log(chapterlist.html()?.substring(0, 1000)); + } + + // 查找 mk-chapterlist-box + console.log('\n=== .mk-chapterlist-box 分析 ==='); + const mkBox = $('.mk-chapterlist-box'); + console.log('.mk-chapterlist-box 数量:', mkBox.length); + + if (mkBox.length > 0) { + console.log('.mk-chapterlist-box li 数量:', mkBox.find('li').length); + console.log('.mk-chapterlist-box a 数量:', mkBox.find('a').length); + + // 打印 HTML + console.log('\n.mk-chapterlist-box HTML (前1000字符):'); + console.log(mkBox.html()?.substring(0, 1000)); + } + + // 查找页面中的所有 script 标签,看是否有章节数据 + console.log('\n=== Script 标签分析 ==='); + $('script').each((i, el) => { + const text = $(el).html() || ''; + if (text.includes('chapter') || text.includes('Chapter')) { + console.log(`\nScript[${i}] 包含 chapter:`); + console.log(text.substring(0, 500)); + } + }); +} + +test().catch(console.error); diff --git a/test-zymk-content.ts b/test-zymk-content.ts new file mode 100644 index 0000000..7efe3ac --- /dev/null +++ b/test-zymk-content.ts @@ -0,0 +1,65 @@ +/** + * 调试知音漫客正文 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; + +async function test() { + // 章节URL格式: 433822.html (相对路径) + // 尝试不同的URL格式 + const urls = [ + 'https://m.zymk.cn/101/1.html', + 'https://m.zymk.cn/101/433822.html', + 'https://m.zymk.cn/read/101/1.html', + ]; + + for (const url of urls) { + console.log('\n尝试URL:', url); + + const result = await httpRequest({ + url, + headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + continue; + } + + console.log('响应状态:', result.statusCode); + console.log('响应长度:', result.body?.length); + + const $ = cheerio.load(result.body || ''); + + console.log('\n=== 图片选择器测试 ==='); + console.log('.comic-page:', $('.comic-page').length); + console.log('.comic-page img:', $('.comic-page img').length); + console.log('.comic-contain:', $('.comic-contain').length); + console.log('.comic-contain img:', $('.comic-contain img').length); + console.log('img[data-original]:', $('img[data-original]').length); + console.log('img[data-src]:', $('img[data-src]').length); + console.log('img:', $('img').length); + + // 查找所有包含 comic 的类 + const comicClasses: string[] = []; + $('[class*="comic"]').each((_, el) => { + const cls = $(el).attr('class') || ''; + if (!comicClasses.includes(cls)) comicClasses.push(cls); + }); + console.log('\n包含comic的类:', comicClasses); + + // 打印所有图片 + console.log('\n=== 所有图片 ==='); + $('img').each((i, el) => { + if (i >= 10) return; + const src = $(el).attr('src') || ''; + const dataSrc = $(el).attr('data-src') || ''; + const dataOriginal = $(el).attr('data-original') || ''; + console.log(`[${i}] src=${src.substring(0, 50)} data-src=${dataSrc.substring(0, 50)} data-original=${dataOriginal.substring(0, 50)}`); + }); + + break; // 成功后退出循环 + } +} + +test().catch(console.error); diff --git a/test-zymk-search.ts b/test-zymk-search.ts new file mode 100644 index 0000000..62dee57 --- /dev/null +++ b/test-zymk-search.ts @@ -0,0 +1,84 @@ +/** + * 调试知音漫客搜索 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; + +async function test() { + // 知音漫客的搜索需要通过分类页面 + // 尝试不同的搜索方式 + + const testUrls = [ + // 分类页面带搜索参数 + 'https://m.zymk.cn/sort/all.html?key=斗罗', + // 直接分类页面 + 'https://m.zymk.cn/sort/all.html', + // PC版搜索 + 'https://www.zymk.cn/search.html?keyword=斗罗', + // 尝试 API + 'https://www.zymk.cn/search/getSearchResult?keyword=斗罗&page=1', + ]; + + for (const url of testUrls) { + console.log(`\n=== 测试: ${url} ===`); + + const result = await httpRequest({ + url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36', + 'Referer': 'https://m.zymk.cn/' + } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + continue; + } + + console.log('状态:', result.statusCode); + console.log('长度:', result.body?.length); + + // 检查是否是 JSON + if (result.body?.startsWith('{') || result.body?.startsWith('[')) { + console.log('JSON 响应:', result.body?.substring(0, 500)); + continue; + } + + const $ = cheerio.load(result.body || ''); + + // 查找漫画列表 + console.log('页面标题:', $('title').text()); + + // 尝试各种选择器 + const selectors = [ + '.comic-sort li', + '.comic-list li', + '.search-list li', + '.list-comic li', + 'ul li a', + ]; + + for (const sel of selectors) { + const count = $(sel).length; + if (count > 0) { + console.log(`选择器 "${sel}": ${count} 个`); + // 打印第一个 + const first = $(sel).first(); + console.log(' 第一个:', first.text().substring(0, 50)); + console.log(' 链接:', first.find('a').attr('href') || first.attr('href')); + } + } + + // 如果找到 comic-sort,打印详细信息 + if ($('.comic-sort li').length > 0) { + console.log('\n--- 漫画列表详情 ---'); + $('.comic-sort li').slice(0, 3).each((i, el) => { + const $el = $(el); + console.log(`[${i + 1}]`); + console.log(' HTML:', $el.html()?.substring(0, 200)); + }); + } + } +} + +test().catch(console.error); diff --git a/test-zymk-toc.ts b/test-zymk-toc.ts new file mode 100644 index 0000000..8e776e0 --- /dev/null +++ b/test-zymk-toc.ts @@ -0,0 +1,76 @@ +/** + * 调试知音漫客目录 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; +import { parseList, ParseContext } from './src/main/debug/rule-parser'; + +async function test() { + const url = 'https://m.zymk.cn/101/'; + const result = await httpRequest({ + url, + headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36' } + }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const $ = cheerio.load(result.body || ''); + + console.log('=== 页面结构 ==='); + console.log('#chapterList:', $('#chapterList').length); + console.log('#chapterList a:', $('#chapterList a').length); + console.log('.chapter-list:', $('.chapter-list').length); + console.log('.chapter-list a:', $('.chapter-list a').length); + + // 查找所有包含 chapter 的元素 + const chapterEls: string[] = []; + $('[id*="chapter"], [class*="chapter"]').each((_, el) => { + const id = $(el).attr('id') || ''; + const cls = $(el).attr('class') || ''; + const tag = $(el).prop('tagName'); + const key = `${tag}#${id}.${cls}`; + if (!chapterEls.includes(key)) chapterEls.push(key); + }); + console.log('\n包含chapter的元素:', chapterEls.slice(0, 10)); + + // 查找所有链接 + console.log('\n=== 链接分析 ==='); + const links = $('a[href*="/"]'); + console.log('总链接数:', links.length); + + // 查找章节链接模式 + const chapterLinks = $('a[href*="/101/"]'); + console.log('包含/101/的链接:', chapterLinks.length); + + if (chapterLinks.length > 0) { + console.log('\n前5个章节链接:'); + chapterLinks.slice(0, 5).each((i, el) => { + console.log(` [${i + 1}] ${$(el).text().trim().substring(0, 30)} - ${$(el).attr('href')}`); + }); + } + + // 测试规则 + const ctx: ParseContext = { + body: result.body || '', + baseUrl: 'https://m.zymk.cn', + variables: {} + }; + + const rules = [ + 'id.chapterList@tag.a', + '#chapterList a', + '.chapter-list a', + 'a[href*="/101/"]', + ]; + + console.log('\n=== 规则测试 ==='); + for (const rule of rules) { + const elements = parseList(ctx, rule); + console.log(`规则 "${rule}": ${elements.length} 个元素`); + } +} + +test().catch(console.error); diff --git a/test-zymk.ts b/test-zymk.ts new file mode 100644 index 0000000..53df893 --- /dev/null +++ b/test-zymk.ts @@ -0,0 +1,22 @@ +/** + * 测试知音漫客 + */ +import { httpRequest } from './src/main/debug/http-client'; + +async function test() { + const url = 'https://m.zymk.cn/sort/all.html?key=斗破苍穹'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + console.log('响应长度:', body.length); + console.log('包含 class="item":', body.includes('class="item"')); + console.log('包含 class=\'item\':', body.includes("class='item'")); + console.log('响应预览:', body.substring(0, 1000)); +} + +test().catch(console.error); diff --git a/test-zymk2.ts b/test-zymk2.ts new file mode 100644 index 0000000..fd8f1fe --- /dev/null +++ b/test-zymk2.ts @@ -0,0 +1,31 @@ +/** + * 测试知音漫客选择器 + */ +import { httpRequest } from './src/main/debug/http-client'; +import * as cheerio from 'cheerio'; + +async function test() { + const url = 'https://m.zymk.cn/sort/all.html?key=斗破苍穹'; + const result = await httpRequest({ url }); + + if (!result.success) { + console.log('请求失败:', result.error); + return; + } + + const body = result.body || ''; + const $ = cheerio.load(body); + + // 测试各种选择器 + console.log('.item 数量:', $('.item').length); + console.log('[class="item"] 数量:', $('[class="item"]').length); + console.log('.item h3 数量:', $('.item h3').length); + + // 打印第一个 .item 的 HTML + const firstItem = $('.item').first(); + if (firstItem.length) { + console.log('\n第一个 .item HTML:', firstItem.html()?.substring(0, 300)); + } +} + +test().catch(console.error);