🔞第一版主bznet系by812

bz888888888.net

tjjj812 (935)05/15 12:57

第一版主重构版 by 812 @260515
专对bz********.net适配
目前发现的有3类,均已做成书源,推荐mumu系,可切换源很多
三年前发布了一个812版的第一版主源之后,看到一直有人在这基础上删删改改,就没有再维护了,自己用也是随手改了就用了,最近失业在家,仔细重构升级了一下,相关注释尽量写明,主要改进如下:
	1.发现界面大优化,分为传统发现、自定发现、关注作者三个版面,并提供各自的配置界面以及域名切换相关配置界面;
	2.在登录功能中提供了🚨格式化🚨功能,可将书源所有自定义配置清空,还原为原始导入状态,慎用!!
	3.传统发现通过配置显示书籍分类,可配置项有小说状态、排序方式、发现起始页数(就是从对应的发现链接第几页开始获取,方便翻旧账😎),同时提供一个可配置的快捷搜索;
	4.新增自定发现,可在对应的配置界面自行配置,自主选择加入传统发现、自定义搜索、自定义作者搜索,在对应的配置界面进行添加删除;
	5.新增关注作者界面,可以按作者查看作品,在对应的配置界面进行添加删除;
	6.域名切换功能进行重构及优化,支持自定义添加域名及通过发布页获取域名,获取到的域名会进行目录体系检测,确保切换域名不会造成目录变成了别的小说;
	7.域名目录体系检测参见jsLib代码中的checkPairs常量,可自行修改,新增域名及获取域名时会按照路径对应的小说名称进行校验,同路径下获取的小说名称不同的不会添加;
	8.checkPairs建议隔一段时间手动更新一下,按照最新入库的小说更新即可,否则有可能时间长了网站新做分支时对新小说无法识别是否同一目录体系;
	9.新增测速功能,测速的时候会对重定向的域名进行处理,如果重定向后的域名在域名列表里,直接删除原域名,否则新增重定向后的域名后再删除;
	10.测速结果仅供参考,因为第一版主服务器非常不稳定,可以多测几次,获取域名的时候也是同理;
	11.利用目录更新前js对域名切换做了处理,切换域名后在刷新小说目录的时候会自动将小说的相关连接切换过去,基本无感;
	12.鉴于服务器不稳定,对获取目录、分页获取正文都做了处理,返回页面不全、超时、503等异常情况下,会延时重新获取,最多重新获取5次,如果还是获取不到才会写入“刷新试试”;
	13.对分页拼接、35字还原、正文替换的正则进行了优化,大大提升了正文解析效率;
	14.滑动条人机验证自动弹出,这个懒得作自动通过了,有兴趣的同学可以自己完善。
	15.本书源专对bz*****.com的域名进行验证,目前能获取到的只有bz888888888.com一个域名,需要其他域名的可自行修改,相关常量:checkPairs、fetchHostsUrls、defaultHosts,修改后重置一下就好;
	16.找工作中,如果找不到一个养老的工作,后面应该不会再写源了,毕竟一个为生计奔波的中年人不会有那么多的时间和体力……
