[{"bookSourceUrl":"https:\/\/api.hwnovel.com","bookSourceType":"0","bookSourceName":"💰 次元姬","bookSourceGroup":"💰 正版","bookSourceComment":"使用:先输入手机号然后点√发送验证码,后输入验证码登陆\n注意:若发现出现错误,请重新打开关闭发现页\n支持:验证码登陆|购买|签到|发现|书架","loginUrl":"<js>\nvar username = String(source.getLoginInfoMap().get(\"手机号\"))\nvar passwd = String(source.getLoginInfoMap().get(\"验证码\"))\n\/\/ 工具类\nvar md5Key = 'NpkTYvpvhJjEog8Y051gQDHmReY54z5t3F0zSd9QEFuxWGqfC8g8Y4GPuabq0KPdxArlji4dSnnHCARHnkqYBLu7iIw55ibTo18'\nvar desKey = Packages.java.lang.String('ZUreQN0Epkpxh3pooWOgixjTfPwumCTYWzYTQ7SMgDnqFLQ1s9tqpVhkGf02we89moQwhSQ07DVzc3LWupRgbVvm29aYeY7zyFN').getBytes('UTF_8')\nvar des = Packages.cn.hutool.crypto.symmetric.DES(\"ECB\",\"PKCS5Padding\", desKey)\nif(!username) throw new Error(\"请输入手机号\")\n\/\/ 发送验证码\nif(username != 0 && passwd == 0) {\n  let timestamp = Date.now()\n  let requestId = java.randomUUID().replace('-','')\n  let param = des.encryptBase64(JSON.stringify({phone: username,smsType: \"1\",timestamp: timestamp}))\n  let sign = String(java.digestHex(java.base64Encode(`param=${param}&requestId=${requestId}&timestamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\n  let data = JSON.stringify({\n    param: param,\n    requestId: requestId,\n    sign: sign,\n    timestamp: timestamp\n  })\n  let op = JSON.stringify({ method: \"POST\", body: data })\n  let res = JSON.parse(java.ajax(`https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/login\/getPhoneCode,${op}`))\n  if(res.code != '200') throw new Error(res.msg)\n  java.toast(\"验证码已发送，请输入验证码登录\")\n}\n\/\/ 验证码登录\nif(username != 0 && passwd != 0) {\n  let timestamp = Date.now()\n  let requestId = java.randomUUID().replace('-','')\n  let param = des.encryptBase64(JSON.stringify({phone: username,phoneCode: passwd,timestamp: timestamp}))\n  let sign = String(java.digestHex(java.base64Encode(`param=${param}&requestId=${requestId}&timestamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\n  let data = JSON.stringify({\n    param: param,\n    requestId: requestId,\n    sign: sign,\n    timestamp: timestamp\n  })\n  let op = JSON.stringify({ method: \"POST\", body: data})\n  let res = JSON.parse(java.ajax(`https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/login\/phone,${op}`))\n  if(res.code != '200') throw new Error(res.msg)\nlet userInfo = res.data.userInfo source.putLoginHeader(JSON.stringify({ \"token\": userInfo.token}))\n  java.toast(\"登陆成功\")\n}\n<\/js>","loginUi":"[\n  {\n    \"name\": \"手机号\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"验证码\",\n    \"type\": \"text\"\n  }\n]","loginCheckJs":"","concurrentRate":"","header":"@js: \n(()=>{\n  var deviceno = java.androidId()\n  return JSON.stringify({\n    \"deviceno\":deviceno,\n    \"imei\": \"\",\n    \"targetmodel\": \"\",\n    \"platform\":\"1\",\n    \"channel\": \"1\",\n    \"version\": \"3.2.5\",\n    \"oaid\": \"\",\n    \"token\": \"\"\n  })\n})()","bookUrlPattern":"","searchUrl":"<js>\n(()=>{\nvar desKey = Packages.java.lang.String('ZUreQN0Epkpxh3pooWOgixjTfPwumCTYWzYTQ7SMgDnqFLQ1s9tqpVhkGf02we89moQwhSQ07DVzc3LWupRgbVvm29aYeY7zyFN').getBytes('UTF_8')\nvar des = Packages.cn.hutool.crypto.symmetric.DES(\"ECB\",\"PKCS5Padding\", desKey)\nvar md5Key = 'NpkTYvpvhJjEog8Y051gQDHmReY54z5t3F0zSd9QEFuxWGqfC8g8Y4GPuabq0KPdxArlji4dSnnHCARHnkqYBLu7iIw55ibTo18'\nvar timestamp = Date.now()\nvar requestId = java.randomUUID().replace('-','')\nvar param = des.encryptBase64(JSON.stringify({'keyword': key, 'pageNo': 1, 'pageSize': 15,'rankType':'0','timestamp': timestamp}))\nvar sign = String(java.digestHex(java.base64Encode(`param=${param}&requestId=${requestId}&timestamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/book\/searchBookList?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}&param=${encodeURIComponent(param)}`\n})()\n<\/js>","exploreUrl":"<js>\nfunction getParams(params,isPost){\n let desKey = Packages.java.lang.String('ZUreQN0Epkpxh3pooWOgixjTfPwumCTYWzYTQ7SMgDnqFLQ1s9tqpVhkGf02we89moQwhSQ07DVzc3LWupRgbVvm29aYeY7zyFN').getBytes('UTF_8')\n let des = Packages.cn.hutool.crypto.symmetric.DES(\"ECB\",\"PKCS5Padding\", desKey)\n let md5Key = 'NpkTYvpvhJjEog8Y051gQDHmReY54z5t3F0zSd9QEFuxWGqfC8g8Y4GPuabq0KPdxArlji4dSnnHCARHnkqYBLu7iIw55ibTo18'\n let timestamp = Date.now()\n let requestId = java.randomUUID().replace('-','')\n let param = des.encryptBase64(JSON.stringify(Object.assign(params,{'timestamp': timestamp})))\n let sign = String(java.digestHex(java.base64Encode(`param=${param}&requestId=${requestId}&timestamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\n let data = JSON.stringify({\n    param: param,\n    requestId: requestId,\n    sign: sign,\n    timestamp: timestamp\n })\n return isPost? JSON.stringify({ method: \"POST\", body: data }) :`timestamp=${timestamp}&requestId=${requestId}&sign=${sign}&param=${encodeURIComponent(param)}`\n}\nlet style1 = {\"layout_flexGrow\": 0,\"layout_flexBasisPercent\": 1}\nlet style2 = {\"layout_flexGrow\": 0.25,\"layout_flexBasisPercent\": -1}\nlet style3 = {\"layout_flexGrow\": 0,\"layout_flexBasisPercent\": 0.29}\nlet findList = [{\"title\": \"༺个人中心༺ \",\"url\": '',\"style\": style1},{\"title\": \"每日签到\",\"url\": `https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/sign\/sign,${getParams({},true)}`,\"style\": style2},{\"title\": \"个人书架\",\"url\": `https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/bookrack\/getUserBookRackList?${getParams({\"pageNo\":1,\"pageSize\":9999},false)}`,\"style\": style2}]\nfindList.push({\"title\": \"༺男生分类༺ \",\"url\": '',\"style\": style1})\n\/\/ bookType: 1 代表男生. bookType: 4 代表女生\n\/\/ 获取男生分类\nres = JSON.parse(java.ajax(`https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/classify\/getBookClassifyListByParams?${getParams({\"classifyId\":0,\"pageNo\":1,\"pageSize\":99,\"bookType\":\"1\"},false)}`))\nres.data.classifyList.forEach(o=> {\n  let params1 = getParams({\"firstClassify\":o.classifyId,\"rankType\":\"1\",\"pageNo\": 1,\"pageSize\": 30,\"bookType\":\"1\"},false)\n  findList.push({\"title\": o.classifyName, \"url\": `https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/book\/getBookListByParams?${params1}`,\"style\": style1})\n  let len =  o.childList.length\n  len>1&&o.childList.forEach((c,i)=>{\n  \t   let params2 = getParams({\"firstClassify\":o.classifyId,\"rankType\":\"1\",\"pageNo\": 1,\"pageSize\": 30,\"bookType\":\"1\",\"secondClassify\":c.classifyId},false)\n  \t  let style=i==len-1?style3:style2\n    findList.push({\"title\":c.classifyName, \"url\": `https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/book\/getBookListByParams?${params2}`,\"style\":style})\n  \t})\n})\n\/\/ 获取男生标签\nfindList.push({\"title\": \"༺ 男生标签༺\",\"url\": '',\"style\": style1})\nres = JSON.parse(java.ajax(`https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/tag\/getAppTagList?${getParams({\"pageNo\":1,\"pageSize\":99,\"bookType\":\"1\"},false)}`))\nlet tagLen =  res.data.list.length\nres.data.list.forEach((o,i)=> {\n  let params = getParams({\"tagId\":o.tagId,\"rankType\":\"1\",\"pageNo\": 1,\"pageSize\": 30,\"bookType\":\"1\"},false)\n  let style=i==tagLen-1?style3:style2\n  findList.push({\"title\": o.tagName, \"url\": `https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/book\/getBookListByTagId?${params}`,\"style\": style})\n})\nJSON.stringify(findList)\n<\/js>","enabled":true,"enabledExplore":true,"weight":0,"customOrder":4,"lastUpdateTime":1661775473067,"ruleSearch":{"bookList":"$.data.esBookList[*]","name":"$.bookName","author":"$.authorName","kind":"{{$.tagName}}\n{{java.getString('endState')=='1'?'已完结':'连载中'}}\n{{java.getString('isFee')=='0'?'免费':'付费'}}","wordCount":"$.wordCount","lastChapter":"{{$.latestChapterName}} • {{$.latestUpdateTime##\\s.*}}","intro":"$.notes","coverUrl":"$.imgUrl","bookUrl":"<js>\n(()=>{\nvar desKey = Packages.java.lang.String('ZUreQN0Epkpxh3pooWOgixjTfPwumCTYWzYTQ7SMgDnqFLQ1s9tqpVhkGf02we89moQwhSQ07DVzc3LWupRgbVvm29aYeY7zyFN').getBytes('UTF_8')\nvar des = Packages.cn.hutool.crypto.symmetric.DES(\"ECB\",\"PKCS5Padding\", desKey)\nvar md5Key = 'NpkTYvpvhJjEog8Y051gQDHmReY54z5t3F0zSd9QEFuxWGqfC8g8Y4GPuabq0KPdxArlji4dSnnHCARHnkqYBLu7iIw55ibTo18'\nvar timestamp = Date.now()\nvar requestId = java.randomUUID().replace('-','')\nvar param = des.encryptBase64(JSON.stringify({'bookId': java.getString('bookId'),'timestamp': timestamp}))\nvar sign = String(java.digestHex(java.base64Encode(`param=${param}&requestId=${requestId}&timestamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/book\/getBookDetail?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}&param=${encodeURIComponent(param)}`\n})()\n<\/js>"},"ruleExplore":{"bookList":"$.data.bookList[*]||$.data.list[*]||$.data.bookRackList[*]||$.data.signTask.rewardList[*]","name":"$.bookName||$.rewardName","author":"$.authorName","kind":"{{$.tagName}}\n{{java.getString('endState')=='1'?'已完结':'连载中'}}\n{{java.getString('isFee')=='0'?'免费':'付费'}}","wordCount":"$.wordCount","lastChapter":"{{$.latestChapterName}}{{java.getString(\"$.latestChapterName\")!=''?'•':''}}{{$.latestUpdateTime##\\s.*}}","intro":"$.notes","coverUrl":"$.imgUrl||$.rewardIcon","bookUrl":"<js>\n(()=>{\nvar desKey = Packages.java.lang.String('ZUreQN0Epkpxh3pooWOgixjTfPwumCTYWzYTQ7SMgDnqFLQ1s9tqpVhkGf02we89moQwhSQ07DVzc3LWupRgbVvm29aYeY7zyFN').getBytes('UTF_8')\nvar des = Packages.cn.hutool.crypto.symmetric.DES(\"ECB\",\"PKCS5Padding\", desKey)\nvar md5Key = 'NpkTYvpvhJjEog8Y051gQDHmReY54z5t3F0zSd9QEFuxWGqfC8g8Y4GPuabq0KPdxArlji4dSnnHCARHnkqYBLu7iIw55ibTo18'\nvar timestamp = Date.now()\nvar requestId = java.randomUUID().replace('-','')\nvar param = des.encryptBase64(JSON.stringify({'bookId': java.getString('bookId'),'timestamp': timestamp}))\nvar sign = String(java.digestHex(java.base64Encode(`param=${param}&requestId=${requestId}&timestamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/book\/getBookDetail?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}&param=${encodeURIComponent(param)}`\n})()\n<\/js>"},"ruleBookInfo":{"init":"$.data.book","name":"$.bookName","author":"$.authorName","kind":"{{java.getStringList('tagList').toArray().map(v=>v.match(\/tagName=(.*),\/)[1]).join()}}\n{{java.getString('endState')=='1'?'已完结':'连载中'}}\n{{java.getString('isFee')=='0'?'免费':'付费'}}","wordCount":"$.wordCount","lastChapter":"$.latestChapterName","intro":"$.notes","coverUrl":"$.imgUrl","tocUrl":"<js>\n(()=>{\nvar desKey = Packages.java.lang.String('ZUreQN0Epkpxh3pooWOgixjTfPwumCTYWzYTQ7SMgDnqFLQ1s9tqpVhkGf02we89moQwhSQ07DVzc3LWupRgbVvm29aYeY7zyFN').getBytes('UTF_8')\nvar des = Packages.cn.hutool.crypto.symmetric.DES(\"ECB\",\"PKCS5Padding\", desKey)\nvar md5Key = 'NpkTYvpvhJjEog8Y051gQDHmReY54z5t3F0zSd9QEFuxWGqfC8g8Y4GPuabq0KPdxArlji4dSnnHCARHnkqYBLu7iIw55ibTo18'\nvar timestamp = Date.now()\nvar requestId = java.randomUUID().replace('-','')\nvar param = des.encryptBase64(JSON.stringify({\"sortType\":\"1\",\"pageNo\":\"1\",\"pageSize\":\"9999\",\"bookId\": java.put('bookId',java.getString('bookId')),\"timestamp\": timestamp}))\nvar sign = String(java.digestHex(java.base64Encode(`param=${param}&requestId=${requestId}&timestamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/chapter\/getChapterListByBookId?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}&param=${encodeURIComponent(param)}`\n})()\n<\/js>"},"ruleToc":{"chapterList":"$.data.bookChapter.chapterList[*]","chapterName":"$.chapterName","chapterUrl":"<js>\n(()=>{\nvar desKey = Packages.java.lang.String('ZUreQN0Epkpxh3pooWOgixjTfPwumCTYWzYTQ7SMgDnqFLQ1s9tqpVhkGf02we89moQwhSQ07DVzc3LWupRgbVvm29aYeY7zyFN').getBytes('UTF_8')\nvar des = Packages.cn.hutool.crypto.symmetric.DES(\"ECB\",\"PKCS5Padding\", desKey)\nvar md5Key = 'NpkTYvpvhJjEog8Y051gQDHmReY54z5t3F0zSd9QEFuxWGqfC8g8Y4GPuabq0KPdxArlji4dSnnHCARHnkqYBLu7iIw55ibTo18'\nvar timestamp = Date.now()\nvar requestId = java.randomUUID().replace('-','')\nvar param = des.encryptBase64(JSON.stringify({\"bookId\":java.get('bookId'),\"chapterId\":java.getString('chapterId'),\"timestamp\":timestamp}))\nvar sign = String(java.digestHex(java.base64Encode(`param=${param}&requestId=${requestId}&timestamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/chapter\/getChapterContent?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}&param=${encodeURIComponent(param)}`\n})()\n<\/js>","isVip":"$.isFee","isPay":"$.isBuy","updateTime":"更新时间 {{$.publishTime}}\n字数 {{$.wordCount}}"},"ruleContent":{"content":"<js>\nvar desKey = Packages.java.lang.String('ZUreQN0Epkpxh3pooWOgixjTfPwumCTYWzYTQ7SMgDnqFLQ1s9tqpVhkGf02we89moQwhSQ07DVzc3LWupRgbVvm29aYeY7zyFN').getBytes('UTF_8')\nlet content=Packages.cn.hutool.crypto.symmetric.DES(\"ECB\",\"PKCS5Padding\", desKey).decryptStr(java.base64DecodeToByteArray(java.getString(\"data.chapter.content\")))\nlet isBuy = java.getString(\"data.isBuy\")=='0'\nlet isFee = java.getString(\"data.isFee\")=='0'\nlet price = java.getString(\"data.price\")\nlet payText = `\\n本章是VIP章节，购买后才能阅读\\n本章需要${price}币`\nisBuy&&!isFee ? content + payText  : content\n<\/js>","payAction":"var desKey = Packages.java.lang.String('ZUreQN0Epkpxh3pooWOgixjTfPwumCTYWzYTQ7SMgDnqFLQ1s9tqpVhkGf02we89moQwhSQ07DVzc3LWupRgbVvm29aYeY7zyFN').getBytes('UTF_8')\nvar des = Packages.cn.hutool.crypto.symmetric.DES(\"ECB\",\"PKCS5Padding\", desKey)\nlet md5Key = 'NpkTYvpvhJjEog8Y051gQDHmReY54z5t3F0zSd9QEFuxWGqfC8g8Y4GPuabq0KPdxArlji4dSnnHCARHnkqYBLu7iIw55ibTo18'\nlet urlParam = JSON.parse(des.decryptStr(java.base64DecodeToByteArray(decodeURIComponent(chapter.url.match(\/param=(.*)$\/)[1]))))\nlet timestamp = Date.now()\nlet requestId = java.randomUUID().replace('-','')\nvar bookId = urlParam.bookId\nvar chapterId = urlParam.chapterId\nlet param = des.encryptBase64(JSON.stringify({\"viewType\":\"2\",\"consumeType\":\"1\",\"bookId\":bookId,\"productId\":chapterId,\"buyCount\":\"1\",\"timestamp\":timestamp}))\nlet sign = String(java.digestHex(java.base64Encode(`param=${param}&requestId=${requestId}&timestamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nlet data = JSON.stringify({\n    param: param,\n    requestId: requestId,\n    sign: sign,\n    timestamp: timestamp\n})\nlet op = JSON.stringify({ method: \"POST\", body: data })\nlet res = JSON.parse(java.ajax(`https:\/\/api.hwnovel.com\/api\/ciyuanji\/client\/order\/consume,${op}`))\nif(res.code != '200'){\n java.toast(res.msg)\n throw new Error(res.msg)\n}\njava.toast(\"购买成功,请手动刷新章节列表及内容\")"}}]