1
+ [
2
+ {
3
+ "bookSourceComment" : " //2025.5.20 ◎夜泽川◎\n //2025.8.3 修复 ◎夜泽川◎\n //2025.8.21 添加账号登录,内置一个公共账号(输入框置空直接点击登陆即可) ◎夜泽川◎" ,
4
+ "bookSourceGroup" : " 自制,漫画" ,
5
+ "bookSourceName" : " 🥝猕猴桃漫画" ,
6
+ "bookSourceType" : 2 ,
7
+ "bookSourceUrl" : " https://www.mwwz.cc" ,
8
+ "customOrder" : 1 ,
9
+ "enabled" : true ,
10
+ "enabledCookieJar" : true ,
11
+ "enabledExplore" : true ,
12
+ "exploreUrl" : " @js:\n var result = [];\n var 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 });\n var tags = org.jsoup.Jsoup.parse(java.ajax(Url() + '/cate')).select('.tag-container').toArray().at(-1).select('a');\n for (let i in tags) {\n\t let size = i == 0 ? 1 : 0.25;\n\t push(tags[i].text(), tags[i].attr('data-value'), tags[i].attr('href'), size);\n }\n JSON.stringify(result);" ,
13
+ "header" : " {\" User-Agent\" :\" Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\" ,\" Referer\" :\" https://www.mhtmh.com\" }" ,
14
+ "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 }" ,
15
+ "lastUpdateTime" : " 1758445498807" ,
16
+ "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]",
17
+ "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}",
18
+ "respondTime" : 180000 ,
19
+ "ruleBookInfo" : {
20
+ "author" : " $.author" ,
21
+ "coverUrl" : " $.cover" ,
22
+ "init" : " $.data" ,
23
+ "intro" : " @js:\n var $ = result;\n ` 当前站源:${JSON.parse(source.getVariable()).sourceurl}\\ n上架时间:${java.timeFormat($.createTime * 1000)}\\ n更新时间:${java.timeFormat($.editTime * 1000)}\\ n简介:${$.intro}`;" ,
24
+ "kind" : " @js:var $ = result;\n $.tags + ',' + java.timeFormat($.editTime * 1000);" ,
25
+ "name" : " $.title" ,
26
+ "tocUrl" : " {{Url()}}/comic/{{$.id}}"
27
+ },
28
+ "ruleContent" : {
29
+ "content" : " @js:var imglist = JSON.parse(src).data.images\n result = imglist.map(x => `<img src=\" ${x.url}\" >`).join('\\ n');" ,
30
+ "imageStyle" : " FULL" ,
31
+ "nextContentUrl" : " @js:var pageList = [];\n let Data = JSON.parse(src).data.pagination;\n var page = Math.ceil(Data.total / Data.page_size);\n for (let i = 2;i <= page;i++) {\n pageList.push(baseUrl.replace(\" page=1\" ,`page=${i}`));\n }\n pageList;"
32
+ },
33
+ "ruleExplore" : {
34
+ "author" : " $.author" ,
35
+ "bookList" : " $.data.list[*]" ,
36
+ "bookUrl" : " {{Url()}}/api/comic/{{$.url##[^\\ d]}}" ,
37
+ "coverUrl" : " $.pic" ,
38
+ "intro" : " $.intro" ,
39
+ "kind" : " $.tags" ,
40
+ "name" : " $.title"
41
+ },
42
+ "ruleSearch" : {
43
+ "author" : " $.author" ,
44
+ "bookList" : " $.data.list[*]" ,
45
+ "bookUrl" : " {{Url()}}/api/comic/{{$.id}}" ,
46
+ "coverUrl" : " $.cover" ,
47
+ "intro" : " $.description" ,
48
+ "kind" : " @js:var $ = result;\n $.tags + ',' + java.timeFormat($.editTime * 1000);" ,
49
+ "name" : " $.title"
50
+ },
51
+ "ruleToc" : {
52
+ "chapterList" : " #chapter-grid-container a" ,
53
+ "chapterName" : " [class$=\" name\" ]@text" ,
54
+ "chapterUrl" : " href##(\\ d+)$##/api/comic/image/$1?page=1###" ,
55
+ "preUpdateJs" : " var sourceUL = Url();\n if (!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 }" ,
56
+ "updateTime" : " span@text##\\ n##|"
57
+ },
58
+ "searchUrl" : " {{Url()}}/api/search?keyword={{key}}&type=mh&page={{page}}&pageSize=20" ,
59
+ "weight" : 0
60
+ }
61
+ ]
0 commit comments