🥝猕猴桃漫画

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
}
广告