🏷晋江文学
https://m.jjwxc.net/channel/
guaner001125 (317)6天前
❗️更新了上一版书源的,请更新这一版,上一版书源搜索出现大问题了❗️
当前书源测试阅读版本为3.25.030422
{ "bookSourceComment": "每隔八小时访问一遍签到(搜索的时候访问)\n\n点击“登录”自定义发现\n更改过发现要刷新本书源才会生效\n\n\n❗️注意事项:\n1、请不要退出晋江app的账号,只要点了退出,或者在其他地方登录了,都要重新抓token。\n\n2、更新token,书籍就要更新目录。\n\n3、登录步骤:\n①填写好账号密码,点击“邮箱验证码”或者“手机验证码”\n②填写好验证码,点击“邮箱登录”或者“手机登录”\n③点击右上角的“✓”,弹出提示“成功”\n④想要确认是否成功可以在登录UI里点右上角三点,查看登录头token里是否有值。\n\n4、如果邮箱和手机号无法登录,可能是需要过滑动验证码,可尝试先在晋江app里登录一遍后,再在阅读里登录,还是不行就只能抓包token,填写在“抓包token登录”处。", "bookSourceGroup": "①🔰 正版,②🌸 常用", "bookSourceName": "🏷晋江文学", "bookSourceType": 0, "bookSourceUrl": "https:\/\/m.jjwxc.net\/channel\/", "bookUrlPattern": "http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo\\?novelId=\\d+", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "<js>\ntoken = Map(\"token\");\n\n\/\/ 选择需要开启的分类\nconst enabledCategories = Map(\"fl\") || \"9,10\";\nconst tagNum = Map(\"bq\") || \"5\";\n\ntagName = [\"言情\",\"纯爱\",\"百合\",\"无Cp\",\"多元\"][Number(tagNum)-1];\ntagCategory = [1,2,3,5,6][Number(tagNum)-1];\nconst at = Map(\"at\");\n\n\n\/\/ 一行个数\nconst defaultNumPerRow = 4;\n\/\/ 分隔符\nconst separator = '::';\n\n\n\/\/标识符\n分类标识 =\"🌸\"\n榜单标识=\"📖\"\n标签标识=\"🏷\"\n\n\/\/ 添加作者格式:作者名::作者id\nlet authorNames = decodeURIComponent(at || \"\").split(\" \").filter(name => name.trim() !== \"\");\nauthorNames = authorNames.length ? authorNames.map(x => `${x}::::at`) : [];\nif (authorNames.length) authorNames.unshift(\"📖 作者 📖::::1\");\n\n\/\/书架数据\nlet ShelfNum = Map(\"classNum\")??\"\"\nlet ShelfList = [];\n\tif(\/❗️([\\s\\S]+?)❗️\/.test(String(source.getVariable()))){\n\t\tShelfList =JSON.parse(String(source.getVariable()).match(\/❗️([\\s\\S]+?)❗️\/)[1]);\n\t\t}else{\n\t\t\tShelfNum = \"\"\n\t\t\t}\n\n\/\/ 为数组中的每一项添加 \"::::class\"\nShelfList = ShelfList.map(item => item + \"::::class\");\n\n\/\/ 标题::链接::一行个数::分类\nlet all = [\n\"🍒 其他::::1\",\n \"点击签到::https:\/\/app.jjwxc.org\/androidapi\/signin,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"versionCode=313&sign={{enbody = String(Date.now())+':'+String(source.getLoginHeaderMap().get('token'));String(java.createSymmetricCrypto('DES\/CBC\/PKCS5Padding', String('KW8Dvm2N'), String('1ae2c94b')).encryptBase64(enbody))}}\\\"}\",\n \"今日限免::https:\/\/app-cdn.jjwxc.net\/bookstore\/getFullPage?channel=novelfree\",\n \"⬆️ TOP 100::::1\",\n \"言情::https:\/\/app.jjwxc.org\/app.jjwxc\/android\/reading\/TopOneHundred\/getRankData?versionCode=389&type=yq,{'headers':{'versionCode': '389'}}::null\",\n\"纯爱::https:\/\/app.jjwxc.org\/app.jjwxc\/android\/reading\/TopOneHundred\/getRankData?versionCode=389&type=dm,{'headers':{'versionCode': '389'}}::null\",\n\"衍生::https:\/\/app.jjwxc.org\/app.jjwxc\/android\/reading\/TopOneHundred\/getRankData?versionCode=389&type=tr,{'headers':{'versionCode': '389'}}::null\",\n\"无CP+::https:\/\/app.jjwxc.org\/app.jjwxc\/android\/reading\/TopOneHundred\/getRankData?versionCode=389&type=nocp_plus,{'headers':{'versionCode': '389'}}::null\",\n\"百合::https:\/\/app.jjwxc.org\/app.jjwxc\/android\/reading\/TopOneHundred\/getRankData?versionCode=389&type=bh,{'headers':{'versionCode': '389'}}::null\"\n];\n\nconst categories = [\"古代言情\",\"现代言情\",\"幻想现言\",\"古代穿越\",\"奇幻言情\",\"未来游戏悬疑\",\"都市纯爱\",\"现代幻纯\",\"古代纯爱\",\"百合\",\"无CP\",\"衍生无CP\",\"衍生纯爱\",\"衍生言情\",\"二次元言情\",\"多元\",\"男主无CP\",\"女主无CP\",\"未来幻纯\"];\n\n\/\/ 分类数据\nconst categoryData = {\n \"古代言情\": {\n \"连载\": [\n \"复仇虐渣::natural_16\",\n \"重生::natural_12\",\n \"宫廷侯爵::natural_11\",\n \"架空历史::natural_13\",\n \"布衣生活::natural_9\",\n \"古香古色::natural_8\",\n \"科举朝堂::natural_18\",\n \"励志人生::natural_19\",\n \"市井人家::natural_17\",\n \"女尊女强::natural_14\",\n \"传奇武侠::natural_15\"\n ],\n \"完结\": [\n \"复仇虐渣::natural_33\",\n \"重生::natural_29\",\n \"宫廷侯爵::natural_28\",\n \"架空历史::natural_30\",\n \"布衣生活::natural_26\",\n \"古香古色::natural_25\",\n \"科举朝堂::natural_35\",\n \"励志人生::natural_36\",\n \"市井人家::natural_34\",\n \"女尊女强::natural_31\",\n \"传奇武侠::natural_32\"\n ],\n \"榜单\": [\n \"频道金榜::natural_23\",\n \"运气淘文::40000001\",\n \"勤奋更新::natural_1482\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=101&ranktype=deep\",\n \"育苗实验::90001000_101\",\n \"VIP新文::natural_3\",\n \"新晋作者::natural_4\",\n \"月度排行::natural_5\",\n \"季度排行::natural_6\",\n \"半年排行::natural_7\"\n ]\n },\n \"现代言情\": {\n \"连载\": [\n \"天之骄子::natural_52\",\n \"豪门世家::natural_44\",\n \"励志人生::natural_46\",\n \"娱乐星光::natural_53\",\n \"婚前婚后::natural_47\",\n \"时代新风::natural_51\",\n \"校园青春::natural_73\",\n \"都市情缘::natural_48\",\n \"甜心蜜意::natural_75\",\n \"破镜重圆::natural_49\",\n \"近水楼台::natural_50\",\n \"情有独钟::natural_76\",\n \"时尚流行::natural_74\",\n \"欢喜冤家::natural_54\",\n \"因缘邂逅::natural_55\"\n ],\n \"完结\": [\n \"天之骄子::natural_69\",\n \"豪门世家::natural_61\",\n \"励志人生::natural_63\",\n \"娱乐星光::natural_70\",\n \"婚前婚后::natural_64\",\n \"时代新风::natural_68\",\n \"校园青春::natural_77\",\n \"都市情缘::natural_65\",\n \"甜心蜜意::natural_79\",\n \"破镜重圆::natural_66\",\n \"近水楼台::natural_67\",\n \"情有独钟::natural_80\",\n \"时尚流行::natural_78\",\n \"欢喜冤家::natural_71\",\n \"因缘邂逅::natural_72\"\n ],\n \"榜单\": [\n \"频道金榜::natural_59\",\n \"运气淘文::40000002\",\n \"勤奋更新::natural_1483\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=102&ranktype=deep\",\n \"育苗实验::90001000_102\",\n \"VIP新文::natural_39\",\n \"新晋作者::natural_40\",\n \"月度排行::natural_41\",\n \"季度排行::natural_42\",\n \"半年排行::natural_43\"\n ]\n },\n \"幻想现言\": {\n \"连载\": [\n \"流金年代::natural_107\",\n \"豪门世家::natural_100\",\n \"娱乐时尚::natural_108\",\n \"快穿系统::natural_97\",\n \"种田日常::natural_98\",\n \"打脸爽文::natural_105\",\n \"重启人生::natural_93\",\n \"都市异闻::natural_103\",\n \"穿越时空::natural_94\",\n \"神奇能力::natural_102\",\n \"升级逆袭::natural_104\",\n \"时代奇缘::natural_96\",\n \"人生赢家::natural_95\",\n \"现代架空::natural_101\",\n \"幻想传奇::natural_99\"\n ],\n \"完结\": [\n \"流金年代::natural_123\",\n \"豪门世家::natural_116\",\n \"娱乐时尚::natural_124\",\n \"快穿系统::natural_113\",\n \"种田日常::natural_114\",\n \"打脸爽文::natural_121\",\n \"重启人生::natural_109\",\n \"都市异闻::natural_119\",\n \"穿越时空::natural_110\",\n \"神奇能力::natural_118\",\n \"升级逆袭::natural_120\",\n \"时代奇缘::natural_112\",\n \"人生赢家::natural_111\",\n \"现代架空::natural_117\",\n \"幻想传奇::natural_115\"\n ],\n \"榜单\": [\n \"频道金榜::natural_86\",\n \"运气淘文::40000003\",\n \"勤奋更新::natural_1484\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=103&ranktype=deep\",\n \"育苗实验::90001000_103\",\n \"VIP新文::natural_84\",\n \"新晋作者::natural_87\",\n \"月度排行::natural_81\",\n \"季度排行::natural_82\",\n \"半年排行::natural_88\"\n ]\n },\n \"古代穿越\": {\n \"连载\": [\n \"复仇虐渣::natural_148\",\n \"宫廷侯爵::natural_142\",\n \"架空穿越::natural_140\",\n \"系统快穿::natural_147\",\n \"历史穿越::natural_139\",\n \"科举朝堂::natural_146\",\n \"布衣生活::natural_141\",\n \"欢喜冤家::natural_143\",\n \"女尊女强::natural_138\",\n \"市井人家::natural_145\",\n \"异世穿书::natural_144\"\n ],\n \"完结\": [\n \"复仇虐渣::natural_164\",\n \"宫廷侯爵::natural_158\",\n \"架空穿越::natural_156\",\n \"系统快穿::natural_163\",\n \"历史穿越::natural_155\",\n \"科举朝堂::natural_162\",\n \"布衣生活::natural_157\",\n \"欢喜冤家::natural_159\",\n \"女尊女强::natural_154\",\n \"市井人家::natural_161\",\n \"异世穿书::natural_160\"\n ],\n \"榜单\": [\n \"频道金榜::natural_130\",\n \"运气淘文::40000004\",\n \"勤奋更新::natural_1485\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=104&ranktype=deep\",\n \"育苗实验::90001000_104\",\n \"VIP新文::natural_128\",\n \"新晋作者::natural_131\",\n \"月度排行::natural_125\",\n \"季度排行::natural_126\",\n \"半年排行::natural_132\"\n ]\n },\n \"奇幻言情\": {\n \"连载\": [\n \"天作之合::natural_179\",\n \"西方奇幻::natural_183\",\n \"爽文::natural_181\",\n \"奇幻甜宠::natural_177\",\n \"升级逆袭::natural_188\",\n \"东方玄幻::natural_186\",\n \"灵异神怪::natural_182\",\n \"穿书异能::natural_187\",\n \"系统穿越::natural_185\",\n \"金手指::natural_184\",\n \"另类幻想::natural_180\"\n ],\n \"完结\": [\n \"天作之合::natural_191\",\n \"西方奇幻::natural_195\",\n \"爽文::natural_193\",\n \"奇幻甜宠::natural_189\",\n \"升级逆袭::natural_200\",\n \"东方玄幻::natural_198\",\n \"灵异神怪::natural_194\",\n \"穿书异能::natural_199\",\n \"系统穿越::natural_197\",\n \"金手指::natural_196\",\n \"另类幻想::natural_192\"\n ],\n \"榜单\": [\n \"频道金榜::natural_170\",\n \"运气淘文::40000005\",\n \"勤奋更新::natural_1486\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=105&ranktype=deep\",\n \"育苗实验::90001000_105\",\n \"VIP新文::natural_168\",\n \"新晋作者::natural_171\",\n \"月度排行::natural_165\",\n \"季度排行::natural_166\",\n \"半年排行::natural_172\"\n ]\n },\n \"未来游戏悬疑\": {\n \"连载\": [\n \"赛博废土::natural_225\",\n \"无限领域::natural_222\",\n \"基建种田::natural_226\",\n \"末世异世::natural_215\",\n \"规则怪谈::natural_223\",\n \"游戏娱乐::natural_216\",\n \"悬疑惊悚::natural_220\",\n \"系统异能::natural_221\",\n \"穿书快穿::natural_227\",\n \"升级爽文::natural_224\",\n \"重生穿越::natural_219\",\n \"未来科幻::natural_217\",\n \"推理探案::natural_214\",\n \"幻想甜宠::natural_228\",\n \"异度幻想::natural_218\"\n ],\n \"完结\": [\n \"赛博废土::natural_241\",\n \"无限领域::natural_238\",\n \"基建种田::natural_242\",\n \"末世异世::natural_231\",\n \"规则怪谈::natural_239\",\n \"游戏娱乐::natural_232\",\n \"悬疑惊悚::natural_236\",\n \"系统异能::natural_237\",\n \"穿书快穿::natural_243\",\n \"升级爽文::natural_240\",\n \"重生穿越::natural_235\",\n \"未来科幻::natural_233\",\n \"推理探案::natural_230\",\n \"幻想甜宠::natural_244\",\n \"异度幻想::natural_234\"\n ],\n \"榜单\": [\n \"频道金榜::natural_206\",\n \"运气淘文::40000006\",\n \"勤奋更新::natural_1487\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=106&ranktype=deep\",\n \"育苗实验::90001000_106\",\n \"VIP新文::natural_204\",\n \"新晋作者::natural_207\",\n \"月度排行::natural_201\",\n \"季度排行::natural_202\",\n \"半年排行::natural_208\"\n ]\n },\n \"都市纯爱\": {\n \"连载\": [\n \"时尚娱乐::natural_270\",\n \"种田日常::natural_266\",\n \"现代都市::natural_260\",\n \"豪门世家::natural_267\",\n \"业界精英::natural_265\",\n \"重生::natural_259\",\n \"边缘恋曲::natural_264\",\n \"校园青春::natural_261\",\n \"婚前婚后::natural_272\",\n \"穿越时空::natural_262\",\n \"成长励志::natural_268\",\n \"欢喜冤家::natural_257\",\n \"情有独钟::natural_271\",\n \"都市甜文::natural_258\",\n \"打脸逆袭::natural_263\"\n ],\n \"完结\": [\n \"时尚娱乐::natural_286\",\n \"种田日常::natural_282\",\n \"现代都市::natural_276\",\n \"豪门世家::natural_283\",\n \"业界精英::natural_281\",\n \"重生::natural_275\",\n \"边缘恋曲::natural_280\",\n \"校园青春::natural_277\",\n \"婚前婚后::natural_288\",\n \"穿越时空::natural_278\",\n \"成长励志::natural_284\",\n \"欢喜冤家::natural_273\",\n \"情有独钟::natural_287\",\n \"都市甜文::natural_274\",\n \"打脸逆袭::natural_279\"\n ],\n \"榜单\": [\n \"频道金榜::natural_250\",\n \"运气淘文::40000007\",\n \"勤奋更新::natural_1488\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=107&ranktype=deep\",\n \"育苗实验::90001000_107\",\n \"VIP新文::natural_248\",\n \"新晋作者::natural_251\",\n \"月度排行::natural_245\",\n \"季度排行::natural_246\",\n \"半年排行::natural_252\"\n ]\n },\n \"现代幻纯\": {\n \"连载\": [\n \"娱乐星光::natural_517\",\n \"萌宠频道::natural_515\",\n \"异闻秘术::natural_514\",\n \"快穿世界::natural_511\",\n \"奇幻灵异::natural_523\",\n \"幻想甜宠::natural_521\",\n \"无限流::natural_509\",\n \"系统::natural_512\",\n \"边缘幻想::natural_516\",\n \"情有独钟::natural_520\",\n \"升级爽文::natural_522\"\n ],\n \"完结\": [\n \"娱乐星光::natural_533\",\n \"萌宠频道::natural_531\",\n \"异闻秘术::natural_530\",\n \"快穿世界::natural_527\",\n \"奇幻灵异::natural_539\",\n \"幻想甜宠::natural_537\",\n \"无限流::natural_525\",\n \"系统::natural_528\",\n \"边缘幻想::natural_532\",\n \"情有独钟::natural_536\",\n \"升级爽文::natural_538\"\n ],\n \"榜单\": [\n \"频道金榜::natural_502\",\n \"运气淘文::40000013\",\n \"勤奋更新::natural_1495\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=118&ranktype=deep\",\n \"育苗实验::90001000_118\",\n \"VIP新文::natural_500\",\n \"新晋作者::natural_503\",\n \"月度排行::natural_497\",\n \"季度排行::natural_498\",\n \"半年排行::natural_504\"\n ]\n },\n \"古代纯爱\": {\n \"连载\": [\n \"仙侠修真::natural_298\",\n \"布衣生活::natural_297\",\n \"武侠传奇::natural_307\",\n \"西幻异世 ::natural_301\",\n \"穿越时空::natural_303\",\n \"重生::natural_302\",\n \"古代幻想::natural_299\",\n \"系统快穿::natural_304\",\n \"玄幻灵异::natural_305\",\n \"天作之合::natural_306\",\n \"升级逆袭::natural_300\"\n ],\n \"完结\": [\n \"仙侠修真::natural_315\",\n \"布衣生活::natural_314\",\n \"武侠传奇::natural_324\",\n \"西幻异世 ::natural_318\",\n \"穿越时空::natural_320\",\n \"重生::natural_319\",\n \"古代幻想::natural_316\",\n \"系统快穿::natural_321\",\n \"玄幻灵异::natural_322\",\n \"天作之合::natural_323\",\n \"升级逆袭::natural_317\"\n ],\n \"榜单\": [\n \"频道金榜::natural_311\",\n \"运气淘文::40000008\",\n \"勤奋更新::natural_1489\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=108&ranktype=deep\",\n \"育苗实验::90001000_108\",\n \"VIP新文::natural_291\",\n \"新晋作者::natural_292\",\n \"月度排行::natural_293\",\n \"季度排行::natural_294\",\n \"半年排行::natural_295\"\n ]\n },\n \"百合\": {\n \"连载\": [\n \"幻想未来::natural_336\",\n \"架空历史::natural_334\",\n \"都市情缘::natural_337\",\n \"穿越时空::natural_335\",\n \"天赐良缘::natural_338\",\n \"时尚娱乐::natural_339\",\n \"奇幻异闻::natural_333\",\n \"系统快穿::natural_342\",\n \"宫廷侯爵::natural_340\",\n \"业界精英::natural_341\",\n \"情有独钟::natural_343\"\n ],\n \"完结\": [\n \"幻想未来::natural_353\",\n \"架空历史::natural_351\",\n \"都市情缘::natural_354\",\n \"穿越时空::natural_352\",\n \"天赐良缘::natural_355\",\n \"时尚娱乐::natural_356\",\n \"奇幻异闻::natural_350\",\n \"系统快穿::natural_359\",\n \"宫廷侯爵::natural_357\",\n \"业界精英::natural_358\",\n \"情有独钟::natural_360\"\n ],\n \"榜单\": [\n \"频道金榜::natural_1072\",\n \"运气淘文::40000009\",\n \"勤奋更新::natural_1490\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=9&ranktype=deep\",\n \"育苗实验::90001000_9\",\n \"VIP新文::natural_1069\",\n \"新晋作者::natural_1045\",\n \"月度排行::natural_1043\",\n \"季度排行::natural_1042\",\n \"半年排行::natural_1044\"\n ]\n },\n \"无CP\": {\n \"连载\": [\n \"未来幻想-女主::natural_477\",\n \"都市成长-男主::natural_478\",\n \"都市成长-女主::natural_479\",\n \"古代架空-男主::natural_480\",\n \"古代架空-女主::natural_481\",\n \"无限快穿-男主::natural_482\",\n \"无限快穿-女主::natural_483\"\n ],\n \"完结\": [\n \"未来幻想-女主::natural_490\",\n \"都市成长-男主::natural_491\",\n \"都市成长-女主::natural_492\",\n \"古代架空-男主::natural_493\",\n \"古代架空-女主::natural_494\",\n \"无限快穿-男主::natural_495\",\n \"无限快穿-女主::natural_496\"\n ],\n \"榜单\": [\n \"频道金榜::natural_487\",\n \"运气淘文::40000014\",\n \"勤奋更新::natural_1494\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=114&ranktype=deep\",\n \"育苗实验::90001000_114\",\n \"VIP新文::natural_471\",\n \"新晋作者::natural_472\",\n \"月度排行::natural_473\",\n \"季度排行::natural_474\",\n \"半年排行::natural_475\"\n ]\n },\n \"衍生无CP\": {\n \"连载\": [\n \"幻想轻小说::natural_549\",\n \"东方衍生::natural_550\",\n \"西方衍生::natural_555\",\n \"二次元热血::natural_552\",\n \"二次元幻想::natural_553\",\n \"二次元异能::natural_554\",\n \"女主向::natural_551\"\n ],\n \"完结\": [\n \"幻想轻小说::natural_562\",\n \"东方衍生::natural_563\",\n \"西方衍生::natural_568\",\n \"二次元热血::natural_565\",\n \"二次元幻想::natural_566\",\n \"二次元异能::natural_567\",\n \"女主向::natural_564\"\n ],\n \"榜单\": [\n \"频道金榜::natural_559\",\n \"运气淘文::40000015\",\n \"勤奋更新::natural_1496\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=120&ranktype=deep\",\n \"育苗实验::90001000_120\",\n \"VIP新文::natural_543\",\n \"新晋作者::natural_544\",\n \"月度排行::natural_545\",\n \"季度排行::natural_546\",\n \"半年排行::natural_547\"\n ]\n },\n \"衍生纯爱\": {\n \"连载\": [\n \"西方罗曼::natural_373\",\n \"都市轻小说::natural_376\",\n \"幻想轻小说::natural_377\",\n \"二次元热血::natural_378\",\n \"二次元幻想::natural_379\",\n \"二次元异能::natural_369\",\n \"其他衍生::natural_372\"\n ],\n \"完结\": [\n \"西方罗曼::natural_390\",\n \"都市轻小说::natural_393\",\n \"幻想轻小说::natural_394\",\n \"二次元热血::natural_395\",\n \"二次元幻想::natural_396\",\n \"二次元异能::natural_386\",\n \"其他衍生::natural_389\"\n ],\n \"榜单\": [\n \"频道金榜::natural_383\",\n \"运气淘文::40000010\",\n \"勤奋更新::natural_1491\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=110&ranktype=deep\",\n \"育苗实验::90001000_110\",\n \"VIP新文::natural_363\",\n \"新晋作者::natural_364\",\n \"月度排行::natural_365\",\n \"季度排行::natural_366\",\n \"半年排行::natural_367\"\n ]\n },\n \"衍生言情\": {\n \"连载\": [\n \"历史传奇::natural_450\",\n \"西方罗曼::natural_449\",\n \"无限快穿::natural_451\",\n \"江湖恩怨::natural_453\",\n \"娱乐竞技::natural_454\",\n \"东方幻想::natural_452\",\n \"其他::natural_455\"\n ],\n \"完结\": [\n \"历史传奇::natural_463\",\n \"西方罗曼::natural_462\",\n \"无限快穿::natural_464\",\n \"江湖恩怨::natural_466\",\n \"娱乐竞技::natural_467\",\n \"东方幻想::natural_465\",\n \"其他::natural_468\"\n ],\n \"榜单\": [\n \"频道金榜::natural_459\",\n \"运气淘文::40000012\",\n \"勤奋更新::natural_1493\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=112&ranktype=deep\",\n \"育苗实验::90001000_112\",\n \"VIP新文::natural_443\",\n \"新晋作者::natural_444\",\n \"月度排行::natural_445\",\n \"季度排行::natural_446\",\n \"半年排行::natural_447\"\n ]\n },\n \"二次元言情\": {\n \"连载\": [\n \"多重身份::natural_415\",\n \"经营基建::natural_418\",\n \"竞技社团::natural_422\",\n \"东方古风::natural_412\",\n \"西幻魔幻::natural_413\",\n \"乙女游戏::natural_414\",\n \"异能超能::natural_417\",\n \"转生::natural_420\",\n \"异闻怪谈::natural_421\",\n \"浪漫情缘::natural_419\",\n \"新奇幻想::natural_423\"\n ],\n \"完结\": [\n \"多重身份::natural_432\",\n \"经营基建::natural_435\",\n \"竞技社团::natural_439\",\n \"东方古风::natural_429\",\n \"西幻魔幻::natural_430\",\n \"乙女游戏::natural_431\",\n \"异能超能::natural_434\",\n \"转生::natural_437\",\n \"异闻怪谈::natural_438\",\n \"浪漫情缘::natural_436\",\n \"新奇幻想::natural_440\"\n ],\n \"榜单\": [\n \"频道金榜::natural_427\",\n \"运气淘文::40000011\",\n \"勤奋更新::natural_1492\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=111&ranktype=deep\",\n \"育苗实验::90001000_111\",\n \"VIP新文::natural_407\",\n \"新晋作者::natural_408\",\n \"月度排行::natural_409\",\n \"季度排行::natural_410\",\n \"半年排行::natural_411\"\n ]\n },\n \"多元\": {\n \"连载\": [],\n \"完结\": [],\n \"榜单\": [\n \"频道金榜::natural_1010\",\n \"月度排行::natural_1012\",\n \"VIP新文::natural_1011\",\n \"育苗实验::90001000_121\",\n \"新晋作者::natural_1013\",\n \"季度排行::natural_1014\",\n \"半年排行::natural_1518\"\n ]\n },\n \"男主无CP\": {\n \"连载\": [\n \"都市成长::natural_478\",\n \"古代架空::natural_480\",\n \"无限快穿::natural_482\"\n ],\n \"完结\": [\n \"都市成长::natural_491\",\n \"古代架空::natural_493\",\n \"无限快穿::natural_495\"\n ],\n \"榜单\": [\n \"频道金榜::natural_992\",\n \"勤奋更新::natural_1515\",\n \"VIP新文::natural_986\",\n \"新晋作者::natural_987\",\n \"月度排行::natural_988\",\n \"季度排行::natural_989\",\n \"半年排行::natural_990\"\n ]\n },\n \"女主无CP\": {\n \"连载\": [\n \"都市成长::natural_479\",\n \"古代架空::natural_481\",\n \"无限快穿::natural_483\"\n ],\n \"完结\": [\n \"都市成长::natural_492\",\n \"古代架空::natural_494\",\n \"无限快穿::natural_496\"\n ],\n \"榜单\": [\n \"频道金榜::natural_1000\",\n \"勤奋更新::natural_1516\",\n \"VIP新文::natural_994\",\n \"新晋作者::natural_995\",\n \"月度排行::natural_996\",\n \"季度排行::natural_997\",\n \"半年排行::natural_998\"\n ]\n },\n \"未来幻纯\": {\n \"连载\": [\n \"娱乐竞技::natural_1112\",\n \"快穿::natural_1113\",\n \"无限流::natural_1114\",\n \"系统::natural_1115\",\n \"末世狂想::natural_1116\",\n \"幻想甜宠::natural_1117\",\n \"星际日常::natural_1118\",\n \"奇幻异想::natural_1119\",\n \"边缘幻想::natural_1120\",\n \"未来畅想::natural_1121\",\n \"升级爽文::natural_1122\"\n ],\n \"完结\": [\n \"娱乐竞技::natural_1128\",\n \"快穿::natural_1129\",\n \"无限流::natural_1130\",\n \"系统::natural_1131\",\n \"末世狂想::natural_1132\",\n \"幻想甜宠::natural_1133\",\n \"星际日常::natural_1134\",\n \"奇幻异想::natural_1135\",\n \"边缘幻想::natural_1136\",\n \"未来畅想::natural_1137\",\n \"升级爽文::natural_1138\"\n ],\n \"榜单\": [\n \"频道金榜::natural_1104\",\n \"运气淘文::wlhxca\",\n \"勤奋更新::natural_1497\",\n \"深耕排行::https:\/\/app-cdn.jjwxc.com\/newBookStoreAndroid\/getRankMoreData?channel=126&ranktype=deep\",\n \"育苗实验::90001000_126\",\n \"VIP新文::natural_1102\",\n \"新晋作者::natural_1105\",\n \"月度排行::natural_1099\",\n \"季度排行::natural_1100\",\n \"半年排行::natural_1106\"\n ]\n }\n}\n\n\/\/ 标签数据\nconst tags = [\"轻松::262::::bq\",\"爽文::137::::bq\",\"甜文::124::::bq\",\"正剧::263::::bq\",\"穿书::134::::bq\",\"强强::19::::bq\",\"系统::122::::bq\",\"成长::183::::bq\",\"重生::75::::bq\",\"惊悚::9::::lx\",\"悬疑::10::::lx\",\"剧情::16::::lx\",\"快穿::125::::bq\",\"直播::142::::bq\",\"逆袭::184::::bq\",\"励志::121::::bq\",\"打脸::138::::bq\",\"女强::82::::bq\",\"异能::72::::bq\",\"基建::237::::bq\",\"救赎::329::::bq\",\"女配::96::::bq\",\"暗恋::314::::bq\",\"末世::81::::bq\",\"惊悚::29::::bq\",\"婚恋::78::::bq\",\"科幻::28::::bq\",\"炮灰::305::::bq\",\"开挂::344::::bq\",\"经营::180::::bq\",\"脑洞::273::::bq\",\"烧脑::269::::bq\",\"爱情::1::::lx\",\"武侠::2::::lx\",\"奇幻::3::::lx\",\"仙侠::4::::lx\",\"游戏::5::::lx\",\"传奇::6::::lx\",\"科幻::7::::lx\",\"童话::8::::lx\",\"都市::30::::bq\",\"校园::185::::bq\",\"综漫::6::::bq\",\"星际::135::::bq\",\"日常::268::::bq\",\"柯南::241::::bq\",\"年下::21::::bq\",\"咒回::240::::bq\",\"沙雕::266::::bq\",\"美食::99::::bq\",\"生子::20::::bq\",\"群像::356::::bq\",\"萌宠::205::::bq\",\"文野::208::::bq\",\"治愈::265::::bq\",\"团宠::287::::bq\",\"爆笑::261::::bq\",\"西幻::143::::bq\",\"魔幻::27::::bq\",\"综艺::335::::bq\",\"热血::267::::bq\",\"废土::281::::bq\",\"清穿::18::::bq\",\"朝堂::178::::bq\",\"虫族::260::::bq\",\"玄学::206::::bq\",\"萌娃::302::::bq\",\"钓系::298::::bq\",\"电竞::328::::bq\",\"港风::282::::bq\",\"全息::276::::bq\",\"宫斗::74::::bq\",\"剧透::343::::bq\",\"科举::174::::bq\",\"机甲::97::::bq\",\"虐文::42::::bq\",\"网王::1::::bq\",\"原神::371::::bq\",\"古早::275::::bq\",\"师徒::292::::bq\",\"家教::12::::bq\",\"江湖::35::::bq\",\"忠犬::312::::bq\",\"武侠::11::::bq\",\"七五::8::::bq\",\"宅斗::73::::bq\",\"腹黑::290::::bq\",\"权谋::326::::bq\",\"失忆::320::::bq\",\"猎人::5::::bq\",\"洪荒::67::::bq\",\"卡牌::357::::bq\",\"职场::98::::bq\",\"御姐::310::::bq\",\"盲盒::345::::bq\",\"吐槽::270::::bq\",\"替身::286::::bq\",\"预知::346::::bq\",\"创业::330::::bq\",\"足球::368::::bq\",\"BE::317::::bq\",\"HE::318::::bq\",\"ABO::259::::bq\",\"APP::338::::bq\",\"NPC::293::::bq\",\"哨向::369::::bq\",\"田园::58::::bq\",\"中二::375::::bq\",\"群穿::352::::bq\",\"奇谭::197::::bq\",\"囤货::322::::bq\",\"位面::350::::bq\",\"学霸::309::::bq\",\"傲娇::294::::bq\",\"民国::61::::bq\",\"鬼灭::254::::bq\",\"开荒::331::::bq\",\"商战::123::::bq\",\"转生::362::::bq\",\"锦鲤::349::::bq\",\"齐神::201::::bq\",\"血族::69::::bq\",\"网红::141::::bq\",\"现实::271::::bq\",\"扶贫::324::::bq\",\"封神::215::::bq\",\"冰山::296::::bq\",\"聊斋::188::::bq\",\"天降::308::::bq\",\"美娱::140::::bq\",\"毒舌::299::::bq\",\"非遗::323::::bq\",\"吃货::297::::bq\",\"御兽::365::::bq\",\"悲剧::264::::bq\",\"港台::87::::bq\",\"网配::84::::bq\",\"曲艺::306::::bq\",\"婆媳::80::::bq\",\"恶役::359::::bq\",\"轻小说::17::::lx\",\"娱乐圈::64::::bq\",\"无限流::83::::bq\",\"升级流::139::::bq\",\"种田文::66::::bq\",\"年代文::173::::bq\",\"万人迷::295::::bq\",\"美强惨::291::::bq\",\"少年漫::90::::bq\",\"马甲文::243::::bq\",\"克苏鲁::283::::bq\",\"白月光::313::::bq\",\"单元文::355::::bq\",\"高智商::311::::bq\",\"读心术::337::::bq\",\"时尚圈::182::::bq\",\"迪化流::370::::bq\",\"龙傲天::289::::bq\",\"论坛体::354::::bq\",\"对照组::316::::bq\",\"古穿今::65::::bq\",\"红楼梦::15::::bq\",\"反套路::274::::bq\",\"神豪流::348::::bq\",\"纸片人::288::::bq\",\"日韩泰::86::::bq\",\"签到流::351::::bq\",\"读档流::340::::bq\",\"召唤流::347::::bq\",\"大冒险::198::::bq\",\"姐弟恋::186::::bq\",\"模拟器::358::::bq\",\"乙女向::360::::bq\",\"少女漫::14::::bq\",\"吐槽役::366::::bq\",\"犬夜叉::257::::bq\",\"红包群::341::::bq\",\"中世纪::280::::bq\",\"对话体::353::::bq\",\"情有独钟::39::::bq\",\"穿越时空::60::::bq\",\"天作之合::52::::bq\",\"天之骄子::54::::bq\",\"豪门世家::33::::bq\",\"宫廷侯爵::32::::bq\",\"仙侠修真::68::::bq\",\"破镜重圆::47::::bq\",\"业界精英::101::::bq\",\"灵异神怪::26::::bq\",\"幻想空间::25::::bq\",\"先婚后爱::315::::bq\",\"欢喜冤家::41::::bq\",\"悬疑推理::128::::bq\",\"游戏网游::92::::bq\",\"时代奇缘::22::::bq\",\"青梅竹马::62::::bq\",\"因缘邂逅::45::::bq\",\"现代架空::126::::bq\",\"相爱相杀::103::::bq\",\"花季雨季::31::::bq\",\"未来架空::127::::bq\",\"恋爱合约::48::::bq\",\"英美衍生::17::::bq\",\"体育竞技::70::::bq\",\"近水楼台::46::::bq\",\"超级英雄::132::::bq\",\"东方玄幻::144::::bq\",\"布衣生活::38::::bq\",\"乔装改扮::51::::bq\",\"规则怪谈::361::::bq\",\"复仇虐渣::145::::bq\",\"异世大陆::57::::bq\",\"高岭之花::301::::bq\",\"市井生活::175::::bq\",\"赛博朋克::277::::bq\",\"女扮男装::136::::bq\",\"随身空间::56::::bq\",\"第四天灾::285::::bq\",\"前世今生::49::::bq\",\"灵魂转换::23::::bq\",\"西方罗曼::59::::bq\",\"阴差阳错::53::::bq\",\"都市异闻::181::::bq\",\"天选之子::307::::bq\",\"史诗奇幻::199::::bq\",\"时代新风::210::::bq\",\"抽奖抽卡::339::::bq\",\"日久生情::332::::bq\",\"异想天开::190::::bq\",\"边缘恋歌::44::::bq\",\"排球少年::253::::bq\",\"异闻传说::196::::bq\",\"制服情缘::85::::bq\",\"三教九流::36::::bq\",\"神话传说::367::::bq\",\"古代幻想::189::::bq\",\"古典名著::130::::bq\",\"平步青云::55::::bq\",\"灵气复苏::284::::bq\",\"西方名著::16::::bq\",\"荒野求生::319::::bq\",\"赶山赶海::325::::bq\",\"性别转换::24::::bq\",\"真假千金::334::::bq\",\"刀剑乱舞::258::::bq\",\"星穹铁道::372::::bq\",\"多重人格::300::::bq\",\"极品亲戚::336::::bq\",\"骑士与剑::63::::bq\",\"亡灵异族::192::::bq\",\"交换人生::342::::bq\",\"魔法少女::256::::bq\",\"原始社会::279::::bq\",\"七年之痒::79::::bq\",\"蒸汽朋克::278::::bq\",\"古典衍生::20::::lx\",\"东方衍生::18::::lx\",\"西方衍生::19::::lx\",\"历史衍生::91::::bq\",\"其他衍生::21::::lx\",\"追爱火葬场::321::::bq\"];\n\n\/\/ 解析分类数据\nfunction parseCategory(data) {\n const [title, url, num = defaultNumPerRow] = data.split(separator);\n \n const fullUrl = \/^\\d+|natural\/.test(url) \n ? `http:\/\/app-cdn.jjwxc.net\/bookstore\/getFullPage?channelBody=%7B%22${url}%22%3A%7B%22offset%22%3A%22{{(page-1)*25}}%22%2C%22limit%22%3A%2225%22%7D%7D&versionCode=148`\n : url;\n \n return [title, fullUrl, num];\n}\n\n\/\/ 解析标签数据\nfunction parseTag(data, tagCategory) {\n const [title, url, num = defaultNumPerRow, tagType] = data.split(separator);\n \n let fullUrl = url;\n if (tagType === \"bq\") {\n fullUrl = `https:\/\/android.jjwxc.com\/search\/getSearchForKeyWords?versionCode=313&offset={{(page-1)*20}}&limit=20&bq=${url}&removetags=0&fw=0&yc=0&xx=${tagCategory}&sd=0&lx=0&fg=0&mainview=0&fbsj=0&collectionTypes=ors&isfinish=0&sortType=0&token=${token}`;\n } else if (tagType === \"at\") {\n \tfullUrl = `https:\/\/app-cdn.jjwxc.com\/androidapi\/authorColumn?authorid=${url}`;\n \t\n \t}else if (tagType === \"class\") {\n \tfullUrl = `https:\/\/android.jjwxc.net\/androidapi\/incrementFavorite,{'method':'POST','body':\\\"versionCode=313&token=${token}&order=1&classId=${url}&backupTime=${Date.now()}\\\"}`\n \t\n \t}else if (tagType === \"lx\") {\n fullUrl = `https:\/\/android.jjwxc.com\/search\/getSearchForKeyWords?versionCode=313&offset={{(page-1)*20}}&limit=20&bq=0&removetags=0&fw=0&yc=0&xx=${tagCategory}&sd=0&lx=${url}&fg=0&mainview=0&fbsj=0&collectionTypes=ors&isfinish=0&sortType=0&token=${token}`;\n }\n return [title, fullUrl, num];\n}\n\n\/\/ 创建 FlexBox 对象\nfunction createFlexBox(title, url, num) {\n const flexBasisMap = { 1: 1, 2: 0.4, 3: 0.25, 4: 0.2, 5: 0.15, 7: 0.1, 10: 0.05 };\n return {\n title,\n url: url || '',\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: flexBasisMap[num]\n }\n };\n}\n\n\/\/ 生成分类结果\nconst result = [];\nresult.push(createFlexBox(`📂 我的收藏`, \"https:\/\/android.jjwxc.net\/androidapi\/incrementFavorite,{'method':'POST','body':\\\"versionCode=313&token={{source.getLoginHeaderMap().get('token')}}&order=1&classId=&backupTime={{Date.now()}}\\\"}\", 1));\n\nif(ShelfNum){\nconst ShelfNumList = String(ShelfNum).split(\",\");\nShelfNumList.forEach(x => {\n const parsedTag = parseTag(ShelfList[x]);\n result.push(createFlexBox(parsedTag[0], parsedTag[1], parsedTag[2],parsedTag[3]));\n});\n}\n\n\nauthorNames.forEach(tag => {\n const parsedTag = parseTag(tag, tagCategory);\n result.push(createFlexBox(parsedTag[0], parsedTag[1], parsedTag[2],parsedTag[3]));\n});\n\nJSON.stringify(result);\n\nall.forEach(item => {\n const parsedItem = parseCategory(item);\n result.push(createFlexBox(parsedItem[0], parsedItem[1], parsedItem[2]));\n});\n\nconst enabledCategoryList = enabledCategories.split(\",\");\nenabledCategoryList.forEach(categoryIndex => {\n const categoryName = categories[categoryIndex];\n if (categoryData[categoryName]) {\n result.push(createFlexBox(`${分类标识} ${categoryName}连载`, null, 1));\n categoryData[categoryName].连载.forEach(item => {\n const parsedItem = parseCategory(item);\n result.push(createFlexBox(parsedItem[0], parsedItem[1], parsedItem[2]));\n });\n result.push(createFlexBox(`${分类标识} ${categoryName}完结`, null, 1));\n categoryData[categoryName].完结.forEach(item => {\n const parsedItem = parseCategory(item);\n result.push(createFlexBox(parsedItem[0], parsedItem[1], parsedItem[2]));\n });\n result.push(createFlexBox(`${榜单标识} ${categoryName}榜单`, null, 1));\n categoryData[categoryName].榜单.forEach(item => {\n const parsedItem = parseCategory(item);\n result.push(createFlexBox(parsedItem[0], parsedItem[1], parsedItem[2]));\n });\n }\n});\n\nresult.push(createFlexBox(`${标签标识} ${tagName}标签`, null, 1));\ntags.forEach(tag => {\n const parsedTag = parseTag(tag, tagCategory);\n result.push(createFlexBox(parsedTag[0], parsedTag[1], parsedTag[2],parsedTag[3]));\n});\n\nJSON.stringify(result);\n\n\n<\/js>", "header": "<js>\nlet date=\"Mobile \"+Date.now();\nresult = JSON.stringify({\n\t\"User-Agent\": String(date),\n\t\"versiontype\":\"reading\"\n\t})\n<\/js>", "jsLib": "function encode(data){\n\tconst { java } = this;\n return\tjava.createSymmetricCrypto(\"DES\/CBC\/PKCS5Padding\", String(\"KW8Dvm2N\"), String(\"1ae2c94b\")).encryptBase64(data)\n\t}\n\t\nfunction Map(e) { \n\t const { source } = this;\n let infomap = source.getLoginHeaderMap();\n let map = (infomap !== null && infomap.get(e)) ? infomap.get(e) : '';\n return String(map);\n}\n\n\t\nfunction setHead(k,v){\n\tconst { source } = this;\n let infomap = source.getLoginHeaderMap();\n let map = (infomap !== null && infomap !== \"\")?infomap:{};\n map[k] = v;\n source.putLoginHeader(JSON.stringify(map))\n\t}", "lastUpdateTime": "1741912899320", "loginCheckJs": "", "loginUi": "[\n{\n \t name:\"获取书架数据\",\n \t type: \"button\",\n action: \"getShelf()\"\n \t},\n{\n \t name:\"选择📚书架序号\",\n \t type: \"button\",\n action: \"showShelf()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n \t},\n \t{\n \"name\": \"选择🌸分类序号\",\n \"type\": \"button\",\n \"action\": \"getFl()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n },\n \t{\n\t\tname: \"选择🏷标签序号\",\n\t\ttype: \"button\",\n\t\taction: \"getTag()\",\n\t\t\"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n\t},\n\t{\n \t name:\"抓包token登录\",\n \t type:\"password\"\n \t},\n {\n \t name:\"账号\",\n \t type:\"text\"\n \t},\n \t{\n \t name:\"密码\",\n \t type:\"password\"\n \t},\n \t{\n \t name:\"验证码\",\n \t type:\"text\"\n \t},\n \n {\n name: \"①获取邮箱验证码\",\n type: \"button\",\n action: \"getCode('email')\"\n },\n {\n name: \"②邮箱登录\",\n type: \"button\",\n action: \"getCode('email')\"\n },\n {\n name: \"①获取手机验证码\",\n type: \"button\",\n action: \"getCode('phone')\"\n },\n {\n name: \"②手机登录\",\n type: \"button\",\n action: \"getCode('phone')\"\n },\n\t\t{\n \t\tname:\"作者列表(作者::作者id 注意添加多个用空格分割)\",\n \t\ttype:\"text\"\n \t\t}\n]", "loginUrl": "<js>\n\n\/\/请不要改书源的任何地方,请点击“登录”后再填写\n\n\/\/保存标签等序号\nfunction saveTag(svg,tagType){\n\tlet Code = String(java.getVerificationCode('data:image\/svg+xml;base64,'+svg));\n if(\/(\\d,*)*\/.test(Code)){\n\t Map = source.getLoginHeaderMap();\n\t Map == (Map == null||Map==\"\")?{}:Map\n\t Map[tagType]=Code;\n\t source.putLoginHeader(JSON.stringify(Map))\n\t java.toast(\"已保存数据\")\n\t}\n}\n\nfunction rd() {\n let n = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n let s = \"\";\n for (let i = 0; i < 20; i++) {\n let r = Math.floor(Math.random() * 10);\n s += n[r];\n }\n return s;\n}\n\n\/\/获取书架数据\nfunction getShelf(){\n let sourceGet = String(source.getVariable()).replace(\/\\n*(?:请勿删除此书架数据)*❗️[\\s\\S]+?❗️\/g,'');\n\tlet token = Map(\"token\");\n\tlet ShelfUrl = `https:\/\/android.jjwxc.net\/androidapi\/incrementFavorite,{'method':'POST','body':\\\"versionCode=313&token=${token}&order=1&classId=&backupTime=${Date.now()}\\\"}`\n\tlet ShelfJson = String(java.ajax(ShelfUrl));\n ShelfJson = JSON.parse(ShelfJson);\n\t function extractClassInfo(obj, result = [], uniqueSet = new Set()) {\n\t \/\/ 如果当前对象是数组,递归遍历数组中的每个元素\n\t if (Array.isArray(obj)) {\n\t for (let item of obj) {\n\t extractClassInfo(item, result, uniqueSet);\n\t }\n\t } else if (typeof obj === 'object' && obj !== null) {\n \/\/ 检查是否存在 className 和 classId\n\t if (obj.hasOwnProperty('className') && obj.hasOwnProperty('classId')) {\n\t let className = obj.className;\n\t \/\/ 如果 className 为空,设置为“尚未分类”\n\t if (className.trim() === \"\") {\n\t className = \"尚未分类\";\n\t }\n\t \/\/ 构造组合字符串\n\t const combo = `${className}::${obj.classId}`;\n\t \/\/ 如果组合字符串未出现过,添加到结果中\n\t if (!uniqueSet.has(combo)) {\n\t uniqueSet.add(combo);\n\t result.push(combo);\n\t }\n\t }\n\t \/\/ 递归遍历对象的每个属性\n\t for (let key in obj) {\n\t extractClassInfo(obj[key], result, uniqueSet);\n\t }\n \t\t }\n \t\treturn result;\n\t }\n\n\tlet ShlefClass = \"请勿删除此书架数据❗️\"+JSON.stringify(extractClassInfo(ShelfJson))+\"❗️\"\n\tsource.setVariable(sourceGet+\"\\n\"+ShlefClass);\n\tjava.longToast(\"已获取书架数据,请点击选择显示的书架\")\n}\n\n\/\/选择要显示的书架\nfunction showShelf(){\n\ttry{\n\t\tif(!\/❗️([\\s\\S]+?)❗️\/.test(String(source.getVariable()))){\n\t\t\tjava.longToast(\"请先点击获取书架数据,只需点一次\");\n\t\t\treturn \"\"\n\t\t}\n\t\tlet sourceGet = String(source.getVariable()).match(\/❗️([\\s\\S]+?)❗️\/)[1];\n\t\tlet classNameList = JSON.parse(sourceGet);\n\t\tlet className = classNameList.map((x,i)=>i+\"、\"+x.split(\"::\")[0]);\n\t\t \n\t\t\/\/ 初始 x 值\n\t\tlet x = 50;\n\t\t\/\/ x 的增量\n\t\tconst xIncrement = 230; \/\/ 250 - 20 = 230\n\t\t\/\/ x 的最大值\n\t\tconst xMax = 910;\n\t\t\/\/ 生成 <tspan> 元素的字符串\n\t\tlet tspanElements = className.map((item) => {\n\t\t \/\/ 如果 x 为 20,dy 为 \"1.5em\",否则为 \"0\"\n\t\t const dy = x === 50 ? \"1.5em\" : \"0\";\n\t\t \/\/ 构造 <tspan> 元素\n\t\t const tspan = `<tspan x=\"${x}\" dy=\"${dy}\">${item}<\/tspan>`;\n\t\t \/\/ 更新 x 的值\n\t\t x += xIncrement;\n\t\t \/\/ 如果 x 超过最大值,重置为 20\n\t\t if (x > xMax) {\n\t\t x = 50;\n\t\t }\n\t\t return tspan;\n\t\t}).join(\"\\n\"); \/\/ 用换行符拼接\n\n\t\t svg = `<svg width=\"1190\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n\t\t <!-- 背景矩形 -->\n\t\t <rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"\/>\n\t\t\n\t\t <!-- 标题 -->\n\t\t <text x=\"20\" y=\"60\" font-family=\"Arial, sans-serif\" font-size=\"30\" fill=\"#333\" font-weight=\"bold\">选项(输入你要显示的书架序号,再点“✓”如:0,1,2 是英文逗号)<\/text>\n\t\t\n\t\t <!-- 选项列表 -->\n\t\t <text x=\"50\" y=\"60\" font-family=\"Arial, sans-serif\" font-size=\"30\" fill=\"#555\">\n\t\t ${tspanElements}\n\t\t <\/text>\n\t\t<\/svg>`;\n\t\tsvg=java.base64Encode(svg);\n\t\tsaveTag(String(svg),\"classNum\")\n\t\t\n\t}catch(e){\n\t\tjava.log(e)\n\t}\n}\n\nfunction getFl(){\n\tlet svg=`<svg width=\"1150\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n\t <!-- 背景矩形 -->\n\t <rect width=\"100%\" height=\"100%\" fill=\"#f0f0f0\" \/>\n\t\n\t <!-- 标题 -->\n\t <text x=\"20\" y=\"60\" font-family=\"Arial, sans-serif\" font-size=\"35\" fill=\"#333\" font-weight=\"bold\">选项(填写需要的序号后,点“✓”确认,如:2,5【默认为9,10】)<\/text>\n\t\n\t <!-- 选项列表 -->\n\t <text x=\"50\" y=\"60\" font-family=\"Arial, sans-serif\" font-size=\"30\" fill=\"#555\">\n\t <tspan x=\"150\" dy=\"1.5em\">0. 古代言情<\/tspan>\n\t <tspan x=\"400\" dy=\"0\">1. 现代言情<\/tspan>\n\t <tspan x=\"650\" dy=\"0\">2. 幻想现言<\/tspan>\n\t <tspan x=\"900\" dy=\"0\">3. 古代穿越<\/tspan>\n\t <tspan x=\"150\" dy=\"1.5em\">4. 奇幻言情<\/tspan>\n\t <tspan x=\"400\" dy=\"0\">5. 未来游戏悬疑<\/tspan>\n\t <tspan x=\"650\" dy=\"0\">6. 都市纯爱<\/tspan>\n\t <tspan x=\"900\" dy=\"0\">7. 现代幻纯<\/tspan>\n\t <tspan x=\"150\" dy=\"1.5em\">8. 古代纯爱<\/tspan>\n\t <tspan x=\"400\" dy=\"0\">9. 百合<\/tspan>\n\t <tspan x=\"650\" dy=\"0\">10. 无CP<\/tspan>\n\t <tspan x=\"900\" dy=\"0\">11. 衍生无CP<\/tspan>\n\t <tspan x=\"150\" dy=\"1.5em\">12. 衍生纯爱<\/tspan>\n\t <tspan x=\"400\" dy=\"0\">13. 衍生言情<\/tspan>\n\t <tspan x=\"650\" dy=\"0\">14. 二次元言情<\/tspan>\n\t <tspan x=\"900\" dy=\"0\">15. 多元<\/tspan>\n\t <tspan x=\"150\" dy=\"1.5em\">16. 男主无CP<\/tspan>\n\t <tspan x=\"400\" dy=\"0\">17. 女主无CP<\/tspan>\n\t <tspan x=\"650\" dy=\"0\">18. 未来幻纯<\/tspan>\n\t <\/text>\n\t<\/svg>`;\n\tsvg=java.base64Encode(svg);\n\tsaveTag(svg,\"fl\")\n\n}\nfunction getTag(){\n\tlet svg=`<svg width=\"1150\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n\t <!-- 背景矩形 -->\n\t <rect width=\"100%\" height=\"100%\" fill=\"#f0f0f0\" \/>\n\t\n\t <!-- 标题 -->\n\t <text x=\"20\" y=\"40\" font-family=\"Arial, sans-serif\" font-size=\"35\" fill=\"#333\" font-weight=\"bold\">选项(填写需要的序号后,点“✓”确认,如:2【默认为5,只能单选】)<\/text>\n\t\n\t <!-- 选项列表 -->\n\t <text x=\"60\" y=\"60\" font-family=\"Arial, sans-serif\" font-size=\"50\" fill=\"#555\">\n\t <tspan x=\"150\" dy=\"2.5em\">1. 言情<\/tspan>\n\t <tspan x=\"400\" dy=\"0\">2. 纯爱<\/tspan>\n\t <tspan x=\"650\" dy=\"0\">3. 百合<\/tspan>\n\t <tspan x=\"150\" dy=\"1.5em\">4. 无CP<\/tspan>\n\t <tspan x=\"400\" dy=\"0\">5. 多元<\/tspan>\n\t <\/text>\n\t<\/svg>`;\n\tsvg=java.base64Encode(svg);\n\tsaveTag(svg,\"bq\")\n\n}\n\n\nfunction getloginUrl(){\n\tlet 账号 = result.get(\"账号\");\n\tlet 密码 = result.get(\"密码\");\n\tlet en = encode(密码);\n\tlet id = rd()+\":\"+java.androidId()+\"d4:\";\n\tlet sign = encode(Date.now()+\"_\"+id+\"_\");\n\tlet loginUrl = `https:\/\/app.jjwxc.org\/androidapi\/login?versionCode=401&loginName=${encodeURIComponent(账号)}&encode=1&loginPassword=${encodeURIComponent(en)}&sign=${encodeURIComponent(sign)}&identifiers=${encodeURIComponent(id)}&autologin=1`;\n\treturn loginUrl\n}\n\nfunction getCode(t){\n\ttry{\n\t\tlet 验证码 = result.get(\"验证码\");\n\t\tlet 账号 = result.get(\"账号\");\n\t\tlet 密码 = result.get(\"密码\");\n\t\t\n\t\tif(!\/^\\d{4,}\/.test(验证码)){\n\t\t\tlet res = \tJSON.parse(java.ajax(getloginUrl()));\n\t\n\t\t\tif(res.code==\"221003\"){\n\t\t\t\tlet url = \"https:\/\/app.jjwxc.org\/\/appDevicesecurityAndroid\/getDeviceSecurityCode\";\n\t\t\t\tbody = \"versionCode=401&username=\"+encodeURIComponent(账号)+\"&checktype=\"+t;\n\t\t\t\toption = {\n\t\t\t\t\t\"method\":\"POST\",\n\t\t\t\t\t\"body\":String(body)\n\t\t\t\t\t}\n\t\t\t\t\tmsg = JSON.parse(java.ajax(url+\",\"+JSON.stringify(option))).data.message;\n\t\t\t\t\tjava.toast(msg);\n\t\t\t}else{\n\t\t\t\t\tjava.toast(res.message)\n\t\t\t\t}\n\t\t}else{\n\t\t\tlet lurl = getloginUrl()+\"&checktype=\"+t+\"&checkdevicecode=\"+验证码;\n\t\t\tlet token = JSON.parse(java.ajax(lurl)).token;\n\t\t\tjava.longToast(\"获取到:\"+token+\"\\n\"+\"请点右上角的✓\");\n\t\t\tjava.log(\"token值:\"+token)\n\t\t\tsource.putLoginHeader(token)\n\t\t}\n\t}catch(e){\n\t\tjava.log(e)\n\t}\n}\n\nfunction getToast(){\n\tjava.toast(\"用来看的,别点了,确认请点右上角的✓\")\n\t};\n\t\nfunction login(){\n\tlet token;\n\tMap = source.getLoginInfoMap()??{};\n\tLoginMap = source.getLoginHeaderMap()??{}\n\ttoken = source.getLoginHeader();\n\tlet t = source.getLoginInfoMap()[\"抓包token登录\"];\n\tif(t!=\"\"&&t!=null)token = t;\n\tif(\/\\{\/.test(token))token = LoginMap[\"token\"]??\"\";\n\t\n\tlet fl = LoginMap[\"fl\"]??\"\";\n\tfl = (fl==\"\"||fl==null)?\"9,10\":fl;\n\t\n\tlet bq = LoginMap[\"bq\"]??\"\";\n\tbq = (bq==\"\"||bq==null)?\"5\":bq;\n\t\n\tlet at = Map.get(\"作者列表(作者::作者id 注意添加多个用空格分割)\");\n\tat = (at==\"\"||at==null)?\"\":at;\n\tclassCode = LoginMap[\"classNum\"]??\"\";\n\t\n\t option = {\n\t \t\"token\":String(token),\n\t \t\"fl\":String(fl),\n\t \t\"bq\":String(bq),\n\t \t\"at\":encodeURIComponent(String(at)),\n\t \t\"classNum\":classCode\n\t \t}\n\tsource.putLoginHeader(JSON.stringify(option))\n}\n\n<\/js>", "respondTime": 180000, "ruleBookInfo": { "author": "$.authorName", "canReName": "1", "coverUrl": "{{$.novelCover}}\n<js>\n\nif(\/(?:postimg|bmp|alicdn)\\.\/.test(result)){\n\tjava.setContent(src);\n\tresult = \"https:\/\/i9-static.jjwxc.net\/novelimage.php?novelid={{$.novelId}}\"\n\t}else{\n\t\tresult = result\n\t\t}\n\t\t\n\t\theader = {\n\t\t\"headers\":{\n\t\t\t\"referer\":result.match(\/(^https?:\\\/\\\/.*?\\\/)\/)[1]\n\t\t\t}\n\t\t}\nresult = (result +\",\"+ JSON.stringify(header)).replace(\/wx\\d+\/,'wx2')\n<\/js>", "init": "", "intro": "<js>\n\/\/请假条\ntry{\na=JSON.parse(java.ajax('http:\/\/app.jjwxc.org\/androidapi\/getnovelOtherInfo?novelId='+baseUrl.match(\/(\\d+)\/)[1]+'&type=novelbasicinfo&versionCode=163'));\n\njava.put(\"pv\",a.novelreview)\n\n$=a.novelLeave;\nn='\\n';\nleave=$.leaveContent?'————————•————————'+n+''+n+$.leaveDateBack+n+''+''+' '+$.leaveContent+n+$.leaveDate.replace(\/请假时间:\/,'⌚️')+n+$.leaveIntro:'';\njava.put('leave',leave);\njava.put('intro',JSON.parse(result).novelIntro.replace(\/\\#\/g,'#'));\nresult}catch(err){\njava.log(err);\njava.put('leave',\"\");\njava.put('intro',\"\");\n}\n<\/js>\n{{\/开启购买\/.test(book.getVariable(\"custom\"))?\" 💰已开启自动购买下五章,建议删除书籍变量的[开启\/关闭购买]文字,避免刷新书籍时反复进行网络请求<br>\\nㅤ<br>\":\"\"}}\n \n📖{{$.novelIntroShort##。$}}📖\n{{'\\nㅤ'}}<br>\n🏆{{$.ranking}} 🍼{{$.nutrition_novel}} 📝{{$.comment_count}} 🔖{{$.novelStyle}}\n◉ 标签:{{$.novelTags##,|\\s##🏷}}<br>\n◉ {{$.protagonist##,|,|;|;##、}}<br>\n◉ {{$.costar##,|,|;|;##、}}<br>\n◉ {{$.other##,|,|;|;##、}}<br>\n◉ 视角:{{$.mainview}}<br>\n◉ 评分:{{java.get(\"pv\")}}<br>\n◉ 收藏:{{$.novelbefavoritedcount}}<br>\n{{String(java.get('intro')).replace(\/立意:\/,'◎◎ 立意:')}}<br>{{java.get('leave')}}<br>\n{{'\\n'+''}}\n添加作者:{{$.authorName}}::{{$.authorId}}\n<js>\nresult=String(result);\nli=result.match(\/◎ 立意.*\/)?'ㅤ\\n'+result.match(\/(◎ 立意.*?<br>)\/)[1]:'';\nString(result).replace(\/📖📖|📖''📖\/,'').replace(\/(◉ 收藏.*?<br>)\/,'$1\\n'+li+'ㅤ\\n'+'————————•————————\\n').replace(\/◎◎ 立意.*<br>\/,'').replace(\/(?:◉ 标签:|◉ 主角:|◉ 配角:|◉ 其它:|◉ 视角:|◉ 评分:|ㅤ\\n◎ 立意:)<br>\/g,'')<\/js>", "kind": "{{step=java.getString('$.novelStep')=='2'?'已完结':'连载中';}},{{$.novelClass}}##-##,", "lastChapter": "<js>\ntry{last=JSON.parse(java.ajax('http:\/\/android.jjwxc.net\/androidapi\/chapterList?novelId='+baseUrl.match(\/(\\d+)\/)[1])).chapterlist;\n$=last[last.length-1];\nvip=$.isvip?'🔒':'';\nchapterid=$.chapterid;\nchaptername=$.chaptername;\ndate=$.chapterdate;\nvip+chapterid+'.'+chaptername+'•'+date}\ncatch(err){\nresult=\"请刷新或暂无目录\"\n}\n<\/js>", "name": "$.novelName", "tocUrl": "@js:\ntoken = Map(\"token\");\nnovelId=baseUrl.match(\/novelId=(\\d+)\/)[1]\nif(\/\\d+_[\\w\\d]{16,}\/.test(token)){\n\turl = \"https:\/\/android.jjwxc.net\/androidapi\/chapterList?novelId=\"+novelId+\"&more=0&whole=1&token=\"+token;\n\t}else{\nurl = \"https:\/\/android.jjwxc.net\/androidapi\/chapterList?novelId=\"+novelId+\"&more=0&whole=1\"\n}", "wordCount": "" }, "ruleContent": { "content": "<js>\nfunction decode() {\n let date = \"Mobile \" + Date.now();\n let response = java.get(baseUrl, {\"User-Agent\": String(date)});\n let content = String(response.body());\n let accesskey = String(response.header(\"accesskey\"));\n let keyString = String(response.header(\"keystring\"));\n\n let accesskeyLen = accesskey.length;\n let v6 = accesskey.charCodeAt(accesskeyLen - 1);\n let v9 = 0;\nfor (var i = 0; i < accesskey.length; i++) {\n v9 += accesskey.charCodeAt(i);\n}\n\n let v15 = v9 % keyString.length;\n let v17 = Math.floor(v9 \/ 65);\n let v18 = keyString.length;\n let v43 = keyString.substring(v15, v17 + v15 > v18 ? v18 : v17 + v15);\n\n let v32 = content.length;\n let [v38, dest] = (v6 & 1) !== 0 ? [content.slice(-12), content.slice(0, -12)] : [content.slice(0, 12), content.slice(12)];\n\n let key = java.md5Encode(v43 + v38).slice(0, 8);\n let iv = java.md5Encode(v38).slice(0, 8);\n return java.createSymmetricCrypto(\"DES\/CBC\/PKCS5Padding\", key, iv).decryptStr(dest);\n}\n\nif (\/jjwxc\/.test(baseUrl)) {\n\t \n let intro = String(java.get(\"intro1\")).replace(\/\\s\/g, '');\n const hasContent = \/\"content\"\/.test(result);\n java.setContent(hasContent ? result : decode());\n intro = intro ? `◎${intro}◎<br>` : '';\n\n const content = String(java.getString(\"$..content\"));\n const saybody = java.getString(\"$..sayBody\");\n const say = \/[\\u4e00-\\u9fa5]\/.test(saybody) \n ? `\\n【📢作者有话说】\\n${saybody}` : '';\n\n if (\/token\/.test(baseUrl)) {\n const vipc = content.length > 30\n ? java.createSymmetricCrypto(\"DES\/CBC\/PKCS5Padding\", \"KW8Dvm2N\", \"1ae2c94b\").decryptStr(content) \n : `${java.getString(\"$..message\")}\\n登录后请更新目录,刷新正文`;\n result = intro + vipc + say;\n } else {\n result = intro + content + say;\n }\n} else {\n result = \"\";\n}\n\n\/\/ 评论处理\nconst bbb = book.getVariable(\"custom\");\nconst sss = source.getVariable();\nif (\/评论\/.test(bbb) || \/评论\/.test(sss)) {\n const commentNum = (\/评论(\\d+)\/.exec(bbb) || \/评论(\\d+)\/.exec(sss))[1];\n const commentUrl = baseUrl.replace(\/androidapi\/, 'comment').replace(\/chapterContent\/, 'getCommentList') + `&limit=${commentNum}&offset=0`;\n const comment = JSON.parse(java.ajax(commentUrl));\n const cflag = comment.code === \"200\" || comment.code === undefined;\n let commentb = '';\n if (cflag) {\n const commentList = comment.commentList || comment.data?.commentList || [];\n commentb = commentList.map(b => `@${b.commentAuthor} 🕘${b.commentDate}\\n${b.commentBody}\\n‎\\n`).join('');\n } else {\n commentb = comment.message;\n }\n\n result += `\\nㅤ\\n最新评论:\\n${commentb.replace(\/<br>\/g, '\\n')}`;\n}\n\nresult;\n<\/js>\n##为营造更好的评论环境,近期网站要求发评须进行实名认证,未实名用户评论暂时仅在对应作者后台及发评用户后台可见.*|获取正文失败[\\s\\S]+|◎\\s+?◎|◎undefined◎", "imageStyle": "TEXT", "nextContentUrl": "", "payAction": "cid = baseUrl.match(\/chapterId=(\\d+)\/)[1];\nnid = baseUrl.match(\/novelId=(\\d+)\/)[1];\ntoken = Map(\"token\");\n\nenbody = String(Date.now())+\":\"+token+\":\"+nid;\nsign = encode(enbody)\n\nbody = \"versionCode=287&novelId=\"+nid+\"&chapters=\"+cid+\"&orderType=15&isautoBuy=0&autosubscribeStatus=0¬UseBackpoint=&sign=\"+sign;\n\nurl = \"https:\/\/android.jjwxc.net\/androidapi\/buy,\"\npost = {\n\t\"method\":\"POST\",\n\t\"body\":String(body)\n\t}\n a = java.ajax(url+JSON.stringify(post));\n \n if(\/购买成功\/.test(JSON.parse(a).message)){\n \tjava.longToast(JSON.parse(a).message);\n \tresult = true\n \t}else{\n \t\tmm = JSON.parse(a).message==\"\"?JSON.parse(a).popupdata.popupmessage+\"\\n❗️进晋江app进行一次验证后❗️才能在阅读app使用购买功能\":JSON.parse(a).message;\n \n \t\tjava.longToast(mm);\n \t\t\n \t\t}", "replaceRegex": "<js>\n\/\/去除章节简介与正文重复\nif(\/^◎\/.test(result) ){\nchapter = result.match(\/◎([\\s\\S]+?)(…)*◎\/)[1].replace(\/\\s\/g,'').replace(\/,\/g,',');\n\nchapter2=result.match(\/◎[\\s\\S]+?◎([\\s\\S]+)\/)[1].replace(\/\\s\/g,'').replace(\/,\/g,',');\n\n\/\/前4个字相同就删除\nnum = 4\nif(chapter.substring(0,num)==chapter2.substring(0,num)){\n\tresult = result.replace(\/◎[\\s\\S]+?◎\/,'')\n\t}else{result}\n}else{result}\n\n\n\/*\n——◎。!?,;:、.?!,;:》 】)”’…~\"')\n如果不是以这些标点符号结尾,里面有一个字符跟章节名相同了就会被删除\n*\/\n\tfunction removeDuplicatedParagraphs(text, chapterTitle) {\n var paragraphs = text.split('\\n');\n \n \/\/ 检查第一段是否包含特定字符 ◎\n var firstParagraph = paragraphs[0].trim();\n var containsSpecialChar = firstParagraph.includes('◎');\n \n \/\/ 根据是否包含特殊字符决定处理哪一段\n var targetIndex = containsSpecialChar ? 1 : 0;\n var targetParagraph = paragraphs[targetIndex].trim();\n \n \/\/ 检查目标段落结尾是否有标点符号\n var lastChar = targetParagraph.charAt(targetParagraph.length - 1);\n var isPunctuation = \/[——◎。!?,;:、\\.\\?!,;:》 】)”’…~\"'\\)]\/.test(lastChar);\n \n if (!isPunctuation) {\n \/\/ 只要有一个字与章节名相同就删除\n for (var char of chapterTitle) {\n if (targetParagraph.includes(char)) {\n if (char === ' ' || char === '☪') continue;\n java.log(\"删除当前段落:\"+targetParagraph)\n java.log(\"当前章节名:\"+chapterTitle)\n java.log(\"相同文字:\"+char)\n paragraphs.splice(targetIndex, 1);\n break;\n }\n }\n }\n\n return paragraphs.join('\\n');\n}\nconst bbb = book.getVariable(\"custom\");\nconst sss = source.getVariable();\nif(\/净化\/.test(sss)||\/净化\/.test(bbb))result = removeDuplicatedParagraphs(result, title);\n\nresult.replace(\/<br\\\/>\/g,'\\n')\n<\/js>", "sourceRegex": "", "webJs": "" }, "ruleExplore": { "author": "$.authorName||$.authorname", "bookList": "@JSon:$..[?(@.novelName)]&&$..[?(@.novelname)]&&$.massage\n<js>\nif (result) {\n function remove(indices, array) {\n indices.sort((a, b) => b - a); \/\/ 按降序排序\n indices.forEach(index => {\n \/\/ java.log(\"❗️删除序号:\" + index);\n \/\/ java.log(array[index].channelName);\n array.splice(index, 1); \/\/ 删除元素\n });\n \n return array;\n }\n\n if (baseUrl === 'https:\/\/app-cdn.jjwxc.net\/bookstore\/getFullPage?channel=bhxs&version=3' || baseUrl.match(\/novelfree\/)) {\n let list = JSON.parse(src);\n\n \/\/ 将 data_random 中的数据合并到 data 中\n list.forEach(item => {\n if (item.data_random && item.data_random.data_groups && item.data_random.data_groups.length > 0) {\n \/\/ 取 data_random 中的第一组数据\n const randomData = item.data_random.data_groups[0];\n if (item.data) {\n \/\/ 将 randomData 合并到 data 中\n item.data = item.data.concat(randomData);\n } else {\n \/\/ 如果 data 不存在,直接赋值\n item.data = randomData;\n }\n \/\/ 删除 data_random,避免重复处理\n delete item.data_random;\n }\n });\n\n \/\/ 修改 channelName\n list.forEach(item => {\n let { channelName, data: blist } = item;\n if (blist) {\n \t \/\/ 检查 data 数组里是否有 list 数组\r\n const hasList = blist.some(b => b.list);\r\n if (hasList) {\r\n \/\/ 如果有 list 数组,只保留 data 数组的第一个元素\r\n item.data = [blist[0]];\r\n blist = item.data;\r\n }\n blist.forEach(b => {\n if (b.list) {\n \t lchannelName = b.channelName\n b.list.forEach(c => c.channelName = b.channelName);\n }\n b.channelName = channelName;\n });\n } else {\n item.channelName = channelName;\n }\n});\n\n \/\/ 根据 URL 删除指定项\n if (!baseUrl.match(\/novelfree\/)) {\n list = remove([0, 6, 11, 12], list);\n } else {\n list = remove([1], list);\n }\n\n result = JSON.stringify(list);\n } else if (baseUrl.match(\/signin|getSearchForKeyWords\/)) {\n result = `{signIn:[${src}]}`;\n } else {\n result = result;\n }\n} else {\n result = \"\";\n}\n<\/js>\n$..[?(@.novelName)]&&$..[?(@.novelname)]&&$.signIn[*]", "bookUrl": "http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId={{$.novelid||$.novelId}}@put:{id:$.novelid||$.novelId}", "coverUrl": "@JSon:$.cover||$.novelCover||$.ebookurl||$.novel_cover\n<js>\nif(\/(?:postimg|bmp|alicdn)\\.\/.test(result)){\n\tjava.setContent(src);\n\tresult = \"https:\/\/i9-static.jjwxc.net\/novelimage.php?novelid={{$.novelId}}\"\n\t}else{\n\t\tresult = result\n\t\t}\n\t\theader = {\n\t\t\"headers\":{\n\t\t\t\"referer\":result.match(\/(^https?:\\\/\\\/.*?\\\/)\/)[1]\n\t\t\t}\n\t\t}\nresult = (result +\",\"+ JSON.stringify(header)).replace(\/wx\\d+\/,'wx2')\n<\/js>", "intro": "$.novelIntroShort||$.novelintroshort\n<js>\nfree=\"{{$.freeDate}}\";\nif(free!=\"\"){\nresult=\"限免日期:🗓\"+free+\"\\n\"+result\n}else{\nresult=result\n}\n<\/js>", "kind": "@JSon:$.mainview&&$.channelName&&$.tags&&$.novelSizeformat&&$.className##\\s+##,", "lastChapter": "第{{$.maxChapterId}}章##第章", "name": "$.novelName||$.novelname||$.message", "wordCount": "$.novelStep||$.novelstep\n@js:result==2?'已完结':'连载中';\nif(result==\"\")\"\"" }, "ruleSearch": { "author": "author", "bookList": "$.items[:10]\n<js>\nif(!cache.get(\"jjtime\")) {\n cache.put(\"jjtime\", true, 23200);\n const enbody = `${String(Date.now())}:${Map(\"token\")}`;\n const option = {\n method: \"POST\",\n body: `versionCode=313&sign=${encode(enbody)}`\n };\n const jjsign = java.ajax(\"https:\/\/app.jjwxc.org\/androidapi\/signin,\" + JSON.stringify(option));\n java.toast(JSON.parse(jjsign).message);\n}\n\nlet page = java.get(\"page\");\nlet key = java.get(\"key\");\nlet authorUrl = `https:\/\/app.jjwxc.org\/androidapi\/search?versionCode=191&keyword=${key}&type=2&page=${page}&searchType=7&sortMode=DESC`;\nconst authorlist = JSON.parse(java.ajax(authorUrl)).items;\n\nlet list = result.toArray().concat(authorlist);\nlet json = [];\n\nfor(i in list){\n try{\n \t let item = list[i];\n let id = item?.novelid;\n let url = `http:\/\/www.jjwxc.net\/onebook.php?novelid=${id}`; \n let html = String(java.ajax(url));\n java.setContent(html);\n let J = org.jsoup.Jsoup.parse(html);\n let authorid = J.select('h1+span>a, h2 a').attr(\"href\").match(\/(\\d+)\/)[1];\n let des = String(J.select(\"span[style='color:#F98C4D']\").text())\n .replace(\/立意:\/, '◎ ')\n .replace(\/一句话简介:\/, '◎ ') + \"◎\" + java.getElement(\"id.novelintro\").text();\n title = J.select('h1').text();\n let author = J.select('span[itemprop=\"author\"]').text();\n let cover = J.select(\".noveldefaultimage\").attr(\"src\");\n\n if (\/(?:postimg|bmp|alicdn)\\.\/.test(cover)) {\n cover = `https:\/\/i9-static.jjwxc.net\/novelimage.php?novelid=${id}`;\n }\n\n let header = {\n headers: {\n referer: cover.match(\/(^https?:\\\/\\\/.*?\\\/)\/)[1]\n }\n };\n cover = `${cover},${JSON.stringify(header)}`.replace(\/wx\\d+\/, 'wx2');\n\n let cat = String(J.select('a[style=\"text-decoration:none;color: red;\"]').text()).replace(\/\\s\/g, ',');\n let status = J.select('span[itemprop=\"updataStatus\"]').text();\n let size = String(J.select('span[itemprop=\"wordCount\"]').text()).replace(\/字\/, '');\n let n = String(java.getElement('@@id.oneboolt@tag.tr.-2@span').text())\n .replace(\/\\n\/, '•')\n .replace(\/\\*最新更新\/, '')\n .replace(\/(.*?)\\[VIP\\]\/, '🔒$1');\n let num = java.getElement('@@id.oneboolt@tag.tr.-2@tag.td.0').text();\n let genre = J.select('[itemprop=\"genre\"]').text().split('-')[1];\n let view = html.match(\/<span>作品视角:<\\\/span>([^<]+)<\\\/li>\/)[1].replace(\/\\s\/g, '');\n java.log(title)\njava.log(`http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId=${id}`)\n\n json.push({\n title,\n author,\n cat: `${view},${status},${cat},${genre}`,\n size,\n url: `http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId=${id}`,\n des,\n new: `${num}、${n}`.replace(\/(\\d+、)🔒\/, '🔒$1').replace(\/^章节、|、$\/, ''),\n cover\n });\n } catch (e) {\n java.log(e);\n }\n}\n\njson;\n<\/js>\n", "bookUrl": "url", "checkKeyWord": "穿进刑侦文", "coverUrl": "cover", "intro": "des", "kind": "cat", "lastChapter": "new", "name": "title", "wordCount": "size" }, "ruleToc": { "chapterList": "<js>\nmessage = JSON.parse(src).message;\nnovelId=baseUrl.match(\/novelId=(\\d+)\/)[1];\n\nif(\/token=\\d+_[\\w\\d]{16,}\/.test(baseUrl)&&!\/1058\/.test(message)){\nlet lessData = JSON.parse(src).chapterlist;\n\n有卷名url = \"https:\/\/android.jjwxc.net\/androidapi\/chapterList?novelId=\"+novelId+\"&more=0&whole=1\";\n\nlet moreData = JSON.parse(java.ajax(有卷名url)).chapterlist;\n\nfor(let item of lessData) {\n let match = moreData.find(moreItem => moreItem.chapterid === item.chapterid && moreItem.chaptertype === item.chaptertype);\n if(match) {\n Object.assign(match, item);\n }\n}\nJSON.stringify(moreData)\n}else{\n\tresult = src\n\t}\n<\/js>\n$.chapterlist[*]||$.[*]\n\n<js>\nfunction readEncrypt(novelid,flag) {\n\t token = Map(\"token\"); \n \tFORUMSIGNTAG = 1;\n READSIGNTAG = 0;\n\t strArr = [token,novelid,\"autosubscribe\",flag]; \n\t sb = new Date().getTime().toString();\n length = strArr.length;\n for ( i2 = READSIGNTAG; i2 < length; i2 += FORUMSIGNTAG) {\n str = strArr[i2];\n sb+=\":\";\n sb+=str;\n } \n let option = {\n\t \t\"method\":\"POST\", \t\"body\":\"versionCode=313&sign=\"+encode(sb)\n\t \t}\n\t \nurl = \"https:\/\/android.jjwxc.com\/androidapi\/autoSubscribe,\"+JSON.stringify(option)\n\n java.longToast(JSON.parse(java.ajax(url)).message)\n }\n \n if(\/(开启|关闭)购买\/.test(book.getVariable(\"custom\"))){\n \ta = \/关闭购买\/.test(book.getVariable(\"custom\"))?\"cancel\":(\/开启购买\/.test(book.getVariable(\"custom\"))?\"open\":\"cancel\");\n \t\n readEncrypt(result[0].novelid,a)\n \t}\n \t\nresult = result[0]==\"1058\"||result[0]==\"1068\"?JSON.stringify([{\"chaptername\":\"暂无目录\",\"chapterid\":\"\",\"islock\":\"0\"}]):result;\n<\/js>\n$.[*]", "chapterName": "<js>\n$=result;title=$.chaptername;title=String(title).replace(\/^\\s+\/,'');intro=$.chapterintro;vip=$.isvip!='0';lock=$.islock!='0';type=$.chaptertype=='1'?true:false;num=!type?$.chapterid+\" ☪ \":'';\n\n\nbbb = book.getVariable(\"custom\");sss = source.getVariable();\nif(\/去章节序号\/.test(bbb) || \/去章节序号\/.test(sss)){\nnum=''\n}\nif(\/章节名\/.test(bbb) || \/章节名\/.test(sss)){\nnum=!type?\"第\"+$.chapterid+\"章 \":'';\n}\ntitle=type?'📖 '+title+' 📖':title;\nif( (\/目录简介\/.test(bbb) || \/目录简介\/.test(sss))&&!\/📖\/.test(title)){\n\tfu = \/目录简介【(.*?)】\/.test(bbb)?bbb.match(\/目录简介【(.*?)】\/)[1]:sss.match(\/目录简介【(.*?)】\/)[1]\n\ttitle = title +fu+intro\n\t}else{\n\t\tjava.put(\"intro1\",intro);\n\t\t}\nl=lock?'[此章节已锁]':'';\nresult=num+title+l;\n<\/js>", "chapterUrl": "@js:\n$=result;\nchapterid=$.chapterid;\nvip=$.isvip!='0';\ntype=$.chaptertype=='1';\nif( !type){\nif(!vip){\nresult='https:\/\/app.jjwxc.net\/androidapi\/chapterContent?novelId='+baseUrl.match(\/novelId=(\\d+)\/)[1]+'&chapterId='+chapterid\n}else{\n\tMap = source.getLoginHeaderMap();\nMap = Map==null?{}:Map;\n\turl =\"https:\/\/app.jjwxc.org\/androidapi\/chapterContent?novelId=\"+baseUrl.match(\/novelId=(\\d+)\/)[1]+\"&versionCode=381&token=\"+Map[\"token\"]+\"&chapterId=\"+chapterid\n\t}\n}else{ result=\"\"}", "formatJs": "", "isPay": "<js>\npoint=(\"{{$.point}}\"=='0');\nchapterMessage =!\/VIP|番外\/.test(\"{{$.chapterMessage}}\")\nif(chapterMessage||point){\n\tresult=true\n\t}else{\n\t\tresult=false\n\t\t}\n<\/js>", "isVip": "<js>\nvip = (\"{{$.isvip}}\"!=\"0\");\ntype = (\"{{$.chaptertype}}\"=='1');\nresult = !type?(vip?true:false):false\n<\/js>", "isVolume": "<js>\n\"{{$.chaptertype}}\"=='1'?true:false;\n<\/js>", "preUpdateJs": "tocUrl = book.tocUrl;\nif(\/token=\\d+_[\\w\\d]{16,}\/.test(tocUrl)){\n let src = \tjava.ajax(tocUrl);\n\t message = JSON.parse(src).message;\n\t if(\/登入验证失败\/.test(message)){\n\t \t newToken = Map(\"token\");\t \n\t \t oldToken = tocUrl.match(\/token=(\\d+_[\\w\\d]{16,})\/)[1]; \n\t \t if(newToken == oldToken)setHead(\"token\",\"\"); \t \t \n\t java.longToast(\"登录token已失效,请重新登录\");\n\t java.refreshTocUrl();\n\t }\n\t}", "updateTime": "{{$.chaptersize}}字•{{$.chapterdate}}•{{$.chapterintro##^\\s*}}##^•|0000-00-00.*|^0字•|•$" }, "searchUrl": "https:\/\/android.jjwxc.net\/androidapi\/search?versionCode=191&keyword={{key;java.put(\"key\",key)}}&type=1&page={{page;java.put(\"page\",page)}}&searchType=8&sortMode=DESC", "variableComment": "1、书籍变量(当前书)\n填写 [去章节序号] —— 去除章节序号\n填写[章节名] —— 变为第xx章 章节名\n\n填写 [目录简介【符号】] —— 章节简介放到目录列表,正文不出现 符号:跟章节名连接时中间的符号,如 目录简介【 】,中间将为空格\n\n填写 [评论+评论数量]——如 评论50 则可以显示50条评论,数量必填\n\n填写 [开启购买\/关闭购买] —— 如 开启购买 则会开启自动购买下五章【确认以后点右上角三点刷新才会生效,使用完毕后最好删除,避免重复请求】\n\n填写[净化] —— 这个是用来删除正文第一段是章节名的,可能会误伤。\n\n2、源变量(所有书)\n同书籍变量", "weight": 0 }