🥝猕猴桃漫画
https://www.mwwz.cc
yezechuandl (3004)09/21 17:04
修复站源获取
{
"bookSourceComment": "\/\/2025.5.20 ◎夜泽川◎\n\/\/2025.8.3 修复 ◎夜泽川◎\n\/\/2025.8.21 添加账号登录,内置一个公共账号(输入框置空直接点击登陆即可) ◎夜泽川◎",
"bookSourceGroup": "自制,漫画",
"bookSourceName": "🥝猕猴桃漫画",
"bookSourceType": 2,
"bookSourceUrl": "https:\/\/www.mwwz.cc",
"customOrder": 1,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"exploreUrl": "@js:\nvar result = [];\nvar push = (title, tag, p, size) => result.push({\n title: title,\n url: `{{Url()}}\/api${p}` + \",\" + JSON.stringify({\n \"body\": `{\\\"page\\\":{\\\"page\\\":{{page}},\\\"pageSize\\\":10},\\\"category\\\":\\\"comic\\\",\\\"sort\\\":0,\\\"comic\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"tag\\\":\\\"${tag}\\\"},\\\"video\\\":{\\\"year\\\":0,\\\"typeId\\\":0,\\\"typeId1\\\":0,\\\"area\\\":\\\"\\\",\\\"lang\\\":\\\"\\\",\\\"status\\\":-1,\\\"day\\\":0},\\\"novel\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"sortId\\\":0}}`,\n \"method\": \"POST\"\n}),\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: size\n }\n});\nvar tags = org.jsoup.Jsoup.parse(java.ajax(Url() + '\/cate')).select('.tag-container').toArray().at(-1).select('a');\nfor (let i in tags) {\n\tlet size = i == 0 ? 1 : 0.25;\n\tpush(tags[i].text(), tags[i].attr('data-value'), tags[i].attr('href'), size);\n}\nJSON.stringify(result);",
"header": "{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 9) Mobile Safari\/537.36\",\"Referer\":\"https:\/\/www.mhtmh.com\"}",
"jsLib": "function Url() {\n const { source, java } = this;\n var original = {\n \"sourceurl\": \"https:\/\/www.mhtmh.com\",\n \"Urls\": []\n };\n if (source.getVariable() == '') {\n source.setVariable(JSON.stringify(original, null, \"\\t\"));\n java.toast('已初始化');\n }\n return JSON.parse(source.getVariable()).sourceurl;\n}",
"lastUpdateTime": "1758445498807",
"loginUi": "[\n {\n \"name\": \"获取站源\",\n \"type\": \"button\",\n \"action\": \"getUrl()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"①\",\n \"type\": \"button\",\n \"action\": \"setUrl(0)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"②\",\n \"type\": \"button\",\n \"action\": \"setUrl(1)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"③\",\n \"type\": \"button\",\n \"action\": \"setUrl(2)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"④\",\n \"type\": \"button\",\n \"action\": \"setUrl(3)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"用户名(3-50个字符)\",\n \"type\": \"text\"\n },\n {\n \"name\": \"邮箱(注册填入)\",\n \"type\": \"text\"\n },\n {\n \"name\": \"密码(6-20个字符)\",\n \"type\": \"password\"\n },\n {\n \"name\": \"注册\",\n \"type\": \"button\",\n \"action\": \"register()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"登录\",\n \"type\": \"button\",\n \"action\": \"Login()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"登出\",\n \"type\": \"button\",\n \"action\": \"LoginOut()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n }\n]",
"loginUrl": "Url();\n\nfunction getUrl() {\n try {\n let urls = Array.from(org.jsoup.Jsoup.parse(java.get(\"https:\/\/www.manwaku.cc\/\", {}).body()).select('.cards a'), x => x.attr('href'));\n if (urls.length === 0) throw new Error('未获取到站源');\n let data = JSON.parse(source.getVariable());\n data.Urls = urls;\n source.setVariable(JSON.stringify(data, null, \"\\t\"));\n java.toast(`获取到${urls.length}个站源\\n${urls.join('\\n')}`);\n } catch (e) {\n java.log(e.message)\n java.toast('获取失败,请检查网络');\n }\n}\n\nfunction setUrl(n) {\n let data = JSON.parse(source.getVariable());\n if (n + 1 > data.Urls.length) return java.toast(`暂时没有站源${n + 1}`);\n data.sourceurl = data.Urls[n];\n source.setVariable(JSON.stringify(data, null, \"\\t\"));\n java.toast(`当前站源已切换到:\\n${data.Urls[n]}`);\n}\n\nfunction login() {}\n\nfunction Login() {\n let username = String(result?.[\"用户名(3-50个字符)\"] ?? '') || \"axb\";\n let password = String(result?.[\"密码(6-20个字符)\"] ?? '') || \"123456789@\";\n let url = `${Url()}\/api\/user\/login`;\n try {\n let response = JSON.parse(java.post(url, JSON.stringify({\n username,\n password\n }), {\n \"x-requested-with\": \"XMLHttpRequest\",\n \"Content-Type\": \"application\/json\"\n }).body());\n if (!\/successful\/.test(response.msg)) return java.toast(response.msg);\n let token = response.data.token;\n source.putLoginHeader(JSON.stringify({\n \"Authorization\": \"Bearer \" + token,\n \"Cookie\": \"authToken=\" + token\n }));\n java.toast(`\\n用户:${username}\\n登录成功!`);\n } catch (e) {\n java.log(e.message);\n java.toast('请求失败,请检查网络状况!');\n }\n}\n\nfunction LoginOut() {\n source.removeLoginHeader();\n cookie.removeCookie(Url());\n java.toast('登出成功!');\n}\n\nfunction register() {\n let username = result?.[\"用户名(3-50个字符)\"] ?? '';\n let password = result?.[\"密码(6-20个字符)\"] ?? '';\n let email = result?.[\"邮箱(注册填入)\"] ?? '';\n if (!String(username) || !String(password) || !String(email)) return java.toast('请填入必要数据');\n if (String(username).length < 3 || String(username).length > 50) return java.toast('用户名不符合要求');\n if (String(password).length < 6 || String(password).length > 20) return java.toast('密码不符合要求');\n try {\n let url = `${Url()}\/api\/user\/register`;\n let body = JSON.stringify({\n username,\n password,\n email,\n \"nickname\": username\n });\n let response = JSON.parse(java.post(url, body, {\n \"x-requested-with\": \"XMLHttpRequest\",\n \"Content-Type\": \"application\/json\"\n }).body());\n if (!\/successful\/.test(response.msg)) return java.toast(response.msg);\n java.log(`\\n用户名:${username}\\n注册邮箱:${email}\\n密码:${password}`);\n let token = response.data.token;\n source.putLoginInfo(JSON.stringify(result));\n source.putLoginHeader(JSON.stringify({\n \"Authorization\": \"Bearer \" + token,\n \"Cookie\": \"authToken=\" + token\n }));\n java.toast(`\\n用户:${username}\\n注册并登录成功!\\n用户数据已打印至源日志`);\n } catch (e) {\n java.log(e.message);\n java.toast('请求失败,请检查网络状况!');\n }\n}",
"respondTime": 180000,
"ruleBookInfo": {
"author": "$.author",
"coverUrl": "$.cover",
"init": "$.data",
"intro": "@js:\nvar $ = result;\n` 当前站源:${JSON.parse(source.getVariable()).sourceurl}\\n上架时间:${java.timeFormat($.createTime * 1000)}\\n更新时间:${java.timeFormat($.editTime * 1000)}\\n简介:${$.intro}`;",
"kind": "@js:var $ = result;\n$.tags + ',' + java.timeFormat($.editTime * 1000);",
"name": "$.title",
"tocUrl": "{{Url()}}\/comic\/{{$.id}}"
},
"ruleContent": {
"content": "@js:var imglist = JSON.parse(src).data.images\nresult = imglist.map(x => `<img src=\"${x.url}\">`).join('\\n');",
"imageStyle": "FULL",
"nextContentUrl": "@js:var pageList = [];\nlet Data = JSON.parse(src).data.pagination;\nvar page = Math.ceil(Data.total \/ Data.page_size);\nfor (let i = 2;i <= page;i++) {\npageList.push(baseUrl.replace(\"page=1\",`page=${i}`));\n}\npageList;"
},
"ruleExplore": {
"author": "$.author",
"bookList": "$.data.list[*]",
"bookUrl": "{{Url()}}\/api\/comic\/{{$.url##[^\\d]}}",
"coverUrl": "$.pic",
"intro": "$.intro",
"kind": "$.tags",
"name": "$.title"
},
"ruleSearch": {
"author": "$.author",
"bookList": "$.data.list[*]",
"bookUrl": "{{Url()}}\/api\/comic\/{{$.id}}",
"coverUrl": "$.cover",
"intro": "$.description",
"kind": "@js:var $ = result;\n$.tags + ',' + java.timeFormat($.editTime * 1000);",
"name": "$.title"
},
"ruleToc": {
"chapterList": "#chapter-grid-container a",
"chapterName": "[class$=\"name\"]@text",
"chapterUrl": "href##(\\d+)$##\/api\/comic\/image\/$1?page=1###",
"preUpdateJs": "var sourceUL = Url();\nif (!String(book.bookUrl).includes(sourceUL)) {\n book.bookUrl = String(book.bookUrl).replace(\/https?:\\\/\\\/[^\\\/]+\/,sourceUL);\n book.tocUrl = String(book.tocUrl).replace(\/https?:\\\/\\\/[^\\\/]+\/,sourceUL);\n java.toast(\"\\n检测到切换源站,已更新目录链接。\");\n java.refreshTocUrl();\n}",
"updateTime": "span@text##\\n##|"
},
"searchUrl": "{{Url()}}\/api\/search?keyword={{key}}&type=mh&page={{page}}&pageSize=20",
"weight": 0
}