🥝猕猴桃漫画
https://www.mwwz.cc
yezechuandl (3004)9小时前
处理封面解密
{
"bookSourceComment": "\/\/2025.5.20 ◎夜泽川◎\n\/\/2025.8.3 修复 ◎夜泽川◎\n\/\/2026.3.24 修复站源获取,随机注册 ◎夜泽川◎\n\/\/2026.4.26 修复站源获取 ◎夜泽川◎\n\/\/2026.7.10 处理正文图片解密,增加图片线路 ◎夜泽川◎\n\/\/2026.7.27 站源扩容,去除随机注册,优化提示 ◎夜泽川◎\n\/\/2026.8.17 处理封面解密\n\/\/ 内置一个公共账号\n\/\/ 可随机注册,请勿滥用。(已失效,网站加入了邮箱验证)",
"bookSourceGroup": "自制,漫画",
"bookSourceName": "🥝猕猴桃漫画",
"bookSourceType": 2,
"bookSourceUrl": "https:\/\/www.mwwz.cc",
"coverDecodeJs": "(() => {\n const view = result.readAllBytes();\n const isImage = (view[0] === 0xFF && view[1] === 0xD8) ||\n (view[0] === 0x89 && view[1] === 0x50) ||\n (view[0] === 0x47 && view[1] === 0x49) ||\n (view[0] === 0x52 && view[1] === 0x49);\n if (isImage) return result;\n const iv = view.slice(0, 16);\n const ciphertext = view.slice(16);\n const key = java.strToBytes('0B6666A0-BB59-1381-B746-a0E4C9AC');\n const cipher = java.createSymmetricCrypto(\"AES\/CBC\/PKCS5Padding\", key, iv);\n return cipher.decrypt(ciphertext);\n})();",
"customButton": false,
"customOrder": 197,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": false,
"exploreUrl": "@js:\nvar result = [];\nvar push = (title, tag, p, size) => result.push({\n title: title,\n url: `{{Url()}}\/api${p}` + \",\" + JSON.stringify({\n \"body\": `{\\\"page\\\":{\\\"page\\\":{{page}},\\\"pageSize\\\":10},\\\"category\\\":\\\"comic\\\",\\\"sort\\\":0,\\\"comic\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"tag\\\":\\\"${tag}\\\"},\\\"video\\\":{\\\"year\\\":0,\\\"typeId\\\":0,\\\"typeId1\\\":0,\\\"area\\\":\\\"\\\",\\\"lang\\\":\\\"\\\",\\\"status\\\":-1,\\\"day\\\":0},\\\"novel\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"sortId\\\":0}}`,\n \"method\": \"POST\"\n}),\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: size\n }\n});\nvar tags = org.jsoup.Jsoup.parse(java.ajax(Url() + '\/cate')).select('.tag-container').toArray().at(-1).select('a');\nif (tags[0].text() != '全部') push('全部', '', '\/cate', 1);\nfor (let i in tags) {\n\tlet size = tags[i].text() == '全部' ? 1 : 0.25;\n\tpush(tags[i].text(), tags[i].attr('data-value'), tags[i].attr('href'), size);\n}\nJSON.stringify(result);",
"header": "@js:\nJSON.stringify({\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 9) Mobile Safari\/537.36\",\"Referer\": Url()});",
"jsLib": "function Url() {\n const { source, java } = this;\n var original = {\n \"sourceurl\": \"https:\/\/www.mhtmh.com\",\n \"imageSourceUrl\": \"\",\n \"Urls\": [],\n \"imageSource\": []\n };\n if (source.getVariable() == '') {\n source.setVariable(JSON.stringify(original, null, \"\\t\"));\n java.toast('已初始化');\n }\n return JSON.parse(source.getVariable()).sourceurl;\n}",
"lastUpdateTime": "1786975718911",
"loginUi": "[\n {\n \"name\": \"获取站源\",\n \"type\": \"button\",\n \"action\": \"getUrl()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"站源选择\",\n \"type\": \"button\",\n \"action\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"①\",\n \"type\": \"button\",\n \"action\": \"setUrl(0)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"②\",\n \"type\": \"button\",\n \"action\": \"setUrl(1)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"③\",\n \"type\": \"button\",\n \"action\": \"setUrl(2)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"④\",\n \"type\": \"button\",\n \"action\": \"setUrl(3)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"⑤\",\n \"type\": \"button\",\n \"action\": \"setUrl(4)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"⑥\",\n \"type\": \"button\",\n \"action\": \"setUrl(5)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"⑦\",\n \"type\": \"button\",\n \"action\": \"setUrl(6)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"⑧\",\n \"type\": \"button\",\n \"action\": \"setUrl(7)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"⑨\",\n \"type\": \"button\",\n \"action\": \"setUrl(8)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"⑩\",\n \"type\": \"button\",\n \"action\": \"setUrl(9)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"⑪\",\n \"type\": \"button\",\n \"action\": \"setUrl(10)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"⑫\",\n \"type\": \"button\",\n \"action\": \"setUrl(11)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"线路选择\",\n \"type\": \"button\",\n \"action\": \"java.toast('\\\\n下方为图片加载线路,选择最佳线路可提升图片加载速度!')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"线路①\",\n \"type\": \"button\",\n \"action\": \"setImageSource(0)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"线路②\",\n \"type\": \"button\",\n \"action\": \"setImageSource(1)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"线路③\",\n \"type\": \"button\",\n \"action\": \"setImageSource(2)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"线路④\",\n \"type\": \"button\",\n \"action\": \"setImageSource(3)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"线路⑤\",\n \"type\": \"button\",\n \"action\": \"setImageSource(4)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"用户名\",\n \"type\": \"text\"\n },\n {\n \"name\": \"密码\",\n \"type\": \"password\"\n },\n {\n \"name\": \"注册\",\n \"type\": \"button\",\n \"action\": \"java.toast('温馨提示:广告切勿相信,请勿在网站充值!!!');java.startBrowser(`${Url()}\/user\/register`, '注册');\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"登录\",\n \"type\": \"button\",\n \"action\": \"Login()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"登出\",\n \"type\": \"button\",\n \"action\": \"LoginOut()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n }\n]",
"loginUrl": "Url();\n\nfunction getUrl() {\n try {\n let urls = [];\n Array.from(org.jsoup.Jsoup.parse(java.get(\"https:\/\/manwami.cc\", {}).body()).select('.btnBox a'), x => {\n if (!x.text().includes('自测')) return urls.push(x.attr('href'));\n let src = java.ajax(x.attr('href'));\n let e = src.match(\/e\\s*=\\s*(\\[.+?\\])\/)[1]\n JSON.parse(e).map(u => urls.push(java.base64Decode(u)));\n });\n urls = Array.from(new Set(urls));\n java.log(urls.join('\\n'));\n if (urls.length === 0) throw new Error('未获取到站源');\n let data = JSON.parse(source.getVariable());\n data.Urls = urls;\n source.setVariable(JSON.stringify(data, null, \"\\t\"));\n java.toast(`获取到${urls.length}个站源\\n${urls.join('\\n')}`);\n } catch (e) {\n java.log(e.message)\n java.toast('获取失败,请检查网络');\n }\n}\n\nfunction setUrl(n) {\n let data = JSON.parse(source.getVariable());\n if (n + 1 > data.Urls.length) return java.toast(`暂时没有站源${n + 1}`);\n data.sourceurl = data.Urls[n];\n let timeNow = Date.now();\n try {\n let ty = java.get(data.Urls[n], {});\n if (!ty.body().includes('漫蛙')) throw new Error('站源失效');\n } catch (e) {\n java.log(e)\n java.toast(`\\n当前站源:${data.Urls[n]}\\n当前站源已失效,请检查网络或切换至其他站源!`);\n return;\n }\n let testTime = (Date.now() - timeNow) \/ 1000\n let imageSource = JSON.parse(java.ajax(data.Urls[n]).match(\/window\\.GLOBAL_IMAGE_ROUTES\\s*=\\s*(\\[.*?\\]);\/)[1]).map(url => url.Url);\n data.imageSource = imageSource;\n source.setVariable(JSON.stringify(data, null, \"\\t\"));\n java.toast(`当前站源已切换到:\\n${data.Urls[n]}\\n🔻解析时间:${testTime.toFixed(2)}🔻\\n已获取${imageSource.length}条线路\\n${imageSource.join('\\n')}`);\n}\n\nfunction setImageSource(n) {\n let data = JSON.parse(source.getVariable());\n if (n + 1 > data.imageSource.length) return java.toast(`暂时没有站源${n + 1}`);\n if (data.imageSourceUrl === data.imageSource[n]) {\n data.imageSourceUrl = '';\n java.toast('已切换图片线路为默认');\n } else {\n data.imageSourceUrl = data.imageSource[n];\n java.toast(`当前图片线路已切换到:\\n${data.imageSource[n]}`);\n }\n source.setVariable(JSON.stringify(data, null, \"\\t\"));\n}\n\nfunction login() {}\n\nfunction Login() {\n let username = String(result?.[\"用户名\"]) || \"axb\";\n let password = String(result?.[\"密码\"]) || \"123456789@\";\n let url = `${Url()}\/api\/user\/login`;\n try {\n let response = JSON.parse(java.post(url, JSON.stringify({\n username,\n password\n }), {\n \"x-requested-with\": \"XMLHttpRequest\",\n \"Content-Type\": \"application\/json\"\n }).body());\n if (!\/successful\/.test(response.msg)) return java.toast(response.msg);\n let token = response.data.token;\n source.putLoginHeader(JSON.stringify({\n \"Authorization\": \"Bearer \" + token,\n \"Cookie\": \"authToken=\" + token\n }));\n result[\"用户名\"] = username;\n result[\"密码\"] = password;\n source.putLoginInfo(JSON.stringify(result));\n java.toast(`\\n用户:${username}\\n登录成功!\\n刷新发现即可查看更多标签`);\n } catch (e) {\n java.log(e.message);\n java.toast('请求失败,请检查网络状况!');\n }\n}\n\nfunction LoginOut() {\n source.removeLoginHeader();\n cookie.removeCookie(Url());\n java.toast('登出成功!');\n}\n\n\/*\nfunction register() {\n let infoData = generateRandomInfo();\n let username = infoData.username;\n let email = infoData.email;\n let password = infoData.password;\n let url = `${Url()}\/api\/user\/register`;\n const captchaResponse = JSON.parse(java.get(`${Url()}\/api\/user\/captcha`, {}).body());\n\n let body = JSON.stringify({\n username,\n password,\n email,\n nickname: username,\n captchaId: captchaResponse.captchaId,\n captchaCode: java.getVerificationCode(captchaResponse.img)\n });\n try {\n let response = JSON.parse(java.post(url, body, {\n \"x-requested-with\": \"XMLHttpRequest\",\n \"Content-Type\": \"application\/json\"\n }).body());\n if (!\/successful\/.test(response.msg)) return java.toast(response.msg);\n java.log(`\\n用户名:${username}\\n注册邮箱:${email}\\n密码:${password}`);\n let token = response.data.token;\n result[\"用户名\"] = username;\n result[\"密码\"] = password;\n source.putLoginInfo(JSON.stringify(result));\n source.putLoginHeader(JSON.stringify({\n \"Authorization\": \"Bearer \" + token,\n \"Cookie\": \"authToken=\" + token\n }));\n java.toast(`\\n用户:${username}\\n注册并登录成功!\\n用户数据已打印至源日志`);\n } catch (e) {\n java.log(e.message);\n java.toast('请求失败,请检查网络状况!');\n }\n}\n*\/",
"respondTime": 180000,
"ruleBookInfo": {
"author": "$.author",
"coverUrl": "$.cover\n@js:\nconst imageSourceUrl = JSON.parse(source.getVariable()).imageSourceUrl;\nimageSourceUrl ? result.replace(\/^[^\\\/]+\\\/\\\/[^\\\/]+\/, imageSourceUrl) : result;",
"init": "$.data",
"intro": "@js:\nconst config = JSON.parse(source.getVariable());\nconst $ = result;\n` 当前站源:${config.sourceurl}\n当前线路:${config.imageSourceUrl || '默认线路'}\n上架时间:${java.timeFormat($.createTime * 1000)}\n更新时间:${java.timeFormat($.editTime * 1000)}\n简介:\n${$.intro}`;",
"kind": "@js:var $ = result;\n$.tags + ',' + java.timeFormat($.editTime * 1000);",
"name": "$.title",
"tocUrl": "{{Url()}}\/comic\/{{$.id}}"
},
"ruleContent": {
"content": "@js:\nconst imglist = JSON.parse(src).data.images;\nconst imageSourceUrl = JSON.parse(source.getVariable()).imageSourceUrl;\nimglist.map(x => `<img src=\"${imageSourceUrl ? x.url.replace(\/^[^\\\/]+\\\/\\\/[^\\\/]+\/, imageSourceUrl) : x.url}\">`).join('\\n');",
"imageDecode": "(() => {\n const isImage = (result[0] === 0xFF && result[1] === 0xD8) ||\n (result[0] === 0x89 && result[1] === 0x50) ||\n (result[0] === 0x47 && result[1] === 0x49) ||\n (result[0] === 0x52 && result[1] === 0x49);\n if (isImage) return result;\n const iv = result.slice(0, 16);\n const ciphertext = result.slice(16);\n const key = java.strToBytes('0B6666A0-BB59-1381-B746-a0E4C9AC');\n const cipher = java.createSymmetricCrypto(\"AES\/CBC\/PKCS5Padding\", key, iv);\n return cipher.decrypt(ciphertext);\n})();",
"imageStyle": "FULL",
"nextContentUrl": "@js:\nconst pageList = [];\nconst Data = JSON.parse(src).data.pagination;\nconst page = Math.ceil(Data.total \/ Data.page_size);\nfor (let i = 2;i <= page;i++) {\npageList.push(baseUrl.replace(\"page=1\",`page=${i}`));\n}\npageList;"
},
"ruleExplore": {
"author": "$.author",
"bookList": "$.data.list[*]",
"bookUrl": "{{Url()}}\/api\/comic\/{{$.url##[^\\d]}}",
"coverUrl": "$.pic\n@js:\nconst imageSourceUrl = JSON.parse(source.getVariable()).imageSourceUrl;\nimageSourceUrl ? result.replace(\/^[^\\\/]+\\\/\\\/[^\\\/]+\/, imageSourceUrl) : result;",
"intro": "$.intro",
"kind": "$.tags",
"name": "$.title"
},
"ruleSearch": {
"author": "$.author",
"bookList": "$.data.list[*]",
"bookUrl": "{{Url()}}\/api\/comic\/{{$.id}}",
"coverUrl": "$.cover\n@js:\nconst imageSourceUrl = JSON.parse(source.getVariable()).imageSourceUrl;\nimageSourceUrl ? result.replace(\/^[^\\\/]+\\\/\\\/[^\\\/]+\/, imageSourceUrl) : result;",
"intro": "$.description",
"kind": "@js:var $ = result;\n$.tags + ',' + java.timeFormat($.editTime * 1000);",
"name": "$.title"
},
"ruleToc": {
"chapterList": "#chapter-grid-container a",
"chapterName": "[class$=\"name\"]@text",
"chapterUrl": "href##(\\d+)$##\/api\/comic\/image\/$1?page=1###",
"preUpdateJs": "const sourceUL = Url();\nif (!String(book.bookUrl).includes(sourceUL)) {\n book.bookUrl = String(book.bookUrl).replace(\/https?:\\\/\\\/[^\\\/]+\/,sourceUL);\n book.tocUrl = String(book.tocUrl).replace(\/https?:\\\/\\\/[^\\\/]+\/,sourceUL);\n java.toast(\"\\n检测到切换源站,已更新目录链接。\");\n java.refreshTocUrl();\n}",
"updateTime": "span@text##\\n##|"
},
"searchUrl": "{{Url()}}\/api\/search?keyword={{key}}&type=mh&page={{page}}&pageSize=20",
"weight": 0
}