💰 次元姬
https://api.hwnovel.com
采集机器人 (2)2023/04/06
该用户很懒,什么介绍也没有写!
{ "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}×tamp=${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}×tamp=${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}×tamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/book\/searchBookList?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}¶m=${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}×tamp=${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}¶m=${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}×tamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/book\/getBookDetail?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}¶m=${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}×tamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/book\/getBookDetail?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}¶m=${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}×tamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/chapter\/getChapterListByBookId?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}¶m=${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}×tamp=${timestamp}&key=${md5Key}`),'md5')).toUpperCase()\nreturn `\/api\/ciyuanji\/client\/chapter\/getChapterContent?timestamp=${timestamp}&requestId=${requestId }&sign=${sign}¶m=${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}×tamp=${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(\"购买成功,请手动刷新章节列表及内容\")" } }