猕蛙
https://www.manwaku.com
SH869 (2786)3天前
随机邮箱,注册完刷新发现,刷新发现要手动
{ "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": 15, "enabled": false, "enabledCookieJar": true, "enabledExplore": false, "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 sortOptions = [\n { text: \"更新\", value: 0 },\n { text: \"新作\", value: 1 },\n { text: \"热门\", value: 3 },\n { text: \"畅销\", value: 2 },\n { text: \"收藏\", value: 4 }\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.25\n }\n });\n};\n\n\/\/ 生成分类\nsortOptions.forEach(so => {\n \/\/ 添加排序标题\n result.push({\n title: so.text,\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.value);\n });\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": "1756052250572", "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 regUrl = `${baseUrl.replace(\/\\\/+$\/,'').replace(\/[^\\w.:\\\/-]\/g,'')}\/api\/user\/register`.replace(\/\\\/+\/gi, \"\/\");\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 registerParams = {\n method: \"POST\",\n headers: {\"Content-Type\": \"application\/json\", \"x-requested-with\": \"XMLHttpRequest\"},\n body: JSON.stringify({\n \tusername: randomUsername, password: randomPassword, \n \temail: randomEmail,\n \tnickname: randomNickname})\n };\n \n java.log(\"尝试注册: \" + registerParams.body);\n const response = java.post(regUrl, registerParams.body, registerParams.headers);\n const body = response.body();\n \n try {\n const result = JSON.parse(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 } else {\n throw Error(result.msg || \"注册失败\");\n }\n } catch (e) {\n java.log(\"注册失败: \" + e.message + \", 响应: \" + body);\n throw Error(\"注册失败\");\n }\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 const loginUrl = `${baseUrl.replace(\/\\\/+$\/,'').replace(\/[^\\w.:\\\/-]\/g,'')}\/api\/user\/login`.replace(\/\\\/+\/gi, \"\/\");\n const user = source.getLoginInfoMap();\n const loginParams = {\n method: \"POST\",\n headers: {\"Content-Type\": \"application\/json\", \"x-requested-with\": \"XMLHttpRequest\"},\n body: JSON.stringify({username: user.get(\"用户名\"), password: user.get(\"密码\")})\n };\n \n const response = java.post(loginUrl, loginParams.body, loginParams.headers);\n const body = response.body();\n \n try {\n const result = JSON.parse(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 } else {\n throw Error(result.msg || \"登录失败\");\n }\n } catch (e) {\n java.log(\"登录失败: \" + e.message);\n throw Error(\"登录失败\");\n }\n}", "respondTime": 180000, "ruleBookInfo": { "author": "$..author||$.data.author", "coverUrl": "$.data.cover||$..cover", "intro": "$..intro||$.data.intro", "kind": "$.data.tags||$..tags", "name": "$.data.title||$..title", "tocUrl": "\/api\/comic\/chapter?comicId={$..id}&page=1&pageSize=20" }, "ruleContent": { "content": "@js:\nvar imgs = JSON.parse(src).data.images;\nimgs.map($=>`<img src=\"${$.url}\">`).join(\"\\n\")", "imageStyle": "FULL", "nextContentUrl": "@js:\nvar pageUrls = [];\ntry {\n var rawData = result || \"{}\";\n if (typeof rawData !== \"string\") rawData = JSON.stringify(rawData);\n var Data = JSON.parse(rawData).data;\n var pageSize = Data.pagination?.page_size;\n var total = Data.pagination?.total;\n var totalPages = Math.ceil(total \/ pageSize);\n\n for (var i = 2; i <= totalPages; i++) {\n pageUrls.push(baseUrl.replace(\/page=\\d+\/, `page=${i}`));\n }\n} catch (e) {\n java.log(\"解析错误: \" + e.message);\n pageUrls = [];\n}\npageUrls;" }, "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}}", "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 pageUrls = [];\n try {\n var rawData = result || \"{}\";\n if (typeof rawData !== \"string\") rawData = JSON.stringify(rawData);\n var result = JSON.parse(rawData);\n var total = result.pagination?.total;\n var pageSize = result.pagination?.size;\n var totalPages = Math.ceil(total \/ pageSize);\n for (var i = 2; i <= totalPages; i++) {\n pageUrls.push(baseUrl.replace(\/page=\\d+\/,`page=${i}`));\n }\n } catch (e) {\n java.log(\"解析错误: \" + e.message);\n pageUrls = [];\n }\n pageUrls;" }, "searchUrl": "\/api\/search?keyword={{key}}&type=mh&page={{page}}&pageSize=20", "weight": 0 }