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 c2213ce..0000000 Binary files a/assets/icon.icns and /dev/null differ diff --git a/assets/icon.ico b/assets/icon.ico index 98948ea..5dec56a 100644 Binary files a/assets/icon.ico and b/assets/icon.ico differ diff --git a/assets/icon.png b/assets/icon.png index 755a6e5..7c78153 100644 Binary files a/assets/icon.png and b/assets/icon.png differ diff --git a/assets/icon.svg b/assets/icon.svg index b064abf..19ac283 100644 --- a/assets/icon.svg +++ b/assets/icon.svg @@ -1,23 +1,55 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + </> + 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": "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+EQNVYEA510MYdQfoAQkBkNq9BUKbydWGfbubQWWdgLxSpFPbHQJsi5veTN+dPnrQ9FYmTVbbVlH/4alRW92D9v/kbow5aDdVm2SAsSjRbGhe8trEo/n8/+47m+H8A1BNZW2tWmZLWtX0iblYnkDUFaLZIS1OyNbK+YmxZw+qA6PW+4QSnxAEGx92LLo4EA+Ir12/x2/8Aue/LDuvWt4k8osFgQgAu1Av7c6U2OOPuQXOStuygExE1LZPLDUR6XLPpg+QrroaBcMnShD41FSmKWppgXiAt4XvfPYyMUeLdXj4F2Ue8Fl7mMHZgwHwgXP/JD9NrjNZRzSoQBK54t3Y+v/vK5s6lGPzY2MTO0vibS5WTWC8X4VIVCS2f8D6AS+CNemsbHbQuavX1CPL+YC76DWbByRlBnk4S3k2B4ZzpyyKfmcSdtgWg8PRcUIP0I+I38RcamYHq1bQzoyPTrLQL+Y+MK5aaQMAGUrroAnG4mloUDJ4G0/v9xMK6JuBTLE9ZcIlEj3t/BdKVo2EjPuXzVCfSPPJ06y5QGaW/YB0yj5Ei/FfFA6qraMO18GzfhiHSlAEB4A8liKyzP0Ug5CA/fiSyuW9B3zXIKwD5X5GiakSXmwz/4zTcgimCINNNVBUc8xEmi3zth6nXlVNGllX/Kg0dPNsJKcgYuKWz2Ji5+e2VcD81f8AtS+V8q7H8QHh9hUVKPDQ=", + "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": "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", + "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": "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", + "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);