猕蛙
https://www.manwaku.com
SH869 (2786)09/13 16:46
🎨🔞猕蛙
修复规则
❗免责声明:
本工具/代码/内容仅供学习交流使用,严禁用于任何非法用途。使用者应严格遵守所在国家或地区的法律法规,任何因滥用或违规使用导致的后果均与开发者/提供者无关,责任自负❗
{ "bookSourceComment": "'https:\/\/www.mhtmh.org\n'https:\/\/www.mhtmh.com\n'https:\/\/www.manwaku.com\n'https:\/\/www.mwmw.cc\n\/\/建议注册或登录使用\n\/\/随机注册也可以\n\/\/\t注册或登录后请重新刷新发现\n\/\/❗免责声明: \n本工具\/代码\/内容仅供学习交流使用,严禁用于任何非法用途。使用者应严格遵守所在国家或地区的法律法规,任何因滥用或违规使用导致的后果均与开发者\/提供者无关,责任自负❗", "bookSourceGroup": "🎨🔞", "bookSourceName": "猕蛙", "bookSourceType": 0, "bookSourceUrl": "https:\/\/www.manwaku.com", "customOrder": 18, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar result = [];\nvar baseUrl = \"\/api\/cate\";\n\n\/\/ 动态获取标签\nvar tags = [];\nvar doc = org.jsoup.Jsoup.parse(java.ajax(source.key + '\/cate'));\nvar tagContainers = doc.select('.tag-container').toArray();\nvar lastContainer = tagContainers[tagContainers.length - 1];\nvar tagElements = lastContainer.select('a');\n\n\/\/ 提取标签数据\nfor (var i = 0; i < tagElements.size(); i++) {\n var element = tagElements.get(i);\n tags.push({\n value: element.attr('data-value'),\n text: element.text()\n });\n}\n\n\/\/ 排序选项\nconst sort = [\n [\"更新\", 0],\n [\"新作\", 1], \n [\"热门\", 3],\n [\"畅销\", 2],\n [\"收藏\", 4]\n];\n\n\n\/\/ 创建分类项\nvar createCategory = (title, tag, sort) => {\n const body = {\n page: { page: \"{{page}}\", pageSize: 36 },\n category: \"comic\",\n sort: sort,\n comic: { status: -1, day: 0, tag: tag },\n video: { year: 0, typeId: 0, typeId1: 0, area: \"\", lang: \"\", status: -1, day: 0 },\n novel: { status: -1, day: 0, sortId: 0 }\n };\n \n \/\/ 构建URL,包含标签值\n const url = baseUrl + (tag ? \"\/\" + tag : \"\") + \",\" + JSON.stringify({\n body: JSON.stringify(body).replace('\"{{page}}\"', '{{page}}'),\n method: \"POST\",\n headers: {\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"Content-Type\": \"application\/json\",\n \"authHeader\": source.getLoginHeader() || \"\"\n }\n });\n \n result.push({\n title: title,\n url: url,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: 0.45\n }\n });\n};\n \n\n\/\/ 生成分类\nsort.forEach(so => {\n result.push({\n title: so[0],\n url: \"\",\n style: { \n layout_flexGrow: 1, \n layout_flexBasisPercent: 1 \n }\n });\n\n \/\/ 添加该排序下的所有标签\n tags.forEach(tag => {\n createCategory(tag.text, tag.value, so[1]);\n });\n});\nJSON.stringify(result);", "header": "@js:\nJSON.stringify({\n\"cache-control\": \"no-cache\",\n\"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\",\n\"sec-ch-ua\": \"Android\",\n\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/127.0.0.0 Mobile Safari\/537.36 EdgA\/127.0.0.0\"\n})", "lastUpdateTime": "1757753206298", "loginUi": "[\n {\n \t\"name\": \"用户名\", \n \t\"type\": \"text\"\n \t},\n {\n \t\"name\": \"密码\", \n \"type\": \"text\"\n },\n {\n \"name\": \"随机注册\",\n \"type\": \"button\",\n \"action\": \"register()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n }\n]", "loginUrl": "function register() {\n const url = baseUrl.replace(\/\\\/+$\/, '').replace(\/[^\\w.:\/-]\/g, '');\n \n const randomUsername = generateRandomString(8); \/\/ 随机用户名\n const randomPassword = generateRandomString(10); \/\/ 随机密码\n \n const domains = [\"qq.com\", \"gmail.com\", \"163.com\", \"outlook.com\"]; \/\/ 邮箱池\n const randomDomain = domains[Math.floor(Math.random() * domains.length)]; \/\/ 随机选择邮箱域名:生成0到domains.length-1的随机索引\n \n const randomEmail = generateRealisticEmail(randomDomain); \/\/ 随机邮箱\n const randomNickname = generateRandomString(6); \/\/ 随机昵称\n \n const body = JSON.stringify({\n username: randomUsername, \n password: randomPassword, \n email: randomEmail,\n nickname: randomNickname\n });\n \n java.log(\"尝试注册: \" + body);\n const response = java.post(\n \t`${url}\/api\/user\/register`,\n \t body, \n {\"Content-Type\": \"application\/json\", \"x-requested-with\": \"XMLHttpRequest\"});\n \n const result = JSON.parse(response.body());\n if (result.code === 200) {\n const token = result.data.token;\n const authHeader = JSON.stringify({Authorization: `Bearer ${token}`, Cookie: `authToken=${token}`});\n source.putLoginInfo(JSON.stringify({\"用户名\": randomUsername, \"密码\": randomPassword}));\n java.longToast(\"注册成功\");\n return source.putLoginHeader(authHeader);\n }\n \n throw Error(result.msg || \"注册失败\");\n}\n\nfunction generateRandomString(length, includeNumbers = true) {\n const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n let result = '';\n for (let i = 0; i < length; i++) result += chars[Math.floor(Math.random() * chars.length)];\n return result;\n}\n\nfunction generateRealisticEmail(domain) {\n let username;\n switch (domain) {\n case \"qq.com\":\n username = Math.floor(100000000 + Math.random() * 900000000).toString();\n break;\n \n case \"163.com\":\n username = generateRandomString(6 + Math.floor(Math.random() * 4), true);\n if (Math.random() > 0.6) username = username.slice(0, 3) + '_' + username.slice(3);\n break;\n \n case \"outlook.com\":\n username = generateRandomString(6 + Math.floor(Math.random() * 4), true);\n if (Math.random() > 0.7) username = username.slice(0, 3) + '.' + username.slice(3);\n break;\n \n default:\n username = generateRandomString(7 + Math.floor(Math.random() * 5), true);\n break;\n }\n \n return username + \"@\" + domain;\n}\n\nfunction login() {\n\t const url = baseUrl.replace(\/\\\/+$\/, '').replace(\/[^\\w.:\/-]\/g, '');\n const user = source.getLoginInfoMap();\n \n const response = java.post(\n \t`${url}\/api\/user\/login`, \n JSON.stringify({username: user.get(\"用户名\"), password: user.get(\"密码\")}),\n {\"Content-Type\": \"application\/json\", \"x-requested-with\": \"XMLHttpRequest\"}\n );\n \n const result = JSON.parse(response.body());\n if (result.code === 200 && result.msg === \"Login successful\") {\n const token = result.data.token;\n return source.putLoginHeader(JSON.stringify({Authorization: `Bearer ${token}`, Cookie: `authToken=${token}`}));\n }\n \n throw Error(result.msg || \"登录失败\");\n}", "respondTime": 4846, "ruleBookInfo": { "author": "$.data.author", "coverUrl": "$.data.cover", "intro": "$.data.intro", "kind": "$.data.tags", "name": "$.data.title", "tocUrl": "\/api\/comic\/chapter?comicId={$.data.id}&page=1&pageSize=20" }, "ruleContent": { "content": "@js:\nvar src\nimg=JSON.parse(src);\nims=img.data.images;\nims.map($=>`<img src=\"${$.url}\">`).join(\"\\n\")", "imageStyle": "FULL", "nextContentUrl": "@js:\nvar ra;\nif (typeof result==='string') {\n ra=result;\n} else {\n ra=JSON.stringify(result || {});\n}\nvar rta=JSON.parse(ra);\npe=rta.data?.pagination?.page_size;\ntl=rta.data?.pagination?.total;\ntes=Math.ceil(tl\/pe);\nvar pls=[];\nif (tes>1) {\n for (var i=2; i<=tes; i++) {\n pls.push(baseUrl.replace(\/page=\\d+\/, `page=${i}`));\n }\n}\npls;" }, "ruleExplore": { "author": "$.author", "bookList": "$.data.list[*]", "bookUrl": "\/api{{$.url}}", "coverUrl": "$.pic", "intro": "$.intro", "kind": "$.tags", "name": "$.title" }, "ruleSearch": { "author": "$.author", "bookList": "$.data.list[*]", "bookUrl": "\/api\/comic\/{{$.id}}", "checkKeyWord": "[Pixiv] Nyako (87118066) part.3 (AI)", "coverUrl": "$.cover", "intro": "$.description", "kind": "$.tags", "name": "$.title" }, "ruleToc": { "chapterList": "$.data[*]", "chapterName": "$.title", "chapterUrl": "\/api\/comic\/image\/{{$.id}}?page=1&page_size=60", "isVip": "$.isVip", "nextTocUrl": "@js:\nvar ra;\nif (typeof result==='string') {\n ra=result;\n} else {\n ra=JSON.stringify(result || {});\n}\nvar rta=JSON.parse(ra);\ntl=rta.pagination?.total;\npe=rta.pagination?.size;\ntes=Math.ceil(tl\/pe);\nvar pls=[];\nif (tes>1) {\n for (var i=2; i<=tes; i++) {\n pls.push(baseUrl.replace(\/page=\\d+\/, `page=${i}`));\n }\n}\npls;" }, "searchUrl": "\/api\/search?keyword={{encodeURIComponent(key)}}&type=mh&page={{page}}&pageSize=20", "weight": 0 }