以上。
祝大家生活如意,工作顺遂,愿开源与共享精神永存!!
二维码导入
{
    "bookSourceComment": "第一版主重构版 by 812 @260515\n专对bz********.net适配\n目前发现的有3类,均已做成书源,推荐mumu系,可切换源很多\n三年前发布了一个812版的第一版主源之后,看到一直有人在这基础上删删改改,就没有再维护了,自己用也是随手改了就用了,最近失业在家,仔细重构升级了一下,相关注释尽量写明,主要改进如下:\n\t1.发现界面大优化,分为传统发现、自定发现、关注作者三个版面,并提供各自的配置界面以及域名切换相关配置界面;\n\t2.在登录功能中提供了🚨格式化🚨功能,可将书源所有自定义配置清空,还原为原始导入状态,慎用!!\n\t3.传统发现通过配置显示书籍分类,可配置项有小说状态、排序方式、发现起始页数(就是从对应的发现链接第几页开始获取,方便翻旧账😎),同时提供一个可配置的快捷搜索;\n\t4.新增自定发现,可在对应的配置界面自行配置,自主选择加入传统发现、自定义搜索、自定义作者搜索,在对应的配置界面进行添加删除;\n\t5.新增关注作者界面,可以按作者查看作品,在对应的配置界面进行添加删除;\n\t6.域名切换功能进行重构及优化,支持自定义添加域名及通过发布页获取域名,获取到的域名会进行目录体系检测,确保切换域名不会造成目录变成了别的小说;\n\t7.域名目录体系检测参见jsLib代码中的checkPairs常量,可自行修改,新增域名及获取域名时会按照路径对应的小说名称进行校验,同路径下获取的小说名称不同的不会添加;\n\t8.checkPairs建议隔一段时间手动更新一下,按照最新入库的小说更新即可,否则有可能时间长了网站新做分支时对新小说无法识别是否同一目录体系;\n\t9.新增测速功能,测速的时候会对重定向的域名进行处理,如果重定向后的域名在域名列表里,直接删除原域名,否则新增重定向后的域名后再删除;\n\t10.测速结果仅供参考,因为第一版主服务器非常不稳定,可以多测几次,获取域名的时候也是同理;\n\t11.利用目录更新前js对域名切换做了处理,切换域名后在刷新小说目录的时候会自动将小说的相关连接切换过去,基本无感;\n\t12.鉴于服务器不稳定,对获取目录、分页获取正文都做了处理,返回页面不全、超时、503等异常情况下,会延时重新获取,最多重新获取5次,如果还是获取不到才会写入“刷新试试”;\n\t13.对分页拼接、35字还原、正文替换的正则进行了优化,大大提升了正文解析效率;\n\t14.滑动条人机验证自动弹出,这个懒得作自动通过了,有兴趣的同学可以自己完善。\n\t15.本书源专对bz*****.com的域名进行验证,目前能获取到的只有bz888888888.com一个域名,需要其他域名的可自行修改,相关常量:checkPairs、fetchHostsUrls、defaultHosts,修改后重置一下就好;\n\t16.找工作中,如果找不到一个养老的工作,后面应该不会再写源了,毕竟一个为生计奔波的中年人不会有那么多的时间和体力……\n以上。\n祝大家生活如意,工作顺遂,愿开源与共享精神永存!!",
    "bookSourceGroup": "🔞,🔞第一版主",
    "bookSourceName": "🔞第一版主bznet系by812",
    "bookSourceType": 0,
    "bookSourceUrl": "bz888888888.net",
    "bookUrlPattern": "@js:getHostUrl(java,source)",
    "concurrentRate": "100",
    "customButton": false,
    "customOrder": 0,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": false,
    "exploreUrl": "@js:\nMD = 'disc';\nclearUI();\nlet args = getArgs(java,source);\nif(args.viewMode !== \"setting\"){\n\tinfoMap[\"state\"] = args.state;\n\tinfoMap[\"order\"] = args.order;\n\tinfoMap[\"domain\"] = args.domain;\n}\ninfoMap[\"keyWord\"] = args.keyWord;\ninfoMap[\"offset\"] = args.offset + \"\";\ninfoMap.save();\n\/\/发现模式\nif(args.viewMode == \"discover\"){\n\tpushUI(newTitle(\"🗽\" + getHostUrl(java,source), MD));\n\t\/\/自定义发现\n\tif(args.discoverMode == \"customize\") {\n\t\tpushUI(newButton(\"🔆自设发现🔆\",MD,\"changeDiscoverMode(java,source,'discover')\",2));\n\t\tpushUI(newButton(\"🧑‍💻关注作者🧑‍💻\",MD,\"changeDiscoverMode(java,source,'authorNovel')\",2));\n\t\tpushUI(newButton(\"【⚙️自定义发现参数配置⚙️】\",MD,\"changeWorkMode(java,source,'setting')\",1));\n\t\tfor (var i in args.UDDiscoverArr) {\n\t\t\tlet charLength = args.UDDiscoverArr[i].replace(\/[\\u0391-\\uFFE5]\/g, 'aa').length;\n\t\t\tif(charLength > 16){\n\t\t\t\tcolsTemp = 1;\n\t\t\t} else if(charLength > 10){\n\t\t\t\tcolsTemp = 2;\n\t\t\t} else if(charLength > 4){\n\t\t\t\tcolsTemp = 3;\n\t\t\t} else{\n\t\t\t\tcolsTemp = 4;\n\t\t\t}\n\t\t\tpushUI(newUrl(args.UDDiscoverArr[i], args.UDDiscover[args.UDDiscoverArr[i]],colsTemp));\n\t\t}\n\t}\n\t\/\/关注作者\n\telse if(args.discoverMode == \"authorNovel\") {\n\t\tpushUI(newButton(\"👓️发现模式👓️\",MD,\"changeDiscoverMode(java,source,'discover')\",2));\n\t\tpushUI(newButton(\"🔆关注作者🔆\",MD,\"\",2));\n\t\tlet hasAuthor = false;\n\t\tpushUI(newButton(\"【⚙️关注作者参数配置⚙️】\",MD,\"changeWorkMode(java,source,'setting')\",1));\n\t\t\/\/自定义关注作者\n\t\tif(args.authors.length > 0){\n\t\t\tlet calcWidth = 0;\n\t\t\tlet colsTemp = 1;\n\t\t\t\/\/分组下作者\n\t\t\tfor (var i in args.authors){\n\t\t\t\tlet charLength = args.authors[i].replace(\/[\\u0391-\\uFFE5]\/g, 'aa').length;\n\t\t\t\tif(charLength > 16){\n\t\t\t\t\tcolsTemp = 1;\n\t\t\t\t} else if(charLength > 10){\n\t\t\t\t\tcolsTemp = 2;\n\t\t\t\t} else if(charLength > 4){\n\t\t\t\t\tcolsTemp = 3;\n\t\t\t\t} else{\n\t\t\t\t\tcolsTemp = 4;\n\t\t\t\t}\n\t\t\t\tpushUI(newUrl(args.authors[i], initDiscoverUrl_A(args.authors[i]),colsTemp));\n\t\t\t}\n\t\t}\n\t}\n\t\/\/传统发现\n\telse if(args.discoverMode == \"discover\") {\n\t\tpushUI(newButton(\"🔆传统发现🔆\",MD,\"changeDiscoverMode(java,source,'customize')\",2));\n\t\tpushUI(newButton(\"🧑‍💻关注作者🧑‍💻\",MD,\"changeDiscoverMode(java,source,'authorNovel')\",2));\n\t\tif(args.keyWord.length > 0){\n\t\t\tpushUI(newUrl(`🔎搜索【${args.keyWord}】`,initDiscoverUrl_S(args.keyWord),1));\n\t\t}\n\t\tlet cateTitle = `⚙️ ${args.state.split(\" \")[1]}小说按${args.order.split(\" \")[1]}:⚙️`;\n\t\tpushUI(newButton(cateTitle,MD,\"changeWorkMode(java,source,'setting')\",29));\n\t\tfor(let i in optionsJson.cate){\n\t\t\tpushUI(newUrl(optionsJson.cate[i],initDiscoverUrl(java,source,optionsJson.cate[i],args.offset),2));\n\t\t}\n\t\t\n\t} else {\n\t\targs.discoverMode = \"discover\";\n\t\tsaveArgs(source, args);\n\t\tjava.refreshExplore();\n\t}\n}\n\/\/设置模式\nelse if(args.viewMode  == \"setting\"){\n\t\/\/传统发现设置\n\tif(args.discoverMode == \"discover\"){\n\t\tpushUI(newButton(\"🔆👓️🔆传统发现设置🔆👓️🔆\",MD,\"\",1));\n\t\tpushUI(newButton(\"👓️状态:\",MD,\"\",3));\n\t\tpushUI(newToggle(\"state\", \" \",MD,optionsJson.state,\"java.refreshExplore()\",22));\n\t\tpushUI(newButton(\"👓️排序:\",MD,\"\",3));\n\t\tpushUI(newToggle(\"order\", \" \",MD,optionsJson.order,\"java.refreshExplore()\",22));\n\t\tpushUI(newButton(\"👓️开始页数:\",MD,\"\",2));\n\t\tpushUI(newText(\"offset\",MD,\"\",22));\n\t\tpushUI(newButton(\"🔎关键字\",MD,\"\",3));\n\t\tpushUI(newText(\"keyWord\",MD,\"\",22));\n\t}\n\t\/\/自设发现设置\n\telse if(args.discoverMode == \"customize\"){\n\t\tpushUI(newButton(\"🔆👓️🔆自设发现设置🔆👓️🔆\",MD,\"\",1));\n\t\tpushUI(newText(\"自定义标题\",MD,\"\",1));\n\t\tpushUI(newSelect(\"UDType\", \"⚙️ 添加发现类型\", MD, [\"👓️发现\",\"🔎搜索\",\"🧑‍💻作者\"], \"java.refreshExplore()\", 1));\n\t\tif(infoMap[\"UDType\"] == \"🔎搜索\") {\n\t\t\tpushUI(newText(\"搜索关键字\",MD,\"\",1));\n\t\t\tpushUI(newButton(\"➕️添加自定义搜索➕️\",MD,\"addUDDiscover(java, source, infoMap, 'search')\",1));\n\t\t} else if(infoMap[\"UDType\"] == \"🧑‍💻作者\") {\n\t\t\tpushUI(newText(\"关注作者\",MD,\"\",1));\n\t\t\tpushUI(newButton(\"➕️添加关注作者➕️\",MD,\"addUDDiscover(java, source, infoMap, 'author')\",1));\n\t\t} else {\n\t\t\tpushUI(newSelect(\"state\", \" \", MD, optionsJson.state, \"\", 2));\n\t\t\tpushUI(newSelect(\"order\", \" \", MD, optionsJson.order, \"\", 2));\n\t\t\tpushUI(newSelect(\"cate\", \" \", MD, optionsJson.cate, \"\", 1));\n\t\t\tpushUI(newText(\"起始页数\",MD,\"\",2));\n\t\t\tpushUI(newButton(\"➕️添加发现➕️\",MD,\"addUDDiscover(java, source, infoMap, 'discover')\",2));\n\t\t}\n\t\tif(args.UDDiscoverArr.length > 0){\n\t\t\tpushUI(newButton(\"↙️删除选中❌️\",MD,\"delUDDiscover(java, source, infoMap)\",1));\n\t\t\tpushUI(newSelect(\"UDDiscovers\", \"🧑‍💻 作者\", MD, args.UDDiscoverArr, \"\", 1));\n\t\t}\n\t\t\n\t\t\n\t}\n\t\/\/关注作者设置\n\telse if(args.discoverMode == \"authorNovel\"){\n\t\tpushUI(newButton(\"🔆🧑‍💻🔆关注作者设置🔆🧑‍💻🔆\",MD,\"\",1));\n\t\tpushUI(newText(\"添加作者\",MD,\"\",1));\n\t\tpushUI(newButton(\"➕️添加作者↗️\", MD, \"addAuthor(java, source, infoMap)\", 2));\n\t\tjava.log(args.authors.length)\n\t\tif(args.authors.length > 0){\n\t\t\tpushUI(newButton(\"↙️删除选中❌️\",MD,\"delAuthor(java, source, infoMap)\",2));\n\t\t\tpushUI(newSelect(\"authors\", \"🧑‍💻 作者\", MD, args.authors, \"\", 1));\n\t\t}\n\t\t}\n\t\t\n} else if (args.viewMode  == \"hosts\") {\n\tpushUI(newButton(\"🔆🛜🔆域名相关设置🔆🛜🔆\", MD, \"\", 1));\n\tpushUI(newSelect(\"protocal\", \" \", MD, [\"http\", \"https\"], \"\", 3));\n\tpushUI(newText(\"URL\",MD,\"\",22));\n\tpushUI(newButton(\"➕️添加域名↗️\", MD, \"addHost(java, source, infoMap)\", 2));\n\tpushUI(newButton(\"↙️删除选中❌️\",MD,\"delHost(java, source, infoMap)\",2));\n\tpushUI(newSelect(\"domain\", \"⚙️ 域名\", MD, args.hostArr, \"switchHost(java, source, infoMap)\", 1));\n\tpushUI(newButton(\"📥️获取域名📥️\", MD, \"getHostUrls(java, source)\", 2));\n\tpushUI(newButton(\"📶连接测试⏱️\", MD, \"testConnet(java, source, infoMap)\", 2));\n}\n\/\/默认显示传统发现设置\nelse {\n\targs.viewMode = \"discover\";\n\tsaveArgs(source, args);\n\tjava.refreshExplore();\n}\n\/\/设置模式显示确认取消\nif(args.viewMode  != \"discover\"){\n\tpushUI(newButton(\"↪️ 返 回 ↩️\",MD,\"conmmitSetting(java,source,infoMap)\",1));\n} else {\n\tpushUI(newButton(\"⚙️域名配置⚙️\",MD,\"changeWorkMode(java,source,'hosts')\",1));\n}\nlet strUI = JSON.stringify(UI,null,\"\\t\");\nL(java,4,\"\\n发现界面UI:\\n\" + strUI);\nstrUI;",
    "jsLib": "\/**基础参数定义*\/\n\/\/是否输出日志\nconst isLog = 511;\n\/\/日志输出模块(2进制开关)\nconst modualSwitches = {\n\t\"基础\" : 1,\n\t\"搜索\" : 2,\n\t\"发现\" : 4,\n\t\"详情\" : 8,\n\t\"目录\" : 16,\n\t\"正文\" : 32,\n\t\"基础性日志\" : 64,\n\t\"调试\" : 128,\n\t\"关键信息\" : 256\n}\n\/\/设置开关状态\nconst logModual = 0\n\/\/ | modualSwitches.基础\n\/\/ | modualSwitches.搜索\n\/\/ | modualSwitches.发现\n\/\/ | modualSwitches.详情\n\/\/ | modualSwitches.目录\n\/\/ | modualSwitches.正文\n\/\/ | modualSwitches.基础性日志\n\t| modualSwitches.调试\n\t| modualSwitches.关键信息\n\t| 0;\n\/\/是否的切换展示\nconst selectedStatus = [\"⬜\",\"☑️\"];\n\/\/展开折叠的切换展示\nconst colspasedStatus = [\"📂\",\"📁\"];\n\/\/连接速度级别标志定义\nconst speedMark = [\"🟩\",\"🟦\",\"🟨\",\"🟧\",\"🟫\",\"🟪\",\"🟥\"];\n\/\/测速分级标准\nconst speedGrading = 400;\n\/\/ [未测试,超级慢,联不通]\nconst disconnectedMark = [\"❓\",\"⬛\",\"⛔\"];\n\/**功能设置初始化*\/\n\/\/符合条件的网址过滤规则\nconst checkPairs = {\n\t\"\/55\/55369\/\" : \"打工妹的逆袭(翻译文)\"\n}\n\/\/获取网址的发布页列表\nconst fetchHostsUrls = [ \"http:\/\/diyibanzhu.net\"];\n\/\/域名选择默认值\nconst defaultHosts = {\n\t\"bz8888888.net\" : {\n\t\t\"url\" : \"https:\/\/www.bz8888888.net\/\",\n\t\t\"token\" : \"\",\n\t\t\"lastTest\" : -1,\n\t\t\"delay\" : -1,\n\t\t\"err\" : \"\"\n\t}\n};\n\/\/小说状态\nconst states = {\n\t\"🎒 全部状态\" : 0,\n\t\"✍️ 连载中\" : 1,\n\t\"📗 已完结\" : 2\n};\n\/\/小说排序\nconst orders = {\n\t\"📬️ 最后更新\" : \"lastupdate\",\n\t\"💥 总人气\" : \"allvisit\",\n\t\"🈷️ 月人气\"  : \"monthvisit\",\n\t\"🔢 总字数\" : \"size\",\n\t\"🆕 最新上架\" : \"postdate\"\n};\n\/\/小说分类\nconst categories = {\n\t\"📚️全部分类📚️\" : 0,\n\t\"🏰玄幻奇幻🔮\" : 1,\n\t\"🐉仙侠武侠🐦‍🔥\" : 2,\n\t\"🏙️都市言情👩‍❤‍👨\" : 3,\n\t\"🌠穿越历史⏳\" : 4,\n\t\"🤖科幻灵异👻\" : 5,\n\t\"🏫 藏 经 阁 🧙‍♂️\" : 6,\n\t\"🍀其他类别❇️\" : 7\n};\n\/\/按作者查询默认值\nconst defaultAuthors = [\"俗人\", \"棺材里的笑声\"];\n\/**登录及发现界面相关方法*\/\n\/\/界面内容\nvar UI = [];\n\/\/内容展示模块(disc=发现界面;其他=登录界面)\nvar MD = \"login\";\n\/\/初始化发现界面参数\nconst optionsJson = {\n\tstate : [],\n\tcate : [],\n\torder : [],\n\tauthor : defaultAuthors,\n\thosts : [],\n\tmode : []\n};\n\/\/初始化小说状态\nfor (let key in states) {\n\toptionsJson.state.push(key);\n}\n\/\/小说排序数组\nfor (let key in orders) {\n\toptionsJson.order.push(key);\n}\n\/\/初始化小说分类\nfor (let key in categories) {\n\toptionsJson.cate.push(key);\n}\n\/\/初始化域名列表\nfor (let key in defaultHosts) {\n\toptionsJson.hosts.push(key + \" \" + disconnectedMark[0]);\n\toptionsJson.hosts.sort();\n}\n\/\/生成发现界面链接\nconst initDiscoverUrl = (java,source,cate,offset) => {\n\tlet args = getArgs(java,source);\n\treturn `{{getHostUrl(java,source)}}shuku\/${categories[cate]}-${orders[args.order]}-${states[args.state]}-{{page+${offset>0?offset-1:0}}}.html`;\n}\n\/\/生成发现界面链接(自定义)\nconst initDiscoverUrlUD = (status,order,cate,offset) => {\n\treturn `{{getHostUrl(java,source)}}shuku\/${categories[cate]}-${orders[order]}-${states[status]}-{{page+${offset>0?offset-1:0}}}.html`;\n}\n\/\/生成发现界面作者链接\nconst initDiscoverUrl_A = (author) => {\n\treturn `{{getHostUrl(java,source)}}author.php?author=${author}`;\n}\n\/\/生成发现界面搜索链接\nconst initDiscoverUrl_S = (keyWord) => {\n\treturn `{{getHostUrl(java,source)}}s.php,{\\\\\"charset\\\\\":\\\\\"GBK\\\\\",\\\\\"method\\\\\":\\\\\"POST\\\\\",\\\\\"body\\\\\":\\\\\"s=${keyWord}&page={{page }}\\\\\"}`;\n}\n\/\/切换发现模式\nconst changeDiscoverMode = (java,source,mode) => {\n\tlet args = getArgs(java,source);\n\targs.discoverMode = mode;\n\tsaveArgs(source, args);\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n}\n\/\/切换工作模式mode:[discover,setting,hosts]\nconst changeWorkMode = (java, source, mode) => {\n\tlet args = getArgs(java, source);\n\targs.viewMode = mode;\n\tsaveArgs(source, args);\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n}\n\/\/确认参数配置\nconst conmmitSetting = (java, source, infoMap) => {\n\tlet args = getArgs(java, source);\n\t\/\/传统发现\n\tif(args.discoverMode == \"discover\"){\n\t\targs.state = infoMap[\"state\"];\n\t\targs.order = infoMap[\"order\"];\n\t\targs.keyWord = infoMap[\"keyWord\"].trim();\n\t\targs.offset= \/[1-9]\\d*\/.test(infoMap[\"offset\"]) ? infoMap[\"offset\"] : 1;\n\t}\n\targs.viewMode = \"discover\";\n\tsaveArgs(source, args);\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n}\n\/\/切换域名\nconst switchHost = (java, source, infoMap) => {\n\tlet args = getArgs(java, source);\n\targs.domain = infoMap[\"domain\"];\n\tsaveArgs(source, args);\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n\tT(java,`\\n\\n域名已切换到\\n【${args.hosts[args.domain.split(\" \")[0]].url}】\\n\\n`);\n}\/\/添加自定义发现\nfunction addUDDiscover(java, source, infoMap, type){\n\tlet args = getArgs(java,source);\n\tlet titleMark = \"👓️\";\n\tlet titleStr = String(infoMap[\"自定义标题\"]).trim();\n\tlet url = \"\";\n\tif(!titleStr || titleStr.length == 0){\n\t\tT(java, \"请输入标题!!\\n\\n\\n\\n\");\n\t\treturn;\n\t}\n\tif(type == \"discover\") {\n\t\tlet status = String(infoMap[\"state\"]);\n\t\tlet order = String(infoMap[\"order\"]);\n\t\tlet cate = String(infoMap[\"cate\"]);\n\t\tlet offset = String(infoMap[\"起始页数\"]);\n\t\turl = initDiscoverUrlUD(status, order, cate, offset);\n\t\targs.UDDiscover[titleMark + titleStr] = url;\n\t\tinfoMap[\"起始页数\"] = \"\";\n\t\tL(java,4,`添加自定义发现链接\\n【${titleMark}${titleStr}】\\n\\n${url}\\n\\n`);\n\t} else if(type == \"search\") {\n\t\ttitleMark = \"🔎\";\n\t\tlet keyWord = String(infoMap[\"搜索关键字\"]).trim();\n\t\tif(!titleStr || titleStr.length == 0){\n\t\t\tT(java, \"请输入搜索关键字!!\\n\\n\\n\\n\");\n\t\t\treturn;\n\t\t}\n\t\turl = initDiscoverUrl_S(keyWord);\n\t\targs.UDDiscover[titleMark + titleStr] = url;\n\t\tinfoMap[\"搜索关键字\"] = \"\";\n\t\tL(java,4,`添加自定义搜索链接\\n【${titleMark}${titleStr}】\\n\\n${url}\\n\\n`);\n\t}  else if(type == \"author\") {\n\t\ttitleMark = \"🧑‍💻\";\n\t\tlet author = String(infoMap[\"关注作者\"]).trim();\n\t\tif(!titleStr || titleStr.length == 0){\n\t\t\tT(java, \"请输入关注作者!!\\n\\n\\n\\n\");\n\t\t\treturn;\n\t\t}\n\t\turl = initDiscoverUrl_A(author);\n\t\targs.UDDiscover[titleMark + titleStr] = url;\n\t\tinfoMap[\"关注作者\"] = \"\";\n\t\tL(java,4,`添加自定义关注作者链接\\n【${titleMark}${titleStr}】\\n\\n${url}\\n\\n`);\n\t} else {\n\t\tL(java,256,\"自定义添加功能非法操作,不做处理!!\");\n\t\treturn;\n\t}\n\targs.UDDiscoverArr = [];\n\tfor(var key in args.UDDiscover){\n\t\targs.UDDiscoverArr.push(key);\n\t}\n\targs.UDDiscoverArr.sort();\n\tinfoMap[\"自定义标题\"] = \"\";\n\tinfoMap.save();\n\tsaveArgs(source, args);\n\tT(java, \"添加成功!!\\n\\n\");\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n}\n\/\/删除自定义发现\nfunction delUDDiscover(java, source, infoMap){\n\tlet args = getArgs(java,source);\n\tlet UDDStr = String(infoMap[\"UDDiscovers\"]);\n\tL(java,4,\"删除自定义发现【\" + UDDStr + \"】\");\n\targs.UDDiscoverArr.splice(args.UDDiscoverArr.indexOf(UDDStr), 1);\n\tdelete args.UDDiscover[UDDStr];\n\tinfoMap[\"UDDiscovers\"] = args.UDDiscoverArr[0];\n\tinfoMap.save();\n\tsaveArgs(source, args);\n\tT(java, \"自定义发现\\n【\" + UDDStr + \"】\\n删除成功!!\\n\\n\");\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n\t\n}\n\/\/完全还原\nconst formatD = (java, source) => {\n\tsaveArgs(source,initArgs());\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n\tT(java,\"\\n\\n已完全还原成初始状态!!\");\n}\n\/\/手动添加关注作者\nconst addAuthor = (java, source, infoMap) => {\n\tlet args = getArgs(java,source);\n\tlet authorStr = String(infoMap[\"添加作者\"]).trim();\n\tif(args.authors.indexOf(authorStr) >= 0){\n\t\tT(java, \"作者\\n【\" + authorStr + \"】\\n已在关注作者列表中!!\\n\\n\");\n\t} else {\n\t\tL(java,4,\"添加作者【\" + authorStr + \"】\");\n\t\targs.authors.push(authorStr);\n\t}\n\tsaveArgs(source, args);\n\tinfoMap[\"添加作者\"] = \"\";\n\tinfoMap.save();\n\tT(java, \"作者\\n【\" + authorStr + \"】\\n添加成功!!\\n\\n\");\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n}\n\/\/删除关注作者\nconst delAuthor = (java, source, infoMap) => {\n\tlet args = getArgs(java,source);\n\tlet authorStr = String(infoMap[\"authors\"]);\n\tL(java,4,\"删除作者【\" + authorStr + \"】\");\n\targs.authors.splice(args.authors.indexOf(authorStr), 1);\n\tsaveArgs(source, args);\n\tinfoMap[\"authors\"] = args.authors[0];\n\tinfoMap.save();\n\tT(java, \"作者\\n【\" + authorStr + \"】\\n删除成功!!\\n\\n\");\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n}\n\/\/验证书源体系\nconst checkBookAddr = (java, source, host) => {\n\ttry{\n\t\tfor(var sub in checkPairs){\n\t\t\tlet rspsBody = java.connect(host + sub, {}, 3500).body();\n\t\t\tif(rspsBody.match(\/_guard\\\/\/)){\n\t\t\t\tT(java,\"\\n进入滑动验证了!\")\n\t\t\t\tL(java,256,\"进入滑动验证了!\");\n\t\t\t\trspsBody = java.startBrowserAwait(host + sub, \"💂‍♂人机💂‍♂\", true, null).body();\n\t\t\t\tL(java,64,\"滑动验证完成!\");\n\t\t\t}\n\t\t\tlet title = java.getString(\"body@div.container@div.bd.column-2@div.right@tag.h1@text\", rspsBody);\n\t\t\tif(title == checkPairs[sub]){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tL(java,256, e);\n\t}\n\treturn false;\n}\n\/\/获取源域名\nconst getHostUrls = (java, source) => {\n\tT(java,\"\\n\\n开始获取可切换域名!\\n\\n\")\n\tlet args = getArgs(java, source);\n\tlet getHosts = [];\n\tlet tempContent = \"\";\n\tfor(let n in fetchHostsUrls){\n\t\tT(java,`\\n\\n发布页解析中【${n}\/${fetchHostsUrls.length}】\\n\\n请耐心等待!!`)\n\t\tlet url = fetchHostsUrls[n];\n\t\ttry{\n\t\t\ttempContent = java.webView(\"\", url, \"\", false);\n\t\t}catch(e){\n\t\t\ttempContent = \"\";\n\t\t}\n\t\tif(java.getString(\"#imageMap@html\", tempContent) != \"\"){\n\t\t\ttempContent = java.getString(\"tag.area@html\", tempContent);\n\t\t} else if(java.getString(\"div.error_page@html\", tempContent) != \"\"){\n\t\t\ttempContent = java.getString(\"tag.h1@tag.a@html\", tempContent);\n\t\t} else {\n\t\t\ttempContent = \"\";\n\t\t}\n\t\tlet l = java.getStringList(\"a@href&&area@href##\\\/?$##\\\/\", tempContent);\n\t\tgetHosts = getHosts.concat(l);\n\t}\n\tlet addObj = {};\n\tlet countA = 0;\n\tfor(let j in getHosts){\n\t\tlet name = String(getHosts[j]).replace(\/^https?\\:\\\/\\\/(w*\\.)?([^\\\/]+)\\\/?$\/,\"$2\");\n\t\tif(!args.hosts[name] && !addObj[name]){\n\t\t\taddObj[name] = getHosts[j];\n\t\t\tcountA ++;\n\t\t}\n\t}\n\tlet addHosts = {};\n\tlet counting = 1;\n\tfor(let key in addObj){\n\t\tT(java,`\\n\\n地址验证中【${counting++}/${countA}】\\n\\n请耐心等待!!\\n\\n!`);\n\t\tif(!checkBookAddr(java, source, addObj[key])){\n\t\t\tcontinue;\n\t\t}\n\t\taddHosts[key] = {\n\t\t\t\"url\" : addObj[key],\n\t\t\t\"token\" : \"\",\n\t\t\t\"lastTest\" : -1,\n\t\t\t\"delay\" : -1,\n\t\t\t\"err\" : \"\"\n\t\t};\n\t}\n\tcounting = 0;\n\tfor(let o in addHosts){\n\t\targs.hosts[o] = addHosts[o];\n\t\targs.hostArr.push(o + \" \" + disconnectedMark[0]);\n\t\tcounting++;\n\t}\n\targs.hostArr.sort();\n\tL(java,4,\"新获取到的源:\\n\" + JSON.stringify(addHosts, \"\\t\"));\n\tsaveArgs(source, args);\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n\tT(java,`\\n\\n域名获取完成!\\n\\n新增${counting}个域名!`);\n}\n\/\/批量测试所有域名连接状态\nconst testConnet = (java, source, infoMap) => {\n\tlet args = getArgs(java,source);\n\tT(java,\"\\n\\n开始测试各域名状态及连接延迟\\n\\n请耐心等候\\n\\n。。。\\n\\n\\n\");\n\tlet delIndex = [];\n\tlet newDomain = \"\";\n\tfor (let i in args.hostArr){\n\t\tif(i > 0){\n\t\t\tT(java,`\\n\\n连接测试中【${i}\/${args.hostArr.length}】\\n\\n请耐心等候\\n\\n。。。\\n\\n\\n`);\n\t\t}\n\t\tlet o = args.hostArr[i].split(\" \")[0];\n\t\tL(java,4, \"开始测试 \" + args.hosts[o].url);\n\t\targs.hosts[o].lastTest = Date.now();\n\t\tlet respons = java.connect(args.hosts[o].url, {}, speedGrading*(speedMark.length + 3));\n\t\targs.hosts[o].delay = respons.callTime();\n\t\tL(java,4,\"测试延迟 \" + args.hosts[o].delay) + \" 毫秒\";\n\t\tif(args.hosts[o].delay > 0){\n\t\t\targs.hosts[o].err = \"\";\n\t\t\tlet delayStatus = parseInt(args.hosts[o].delay \/ speedGrading);\n\t\t\tlet mark = speedMark[delayStatus];\n\t\t\tlet delay = args.hosts[o].delay;\n\t\t\tlet name = args.hostArr[i].split(\" \")[0];\n\t\t\tif(delayStatus < speedMark.length){\n\t\t\t\targs.hostArr[i] = `${name} ${mark}${delay}`;\n\t\t\t} else {\n\t\t\t\targs.hostArr[i] = `${name} ${disconnectedMark[1]}${delay}`;\n\t\t\t}\n\t\t} else {\n\t\t\tswitch(args.hosts[o].delay){\n\t\t\t\tcase 0:\n\t\t\t\t\targs.hosts[o].err = \"网页无法访问\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase -1:\n\t\t\t\t\targs.hosts[o].err = \"超过设定时间\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase -2:\n\t\t\t\t\targs.hosts[o].err = \"超时\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase -3:\n\t\t\t\t\targs.hosts[o].err = \"域名错误\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase -4:\n\t\t\t\t\targs.hosts[o].err = \"连接被拒绝\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase -5:\n\t\t\t\t\targs.hosts[o].err = \"连接被重置\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase -6:\n\t\t\t\t\targs.hosts[o].err = \"SSL证书错误\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase -7:\n\t\t\t\t\targs.hosts[o].err = \"其它错误\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\targs.hosts[o].err = \"未收录的错误\";\n\t\t\t}\n\t\t\targs.hostArr[i] = args.hostArr[i].split(\" \")[0] + \" \" + disconnectedMark[2];\n\t\t}\n\t\tlet redirectUrl = String(respons.raw().request().url().toString());\n\t\tlet rName = redirectUrl.replace(\/^https?\\:\\\/\\\/w*\\.([^\\\/]+)\\\/?$\/, \"$1\");\n\t\tif(args.hosts[o].url != redirectUrl){\n\t\t\tL(java,4,`域名${args.hosts[o].url}被重定向到了${redirectUrl}!!`);\n\t\t\tif(args.domain.split(\" \")[0] == o){\n\t\t\t\tL(java,4,`当前使用域名被重定向,设置为重定向后域名${redirectUrl}!!`);\n\t\t\t\tnewDomain = rName;\n\t\t\t}\n\t\t\tif(args.hosts[rName]){\n\t\t\t\tL(java,4,`重定向域名${redirectUrl}已在配置中,不需要新增!!`);\n\t\t\t}else{\n\t\t\t\tL(java,4,`新增重定向后域名${redirectUrl}!!`);\n\t\t\t\targs.hosts[rName] = {\n\t\t\t\t\t\"url\" : redirectUrl,\n\t\t\t\t\t\"token\" : \"\",\n\t\t\t\t\t\"lastTest\" : args.hosts[o].lastTest,\n\t\t\t\t\t\"delay\" : args.hosts[o].delay,\n\t\t\t\t\t\"err\" : \"\"\n\t\t\t\t};\n\t\t\t\targs.hostArr.push(rName + \" \" + args.hostArr[i].split(\" \")[1]);\n\t\t\t}\n\t\t\tdelIndex.push(i);\n\t\t}\n\t\tif(args.domain.split(\" \")[0] == o){\n\t\t\targs.domain = args.hostArr[i];\n\t\t\tinfoMap[\"domain\"] = args.domain;\n\t\t\tinfoMap.save();\n\t\t}\n\t\tredirected = false;\n\t}\n\tlet subfixStr = \"\";\n\tif(delIndex.length > 0){\n\t\tfor(let i = delIndex.length - 1; i >= 0; i--){\n\t\t\tlet o = args.hostArr[delIndex[i]].split(\" \")[0];\n\t\t\tL(java,4,`删除重定向域名${args.hosts[o].url}!`);\n\t\t\tdelete args.hosts[o];\n\t\t\targs.hostArr.splice(delIndex[i], 1);\n\t\t}\n\t\tsubfixStr = `\\n\\n处理了${delIndex.length}个重定向的域名!!`;\n\t}\n\tif(newDomain != \"\"){\n\t\tfor(var i in args.hostArr){\n\t\t\tif(args.hostArr[i].split(\" \")[0] == newDomain){\n\t\t\t\targs.domain = args.hostArr[i];\n\t\t\t\tinfoMap[\"domain\"] = args.domain;\n\t\t\t\tinfoMap.save();\n\t\t\t}\n\t\t}\n\t}\n\tL(java,4,JSON.stringify(args.hosts, null, \"\\t\"));\n\tT(java,`\\n\\n测试完成!!!${subfixStr}\\n\\n\\n`)\n\tsaveArgs(source, args);\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n}\n\/\/手动添加域名\nconst addHost = (java, source, infoMap) => {\n\tlet args = getArgs(java,source);\n\tlet url = String(infoMap[\"URL\"]).replace(\/\\\/?$\/, \"\");\n\tif(!url){\n\t\tT(java, \"\\n\\n请输入URL!!!\");\n\t\treturn;\n\t}\n\tlet host = infoMap[\"protocal\"] + \":\/\/\" + url;\n\turl = url.replace(\/^www\\.\/,\"\");\n\tlet rsps = null;\n\ttry{\n\t\thost = java.toURL(host,\"\").origin;\n\t}catch(e){\n\t\tT(java, host + \"\\n\\n不是有效的链接!!\");\n\t\treturn;\n\t}\n\thost = String(host).replace(\/\\\/?$\/,\"\/\");\n\tif(args.hosts[url]){\n\t\tT(java, host + \"\\n\\n已经存在!!\");\n\t\treturn;\n\t}\n\ttry{\n\t\trsps = java.connect(host + \"jilu.php\", {}, 2500);\n\t\tif(rsps.callTime() <= 0){\n\t\t\tT(java, host + \"\\n\\n无法连接!!\");\n\t\t\treturn;\n\t\t}\n\t\tif(!(rsps.code() == 200 && java.getString(\"h1.page-title@text\", rsps.body()) == \"您的阅读足迹\")){\n\t\t\tT(java, host + \"\\n\\n不是第一版主系列网站!!\");\n\t\t\treturn;\n\t\t}\n\t}catch(e){\n\t\tT(java, host + \"\\n\\n无法连接!!\");\n\t\treturn;\n\t}\n\tif(!checkBookAddr(java, source, host)){\n\t\tT(java, host + \"\\n\\n与当前书源地址不是一个体系,会导致切换源书籍内容改变,不能添加!!\\n\\n\\n\\n\");\n\t\treturn;\n\t}\n\targs.hosts[url] = {\n\t\t\"url\" : host,\n\t\t\"token\" : \"\",\n\t\t\"lastTest\" : -1,\n\t\t\"delay\" : -1,\n\t\t\"err\" : \"\"\n\t};\n\targs.hostArr.push(url + \" \" + disconnectedMark[0]);\n\t\targs.hostArr.sort();\n\tsaveArgs(source, args);\n\tinfoMap[\"URL\"] = \"\";\n\tinfoMap.save();\n\tT(java, host + \"\\n\\n添加成功!!\");\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n}\n\/\/删除选中源\nconst delHost = (java, source, infoMap) => {\n\tlet args = getArgs(java,source);\n\tlet host = String(infoMap[\"domain\"]);\n\tif(args.hostArr.length < 2){\n\t\tT(java, `无法删除源\\n\\n${host}\\n\\n这是最后一个源了!\\n\\n`);\n\t\treturn;\n\t}\n\tlet domainName = host.split(\" \")[0];\n\tT(java, `删除源\\n\\n${host}`);\n\tfor(var i in args.hostArr){\n\t\tif(args.hostArr[i] == host){\n\t\t\tdelete args.hosts[domainName];\n\t\t\targs.hostArr.splice(i, 1);\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(args.domain == host){\n\t\targs.domain = args.hostArr[0];\n\t\tinfoMap[\"domain\"] = args.hostArr[0];\n\t}\n\tsaveArgs(source, args);\n\tinfoMap.save();\n\tjava.refreshExplore();\n\tsource.refreshExplore();\n\tT(java, `已删除源\\n\\n${host}`);\n}\n\/**正文相关方法*\/\n\/\/测试是否需要重新获取页面内容,如果需要,则尝试延迟4倍延迟分级标准时间再次获取,最多重复5次\nconst reFetchTest = (java, baseUrl, result, type) => {\n\tL(java,64,`${baseUrl} 判断是否请求超时`);\n\tlet reFetchTime = 0;\n\tlet contentRule = \"#ChapterView@div.bd@div.page-content@html\";\n\tif(type === \"目录\"){\n\t\tcontentRule = \".chapter-list.1@li@a@text\";\n\t}\n\t\/\/超时处理\n\twhile((result == \"\" || java.getString(\"tag.title@text\") == \"网站请求超时\" || java.getString(contentRule, result) == \"\") && reFetchTime < 5){\n\t\tL(java,64,`${baseUrl} 在${type}解析时出现超时,延时后重新获取第${++reFetchTime}次!!`);\n\t\tlet ms_Now = Date.now();\n\t\tlet ms_End = ms_Now + speedGrading * 4;\n\t\twhile(ms_Now < ms_End){\n\t\t\tms_Now = Date.now();\n\t\t}\n\t\tL(java,64,baseUrl + \" 延时结束,开始重新获取!!\");\n\t\tresult = java.connect(baseUrl).body();\n\t}\n\t\/\/最后的保险,检测获取的页面内容是否为空\n\tif (reFetchTime == 5) {\n\t\tL(java,256,`🐞🐞🐞🐞🐞🐞🐞🐞🐞🐞🐞🐞🐞\\n${baseUrl} 在${type}解析时错误,重试五次后内容依然为空!`);\n\t\tif(type === \"目录\"){\n\t\t\treturn \"\";\n\t\t}\n\t\tresult = \"<div id=\\\"ChapterView\\\"><div class=\\\"bd\\\"><div class=\\\"page-content\\\"><br\/>🐞🐞\";\n\t\tresult += \"<br\/>🐞🐞在正文解析时错误,重试四次后内容依然为空!\";\n\t\tresult += \"<br\/>🐞🐞换个时间刷新试试或者打开页面查看是否有问题!!!\";\n\t\tresult += \"<\/div><\/div><\/div>\";\n\t} else if(reFetchTime != 0){\n\t\tL(java,64, `${baseUrl} 延时重试第${reFetchTime}次获取成功!`);\n\t}\n\treturn result;\n}\n\/\/ 判断Aes解密的正则\nconst AESReg = \/=\\s*secret\\(\\s*['\"](.+?)['\"],[\\s]*['\"](.+?)['\"],[^);]*?\/;\n\/\/ 初始化乱序恢复的正则替换对 有问题修改下面正则 修正两个br标签换行显示\nconst decryptOrderRegPair = [\n\t\/(<br\\\/?>\\s*){2}\/g,\n\t\"<br><br>\"\n];\n\/\/ 判断乱序恢复的正则\nconst decryptOrderReg = \/var ns='(.+?)';\/;\n\/\/获取正文内容 \nconst getMainBody = (java, baseUrl, result) => {\n\tlet scripts = java.getString(\"tag.script@html\", result);\n\tL(java,32, \"HTML中包含的脚本:\\n\" + scripts);\n\tresult = java.getString(\"#ChapterView@div.bd@div.page-content@html\", result);\n\tL(java,32, \"解析内容主体:\\n\" + result);\n\t\/\/result = decryptRefetch(java, baseUrl, scripts, result);\n\t\/\/大概第四页正文有切割,需要调接口获取这一页剩余正文(现在貌似也没有了,留着观察一段时间)\n\tL(java,32, baseUrl + \"判断是否存在需要重新获取的内容!\");\n\tif (\/\\$.post\\('',{'j':'1'}\/.test(scripts)) {\n\t\tL(java,256, baseUrl + \"重新获取剩余正文内容!\")\n\t\tresult += java.ajax(String(baseUrl + ',' + JSON.stringify({\n\t\t\"method\": \"POST\",\n\t\t\"body\": \"j=1\"\n\t\t})));\n\t} else {\n\t\tL(java,32, baseUrl + \" 不需要重新获取!\");\n\t}\n\t\/\/ Aes解密(现在貌似也没有了,留着观察一段时间)\n\ttry {\n\t\tL(java,32, baseUrl + \"尝试Aes解密!\");\n\t\tlet secret = scripts.match(\/=\\s*secret\\(\\s*['\"](.+?)['\"],[\\s]*['\"](.+?)['\"],[^);]*?\/);\n\t\tif(secret){\n\t\t\tL(java,256, baseUrl + \" Aes解密!\");\n\t\t\tlet string = secret[1];\n\t\t\tlet code = java.md5Encode(secret[2]);\n\t\t\tlet iv = code.substring(0, 16);\n\t\t\tlet key = code.substring(16);\n\t\t\tresult = java.createSymmetricCrypto(\"AES\/CBC\/PKCS7Padding\", key, iv).decryptStr(string);\n\t\t\tL(java,256, baseUrl + \" Aes解密ok:\" + code + \"\\n\" + iv + \"\\n\" + key);\n\t\t} else {\n\t\t\tL(java,32, baseUrl + \" 不需要Aes解密!\");\n\t\t}\n\t} catch (err) {\n\t\tL(java,256, baseUrl + \" Aes解密出错!\");\n\t\tL(java,32, err);\n\t}\n\t\/\/ 乱序恢复(现在貌似也没有了,留着观察一段时间)\n\tresult = X(result, decryptOrderRegPair);\n\ttry {\n\t\tL(java,32, baseUrl + \" 尝试乱序恢复!\");\n\t\tlet secret = scripts.match(\/var ns='(.+?)';\/);\n\t\tif(secret){\n\t\t\tL(java,256, baseUrl + \" 进入乱序恢复!\");\n\t\t\tTE(java, \"\\n\" + baseUrl + \"\\n进入乱序恢复!\");\n\t\t\tlet ns = java.base64Decode(secret[1]).split(',');\n\t\t\tlet paragraphArr = result.split('<br><br>');\n\t\t\tresult = \"\";\n\t\t\tlet paragraphLength = paragraphArr.length\n\t\t\tfor (i = 1; i <= paragraphArr.length; i++) {\n\t\t\t\tresult += paragraphArr[ns[i] - ns[0]] + '<br><br>';\n\t\t\t}\n\t\t\tL(java,256, baseUrl + \" 乱序恢复成功!\");\n\t\t} else {\n\t\t\tL(java,32, baseUrl + \" 不需要乱序恢复!\");\n\t\t}\n\t} catch (err) {\n\t\tL(java,256, baseUrl + \" 乱序恢复出错!\");\n\t\tL(java,32, err);\n\t}\n\treturn result;\n}\n\/***功能扩展——日志*\/\n\/\/后台输出日志\nconst L = (java,level, message) => {\n\tif(isLog & level & logModual){\n\t\tjava.log(`\\n${message}\\n🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿`);\n\t}\n}\n\/\/前台提示(jsLib中调用)\nconst TE = (java, message) => {\n\tjava.toast(message);\n}\n\/\/前台长提示(jsLib中调用)\nconst T = (java, message) => {\n\tjava.longToast(\"\\n                    \\n\" + message + \"\\n\\n\\n\");\n}\n\/**功能扩展——替换*\/\n\/\/基础替换方法\nconst X = (str, regPair, isLoop) => {\n\tif (!isLoop) {\n\t\tstr = String(str).replace(regPair[0], regPair[1]);\n\t\treturn str;\n\t}\n\twhile (regPair[0].exec(str)) {\n\t\tstr = String(str).replace(regPair[0], regPair[1]);\n\t}\n\treturn str;\n};\n\/\/按照数组替换,数组内容[{p:正则:r:替换值},{p:正则:r:替换值,l:是否循环替换}...]\nconst XArr = (str,regs) => {\n\tfor(var i in regs){\n\t\tstr = X(str,[regs[i].p,regs[i].r],regs[i].l ? regs[i].l : false);\n\t}\n\treturn str;\n}\n\/**功能扩展——替换*\/\n\/\/基础替换方法\nconst Y = (java, str, regPair, isLoop) => {\n\tL(java, 128, regPair[0]);\n\tif (!isLoop) {\n\t\tstr = String(str).replace(regPair[0], regPair[1]);\n\tL(java, 128, regPair[1]);\n\t\treturn str;\n\t}\n\twhile (regPair[0].exec(str)) {\n\t\tstr = String(str).replace(regPair[0], regPair[1]);\n\t}\n\tL(java, 128, regPair[1]);\n\treturn str;\n};\n\/\/按照数组替换,数组内容[{p:正则:r:替换值},{p:正则:r:替换值,l:是否循环替换}...]\nconst YArr = (java, str, regs) => {\n\tfor(var i in regs){\n\t\tstr = Y(java, str,[regs[i].p,regs[i].r],regs[i].l?regs[i].l:false);\n\t}\n\treturn str;\n}\n\/**通用正则组定义*\/\n\/\/35字换行还原的正则[{p:正则:r:替换值},{p:正则:r:替换值,l:是否循环替换}...]\nconst rvs35Regs = [\n\/\/开头添加换行以匹配第一行就35了\n{p:\/^\/,r:\"\\n\"},\n\/\/标记要合并的行\n{p:\/([\\r\\n]+)((tjjtds)?.{31,40}[,、.~…“:;‘『(\\(「一-龥][\\r\\n]+)(?!tjjtds)\/g,r:\"\\n$2tjjtds\",l:true},\n\/\/执行合并\n{p:\/[\\r\\n]+(tjjtds| +?[\\r\\n]+)\/g,r:\"\"}\n];\n\/\/分页还原合并的正则[{p:正则:r:替换值},{p:正则:r:替换值,l:是否循环替换}...]\n\/\/前提条件是用\\nhereispagebreak\\n夹在两页文字之间 \nconst rvsPBRegs = [\n\/\/去除应该合并的位置的hereispagebreak\n{p:\/([一-龥,「:…a-zA-Z\\.])[\\r\\n\\s]*hereispagebreak[\\s\\r\\n]*\/g,r:\"$1\"},\n\/\/去处所有其他的hereispagebreak以及形成的空换行\n{p:\/hereispagebreak[\\s\\r\\n]*\/g,r:\"\"}\n];\n\/**一版专属正则组定义*\/\n\/\/初始化页面完整内容的正则组[{p:正则:r:替换值},{p:正则:r:替换值,l:是否循环替换}...]\nconst initMainBodiRegs = [\n\/\/初始化图片链接\n{p:\/(<img\\s+)data\\-cfsrc=\"[^\"]+\"\/g,r:\"$1\"},\n{p:\/[\\r\\n]?[\\t ]*<img .+?toimg\\\/data\\\/([^\\.]+)[^>]+>[\\t ]*[\\r\\n]?\/g,r:\"#$1#\"},\n\/\/初始化字体格式的文字,匹配<i>&#xe800<\/i>\n{p:\/<i>(.*?)<\\\/i>\/g,r:function(str, p1) {\n\tL(java,32, p1.charCodeAt().toString(16));\n\t\/\/返回16进制,例:p1=&#xe800 返回格式#e800#\n\treturn '#' + p1.charCodeAt().toString(16) + '#'\n}},\n\/\/转换空格\n{p:\/&nbsp;\/g,r:\" \"},\n\/\/疑似首行缩进字符的统一转换成全角空格\n{p:\/[\\t  ]{2,2}\/g,r:\" \"},\n\/\/去掉标签里的属性\n{p:\/(\\<|&lt;)([^\\>]*?)(\\s|&nbsp;)[^\\>]*(\\>|&gt;)\/g,r:\"<$2>\"},\n\/\/还原H1H2\n{p:\/\\<(h\\d)\\>(.+)\\<\\\/\\1\\>\/g,r:\"<p>$2<\/p>\\n\"},\n\/\/去掉超链接(注意会连内部文字一起去掉)\n{p:\/\\<a\\>[^\\>]+\\>\/g,r:\"\"},\n\/\/去掉脚本\n{p:\/\\<script\\>[^\\>]+\\>\/g,r:\"\"},\n\/\/调整排版\n{p:\/(\\<\\\/?\\s*br\\s*\\\/?\\>)\/g,r:\"<br>\"},\n{p:\/\\s*(<br>)?\\s* {2,}\/g,r:\"<\/p>\\r\\n<p>\"},\n{p:\/\\s*[\\r\\n]?\\s*<div[^\\>]+\\>\\s*[\\r\\n]\\s*\/g,r:\"<\/p>\\r\\n<p>\"},\n{p:\/\\s*(<br>){2,}\\s*\/g,r:\"<\/p>\\r\\n<p>\"},\n\/\/去掉不需要的标签\n{p:\/([\\r\\n\\s]*)\\<([^\\\/pb]r?[^\\<\\>]*)?\\>([\\r\\n\\s]*)\/g,r:\"\"},\n{p:\/([\\r\\n\\s]*)\\<\\\/([^p][^\\<\\>]*)?\\>([\\r\\n\\s]*)\/g,r:\"\"},\n\/\/乱码删除\n{p:\/(^[\\s\\r\\n]+)\/g,r:\"\"},\n{p:\/([\\s\\r\\n]+)$\/g,r:\"\"},\n{p:\/(^|[\\r\\n])(<p>)?[^\\>\\<]*(\\>|&gt;)\/g,r:\"$2\"},\n{p:\/<p>\\s*o([\\r\\n]|$)\/g,r:\"\"},\n\/\/引号替换🚨个人喜好,如果关闭注意要修改35字和分页还原相关正则\n{p:\/‘\/g,r:\"『\"},\n{p:\/’\/g,r:\"』\"},\n{p:\/“\/g,r:\"「\"},\n{p:\/”\/g,r:\"」\"},\n];\n\/\/图片还原的正则组[{p:正则:r:替换值},{p:正则:r:替换值,l:是否循环替换}...]\nconst imgRegs = [\n{p:\/#(3452829630|3734280203|7160647985)#\/g,r:\"毛\"},\n{p:\/#(0465229144|3916380979|9904598393|6388602220)#\/g,r:\"鹏\"},\n{p:\/#(6810021581|4074851758|8625748415|2090369734)#\/g,r:\"熟\"},\n{p:\/#(4830525755|4247282819|2472759648|4668655063)#\/g,r:\"潮\"},\n{p:\/#(8186728471|4190571012|9063255411)#\/g,r:\"出\"},\n{p:\/#(0774208243|1312563809|5558441730|3893173869)#\/g,r:\"介\"},\n{p:\/#(2159282507|7334347774|3996916798)#\/g,r:\"玉\"},\n{p:\/#(3987221833|0592893886|7075168225|2553168545)#\/g,r:\"穴\"},\n{p:\/#(2623901427|2222207117|8254683485|2276251664)#\/g,r:\"嫩\"},\n{p:\/#(2624694117|3597754944|5845812256|4488426878)#\/g,r:\"缝\"},\n{p:\/#(0733848743|0271250302|5047557824|5034779980)#\/g,r:\"锡\"},\n{p:\/#(6115586454|6800261922|3774281334|5110754259)#\/g,r:\"吸\"},\n{p:\/#(1042838226|5141468309|9332720497|5910985788)#\/g,r:\"足\"},\n{p:\/#(5446146111|4608623657|0951783242|0146287633)#\/g,r:\"露\"},\n{p:\/#(4915941086|8963596058|7177706034)#\/g,r:\"西\"},\n{p:\/#(5268319798|7390498076|1461142782)#\/g,r:\"房\"},\n{p:\/#(6310792342|7801094435|6357713966|0092238155)#\/g,r:\"阴\"},\n{p:\/#(4847629361|0902772900|0692957361)#\/g,r:\"春\"},\n{p:\/#(0117530724|3534031771|2383311784|5758773674)#\/g,r:\"棍\"},\n{p:\/#(9100236271|0543813166|5242240437|2293535402)#\/g,r:\"兽\"},\n{p:\/#(7454910199|8728327662|1141551481|0720742117)#\/g,r:\"乳\"},\n{p:\/#(3518213323|6184831247|3672519671|1801354585)#\/g,r:\"勃\"},\n{p:\/#(3561353475|2406299329|5218315173)#\/g,r:\"眼\"},\n{p:\/#(3841393519|7880862058|7912251525|3746262645)#\/g,r:\"舔\"},\n{p:\/#(2641673291|0230924173|2378569828|5366734122)#\/g,r:\"共\"},\n{p:\/#(1078667735|9818286580|5314593750)#\/g,r:\"扎\"},\n{p:\/#(3785706613|4594920519|7875951963)#\/g,r:\"四\"},\n{p:\/#(2333744551|5405095624|7230561098)#\/g,r:\"活\"},\n{p:\/#(5219037129|5032489262|5061449905|1063785572)#\/g,r:\"搞\"},\n{p:\/#(7756664002|4896650341|8374219522|2063259833)#\/g,r:\"色\"},\n{p:\/#(6153774070|5604308767|0453641548|2729628100)#\/g,r:\"颅\"},\n{p:\/#(1257558943|8134092417|8285637025)#\/g,r:\"容\"},\n{p:\/#(5570002531|1886709496|0744258594|1947937898|2022721869)#\/g,r:\"粉\"},\n{p:\/#(9145127477|3023538105|9078990437|7130632296)#\/g,r:\"席\"},\n{p:\/#(5865212886|5050246827|4820521578)#\/g,r:\"里\"},\n{p:\/#(4633423952|1484832267|7092415778)#\/g,r:\"头\"},\n{p:\/#(5366920169|5200837531|3997708706|5265224411)#\/g,r:\"干\"},\n{p:\/#(2226143209|7084008153|0747467933|6534003186)#\/g,r:\"蜜\"},\n{p:\/#(0665756424|4606314618|7950018257|2761875847)#\/g,r:\"胸\"},\n{p:\/#(7106060561|5554918885|1007046559)#\/g,r:\"夫\"},\n{p:\/#(3091089594|8706852605|5034321418|6281647881)#\/g,r:\"流\"},\n{p:\/#(0602771294|8371203386|8650024872|5318824731)#\/g,r:\"妈\"},\n{p:\/#(1993443364|6972560942|5548249566|5969522288)#\/g,r:\"亲\"},\n{p:\/#(7645727085|5896195606|4380620349)#\/g,r:\"私\"},\n{p:\/#(4333336968|8431794980|0399680202|0551722925)#\/g,r:\"唇\"},\n{p:\/#(3620919708|4829671606|1613331912|3309926634)#\/g,r:\"宰\"},\n{p:\/#(7979336243|9707609372|1330289459|0026372214)#\/g,r:\"丝\"},\n{p:\/#(5947057862|5412723094|9364129810|0783213298)#\/g,r:\"丁\"},\n{p:\/#(1167260777|5978095077|9885014626|9928120606)#\/g,r:\"腿\"},\n{p:\/#(7049694563|2610770243|5125861477|0351216125)#\/g,r:\"坑\"},\n{p:\/#(2845054079|1782605261|8662428266|8051876761)#\/g,r:\"漪\"},\n{p:\/#(2038870549|5765697086|9150071773|2965616717)#\/g,r:\"爱\"},\n{p:\/#(3540936540|0744208851|1969781516)#\/g,r:\"一\"},\n{p:\/#(6312544120|4102627444|1644155001|8592042303)#\/g,r:\"腐\"},\n{p:\/#(1431765711|5797973848|5909889921|6560841485)#\/g,r:\"伦\"},\n{p:\/#(2132128883|5067461841|9498890427|4510436554)#\/g,r:\"菊\"},\n{p:\/#(8465027396|1110350989|7971728127|9720548295)#\/g,r:\"杜\"},\n{p:\/#(9784824665|8212084865|6581803664|6050660618)#\/g,r:\"屁\"},\n{p:\/#(2552707218|3554203860|2113285564|0923672614)#\/g,r:\"死\"},\n{p:\/#(9480765147|8748613862|0123303427|2781961287)#\/g,r:\"厥\"},\n{p:\/#(1992295418|6834531826|4654336320|9572021917)#\/g,r:\"尿\"},\n{p:\/#(3895473218|0010005960|9350080768)#\/g,r:\"下\"},\n{p:\/#(0517159832|8431104929|5985086913|3342690501)#\/g,r:\"舌\"},\n{p:\/#(7478986526|6942262704|7168606002|6768988724)#\/g,r:\"鸡\"},\n{p:\/#(3061193484|4500574558|2211806946)#\/g,r:\"人\"},\n{p:\/#(3609388116|5527272297|5887114772|5004143384)#\/g,r:\"乱\"},\n{p:\/#(1851372601|2537989817|6661319734|4436421269)#\/g,r:\"党\"},\n{p:\/#(5382174556|3750225803|8210855360|4017050851)#\/g,r:\"交\"},\n{p:\/#(3462784021|2398210818|9065740329|9308659858)#\/g,r:\"射\"},\n{p:\/#(5241270215|7352867298|3654555607)#\/g,r:\"址\"},\n{p:\/#(8710918821|7373168399|4738148856)#\/g,r:\"办\"},\n{p:\/#(2825234303|3326385285|6092378237)#\/g,r:\"版\"},\n{p:\/#(2846608968|5825662041|6630583610)#\/g,r:\"白\"},\n{p:\/#(8794230418|2857703127|4609698611)#\/g,r:\"法\"},\n{p:\/#(9093172577|5473638027|3236560627)#\/g,r:\"胎\"},\n{p:\/#(3186999824|2886155750|1398281412|2633701054)#\/g,r:\"棒\"},\n{p:\/#(5738418978|6189237176|2105123431|3780302075)#\/g,r:\"氓\"},\n{p:\/#(6356531709|6338842694|8240041430)#\/g,r:\"排\"},\n{p:\/#(7140597939|0665889261|3205881331|8280163404)#\/g,r:\"蛋\"},\n{p:\/#(9312787093|5814392141|8500738501)#\/g,r:\"七\"},\n{p:\/#(4463549087|3955350664|4072862874|4006928252)#\/g,r:\"吞\"},\n{p:\/#(6202025318|7093253691|8604758995)#\/g,r:\"代\"},\n{p:\/#(6543501150|9993921948|0899255392)#\/g,r:\"局\"},\n{p:\/#(9144615555|7175324752|2116155892|9829762678)#\/g,r:\"妇\"},\n{p:\/#(3027722189|7614765414|3891562379|1697595086)#\/g,r:\"斩\"},\n{p:\/#(8208577763|7366713478|3851298429)#\/g,r:\"买\"},\n{p:\/#(5427613105|4364293920|9633654504)#\/g,r:\"公\"},\n{p:\/#(5934682064|1221601598|9260450717)#\/g,r:\"二\"},\n{p:\/#(6577306817|7421367031|2346301295|7736423818)#\/g,r:\"剖\"},\n{p:\/#(0570562432|6582446880|8443857439|0423651377)#\/g,r:\"插\"},\n{p:\/#(0277593854|6039632604|7071132422|2471389451)#\/g,r:\"湿\"},\n{p:\/#(1909221781|7406513426|2386447352|9173059916)#\/g,r:\"毒\"},\n{p:\/#(4281755712|9875422061|9465258920|8666880661)#\/g,r:\"凌\"},\n{p:\/#(2733856399|0698278491|4188337959)#\/g,r:\"首\"},\n{p:\/#(0132292497|8774556813|6534980771|1082275499)#\/g,r:\"台\"},\n{p:\/#(3473128666|5287671279|9030340049|2444947917)#\/g,r:\"性\"},\n{p:\/#(3028548732|4463833256|8023457557|7074467222)#\/g,r:\"逼\"},\n{p:\/#(3511096181|7138983218|6345580535|6855685283)#\/g,r:\"摇\"},\n{p:\/#(6965515376|0203769080|1957086454)#\/g,r:\"丰\"},\n{p:\/#(3269935019|5954911131|8370627720)#\/g,r:\"光\"},\n{p:\/#(6602934344|3679503296|5637260964|5245263419)#\/g,r:\"轮\"},\n{p:\/#(4323477214|4870547767|7412915922)#\/g,r:\"发\"},\n{p:\/#(7641707176|5947611027|3928911332)#\/g,r:\"甲\"},\n{p:\/#(8454668064|2218308069|4208731327|2769203094)#\/g,r:\"未\"},\n{p:\/#(0832215510|0855781973|7068856042)#\/g,r:\"合\"},\n{p:\/#(0902926171|7582804185|6921916056|0551252288)#\/g,r:\"龟\"},\n{p:\/#(4973271227|8715410257|8377724925|7618693335)#\/g,r:\"呻\"},\n{p:\/#(7354186984|3087672465|7889416076)#\/g,r:\"五\"},\n{p:\/#(2773399424|4763085099|7902010953|1810002091)#\/g,r:\"九\"},\n{p:\/#(0739597541|7873389278|2321223621)#\/g,r:\"朱\"},\n{p:\/#(5071472241|8522399281|5515430018)#\/g,r:\"妹\"},\n{p:\/#(0188589055|4378132885|0689040939|8926554707)#\/g,r:\"炸\"},\n{p:\/#(5117051722|4215887283|3887706975|5105645092)#\/g,r:\"温\"},\n{p:\/#(1970298383|8739167787|2642204389|9925956069)#\/g,r:\"处\"},\n{p:\/#(5025986971|6695940412|8780685079|8025291368)#\/g,r:\"锦\"},\n{p:\/#(8870572165|8755875442|4426733800|0519063805)#\/g,r:\"秽\"},\n{p:\/#(1949866581|4474051358|7614763772|0486110525)#\/g,r:\"水\"},\n{p:\/#(3323959507|9131928994|5126322372|7051993783)#\/g,r:\"硬\"},\n{p:\/#(8406787204|2279922761|4055228760)#\/g,r:\"退\"},\n{p:\/#(4412323691|7177895002|2676668403|1218400718)#\/g,r:\"虐\"},\n{p:\/#(4465328127|0312005842|4656222554)#\/g,r:\"六\"},\n{p:\/#(3817726133|1212982941|3573763138)#\/g,r:\"最\"},\n{p:\/#(1790668606|3720176816|6817781912|2173857009)#\/g,r:\"高\"},\n{p:\/#(0407334288|2572476976|5077961297|0050897572)#\/g,r:\"涛\"},\n{p:\/#(6472284406|4029006589|2877274169|5329628684)#\/g,r:\"辱\"},\n{p:\/#(1689714497|1834872811|0587188979|0975893408)#\/g,r:\"吟\"},\n{p:\/#(5040723321|8242185966|7888067492)#\/g,r:\"动\"},\n{p:\/#(8244230680|1916417096|2735853814)#\/g,r:\"独\"},\n{p:\/#(9884662704|5287254025|2836910644|2033008053)#\/g,r:\"撸\"},\n{p:\/#(0528649589|9261732995|8421964095|4808579862)#\/g,r:\"臀\"},\n{p:\/#(8553796321|3926979151|6179042850|6957748176)#\/g,r:\"尸\"},\n{p:\/#(3909511071|2522832594|2791601284|4933790542)#\/g,r:\"枪\"},\n{p:\/#(4081174270|0965662198|1605992686)#\/g,r:\"件\"},\n{p:\/#(0902364778|3684012410|3332912323)#\/g,r:\"十\"},\n{p:\/#(3292843358|2660141736|8294761359|2811411890)#\/g,r:\"亡\"},\n{p:\/#(7887536384|1117966584|8482091824)#\/g,r:\"江\"},\n{p:\/#(1315163785|0355171744|4100571969)#\/g,r:\"地\"},\n{p:\/#(8590038166|5227025337|0682651127|1607055014)#\/g,r:\"酸\"},\n{p:\/#(5185348413|5051383838|6457819129|1024850854)#\/g,r:\"嫡\"},\n{p:\/#(2546160883|5964092977|8804400892)#\/g,r:\"上\"},\n{p:\/#(6546197987|2953530793|6956001608)#\/g,r:\"花\"},\n{p:\/#(6261906167|7224150395|9572922210)#\/g,r:\"布\"},\n{p:\/#(6385481463|9440082131|7544658985)#\/g,r:\"生\"},\n{p:\/#(4207051000|1533431667|5537116184)#\/g,r:\"嫂\"},\n{p:\/#(0948398955|4691614404|9986630664)#\/g,r:\"漏\"},\n{p:\/#(0286099622|6695148880|0851402991|9763512263)#\/g,r:\"美\"},\n{p:\/#(3761170223|5174870454|6874325047|4740869798)#\/g,r:\"操\"},\n{p:\/#(2378050882|3390508734|6813919707|7228562021)#\/g,r:\"纪\"},\n{p:\/#(b69322714b|a85090415a|c81498104c|3043454467)#\/g,r:\"日\"},\n{p:\/#(7691109819|2814245110|1809149563|0473556214)#\/g,r:\"含\"},\n{p:\/#(6764978449|0894532232|9386124353)#\/g,r:\"儿\"},\n{p:\/#(1165271020|8353295295|1901233548|2174754224)#\/g,r:\"暴\"},\n{p:\/#(3928657599|8620217283|8770568739|5229950952)#\/g,r:\"肉\"},\n{p:\/#(7662722126|2472677945|5093089507|7051410763)#\/g,r:\"马\"},\n{p:\/#(1354231266|7506204301|6843073930|5260398634)#\/g,r:\"指\"},\n{p:\/#(8836471562|2885608989|5618127868|6197424834)#\/g,r:\"中\"},\n{p:\/#(4179250285|6076847362|9075956636)#\/g,r:\"迷\"},\n{p:\/#(9652486924|5958823569|2563690011|9860153795)#\/g,r:\"麻\"},\n{p:\/#(7402244018|9217862382|7337698464|3089649511)#\/g,r:\"宫\"},\n{p:\/#(5091848517|0978291143|9588077975|2158558763)#\/g,r:\"幼\"},\n{p:\/#(1690746609|1509162328|4574361464|3382216428)#\/g,r:\"义\"},\n{p:\/#(1090502360|8735858515|1190111324)#\/g,r:\"第\"},\n{p:\/#(8457823464|5761080466|0990372354|5946892177)#\/g,r:\"淫\"},\n{p:\/#(0897088508|9209363567|6146409280)#\/g,r:\"粗\"},\n{p:\/#(8519707329|9574018318|2954536573|6259252852)#\/g,r:\"杀\"},\n{p:\/#(7160038829|1782567235|8773645769|0678663477)#\/g,r:\"情\"},\n{p:\/#(4808657706|2876804651|8358388359)#\/g,r:\"顶\"},\n{p:\/#(7118332370|7279115113|6261439078|5318162318)#\/g,r:\"贱\"},\n{p:\/#(4602423928|2148844516|3948875377|4704630913)#\/g,r:\"茎\"},\n{p:\/#(7650648460|9218945420|9478849035)#\/g,r:\"波\"},\n{p:\/#(5111229895|8208727967|8806967364|1040782805)#\/g,r:\"奸\"},\n{p:\/#(5264533408|3187883344|5844292263)#\/g,r:\"园\"},\n{p:\/#(1020382214|4304523715|6149826374)#\/g,r:\"三\"},\n{p:\/#(2508447790|8899305652|9600739652|5518664754)#\/g,r:\"骚\"},\n{p:\/#(8554004725|9123535704|4837206388|8993789017)#\/g,r:\"洞\"},\n{p:\/#(6598183488|1466119857|2347547983|0961296593)#\/g,r:\"弹\"},\n{p:\/#(5942653794|2453282069|5798715549)#\/g,r:\"山\"},\n{p:\/#(8637348340|6385714697|2044276277|4766000693)#\/g,r:\"精\"},\n{p:\/#(9293860947|2444390640|4598856392|5429058065)#\/g,r:\"弟\"},\n{p:\/#(2479341369|1625785675|1164260008|7508904751)#\/g,r:\"帮\"},\n{p:\/#(1128608327|2352694038|4080685678|0756494362)#\/g,r:\"偷\"},\n{p:\/#(9102602793|6269512667|7615188907)#\/g,r:\"天\"},\n{p:\/#(1019435523|9513785378|7185542494|6378369235)#\/g,r:\"胡\"},\n{p:\/#(4813465063|7080698327|1748611635|8954155954)#\/g,r:\"炮\"},\n{p:\/#(2166433573|2757781217|9655348333|0813524594)#\/g,r:\"妓\"},\n{p:\/#(7806997609|5119090656|8487710161|8997927012)#\/g,r:\"灭\"},\n{p:\/#(7808420336|9767114503|7814833369|4481675898)#\/g,r:\"荡\"},\n{p:\/#(7666628481|3211393926|4472105527|6789528781)#\/g,r:\"学\"},\n{p:\/#(9806206863|3691658535|8660416328|9134848937)#\/g,r:\"做\"},\n{p:\/#(5853540975|9942269763|6187610487)#\/g,r:\"浪\"},\n{p:\/#(4065205050|6325155879|5167141579|8698737337)#\/g,r:\"奶\"},\n{p:\/#(7270938794|8019581819|3835404789)#\/g,r:\"大\"},\n{p:\/#(0818169035|9045509252|7450445747|4538628495)#\/g,r:\"挤\"},\n{p:\/#(8202714140|2125923322|1341427057)#\/g,r:\"东\"},\n{p:\/#(4199839723|8986539842|0494725103)#\/g,r:\"证\"},\n{p:\/#(6258129695|8191231978|6077837752|3296363576)#\/g,r:\"欲\"},\n{p:\/#(6720400310|1527556132|2491143861)#\/g,r:\"元\"},\n{p:\/#(5847243892|3770724478|3697158622|8478694653)#\/g,r:\"主\"},\n{p:\/#(5310232896|6143300813|3309407590|4472054519)#\/g,r:\"咪\"},\n{p:\/#(2123405327|4177639527|0835270647)#\/g,r:\"八\"},\n{p:\/#(9294600366|5794932762|2056942298)#\/g,r:\"巴\"},\n{p:\/#(4221946546|0038716011|5504072831|9821815185)#\/g,r:\"裸\"},\n{p:\/#(9073248466|7230730327|2968320736|6514831790)#\/g,r:\"血\"},\n{p:\/#(0817898144|2043405379|4170964036)#\/g,r:\"民\"},\n{p:\/#(8001980049|0343310657|3246642373|8087788059)#\/g,r:\"国\"},\n{p:\/#(5205548090|0872283620|1894022554|0261725863)#\/g,r:\"泽\"},\n{p:\/#(2485220834|8576438185|6198192490|5710915044)#\/g,r:\"童\"},\n{p:\/#(9934161012|5134244742|8897428624|8861933232)#\/g,r:\"婊\"},\n{p:\/#(5041330601|5385687355|2628020990|9636759436)#\/g,r:\"药\"},\n{p:\/#(8771907310|2088765670|2642397267|2525826615)#\/g,r:\"狗\"},\n{p:\/#(5118765982|8779415131|8180918630)#\/g,r:\"网\"},\n{p:\/#(0462284997|6347202533|7980237169|5736430795)#\/g,r:\"内\"},\n{p:\/#(6445315584|3047720382|2095040384|8261828414)#\/g,r:\"肛\"},\n{p:\/#(7227745529|5655070942|3924123605|2548022544)#\/g,r:\"奴\"},\n{p:\/#(8165804057|0304558987|4707263212|5732450242)#\/g,r:\"母\"},\n{p:\/#(1776326009|2403603674|8381351178|5213317466)#\/g,r:\"具\"},\n{p:\/#(8605843019|8838087473|0983658750)#\/g,r:\"香\"},\n{p:\/#(4852882191|8652744697)#\/g,r:\"妊\"},\n{p:\/#8665933801#\/g,r:\"铀\"},\n{p:\/#6927308149#\/g,r:\"漆\"},\n{p:\/#9009691548#\/g,r:\"…\"}\n];\n\/\/字形还原的正则\nconst fontRegs = [\n{p:\/#e800#\/g,r:\"的\"},\n{p:\/#e800#\/g,r:\"的\"},\n{p:\/#e801#\/g,r:\"一\"},\n{p:\/#e802#\/g,r:\"是\"},\n{p:\/#e803#\/g,r:\"了\"},\n{p:\/#e804#\/g,r:\"我\"},\n{p:\/#e805#\/g,r:\"不\"},\n{p:\/#e806#\/g,r:\"人\"},\n{p:\/#e807#\/g,r:\"在\"},\n{p:\/#e808#\/g,r:\"他\"},\n{p:\/#e809#\/g,r:\"有\"},\n{p:\/#e80A#\/g,r:\"这\"},\n{p:\/#e80B#\/g,r:\"个\"},\n{p:\/#e80C#\/g,r:\"上\"},\n{p:\/#e80D#\/g,r:\"们\"},\n{p:\/#e80E#\/g,r:\"来\"},\n{p:\/#e80F#\/g,r:\"到\"},\n{p:\/#e810#\/g,r:\"时\"},\n{p:\/#e811#\/g,r:\"大\"},\n{p:\/#e812#\/g,r:\"地\"},\n{p:\/#e813#\/g,r:\"为\"},\n{p:\/#e814#\/g,r:\"子\"},\n{p:\/#e815#\/g,r:\"中\"},\n{p:\/#e816#\/g,r:\"你\"},\n{p:\/#e817#\/g,r:\"说\"},\n{p:\/#e818#\/g,r:\"生\"},\n{p:\/#e819#\/g,r:\"国\"},\n{p:\/#e81A#\/g,r:\"年\"},\n{p:\/#e81B#\/g,r:\"着\"},\n{p:\/#e81C#\/g,r:\"就\"},\n{p:\/#e81D#\/g,r:\"那\"},\n{p:\/#e81E#\/g,r:\"和\"},\n{p:\/#e81F#\/g,r:\"要\"},\n{p:\/#e820#\/g,r:\"她\"},\n{p:\/#e821#\/g,r:\"出\"},\n{p:\/#e822#\/g,r:\"也\"},\n{p:\/#e823#\/g,r:\"得\"},\n{p:\/#e824#\/g,r:\"里\"},\n{p:\/#e825#\/g,r:\"后\"},\n{p:\/#e826#\/g,r:\"自\"},\n{p:\/#e827#\/g,r:\"以\"},\n{p:\/#e828#\/g,r:\"会\"},\n{p:\/#e829#\/g,r:\"家\"},\n{p:\/#e82A#\/g,r:\"可\"},\n{p:\/#e82B#\/g,r:\"下\"},\n{p:\/#e82C#\/g,r:\"而\"},\n{p:\/#e82D#\/g,r:\"过\"},\n{p:\/#e82E#\/g,r:\"天\"},\n{p:\/#e82F#\/g,r:\"去\"},\n{p:\/#e830#\/g,r:\"能\"},\n{p:\/#e831#\/g,r:\"对\"},\n{p:\/#e832#\/g,r:\"小\"},\n{p:\/#e833#\/g,r:\"多\"},\n{p:\/#e834#\/g,r:\"然\"},\n{p:\/#e835#\/g,r:\"于\"},\n{p:\/#e836#\/g,r:\"心\"},\n{p:\/#e837#\/g,r:\"学\"},\n{p:\/#e838#\/g,r:\"么\"},\n{p:\/#e839#\/g,r:\"之\"},\n{p:\/#e83A#\/g,r:\"都\"},\n{p:\/#e83B#\/g,r:\"好\"},\n{p:\/#e83C#\/g,r:\"看\"},\n{p:\/#e83D#\/g,r:\"起\"},\n{p:\/#e83E#\/g,r:\"发\"},\n{p:\/#e83F#\/g,r:\"当\"},\n{p:\/#e840#\/g,r:\"没\"},\n{p:\/#e841#\/g,r:\"成\"},\n{p:\/#e842#\/g,r:\"只\"},\n{p:\/#e843#\/g,r:\"如\"},\n{p:\/#e844#\/g,r:\"事\"},\n{p:\/#e845#\/g,r:\"把\"},\n{p:\/#e846#\/g,r:\"还\"},\n{p:\/#e847#\/g,r:\"用\"},\n{p:\/#e848#\/g,r:\"第\"},\n{p:\/#e849#\/g,r:\"样\"},\n{p:\/#e84A#\/g,r:\"道\"},\n{p:\/#e84B#\/g,r:\"想\"},\n{p:\/#e84C#\/g,r:\"作\"},\n{p:\/#e84D#\/g,r:\"种\"},\n{p:\/#e84E#\/g,r:\"开\"},\n{p:\/#e84F#\/g,r:\"美\"},\n{p:\/#e850#\/g,r:\"总\"},\n{p:\/#e851#\/g,r:\"从\"},\n{p:\/#e852#\/g,r:\"无\"},\n{p:\/#e853#\/g,r:\"情\"},\n{p:\/#e854#\/g,r:\"己\"},\n{p:\/#e855#\/g,r:\"面\"},\n{p:\/#e856#\/g,r:\"最\"},\n{p:\/#e857#\/g,r:\"女\"},\n{p:\/#e858#\/g,r:\"但\"},\n{p:\/#e859#\/g,r:\"现\"},\n{p:\/#e85A#\/g,r:\"前\"},\n{p:\/#e85B#\/g,r:\"些\"},\n{p:\/#e85C#\/g,r:\"所\"},\n{p:\/#e85D#\/g,r:\"同\"},\n{p:\/#e85E#\/g,r:\"日\"},\n{p:\/#e85F#\/g,r:\"手\"},\n{p:\/#e860#\/g,r:\"又\"},\n{p:\/#e861#\/g,r:\"行\"},\n{p:\/#e862#\/g,r:\"意\"},\n{p:\/#e863#\/g,r:\"动\"},\n];\n\/\/净化广告替换规则组,逐渐积累完善下来的,不要乱搞\/\/\nconst purifyRegs = [\n\/\/净化前处理避免某些发布文字被误判\n{p:\/([\\r\\n][^\\r\\n]+)发[表布]于第一版主小说网([^\\r\\n]*[\\r\\n])\/,r:\"$1#publictext#$2\"},\n\/\/净化替换\n{p:\/\\n[^\\n]*([最樶]新.?)?[地网哋迴回].?[址祉阯家].?[发發沷锝].?[布怖咘潞].?[页頁]?[\\\/\\::]?[1144]?[^\\n]*\/g,r:\"\\n\"},\n{p:\/(苹果手机使用.+\/g,r:\"\"},\n{p:\/\\n[^\\n]*([5678]X)+[^\\n]*\\n\/g,r:\"\"},\n{p:\/www.diyibanzhu.net\/g,r:\"\"},\n{p:\/www.diyibanzhu.net\/g,r:\"\"},\n{p:\/\\n([^\\n]*?(手.?机.?看.?[小片](.?[书说])?|搜?.{0,4}索?.{0,4}第.{0,4}一.{0,4}版.{0,4}主)[^\\n]*\\n)\/g,r:\"\\n\"},\n{p:\/\\n[^\\n]*\\\\u5730\\\\u5740\\\\u767c\\\\u5e03\\\\u9801[^\\n]*\/g,r:\"\\n\"},\n{p:\/\\n[^\\n]*([0-90-9])[a-zA-Za-zA-Z]([0-90-9])[a-zA-Za-zA-Z]([0-90-9])[a-zA-Za-zA-Z](([0-90-9])[a-zA-Za-zA-Z])?[^<\\r\\n]*\/g,r:\"\\n\"},\n{p:\/\\n[^\\n]*[Yy][Yy][Dd][Ss][Tt][Xx][Tt][^\\n]*\/g,r:\"\\n\"},\n\/\/发```新```地```址\n{p:\/\\n[^\\n]*[最寻找发].{0,4}[新回].{0,4}[网地找].{0,4}[址阯回][^\\n]*[\\r\\n]\/g,r:\"\\n\"},\n\/\/ωωω.0bz.ńéτ\n{p:\/\\n[^\\n]*[00][11①][bЪb][zz][^\\n]*[\\r\\n]\/g,r:\"\"},\n{p:\/\\n[^\\n]*[真发即百更].?.?[正送可度多].?.?[网电获搜精看].?.?[站子得索彩小].?.?\\s?[请邮最第小书说][^\\n]*[\\r\\n]\/g,r:\"\\n\"},\n{p:\/(bz2021)[^<\\n]+\/g,r:\"\"},\n{p:\/[\\r\\n][^\\r\\n]*手机(阅读|看)小说[:;\\:\\;]7778877[^\\n]+\/g,r:\"\\n\"},\n{p:\/diyibanzhu@gmail.com\/g,r:\"\"},\n{p:\/((待续)|(地~址~)|(手机看片))[^\\n]+\/g,r:\"\"},\n{p:\/(-\\=.{2,}\\d{4,}\\.com\\=-)\/g,r:\"\"},\n{p:\/[\\r\\n].*使用chrome谷歌浏览.*[\\r\\n]\/g,r:\"\\r\\n\"},\n{p:\/\\n[^\\n]*#chao#.*#lian#.*#jie#[^\\n]*\\n\/,r:\"\\n\"},\n{p:\/\\n[^\\n]*[wШЩ]*?.*[℃ㄈC][О⊙ò〇Ο0][мМMΜ][^\\n]*\/g,r:\"\"},\n\/\/去除CHM反编译回来的某种代码\n{p:\/\"\\); \\('\/g,r:\"\"},\n{p:\/'\\).+\\sfile\\s.+\\sversion\\s.+即可)\/i,r:\"\"},\n\/\/为防万一,去掉汉字之间的空格\n{p:\/([一-龥「『』」,。?!:;…])[  ]+([一-龥「『』」,。?!:;…])\/g,r:\"$1$2\"},\n\/\/还原发布文字\n{p:\/#publictext#\/,r:\"发表于第一版主小说网\"},\n];\n\/***功能扩展——源变量操作*\/\n\/\/源变量基础参数名\nconst argsKeys = [\"domain\", \"keyWord\", \"order\", \"state\", \"offset\", \"viewMode\", \"discoverMode\", \"authors\", \"UDDiscoverArr\", \"hostArr\", \"UDDiscover\", \"hosts\"];\n\/\/初始化源变量\nconst initArgs = () => {\n\treturn  {\n\t\t\"domain\": optionsJson.hosts[0],\n\t\t\"order\": optionsJson.order[0],\n\t\t\"state\": optionsJson.state[0],\n\t\t\"offset\": 1,\n\t\t\"viewMode\": \"discover\",\n\t\t\"discoverMode\": \"discover\",\n\t\t\"authors\": defaultAuthors,\n\t\t\"UDDiscover\": {},\n\t\t\"UDDiscoverArr\": [],\n\t\t\"keyWord\": \"\",\n\t\t\"hostArr\": optionsJson.hosts,\n\t\t\"hosts\": defaultHosts\n\t};\n}\n\/\/获取源变量参数\nconst getArgs = (java, source) => {\n\tlet argsStr = source.getVariable();\n\tlet args;\n\tif(!argsStr || argsStr == \"\"){\n\t\tTE(java,\"重新初始化参数!\")\n\t\targs = initArgs();\n\t\tsaveArgs(source, args);\n\t} else {\n\t\targs = JSON.parse(argsStr);\n\t\tfor (let k in argsKeys) {\n\t\t\tlet tmpValue = args[argsKeys[k]];\n\t\t\tif(typeof(tmpValue) == \"undefined\"){\n\t\t\t\tTE(java,`参数${argsKeys[k]}不存在,重新初始化!`)\n\t\t\t\tlet newArgs = initArgs();\n\t\t\t\tfor(let key in args){\n\t\t\t\t\tif(args[key]){\n\t\t\t\t\t\tnewArgs[key] = args[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\targs = newArgs;\n\t\t\t\tsaveArgs(source,args);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn args;\n}\n\/\/保存参数\nconst saveArgs = (source, args) => {\n\tsource.setVariable(JSON.stringify(args,null,\"\\t\"));\n}\n\/\/获取切换的域名\nconst getHostUrl = (java,source) => {\n\tlet args = getArgs(java,source);\n\treturn args.hosts[args.domain.split(\" \")[0]].url;\n}\n\/**登录、发现界面通用方法*\/\n\/\/清理界面缓存\nconst clearUI = () => {\n\tUI = [];\n}\n\/\/向界面中添加元素\nconst pushUI = (obj) => {\n\tUI .push(obj);\n}\n\/\/创建菜单元素\nconst creatEle = (info) => {\n\tlet nameN = info.modual == \"disc\" ? \"title\" : \"name\";\n\tlet nameStr = info.name;;\n\tlet eleStr = \"\";\n\tlet pct = 1;\n\tlet grow = 1;\n\tif(parseInt(info.cols\/10) > 1){\n\t\tgrow = 999;\n\t}\n\tlet charsStr = JSON.stringify(info.chars);\n\tlet defaultStr = JSON.stringify(info.default);\n\tswitch (info.cols%10){\n\t\tcase 2:\n\t\t\tpct = 0.46;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tpct = 0.29;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tpct = 0.2;\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tpct = 0.14;\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\tpct = 0.6;\n\t\t\tbreak;\n\t}\n\tswitch(info.type){\n\t\tcase \"title\":\n\t\t\teleStr = `{\"${nameN}\":\"${nameStr}\",\"type\":\"button\",\"style\":{\"layout_flexGrow\":${grow},\"layout_flexBasisPercent\":1.2,\"layout_wrapBefore\":true}}`;\n\t\t\tbreak;\n\t\tcase \"url\":\n\t\t\teleStr = `{\"${nameN}\":\"${nameStr}\",\"url\":\"${info.url}\",\"style\":{\"layout_flexGrow\":${grow},\"layout_flexBasisPercent\":${pct}}}`;\n\t\t\tbreak;\n\t\tcase \"button\":\n\t\t\teleStr = `{\"${nameN}\":\"${nameStr}\",\"type\":\"button\",\"action\":\"${info.func}\",\"style\":{\"layout_flexGrow\":${grow},\"layout_flexBasisPercent\":${pct}}}`;\n\t\t\tbreak;\n\t\tcase \"buttonW\":\n\t\t\teleStr = `{\"${nameN}\":\"${nameStr}\",\"type\":\"button\",\"action\":\"${info.func}\",\"style\":{\"layout_flexGrow\":${grow},\"layout_flexBasisPercent\":${pct},\"layout_wrapBefore\":true}}`;\n\t\t\tbreak;\n\t\tcase \"text\":\n\t\t\teleStr = `{\"${nameN}\":\"${nameStr}\",\"type\":\"text\",\"style\":{\"layout_flexGrow\":${grow},\"layout_flexBasisPercent\":${pct}}}`;\n\t\t\tbreak;\n\t\tcase \"password\":\n\t\t\teleStr = `{\"${nameN}\":\"${nameStr}\",\"type\":\"password\",\"style\":{\"layout_flexGrow\":${grow},\"layout_flexBasisPercent\":${pct}}}`;\n\t\t\tbreak;\n\t\tcase \"toggle\":\n\t\t\teleStr = `{\"${nameN}\":\"${nameStr}\",\"type\":\"toggle\",\"viewName\":\"\\\\\"${info.viewName}\\\\\"\",\"action\":\"${info.func}\",\"chars\":${charsStr},\"default\":${defaultStr},\"style\":{\"layout_flexGrow\":${grow},\"layout_flexBasisPercent\":${pct}}}`;\n\t\t\tbreak;\n\t\tcase \"select\":\n\t\t\teleStr = `{\"${nameN}\":\"${nameStr}\",\"type\":\"select\",\"viewName\":\"\\\\\"${info.viewName}\\\\\"\",\"action\":\"${info.func}\",\"chars\":${charsStr},\"default\":${defaultStr},\"style\":{\"layout_flexGrow\":${grow},\"layout_flexBasisPercent\":${pct}}}`;\n\t}\n\treturn JSON.parse(eleStr);\n}\n\/\/创建标题(只有文字没有作用的按钮)\nconst newTitle = (name,modual) => {\n\tvar di = {};\n\tdi.modual = modual;\n\tdi.type = \"title\";\n\tdi.name = name;\n\treturn creatEle(di);\n}\n\/\/创建链接(仅限发现界面)\nconst newUrl = (name,url,cols) => {\n\tvar di = {};\n\tdi.modual = \"disc\";\n\tdi.type = \"url\";\n\tdi.name= name;\n\tdi.url= url;\n\tdi.cols= cols;\n\treturn creatEle(di);\n}\n\/\/创建按钮(执行func)\nconst newButton = (name,modual,func,cols) => {\n\tvar di = {};\n\tdi.modual = modual;\n\tdi.type = \"button\";\n\tdi.name = name;\n\tdi.func= func;\n\tdi.cols = cols;\n\treturn creatEle(di);\n}\n\/\/创建强制换行按钮(执行func)\nconst newButtonW = (name,modual,func,cols) => {\n\tvar di = {};\n\tdi.modual = modual;\n\tdi.type = \"buttonW\";\n\tdi.name = name;\n\tdi.func= func;\n\tdi.cols = cols;\n\treturn creatEle(di);\n}\n\/\/创建文本输入(⚠️输入完毕执行func没有测试过)\nconst newText = (name,modual,func,cols) => {\n\tvar di = {};\n\tdi.modual = modual;\n\tdi.type = \"text\";\n\tdi.name = name;\n\tdi.func= func;\n\tdi.cols= cols;\n\treturn creatEle(di);\n}\n\/\/创建密码输入(仅限登录界面)\nconst newPwd = (name,cols) => {\n\tvar di = {};\n\tdi.modual = \"login\";\n\tdi.type = \"password\";\n\tdi.name = name;\n\tdi.cols= cols;\n\treturn creatEle(di);\n}\n\/\/创建下拉列表选择框(选中后执行func)\nconst newSelect = (name,viewName,modual,chars,func,cols) => {\n\tvar di = {};\n\tdi.modual = modual;\n\tdi.type = \"select\";\n\tdi.name = name;\n\tdi.viewName= viewName;\n\tdi.func= func;\n\tdi.cols = cols;\n\tdi.chars = chars;\n\tdi.default = chars[0];\n\treturn creatEle(di);\n}\n\/\/创建切换按钮(选中后执行func)\nconst newToggle = (name,viewName,modual,chars,func,cols) => {\n\tvar di = {};\n\tdi.modual = modual;\n\tdi.type = \"toggle\";\n\tdi.name = name;\n\tdi.viewName= viewName;\n\tdi.func= func;\n\tdi.cols = cols;\n\tdi.chars = chars;\n\tdi.default = chars[0];\n\treturn creatEle(di);\n}",
    "lastUpdateTime": "1778821045843",
    "loginCheckJs": "\/\/滑动条验证检测\nL(java,64,result.url() + \" 调用登录检测!\" + result.code());\nif(result.body().match(\/_guard\\\/\/)){\n\tT(java,\"\\n进入滑动验证了!\")\n\tL(java,256,\"进入滑动验证了!\");\n\ta = java.startBrowserAwait(getHostUrl(java,source),\"💂‍♂人机💂‍♂\",true,null).body();\n\tresult = java.getStrResponse();\n\tL(java,64,\"滑动验证完成!\");\n}\n\/\/1234验证框检测(实际应该已经没有这种了)\nif (result.code() == 403 || \/<div\\s*class=\"title\"\\s*>.*1234\/.test(result.body())) {\n\tT(java,\" \\n进入输入1234验证了!\")\n\tL(java,256,\"进入输入1234验证了!\");\n\tL(java,1,\"\\n进入1234验证的页面内容\\n\" + result.body());\n\tlet checkres = java.ajax(String(getHostUrl(java,source) + \",{'method': 'POST','body': 'action=1&v=1234'}\"));\n\tresult = java.getStrResponse();\n\tL(java,64,\"输入1234验证完成!\");\n}\n\/\/超时处理\nelse if(result.code() == 504 || result.code() == 500){\n\tL(java,64,`${result.url()} 在登录检测时出现超时,重新获取!!\\ncode:${result.code()}\\ncallTime:${result.callTime()}`);\n\tL(java,1,\"登录检测时出现超时的页面内容\\n\" + result.body());\n\tresult = java.getStrResponse();\n}\n\/\/Bad Gateway\nelse if(result.code() == 502){\n\tL(java,64,`${result.url()} 在登录检测时出现Bad Gateway,重新获取!!\\ncode:${result.code()}\\ncallTime:${result.callTime()}`);\n\tL(java,1,\"登录检测时出现Bad Gateway的页面内容\\n\" + result.body());\n\tresult = java.getStrResponse();\n}\nelse if(result.code() != 200){\n\tL(java,256,baseUrl + \"调用登录检测有问题!返回状态码:\" + result.code());\n\tL(java,1,baseUrl + \"返回结果:\" + result.body());\n}\nresult",
    "loginUi": "@js:\nMD = 'login';\nclearUI();\npushUI(newButton(\"⚠️🚨☢️格式化(完全清零)☢️🚨⚠️\",MD,\"formatD(java,source)\",1));\nJSON.stringify(UI);",
    "loginUrl": "const login = () => {\n return getHostUrl(java,source)\n}",
    "respondTime": 180000,
    "ruleBookInfo": {
        "author": "作者",
        "init": "@js:\nL(java,64,\"调用详情预处理!\")\nL(java,8,\"\\n详情页页面内容:\\n\" + result);\njava.setContent(java.getString(\"body@div.container@html\"));\nlet resultJson = {};\nresultJson.lastChap = java.getString(\".chapter-list.0@div.bd@ul@li.0@text\");\nlet introStr = String(java.getString(\"div.mod.book-intro@div@textNodes\")).replace(\/^|\\s\/gi,\"\\r\\n\").replace(\/[\\r\\n]+\/gi,\"\\r\\n\");\nresultJson.intro = XArr(introStr, rvs35Regs)\njava.setContent(java.getString(\"div.bd.column-2@div.right@html\"));\nresultJson.title = java.getString(\"h1@text\");\neval(String(java.getString(\"p.info@textNodes\")).replace(\/(^|[\\r\\n]+)([^:]+):(.*)\/gi,\"resultJson.$2=\\\"$3\\\";\"));\nresultJson.status = java.getString(\"span.status@textNodes\").replace(\".\",\"\");\nresultJson.cate = [resultJson.类型,resultJson.status];\nL(java,8,\"\\n详情预处理结果\\n\" + JSON.stringify(resultJson,null,\"\\t\"));\nresultJson",
        "intro": "intro",
        "kind": "cate",
        "lastChapter": "lastChap",
        "name": "title",
        "wordCount": "字数"
    },
    "ruleContent": {
        "content": "<js>\nL(java,32,`已获取到${baseUrl},解析中。。。`);\n\/\/超时及获取出错处理\nresult = reFetchTest(java,baseUrl,result,\"正文\");\nL(java,32,\"获取到的HTML:\\n\" + result);\n\/\/获取分页信息\nlet pContent = java.getString(\"#ChapterView@center.chapterPages@tag.a@html\", result);\nlet listPageUrls = java.getStringList(\"tag.a@href\", pContent);\nL(java,32, \"分页Url数组:\\n\" + listPageUrls);\nlet currPageUrl = java.getString(\"a.curr@href\", pContent);\nL(java,32, \"本页Url:\" + currPageUrl);\n\/**获取正文内容*\/\nlet contentArr = [];\n\/\/本页内容\nresult = getMainBody(java,baseUrl, result);\n\/\/获取其他页内容\n\/\/无奈之举,源服务器经常不稳定,造成丢分页、部分分页返回错误(就是原来的“刷新试试”),模拟app进行分页获取,增加延时重试机制,重试5次还无法正确返回还是会写入“刷新试试”\nif(listPageUrls.length > 1){\n for(let i in listPageUrls){\n  if(listPageUrls[i] == currPageUrl){\n   L(java,32, listPageUrls[i] + \"已获取,不需要再次获取!\");\n   contentArr.push(result);\n  } else {\n   let jsUrl = java.toURL(listPageUrls[i], baseUrl);\n   let tempUrl = `${jsUrl.origin}${jsUrl.pathname}`;\n   L(java,32, tempUrl + \"获取中\");\n   let tempResult = java.connect(tempUrl).body();\n   L(java,32,`已获取到${tempUrl},解析中。。。`);\n   \/\/超时处理\n   tempResult = reFetchTest(java,tempUrl,tempResult,\"正文\");\n   L(java,32,\"获取到的HTML:\\n\" + tempResult);\n   \/\/获取正文内容\n   tempResult = getMainBody(java,tempUrl,tempResult);\n   contentArr.push(tempResult);\n  }\n }\n} else {\n contentArr.push(result);\n}\n\/\/合并内容并加上分页标志用来判断是否拼接还原\nresult = contentArr.join(\"<p>hereispagebreak<\/p>\");\nL(java,32,`${baseUrl}所有分页正文内容获取完成,初始化中。。。`);\n\/**初始化文本内容*\/\nresult = XArr(result, initMainBodiRegs);\nL(java,32,baseUrl + \" 正文初始化完成,执行正则替换\");\nresult;\n<\/js>",
        "imageStyle": "TEXT",
        "replaceRegex": "<js>\nL(java,32,\"执行替换规则的正文内容:\\n\" + result);\n\/**文字转换还原*\/\n\/\/图片还原\nresult = XArr(result, imgRegs);\n\/\/字体转换还原\nresult = XArr(result, imgRegs);\n\/\/净化广告\nresult = XArr(result, purifyRegs);\n\/**净化后开始特殊处理*\/\n\/\/大兜底,某一页如果转换完是空的,显示“刷新试试”\n\/\/没有出现问题的时候不要打开,因为大多数情况是页里面内容就是空的\n\/*\nresult = X(result, [\/(^\\s*hereispagebreak)|(hereispagebreak\\s*hereispagebreak)|(hereispagebreak\\s*$)\/,`hereispagebreak\n🐞🐞在正文解析后本页内容为空!!🐞🐞\n🐞🐞换个时间刷新试试或者打开页面查看是否有问题!!!🐞🐞\nhereispagebreak`]);\n*\/\n\/\/分页后的断行还原\nresult = XArr(result, rvsPBRegs);\n\/\/35字换行排版恢复\nresult = XArr(result, rvs35Regs);\n\/**不成熟的尝试*\/\n\/\/对后引号前不是正常断句标点的特殊处理\n\/\/如「凶猛」\\r\\n进攻 ->「凶猛」进攻\nresult=X(result,[\/([,、\\u4e00-\\u9fa5][『「][^,。?!:;]{1,10}[」』])[\\s\\r\\n]+\/g,\"$1\"],true);\n\/\/对前引号前是正常断句的处理,如\n\/\/他扭头走开了。「你不要走! ->扭头走开了。\\r\\n「你不\nresult = X(result, [\/([。!?…])([『「].{5,})\/g,\"$1\\r\\n$2\"]);\n\/\/处理意外情况,后引号换行后结束\n\/\/「你说的对。\\r\\n」\\r\\n ->「你说的对。」\\r\\n\nresult = X(result, [\/([。!?…])[\\s\\r\\n]+(」[\\s\\r\\n]+)\/g,\"$1$2\"]);\n\/\/兜底返回未能还原的文字,用来进一步完善还原正则数组\nlet unReversed = result.match(\/#[a-zA-Z\\d]{4,12}#\/gi);\nif(unReversed){\n result += \"\\n🚨🚨未能还原的文字🚨🚨\\n\";\n let arr = Array.from(new Set(unReversed));\n let host = getHostUrl(java,source);\n for(var i in arr){\n  result += `${arr[i]}:<img src=\"${host}toimg\/data\/${arr[i].replace(\/#\/g,\"\")}.png\">`;\n }\n}\nresult;\n<\/js>"
    },
    "ruleExplore": {},
    "ruleSearch": {
        "author": ".info.0@text##\\s+字数:.*",
        "bookList": "div.container@div.book-all-list@div.bd@tag.ul@div.right",
        "bookUrl": ".name@href",
        "checkKeyWord": "妻子大战SM调教师外传",
        "kind": "span.0@text&&p.info.1@text##更新:",
        "lastChapter": ".update@a@text",
        "name": ".name@text",
        "wordCount": ".info@span.words@text##字数:"
    },
    "ruleToc": {
        "chapterList": "<js>\nL(java,16,baseUrl + \" 获取列表内容!\");\nresult = reFetchTest(java,baseUrl,result,\"目录\");\njava.setContent(result);\nlet pageNum = java.getString(\"div.mod.page@text##.+第[\\\\d]+\\\/(\\\\d+)页.+##$1\");\njava.setContent(java.getString(\".chapter-list.1@li@html\"));\nlet listTemp = java.getElements(\"tag.a\");\nlet objResult = [];\nL(java,16,\"\\n章节列表页数:\" + pageNum);\nlet intpageNum = 0;\nif(pageNum && pageNum.match(\/^\\d+$\/)){\n intpageNum = parseInt(pageNum);\n}\nfor(let i in listTemp){\n objResult.push({\n  name : java.getString(\"tag.a@text\", listTemp[i]),\n  url : java.getString(\"tag.a@href\", listTemp[i])\n });\n}\n\/\/无奈之举,源服务器经常不稳定,造成丢目录现象,模拟app进行分页获取,增加延时重试机制,重试5次还不行再返回更新失败\nif(intpageNum > 1){\n for(let i = 2; i<= parseInt(pageNum); i++){\n  L(java,16,\"\\n获取章节列表页:\" + baseUrl.replace(\/(_\\d+)?\\\/?$\/, \"_\" + i +\"\/\"));\n  let tempUrl = baseUrl.replace(\/(_\\d+)?\\\/?$\/, \"_\" + i +\"\/\");\n  let strTemp = java.connect(baseUrl.replace(\/(_\\d+)?\\\/?$\/, \"_\" + i +\"\/\")).body();\n  strTemp = reFetchTest(java,tempUrl,strTemp,\"目录\");\n  if(strTemp === \"\"){\n   objResult = [];\n   break;\n  }\n  java.setContent(java.getString(\".chapter-list.1@li@html\",strTemp));\n  listTemp = java.getElements(\"tag.a\");\n  for(let i in listTemp){\n   objResult.push({\n    name : java.getString(\"tag.a@text\", listTemp[i]),\n    url : java.getString(\"tag.a@href\", listTemp[i])\n   });\n  }\n }\n}\nif(objResult.length > 0){\n objResult.sort((a,b) => {\n  return (parseInt(a.url.match(\/^.+\\\/(\\d+)\\.html?$\/)[1]) - parseInt(b.url.match(\/^.+\\\/(\\d+)\\.html?$\/)[1]));\n });\n} else {\n objResult = null;\n}\nL(java,16,\"\\n获取的章节信息:\\n\" + JSON.stringify(objResult,null,\"\\t\"));\nobjResult\n<\/js>",
        "chapterName": "name",
        "chapterUrl": "url",
        "preUpdateJs": "L(java,64,\"调用目录更新前JS!\")\n\/\/发现、目录替换为最新域名\nbook.bookUrl = String(book.bookUrl).replace(\/^https?\\:\\\/\\\/[^\\\/]+\\\/\/, getHostUrl(java,source));\nbook.tocUrl = String(book.tocUrl ).replace(\/^https?\\:\\\/\\\/[^\\\/]+\\\/\/, getHostUrl(java,source));"
    },
    "searchUrl": "{{getHostUrl(java,source)}}s.php,{\"charset\":\"GBK\",\"method\":\"POST\",\"body\":\"s={{key}}&page={{page}}\"}",
    "weight": 0
}
广告