🍅 团夕番茄
https://reading.snssdk.com#0
tuanxi (12142)2天前
番茄的缘
{
"bookSourceComment": "\n\n## 添加搜索不到的书籍:\nhttps:\/\/reading.snssdk.com\/reading\/bookapi\/detail\/v\/?book_id=【书籍ID】\n\n\n## 调试测试\nhttps:\/\/www.baidu.com\/删书示例?book_id=7285555567827880975\n\nhttps:\/\/www.baidu.com\/插图示例?book_id=7193358363978107963\n\nhttps:\/\/www.baidu.com\/漫画示例?book_id=7225884766417980473\n\nhttps:\/\/www.baidu.com\/有声示例?book_id=7268163868831173694",
"bookSourceGroup": "🍅",
"bookSourceName": "🍅 团夕番茄",
"bookSourceType": 0,
"bookSourceUrl": "https:\/\/reading.snssdk.com#0",
"bookUrlPattern": "https?:\/\/.*(fqnovel|snssdk|fanqienovel|changdunovel)\\.com\/.*[0-9]{19}.*",
"customOrder": 0,
"enabled": true,
"enabledCookieJar": false,
"enabledExplore": true,
"exploreUrl": "@js:\n个人中心 = 1;\n\nfaxian=source.getVariable()\nvar type = getArguments('type');\n\njs = (cid, genre_type, gender) => `@js:\nxGorgon(\n \"new_category\/landing\",\n \"category_id=${cid}&gender=${gender}&genre_type=${genre_type}&offset=0&aid=1967&app_name=novelapp&channel=0&device_platform=android&os_version=0&version_code=69132&update_version_code=69132&manifest_version_code=69132&version_name=6.9.1.32&&device_type=Honor10&limit=100&page_version=1\"\n)`\n\ntt_rank_books = (url) => `@js:\n let ck = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source. getLoginInfoMap() || {})['手动登录Token'])\n let list = JSON.parse(java.ajax('${url}')).data.result;\n let book_ids = [];\n for (let i of list) book_ids.push(i.book_id)\n xGorgon(\n \"multi-detail\",\n \"book_id=\" + book_ids.slice(0, 100).join(','),\n null,\n ck,\n )\n`\n\n\nfunction extractQueryParams(input) {\n let genreType = '';\n let gender = '';\n const genreTypeMatch = input.match(\/[?&]genreType=([^&]+)\/);\n if (genreTypeMatch && genreTypeMatch[1]) {\n genreType = decodeURIComponent(genreTypeMatch[1]);\n }\n const genderMatch = input.match(\/[?&]gender=([^&]+)\/);\n if (genderMatch && genderMatch[1]) {\n gender = decodeURIComponent(genderMatch[1]);\n }\n return [genreType, gender];\n}\n\nobj = (title, url, type, type1) => ({\n title: title,\n url: url,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: type\n }\n})\n\n\nlet toutiao_rank_info = JSON.parse(java.ajax('https:\/\/novel.snssdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?need_type=1&offset=0&side_type=10&type=1&aid=1319') || '{\"data\":{\"type\":{\"type\":[]}}}').data.type.type\ntoutiao_rank = (index) => {\n let rank_list = toutiao_rank_info[index] || []\n let ret = []\n if (rank_list) {\n ret.push(obj(i.name + '榜', '', 1))\n for (let j of rank_list.rank_list) {\n ret.push(obj(j.name, 'https'))\n }\n }\n}\narr = []\njava.longToast(\"请稍等,发现列表正在热更新!\")\nlet index = [];\nif (faxian.match(\/漫画\/)) {\n index = [5];\n} else if (faxian.match(\/听书\/)) {\n index = [3];\n} else if (faxian.match(\/短剧\/)) {\n index = [6];\n} else {\n index = [0, 1, 2];\n}\nfor (let i of index) {\n \/\/ java.toast(i)\n let type = i\n $ = JSON.parse(java.ajax(xGorgon(\n \"new_category\/front\",\n `distinct_style=1&aid=1967&app_name=novelapp&channel=0&device_platform=android&os_version=0&version_code=69132&update_version_code=69132&manifest_version_code=69132&version_name=6.9.1.32&new_category_tab=${i}&device_type=Honor10`\n ))).data.category_tab_data\n cate = []\n cate.push(obj(\n \"====== \" + $.tab_name + \" ======\", \"\", 1\n ))\n $.cell_data.forEach((c) => {\n let [genreType, gender] = extractQueryParams(c.atom_data[0].category_data.category_landpage_url);\n cate.push(obj(\n c.cell_name,\n js(c.atom_data[0].category_data.category_id, genreType, gender),\n 1\n ))\n for (j = 2; j < 5; j++) {\n c.atom_data.slice(1).forEach((a) => {\n d = a.category_data\n if (d.name.length == j) {\n let \t[genreType2, gender2] = extractQueryParams(d.category_landpage_url)\n cate.push(obj(d.name, js(d.category_id, genreType2, gender2), 0.25))\n }\n })\n }\n })\n arr = cate.concat(arr)\n}\n\nget = (path) => `@js:\nlet ck = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['手动登录Token'])\n\nlet v = xGorgon(\n \"${path}\",\n \"offset=\" + (page - 1) * 20,\n null,\n ck,\n)\n\nxGorgon(\n \"multi-detail\",\n \"book_id=\" + getBookId(java.ajax(v)),\n null,\n ck,\n)`\n\nlet book_shelf_url = 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=57700&update_version_code=57700'\nlet book_shelf_info = JSON.parse(java.ajax(book_shelf_url + ', ' + JSON.stringify({\n headers: {\n 'Cookie': \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['手动登录Token']),\n }\n})))\n\njava.log(JSON.stringify(book_shelf_info))\n\nlet username\nif (book_shelf_info.code != 0) {\n 个人中心 = 0\n} else {\n let uinfo = java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({ headers: { Cookie: \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['手动登录Token']) } }))\n uinfo = JSON.parse(uinfo)\n username = uinfo.data.name\n}\n\nlet gro = []\npush = (title, url, type) => gro.push({\n title: title,\n url: url,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: type\n }\n});\n\nlet sArr = []\n\nif (个人中心) {\n let groups_bookids = {\n \"未分组\": []\n }\n book_shelf_info.data.book_shelf_info.forEach(i => {\n if (!groups_bookids[i.group_name ? i.group_name : \"未分组\"]) groups_bookids[i.group_name] = []\n groups_bookids[i.group_name ? i.group_name : \"未分组\"].push(i.book_id)\n })\n\n Object.keys(groups_bookids).forEach(k => {\n var multi_detail_post_body = {\n data: {\n book_shelf_info: []\n }\n }\n groups_bookids[k].forEach(i => multi_detail_post_body.data.book_shelf_info.push({ book_id: String(i), item_id: '0' }))\n \/\/ var multi_detail_group_url = `https:\/\/fanqienovel.com\/api\/bookshelf\/multidetail,${JSON.stringify(multi_detail_post_body)}`\n \/\/ var book_ids = getBookId(JSON.stringify(multi_detail_post_body)).join(\",\")\n push(k, \"https:\/\/fanqienovel.com\/fqbookshelf\/groupName\/\" + k, 0.4)\n })\n if (Object.keys(groups_bookids).length % 2 != 0) push(\"占位\", \"\", 0.4)\n \/\/ java.log(JSON.stringify(gro, null, 2))\n sArr.push(obj(username + '的个人中心', '', 1))\n sArr.push(obj('首页推荐', \"https:\/\/fanqienovel.com\/tab\/0\", 0.4))\n sArr.push(obj('猜你喜欢', \"https:\/\/fanqienovel.com\/tab\/2\", 0.4))\n \/\/ sArr.push(obj('猜你喜欢', \"https:\/\/fanqienovel.com\/tab\/1\", 0.4))\n sArr.push(obj(\"我的书架\", \"https:\/\/fanqienovel.com\/fqbookshelf\", 1))\n \n sArr = sArr.concat(gro)\n \/\/ java.toast(JSON.stringify(sArr)) \n sArr.push(obj(\"阅读历史\", get(\"read_history\/list\"), 1))\n}\n\narr = sArr.concat(arr)\nJSON.stringify(arr)",
"jsLib": "getHost = (a, b, c, d) => [\n [\"https:\/\/\"][0],\n [\n \"reading\",\n \"api\",\n \"api3\",\n \"api5\",\n \"novel\",\n \"\",\n ][(a == 4 ? 5 : b) || 0],\n [\n \"\",\n \"-normal\",\n ][c || 0],\n [\n \"\",\n \"-hl\",\n \"-lf\",\n \"-lq\",\n \"-sinfonlinea\",\n \"-sinfonlineb\",\n \"-sinfonlinec\",\n ][d || 0],\n [\".\", \"\"][a == 4 ? 1 : 0],\n [\n \"snssdk\",\n \"fqnovel\",\n \"fanqiesdk\",\n \"toutiaoapi\",\n \"fanqienovel\",\n ][a || 0],\n [\".com\"][0],\n].join(\"\");\njavaImport = new JavaImporter()\njavaImport.importPackage(\n Packages.okhttp3,\n Packages.cn.hutool.core.util,\n Packages.cn.hutool.core.codec,\n Packages.cn.hutool.crypto.digest\n)\nwith(javaImport) {\n \/\/POST请求\n function post(url, body, map) {\n let json = MediaType.parse(\"application\/json\");\n let request = new Request.Builder()\n .url(url)\n .post(RequestBody.create(body, json));\n if (map) {\n request.addHeader(\"Content-Encoding\", \"gzip\");\n for (let n in map) {\n request.addHeader(n, map[n]);\n }\n }\n let client = new OkHttpClient();\n let response = client.newCall(request.build()).execute();\n return JSON.parse(response.body().string());\n }\n\n function okhttpGet(url, map) {\n const { java } = this\n let request = new Request.Builder()\n .url(url)\n .get();\n if (map) {\n request.addHeader(\"Content-Encoding\", \"gzip\");\n for (let n in map) {\n request.addHeader(n, map[n]);\n }\n }\n java.log(\"okhttp: \" + url + \", headers=\" + JSON.stringify(map))\n let client = new OkHttpClient();\n let response = client.newCall(request.build()).execute();\n return JSON.parse(response.body().string());\n }\n \n function okhttpWithHeaders(url, map) {\n const { java } = this\n let request = new Request.Builder()\n .url(url)\n .get();\n if (map) {\n request.addHeader(\"Content-Encoding\", \"gzip\");\n for (let n in map) {\n request.addHeader(n, map[n]);\n }\n }\n java.log(\"okhttp: \" + url + \", headers=\" + JSON.stringify(map))\n let client = new OkHttpClient();\n let response = client.newCall(request.build()).execute();\n let headers = {}\n let names = response.headers().names()\n names.forEach((k) => {\n headers[k] = response.headers().get(k)\n })\n return {\n body: JSON.parse(response.body().string()),\n headers: headers\n }\n }\n\n \/\/Base64编码\n let b64En = (b64) => Base64.encode(b64);\n\n \/\/Base64解码\n let b64De = (b64) => Base64.decode(b64);\n \n function gzip(data) { ZipUtil.gzip(data, \"\") }\n\n \/\/X-Gorgon参数\n function xGorgon(path, params, data, ck) {\n const { java, source } = this;\n params = [\n params,\n \"aid=1967\",\n \"channel=0\",\n \"os_version=0\",\n \"app_name=novelapp\",\n \"version_code=58932\",\n \"device_platform=android\",\n \"device_type=unknown\",\n ].join(\"&\").split(\"&\").sort().join(\"&\").replace(\/^&+\/, \"\");\n if (!data) {\n path = \"\/reading\/bookapi\/\" + path + \"\/v\/?\";\n }\n let url = getHost() + path + params;\n let devtype\n for (let i of (source.getLoginHeader() || '').split('&')) {\n \/\/ java.log(i)\n if (i.startsWith('device_type')) {\n \/\/ java.log(i)\n devtype = i.split('=')[1]\n }\n }\n\n\n \/\/md5加密\n let md5 = (str) => DigestUtil.md5Hex(str);\n\n \/\/反转字符串\n let rStr = (str) => StrUtil.reverse(str);\n\n \/\/10转16进制\n let Hex = (num) => num.toString(16).padStart(2, \"0\");\n\n \/\/反转16进制\n let rHex = (num) => parseInt(rStr(Hex(num)), 16);\n\n \/\/反转2进制\n function rBin(num) {\n let bin = num.toString(2).padStart(8, \"0\");\n return parseInt(rStr(bin), 2);\n }\n\n \/\/运算\n function getHex(ck) {\n let hex = md5(params)\n hex += data ? md5(data) : \"0\".repeat(8)\n hex += ck ? md5(ck) : \"0\".repeat(8)\n return hex\n }\n\n function calculate(hex, ck) {\n let len = 0x14;\n let key = [0xDF, 0x77, 0xB9, 0x40, 0xB9, 0x9B, 0x84, 0x83, 0xD1, 0xB9, 0xCB, 0xD1, 0xF7, 0xC2, 0xB9, 0x85, 0xC3, 0xD0, 0xFB, 0xC3];\n let paramList = [];\n for (let i = 0; i < 9; i += 4) {\n let temp = hex.substring(8 * i, 8 * (i + 1));\n for (let j = 0; j < 4; j++) {\n let h = parseInt(temp.substring(j * 2, (j + 1) * 2), 16);\n paramList.push(h);\n }\n }\n paramList.push(0x0, 0x6, 0xB, 0x1C);\n let T = Math.floor(Date.now() \/ 1000);\n paramList.push((T >> 24) & 0xFF, (T >> 16) & 0xFF, (T >> 8) & 0xFF, T & 0xFF);\n \/\/异或\n let eorResultList = []\n for (let i = 0; i < paramList.length; i++) {\n eorResultList.push(paramList[i] ^ key[i % len]);\n }\n for (let A, B, C, D, i = 0; i < len; i++) {\n A = rHex(eorResultList[i]);\n B = eorResultList[(i + 1) % len];\n C = rBin(A ^ B);\n D = ((C ^ 0xFFFFFFFF) ^ len) & 0xFF;\n eorResultList[i] = D;\n }\n let result = \"\"\n for (let param of eorResultList) {\n result += Hex(param);\n }\n let option = {\n \"headers\": {\n \"X-Khronos\": String(T),\n \"X-Gorgon\": \"0404b0d30000\" + result,\n \"User-Agent\": 'com.dragon.read',\n \"Cookie\": ck ? ck : \"\"\n }\n }\n let b_ = option\n b_[\"body\"] = String(data ? data : \"\")\n java.log(url + \",\" + JSON.stringify(b_))\n if (data) {\n return post(url, data, option.headers).data;\n } else {\n return url + \",\" + JSON.stringify(option);\n }\n }\n return calculate(getHex(ck), ck);\n }\n}\n\nfunction getBookId(url) {\n\tconst {java} = this\n\tlet $ = JSON.parse(url).data\n\tlet arr, list\n\tif ($.book_shelf_info != 0 && $.book_shelf_info != undefined) {\n\t\tarr = $.book_shelf_info.map($ => $.book_id)\n\t} else if (list = $.data_list != 0 && $.data_list != undefined) {\n\t\tarr = $.data_list.map($ => $.book_id_str)\n\t} else {\n\t\tjava.toast(\"获取 book_id 失败,你可能需要登录!\")\n\t}\n\treturn arr.slice(0, 100)\n}\n\nfunction getBookIdFull(url) {\n\tconst {java} = this\n\tlet $ = JSON.parse(url).data\n let arr, list\n\tif ($.book_shelf_info != 0 && $.book_shelf_info != undefined) {\n\t\tarr = $.book_shelf_info.map($ => $.book_id)\n\t} else if (list = $.data_list != 0 && $.data_list != undefined) {\n\t\tarr = $.data_list.map($ => $.book_id_str)\n\t} else {\n\t\tjava.toast(\"获取 book_id 失败,你可能需要登录!\")\n\t}\n\treturn arr\n}\n\nfunction splitArray(input, size) {\n const output = []\n for (let i = 0; i < input.length; i += size) {\n output.push(input.slice(i, i + size))\n }\n return output\n}\n\nlet replaceCover = (u) => {\n if (u.startsWith(\"https:\/\/\")) u = u.substring(8)\n else u = u.substring(7)\n let uArr = u.split(\"\/\")\n uArr[0] = \"https:\/\/p6-novel.byteimg.com\/origin\"\n let uArr2 = []\n uArr.forEach((x) => {\n if (!x.includes(\"?\") && !x.includes(\"~\")) uArr2.push(x)\n else uArr2.push(x.split(\"~\")[0])\n })\n u = uArr2.join(\"\/\")\n return u\n}\n\n\n\n\nfunction getApi() {\n return \"http:\/\/nove.98tx.cn\";\n}\n\nfunction getServerHost() {\n let { source } = this;\n try {\n const config = JSON.parse(source.getVariable());\n if (Array.isArray(config) && config.length > 0) {\n return config[0]?.host || getApi();\n } \n else if (config && typeof config === \"object\") {\n return config.server || getApi();\n }\n return getApi();\n } catch(e) {\n return getApi();\n }\n}\n\n\n\n\n\n\n\n\n\n\n\/\/发现页配套规则\n\nconst host = [\n\"http:\/\/nove.98tx.cn\",\n\"http:\/\/noca.98tx.cn\",\n]\n\nfunction get_key(cookie){\nlet key;\nkey = cookie.split('secretKey2=');\nkey = key[key.length-1];\nreturn key;\n}\n\n\n\nfunction \ngetArguments(open_argument,key) {\n try {\n open_argument = JSON.parse(open_argument);\n } catch (e) {\n const serverList = host;\n open_argument = {\n \t\n \t\n\t\"search\": \"-1\",\n\t\"tone_id\": \"-1\",\n\t\"sz\": \"0\",\n\t\"server\": \"http:\/\/nove.98tx.cn\",\n\t\"tone\": \"\",\n\t\"st\": 0,\n\t\"type\": \"小说模式\",\n\t\"module\": \"3\",\n\t\"faxian\": \"小说\"\n\t\n\n };\n }\n if (key) {return open_argument[key];} else {return open_argument}\n}\n\n",
"lastUpdateTime": "1768492948512",
"loginUi": "[\n\n{\n name: \"手动登录Token\",\n type: \"text文字关闭\",\n action: \"\"\n},\n\n {\n 'name': '👥书源反馈👥',\n 'type': 'button',\n \"action\":\"http:\/\/blog.98tx.cn\", \n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1.4\n }\n },\n \n\n{\n \"name\":\"💮团夕小站💮\",\n \"type\": \"button\",\n \"action\": \"getKey()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n },\n\n\n {\n 'name': '👥加入群聊 👥',\n 'type': 'button',\n \"action\":\"https:\/\/qun.qq.com\/universal-share\/share?ac=1&authKey=PVmKtvawKonFt3SMEc912mUzpv71goOVoByeymijGE9pYQDVh0Cetj5viiZfXGAE&busi_data=eyJncm91cENvZGUiOiIxNjUxNTk4IiwidG9rZW4iOiJWbkhEQ1JnTXM3cW5CQWIwWm8xYno5Y1hEZDJTUmQ1Y2JOMElRS3FSRHhUdXM5Q3cwM1BVOW41c09lUlRGcWRVIiwidWluIjoiMjYyMTYyOTQ1NiJ9&data=paLnLOcOse1qFhjVyLnrVdTpycgUXqSF3sS79bkANpiFI9f0f0hl93XsxGAfMHlmH22YDfgVVrOhs67qtdxlig&svctype=4&tempid=h5_group_info\", \n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n },\n \n\n \n \n{\n\t\"name\": \"☕️赞助服务器☕️\",\n \"type\": \"button\", \n \"action\":\"zz()\", \n \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4\n}\n},\n\n\n\n{\n\t\"name\": \"🐰接口文档🐰\",\n \"type\": \"button\", \n \"action\":\"发布页()\", \n \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4\n}\n},\n\n\n{\n\tname: \" ❓登录检查❓ \",\n\ttype: \"button\",\n\taction: \"l2(false, true)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1.4\n }\n},\n\n \n\n\n\n{\n\tname: \"🍅账号登录🍅\",\n\ttype: \"button\",\n\taction: \"l2(true)\",\n\t \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n},\n{\n\tname: \"❗️退出登录❗️\",\n\ttype: \"button\",\n\taction: \"logout()\",\n\t \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n},\n\n {\n\tname: \"🎚服务器检查🎚 \",\n\ttype: \"button\",\n\taction: \"out()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1.4\n }\n},\n\n\n\n\n\n\n\n{\n \"name\": \"🎚切换服务器🎚\",\n \"type\": \"button\",\n \"action\": \"set_server()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.3\n }\n },\n\n{\n \"name\": \"🔄服务器检测🔄\",\n \"type\": \"button\",\n \"action\": \"checkNet()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n },\n \n\n{\n'action': \"yu()\",\n'name': '当前模式',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 1\n}\n},\n{\n'action': \"settype('小说模式')\",\n'name': '📕小说模式📕',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.39\n}\n},\n{\n'action': \"settype('听书模式')\",\n'name': '📻听书模式📻',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.39\n}\n},\n{\n'action': \"settype('漫画模式')\",\n'name': '🖼漫画模式🖼',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.39\n}\n},\n{\n'action': \"settype('短剧模式')\",\n'name': '🎥短剧模式🎥',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.39\n}\n},\n{\n \"name\": \"查询模式\",\n \"type\": \"button文字关闭\",\n \"action\": \"get()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n{\n \"name\": \"阅读模式\",\n \"type\": \"button\",\n \"action\": \"set(0)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.45\n }\n},\n{\n \"name\": \"切换模式\",\n \"type\": \"button\",\n \"action\": \"st()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.45\n }\n},\n\n{\n \"name\": \"注册设备(能正常使用别点)\",\n \"type\": \"button\",\n \"action\": \"激活设备()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1.45\n }\n},\n \n{\n \"name\": \"📦初始化源变量📦\",\n \"type\": \"button\",\n \"action\": \"began()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.35\n }\n },\n\n{\n \"name\": \" 🎐清除源变量🎐 \",\n \"type\": \"button\",\n \"action\": \"clean()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.35\n }\n \n },\n \n \n \n \n{\n \"name\": \"请先确定当前书籍支持的音色再切换!\",\n \"type\": \"button\",\n \"action\": \"get()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 2.45\n }\n},\n \n {\n \"name\": \"其他音色ID(确定后✔返回点击切换)\",\n \"type\": \"text\"\n},\n {\n \"name\": \"切换自定音色\",\n \"type\": \"button\",\n \"action\": \"set(1)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.45\n }\n},\n\n \n {\n \"name\": \"保存自定音色\",\n \"type\": \"button\",\n \"action\": \"set_tone_id()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.45\n }\n},\n\n\n \n {\n \"name\": \"真人发音\",\n \"type\": \"button\",\n \"action\": \"set(2)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 2.25\n }\n},\n\n \n\n{\n \"name\": \"音色1\",\n \"type\": \"button\",\n \"action\": \"set(3)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色2\",\n \"type\": \"button\",\n \"action\": \"set(4)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色4\",\n \"type\": \"button\",\n \"action\": \"set(5)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色5\",\n \"type\": \"button\",\n \"action\": \"set(6)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色6\",\n \"type\": \"button\",\n \"action\": \"set(7)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色7\",\n \"type\": \"button\",\n \"action\": \"set(8)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色8\",\n \"type\": \"button\",\n \"action\": \"set(9)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n\n\n{\n \"name\": \"音色9\",\n \"type\": \"button\",\n \"action\": \"set(10)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色10\",\n \"type\": \"button\",\n \"action\": \"set(11)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色11\",\n \"type\": \"button\",\n \"action\": \"set(12)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色12\",\n \"type\": \"button\",\n \"action\": \"set(13)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色14\",\n \"type\": \"button\",\n \"action\": \"set(14)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色15\",\n \"type\": \"button\",\n \"action\": \"set(15)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色16\",\n \"type\": \"button\",\n \"action\": \"set(16)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色17\",\n \"type\": \"button\",\n \"action\": \"set(17)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色18\",\n \"type\": \"button\",\n \"action\": \"set(18)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色21\",\n \"type\": \"button\",\n \"action\": \"set(19)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色22\",\n \"type\": \"button\",\n \"action\": \"set(20)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色23\",\n \"type\": \"button\",\n \"action\": \"set(21)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色26\",\n \"type\": \"button\",\n \"action\": \"set(22)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色27\",\n \"type\": \"button\",\n \"action\": \"set(23)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色28\",\n \"type\": \"button\",\n \"action\": \"set(24)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色29\",\n \"type\": \"button\",\n \"action\": \"set(25)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色30\",\n \"type\": \"button\",\n \"action\": \"set(26)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n{\n \"name\": \"音色31\",\n \"type\": \"button\",\n \"action\": \"set(27)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n{\n \"name\": \"音色32\",\n \"type\": \"button\",\n \"action\": \"set(28)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色51\",\n \"type\": \"button\",\n \"action\": \"set(29)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色53\",\n \"type\": \"button\",\n \"action\": \"set(30)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色55\",\n \"type\": \"button\",\n \"action\": \"set(31)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色56\",\n \"type\": \"button\",\n \"action\": \"set(32)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色57\",\n \"type\": \"button\",\n \"action\": \"set(33)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色58\",\n \"type\": \"button\",\n \"action\": \"set(34)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色59\",\n \"type\": \"button\",\n \"action\": \"set(35)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色60\",\n \"type\": \"button\",\n \"action\": \"set(36)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色61\",\n \"type\": \"button\",\n \"action\": \"set(37)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色62\",\n \"type\": \"button\",\n \"action\": \"set(38)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色63\",\n \"type\": \"button\",\n \"action\": \"set(39)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色64\",\n \"type\": \"button\",\n \"action\": \"set(40)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色67\",\n \"type\": \"button\",\n \"action\": \"set(41)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色68\",\n \"type\": \"button\",\n \"action\": \"set(42)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色71\",\n \"type\": \"button\",\n \"action\": \"set(43)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色72\",\n \"type\": \"button\",\n \"action\": \"set(44)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色73\",\n \"type\": \"button\",\n \"action\": \"set(45)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色74\",\n \"type\": \"button\",\n \"action\": \"set(46)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色75\",\n \"type\": \"button\",\n \"action\": \"set(47)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色76\",\n \"type\": \"button\",\n \"action\": \"set(48)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色77\",\n \"type\": \"button\",\n \"action\": \"set(49)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色78\",\n \"type\": \"button\",\n \"action\": \"set(50)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色79\",\n \"type\": \"button\",\n \"action\": \"set(51)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色80\",\n \"type\": \"button\",\n \"action\": \"set(52)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色81\",\n \"type\": \"button\",\n \"action\": \"set(53)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色82\",\n \"type\": \"button\",\n \"action\": \"set(54)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色84\",\n \"type\": \"button\",\n \"action\": \"set(55)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色85\",\n \"type\": \"button\",\n \"action\": \"set(56)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色86\",\n \"type\": \"button\",\n \"action\": \"set(57)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色87\",\n \"type\": \"button\",\n \"action\": \"set(58)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色88\",\n \"type\": \"button\",\n \"action\": \"set(59)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色89\",\n \"type\": \"button\",\n \"action\": \"set(60)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色90\",\n \"type\": \"button\",\n \"action\": \"set(61)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色91\",\n \"type\": \"button\",\n \"action\": \"set(62)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n\n\n{\n \"name\": \"音色100\",\n \"type\": \"button\",\n \"action\": \"set(63)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色101\",\n \"type\": \"button\",\n \"action\": \"set(64)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色102\",\n \"type\": \"button\",\n \"action\": \"set(65)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色103\",\n \"type\": \"button\",\n \"action\": \"set(66)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色104\",\n \"type\": \"button\",\n \"action\": \"set(67)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色105\",\n \"type\": \"button\",\n \"action\": \"set(68)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色106\",\n \"type\": \"button\",\n \"action\": \"set(69)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色107\",\n \"type\": \"button\",\n \"action\": \"set(70)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色108\",\n \"type\": \"button\",\n \"action\": \"set(71)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n\n{\n \"name\": \"音色109\",\n \"type\": \"button\",\n \"action\": \"set(72)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色110\",\n \"type\": \"button\",\n \"action\": \"set(73)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色111\",\n \"type\": \"button\",\n \"action\": \"set(74)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n\n{\n \"name\": \"音色112\",\n \"type\": \"button\",\n \"action\": \"set(75)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色113\",\n \"type\": \"button\",\n \"action\": \"set(76)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n{\n \"name\": \"音色114\",\n \"type\": \"button\",\n \"action\": \"set(77)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n{\n \"name\": \"音色115\",\n \"type\": \"button\",\n \"action\": \"set(78)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n},\n\n{\n \"name\": \"音色204\",\n \"type\": \"button\",\n \"action\": \"set(79)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n}\n,\n \n {\n 'name': '接口项目:兔兔 作者: 团夕 ',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n }\n\n]",
"loginUrl": "\nfunction clean() {\n let variavle = \"\";\n source.setVariable(variavle);\n java.toast(\"源变量已清除\");\n }\n \nfunction began() {\n var baseVariable = JSON.stringify({\n\n\n\t\"sz\": \"0\",\n\t\"tone\": \"\",\n\t\"st\": 1,\n\t\"server\": \"http:\/\/nove.98tx.cn\",\n\t\"type\": \"小说模式\",\n\t\"module\": 3\n\n\t\n\t\n}, null, \"\\t\");\n source.setVariable(baseVariable);\n java.toast(\"已初始化源变量!\");\n\t}\n\n\n\n\n\n\nfunction 发布页() {\tjava.startBrowserAwait(server +'', \"API 请求统计仪表板\");\n}\n\n\n\nserver = String(source.getVariable()).match(\/server\/)? JSON.parse(source.getVariable()).server: source.server;\njava.put(\"server\",server);\n\n\n\n\nfunction 激活设备() {\n\t\n\t\t\n\t\n\tjava.startBrowserAwait(result = server + '\/api\/index.php?api=device_register&action=register', \"激活设备\");\n}\n\n\n\n\n\n\n\n\n\nfunction login52(){}; \nfunction out(){ java.toast(\"当前服务器为:\\n\"+getServerHost()) };\n\nif (source.getVariable()==\"\") { \n reg(true);\n}\n\nvar lists = JSON.parse(source.getVariable());\n\n\n\n\nfunction settype(Type) {\n lists.type = Type;\n if (Type == '小说模式') {\n lists.module = \"3\";\n }else\n \n if (Type == '听书模式') {\n lists.module = \"2\";\n }else\n \n \n if (Type == '漫画模式') {\n lists.module = \"8\";\n }else\n \n if (Type == '短剧模式') {\n lists.module = \"11\";\n };\n source.setVariable(JSON.stringify(lists, null, \"\\t\"));\n java.toast('已将类型切换为:\\n' + Type);\n}\nyu=()=>{\nu=JSON.parse(source.getVariable()).type;\njava.toast(`\\n${u}`)\n}\n\n\n\n\n\n\/\/ 登录及登录检查\nfunction login_(openBrowser, checkMode) {\n \/\/ java.removeCookie(\"snssdk.com\")\n var cookie_ = String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['手动登录Token']\n \/\/ java.toast(cookie_)\n if (cookie_ && cookie_ != \"\" && !checkMode) {\n if (!source.variableComment) {\n java.toast(\"请不要重复登录,请先退出登录!\")\n } else {\n java.toast(\"您为填写token登录,请手动移除token后再次登录\")\n }\n return false\n }\n if (openBrowser) {\n try {\n java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"登录\")\n } catch (e) {\n java.toast(e)\n }\n }\n \/\/ java.log(\"snssdk cookie: \" + java.getCookie(\"snssdk.com\") + \"will be reomved\")\n try {\n cookie.removeCookie(\"snssdk.com\")\n } catch (e) {}\n \/\/ java.log(cookie)\n var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['手动登录Token'])\n let user\n try {\n user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n method: \"GET\",\n headers: {\n \"Cookie\": cookie_\n }\n }))).data.name\n } catch (e) {java.log(e)}\n if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n java.toast(\"未获取到登录凭据,登录失败\")\n return false\n }\n java.toast(\"欢迎 \" + user + \"\\n登录成功!\")\n return true\n}\n\nfunction login() \/\/ 一定程度上加上这个函数能够支持更多的版本\n{}\n\nfunction l2(a, b) {\n try {\n login_(a, b)\n } catch (e) {\n java.log(e+\"\\n\"+e.stack)\n }\n}\n\n\/\/ 取消登录\nfunction logout() {\n cookie.removeCookie(\"fanqienovel.com\");\n cookie.removeCookie(\"snssdk.com\");\n if (source.getLoginInfoMap()['手动登录Token']) java.toast(\"请手动移除填写的Token\")\n else java.toast(\"退出登录成功\");\n}\n\n\n\n\n\n\n\n\n\nfunction logToken() {\n java.log(\n String(\n cookie.getKey(\n \"fanqienovel.com\",\n \"sessionid\"\n )\n ) ? String(\n cookie.getKey(\n \"fanqienovel.com\", \n \"sessionid\"\n )\n ) : (\n source.getLoginInfoMap()\n ? source.getLoginInfoMap()\n : {}\n )['手动登录Token']\n )\n java.toast(\"登录Token已打印到日志,请妥善保管\")\n}\n\nfunction tutorial() {\n java.longToast(\"\\n手动登录token功能用于部分用户的跨端登录,不知道是什么的留空就行\\n普通用户请使用下方的\\\"账号登录\\\"按钮登录自己的账号\")\n}\n\nfunction t() {\n let gc = [\"(*^ω^*)\", \"(=^▽^=)\", \"(。’▽’。)♡\", \"٩(๑´0`๑)۶\", \"喵\", \"你好?\", \"逢考必过!\", \"早ノ☀\"]\n rnd = Math.floor(Math.random() * 100)\n if (typeof gc[rnd] != \"undefined\") {\n java.toast(gc[rnd])\n } else {\n let res = JSON.parse(\n java.ajax(\"https:\/\/v1.hitokoto.cn\")\n )\n java.toast(res.hitokoto)\n }\n}\n\n\/\/ 音色设置,以及链接\nvar data = [\n [\"正常模式\", \"\"],\n [\"自定义音色\", \"\"],\n [\"真人\", \"tone_id=0\"],\n [\"甜美少女\", \"tone_id=1\"],\n [\"清亮青叔\", \"tone_id=2\"],\n [\"成熟大叔\", \"tone_id=4\"],\n [\"开朗青年\", \"tone_id=5\"],\n [\"温柔淑女\", \"tone_id=6\"],\n [\"音频7\", \"tone_id=7\"],\n [\"风雅青叔\", \"tone_id=8\"],\n [\"音频9\", \"tone_id=9\"],\n [\"音频10\", \"tone_id=10\"],\n [\"音频11\", \"tone_id=11\"],\n [\"清纯少女\", \"tone_id=12\"],\n [\"音频14\", \"tone_id=14\"],\n [\"音频15\", \"tone_id=15\"],\n [\"音频16\", \"tone_id=16\"],\n [\"磁性青叔\", \"tone_id=17\"],\n [\"音频18\", \"tone_id=18\"],\n [\"音频21\", \"tone_id=21\"],\n [\"音频22\", \"tone_id=22\"],\n [\"音频23\", \"tone_id=23\"],\n [\"音频26\", \"tone_id=26\"],\n [\"推文女声\", \"tone_id=27\"],\n [\"亲切姐姐\", \"tone_id=28\"],\n [\"儒雅大叔\", \"tone_id=29\"],\n [\"优雅御姐\", \"tone_id=30\"],\n [\"斯文青叔\", \"tone_id=31\"],\n [\"知性主播\", \"tone_id=32\"],\n [\"多人对话\", \"tone_id=51\"],\n [\"音频53\", \"tone_id=53\"],\n [\"音频55\", \"tone_id=55\"],\n [\"音频56\", \"tone_id=56\"],\n [\"音频57\", \"tone_id=57\"],\n [\"音频58\", \"tone_id=58\"],\n [\"音频59\", \"tone_id=59\"],\n [\"音频60\", \"tone_id=60\"],\n [\"音频61\", \"tone_id=61\"],\n [\"音频62\", \"tone_id=62\"],\n [\"音频63\", \"tone_id=63\"],\n [\"音频64\", \"tone_id=64\"],\n [\"音频67\", \"tone_id=67\"], \n [\"音频68\", \"tone_id=68\"],\n [\"音频71\", \"tone_id=71\"],\n [\"音频72\", \"tone_id=72\"],\n [\"音频73\", \"tone_id=73\"],\n [\"成熟升级\", \"tone_id=74\"],\n [\"音频75\", \"tone_id=75\"],\n [\"音频76\", \"tone_id=76\"],\n [\"音频77\", \"tone_id=77\"],\n [\"音频78\", \"tone_id=78\"],\n [\"音频79\", \"tone_id=79\"],\n [\"音频80\", \"tone_id=80\"],\n [\"音频81\", \"tone_id=81\"],\n [\"音频82\", \"tone_id=82\"],\n [\"音频84\", \"tone_id=84\"],\n [\"音频85\", \"tone_id=85\"],\n \n [\"音频86\", \"tone_id=86\"],\n [\"音频87\", \"tone_id=87\"],\n [\"音频88\", \"tone_id=88\"],\n [\"音频89\", \"tone_id=89\"],\n [\"音频90\", \"tone_id=90\"],\n \n [\"音频91\", \"tone_id=91\"],\n [\"俏皮御姐\", \"tone_id=100\"],\n \/\/ [\"邻家妹妹\", \"\"],\n [\"音频101\", \"tone_id=101\"],\n [\"音频102\", \"tone_id=102\"],\n [\"双音灵动\", \"tone_id=103\"],\n [\"音频104\", \"tone_id=104\"],\n [\"王明军音\", \"tone_id=105\"],\n [\"音频106\", \"tone_id=106\"],\n [\"音频107\", \"tone_id=107\"],\n [\"音频108\", \"tone_id=108\"],\n [\"音频109\", \"tone_id=109\"],\n [\"音频110\", \"tone_id=110\"],\n [\"音频111\", \"tone_id=111\"],\n [\"音频112\", \"tone_id=112\"],\n [\"音频113\", \"tone_id=113\"],\n [\"音频114\", \"tone_id=114\"],\n [\"音频115\", \"tone_id=115\"],\n [\"音频204\", \"tone_id=204\"]\n];\n\n\nvar modeNames = {3: \"小说模式\",2: \"听书模式\",8: \"漫画模式\",11: \"短剧模式\"};\n\n\/\/ 设置保存接口\nfunction set(num) {\n if (num < 0 || num >= data.length) {\n java.longToast(\"无效的接口编号!\");\n return;\n }\n var show = \"设置成功\\n当前模式:\";\n var tips = \"\\n‼️设置完成请点击切换模式‼️\"\n var setData = JSON.parse(source.getVariable())\n setData.sz = num.toString();\n setData.tone = data[num][1];\n source.setVariable(JSON.stringify(setData, null, \" \"));\n var msg = show + data[num][0] + tips;\n java.longToast(msg);\n}\n\n\/\/ 设置保存接口\nfunction set(num) {\n\tif (source.getVariable()==\"\") {\n reg(true);\n}\n\n if (num < 0 || num >= data.length) {\n java.longToast(\"无效的接口编号!\");\n return;\n }\n var show = \"设置成功\\n当前模式:\";\n var tips = \"\\n‼️设置完成请点击切换模式‼️\"\n var setData = JSON.parse(source.getVariable())\n \n const currentTone = data[num][1];\n if (currentTone == \"tone_id=0\") {\n setData.module = 2;\n } else {\n setData.module = 3;\n }\n \n setData.sz = num.toString();\n setData.tone = currentTone;\n source.setVariable(JSON.stringify(setData, null, \"\\t\"));\n \n var currentMode = setData.module || 3;\n var msg = show + (modeNames[currentMode] || \"未知模式\") + \n \"\\n音色设置:\" + data[num][0] + tips;\n java.longToast(msg);\n}\n\n\n\/\/ 获取接口显示\nfunction get() {\n\tif (source.getVariable()==\"\") {\n reg(true);\n try {\n var v = JSON.parse(source.getVariable() || \"{}\");\n var currentMode = v.module || 3;\n \n var message = \"当前模式:\" + (modeNames[currentMode] || \"未知模式\");\n \n if (currentMode === 2) {\n var sz = parseInt(v.sz || \"0\", 10);\n var toneName = (sz >= 0 && sz < data.length) ? data[sz][0] : \"默认\";\n message += \"\\n音色设置:\" + toneName;\n }\n \n java.longToast(message);\n } catch (e) {\n java.longToast(\"获取模式失败:\" + e.message);\n }\n}else{\n try {\n var v = JSON.parse(source.getVariable() || \"{}\");\n var currentMode = v.module || 3;\n \n var message = \"\\n当前模式:\" + (modeNames[currentMode] || \"未知模式\");\n \n if (currentMode === 2 || currentMode === 3) {\n var sz = parseInt(v.sz || \"0\", 10);\n var toneName = (sz >= 0 && sz < data.length) ? data[sz][0] : \"默认\";\n message += \"\\n音色设置:\" + toneName;\n }\n \n java.longToast(message);\n } catch (e) {\n java.longToast(\"获取模式失败:\" + e.message);\n }}\n}\n\n \n\nfunction st() {\n\t\t\n\t\n var v = JSON.parse(source.getVariable());\n var mode = v.module|| 3; \n\n var newMode;\n if (mode === 3) {\n newMode = 2;\n } else\n \n if (mode === 2) {\n newMode = 8;\n } else\n \n if (mode === 8) {\n newMode = 11;\n } else\n \n \n if (mode === 11) {\n newMode = 3;\n } else {\n newMode = 3; \n }\n v.module = newMode;\n\n \n v.sz = \"0\";\n v.tone = \"\";\n\n source.setVariable(JSON.stringify(v, null, \"\\t\"));\n\n var show = \"设置成功\\n当前模式:\";\n var tips = \"\\n请前往详情页刷新是否切换成功\";\n \n \n \n var msg;\n\n if (newMode === 3) {\n msg = show + \"阅读模式\" + tips\n } else if (newMode === 2) {\n \t\n \t msg = show + \"听书模式\" + tips;\n } else if (newMode === 8){\n \t\n msg = show + \"漫画模式\" + tips;\n } else if (newMode === 11) {\n msg = show + \"短剧模式\" + tips;\n }\n \n java.longToast(msg);\n}\n\nfunction reg(is) {\n if (is) {\ntry {\nvar setData = {\n\t\"search\": \"-1\",\n\t\"tone_id\": \"-1\",\n\t\"sz\": \"0\",\n\t\"server\": \"http:\/\/nove.98tx.cn\",\n\t\"tone\": \"\",\n\t\"st\": 0,\n\t\"type\": \"小说模式\",\n\t\"module\": \"3\",\n\t\"faxian\": \"小说\"\n\t\n}\nsource.setVariable(JSON.stringify(setData, null, \"\\t\"));\n} catch (e) {\nvar setData = {\n\t\"search\": \"-1\",\n\t\"tone_id\": \"-1\",\n\t\"sz\": \"0\",\n\t\"server\": \"http:\/\/rlfq.de5.net\",\n\t\"tone\": \"\",\n\t\"st\": 0,\n\t\"type\": \"小说模式\",\n\t\"module\": \"3\",\n\t\"faxian\": \"小说\"\n\t\n}\nsource.setVariable(JSON.stringify(setData, null, \"\\t\"));\n }\n }\n}\n\n\n\n\n\n\n\nfunction gets_key() {\n var servers = String(source.bookSourceUrl);\n const serverList = servers.split('\\n');\n \n for (let server of serverList) {\n let key = String(cookie.getCookie(server)) || String(java.getCookie(server));\n if (key) {\n let keyParts = key.split('secretKey=');\n if (keyParts.length > 1) {\n key = keyParts[keyParts.length - 1];\n setArgument('key', key);\n return key;\n }\n }\n }\n\n return ''; \n }\n\n\n\/\/获取服务器\nfunction get_server() {\n var server = getArgument('server');\n var tishi = '\\n\\n当前服务器:' + server\n java.toast(tishi);\n return server\n}\n\n\/\/设置服务器\nfunction set_server() {\n let zdyserver;\n try {\n zdyserver = String(source.getLoginInfoMap().get('其他服务器(确定后✔返回点击切换)'));\n if (zdyserver.includes('http')) {\n setArgument('server', zdyserver);\n java.toast(`\\n\\n当前服务器为自定义服务器\\n${zdyserver}\\n\\n切换内置服务器请先清空自定义服务器中的数据`);\n } else {\n zdyserver = '';\n }\n } catch (error) {\n zdyserver = '';\n }\n if (!zdyserver) {\n const servers = host\n const currentServer = getArgument('server') || '';\n const currentIndex = servers.indexOf(currentServer);\n\n const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n const nextServer = servers[nextIndex];\n\n setArgument('server', nextServer);\n java.toast(`\\n\\n当前服务器${nextIndex+1}:${nextServer}\\n\\n注意:切换服务器后需要在详情页刷新目录才能生效`);\n }\n}\n\n\n\n\n\/\/ 检测服务器\nfunction checkNet() {\n let url = getArgument('server');\n java.longToast(`\\n\\n♻️正在检测:${url}\\n请稍等~`);\n let date1 = new Date().getTime();\n let html = java.log(java.ajax(url));\n let date2 = new Date().getTime();\n let t = date2 - date1;\n let c = String(html).indexOf('API 统计仪表板'); \/\/ 关键内容检测\n let time = t \/ 1000 + 's';\n let logTime = '【' + url + '】\\n┋┋\\n' + '解析时间:' + time;\n\n if (c == -1 || t > 5000) {\n java.longToast('\\n【团夕小站】\\n' + \n '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + \n logTime + '\\n┋┋\\n♣️当前接口♣️\\n┋┋\\n请切换其他接口\/切换网络环境\\n┋┋' + \n '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n } else if (t < 1000) {\n java.longToast('\\n💖【网络环境优良】\\n' + \n '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + \n logTime + '\\n┋┋\\n❤️延迟低,推荐使用此接口❤️\\n┋┋\\n网络环境优良,请继续保持状态\\n┋┋' + \n '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n } else if (t >= 1000 && t < 2000) {\n java.longToast('\\n💛【网络环境一般】\\n' + \n '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + \n logTime + '\\n┋┋\\n♦️延迟一般,勉强可使用♦️\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + \n '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n } else if (t >= 2000 && t < 5000) {\n java.longToast('\\n💔【网络环境堪忧】\\n' + \n '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + \n logTime + '\\n┋┋\\n♠延迟过高,不建议使用♠\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + \n '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n }\n}\n\n\n\n\n\n\/\/自定义音色\nfunction set_tone_id() {\n let zdytone_id;\n try {\n zdytone_id = String(source.getLoginInfoMap().get('其他音色ID(确定后✔返回点击切换)'));\n if (zdytone_id) {\n \t setArgument('sz', 1);\n setArgument('tone', \"tone_id=\"+zdytone_id);\n java.toast(\"\\n\\n已保存自定义音色\");\n } else {\n zdytone_id = '';\n }\n } catch (error) {\n zdytone_id = '';\n }\n if (!zdytone_id) {\n let toast = \"\\n\\n自定义音色为空\";\n java.toast(toast);\n }\n}\n\n\n\n\n\n\n\n\n\/\/获取参数\nfunction getArgument(key) {\n let open_argument = source.getVariable();\n return getArguments(open_argument,key);\n}\n\n\/\/设置参数\nfunction setArgument(key, value) {\n let open_argument = source.getVariable();\n open_argument = getArguments(open_argument,'');\n open_argument[key] = value;\n open_argument = JSON.stringify(open_argument, null, \"\\t\");\n source.setVariable(open_argument);\n return open_argument;\n}\n\nfunction getKey() {\n\t let url = \"http:\/\/www.98tx.cn\";\n\t let mes = \"欢迎访问我的个人主页!\"\n\t java.startBrowser(url, \"团夕小站\")\n\t java.longToast(mes);\n\t return;\n\t}\n\n\nfunction zz(){\n\tlet url=\"http:\/\/nove.98tx.cn\/zs.png\"\n\tlet mes=\"欢迎赞助服务器!\"\n\tjava.startBrowser(url, \"团夕赞助码\")\n\t java.longToast(mes);\n\t return;\n\t}",
"respondTime": 180000,
"ruleBookInfo": {
"author": "author",
"canReName": "true",
"coverUrl": "@js:replaceCover(java.getString(\"thumb_url\"))",
"init": "<js>\nvar model = [\n [\"正常模式\", \"\"],\n [\"自定义音色\", \"\"],\n [\"真人\", \"tone_id=0\"],\n [\"甜美少女\", \"tone_id=1\"],\n [\"清亮青叔\", \"tone_id=2\"],\n [\"成熟大叔\", \"tone_id=4\"],\n [\"开朗青年\", \"tone_id=5\"],\n [\"温柔淑女\", \"tone_id=6\"],\n [\"音频7\", \"tone_id=7\"],\n [\"风雅青叔\", \"tone_id=8\"],\n [\"音频9\", \"tone_id=9\"],\n [\"音频10\", \"tone_id=10\"],\n [\"音频11\", \"tone_id=11\"],\n [\"清纯少女\", \"tone_id=12\"],\n [\"音频14\", \"tone_id=14\"],\n [\"音频15\", \"tone_id=15\"],\n [\"音频16\", \"tone_id=16\"],\n [\"磁性青叔\", \"tone_id=17\"],\n [\"音频18\", \"tone_id=18\"],\n [\"音频21\", \"tone_id=21\"],\n [\"音频22\", \"tone_id=22\"],\n [\"音频23\", \"tone_id=23\"],\n [\"音频26\", \"tone_id=26\"],\n [\"推文女声\", \"tone_id=27\"],\n [\"亲切姐姐\", \"tone_id=28\"],\n [\"儒雅大叔\", \"tone_id=29\"],\n [\"优雅御姐\", \"tone_id=30\"],\n [\"斯文青叔\", \"tone_id=31\"],\n [\"知性主播\", \"tone_id=32\"],\n [\"多人对话\", \"tone_id=51\"],\n [\"音频53\", \"tone_id=53\"],\n [\"音频55\", \"tone_id=55\"],\n [\"音频56\", \"tone_id=56\"],\n [\"音频57\", \"tone_id=57\"],\n [\"音频58\", \"tone_id=58\"],\n [\"音频59\", \"tone_id=59\"],\n [\"音频60\", \"tone_id=60\"],\n [\"音频61\", \"tone_id=61\"],\n [\"音频62\", \"tone_id=62\"],\n [\"音频63\", \"tone_id=63\"],\n [\"音频64\", \"tone_id=64\"],\n [\"音频67\", \"tone_id=67\"], \n [\"音频68\", \"tone_id=68\"],\n [\"音频71\", \"tone_id=71\"],\n [\"音频72\", \"tone_id=72\"],\n [\"音频73\", \"tone_id=73\"],\n [\"成熟升级\", \"tone_id=74\"],\n [\"音频75\", \"tone_id=75\"],\n [\"音频76\", \"tone_id=76\"],\n [\"音频77\", \"tone_id=77\"],\n [\"音频78\", \"tone_id=78\"],\n [\"音频79\", \"tone_id=79\"],\n [\"音频80\", \"tone_id=80\"],\n [\"音频81\", \"tone_id=81\"],\n [\"音频82\", \"tone_id=82\"],\n [\"音频84\", \"tone_id=84\"],\n [\"音频85\", \"tone_id=85\"],\n [\"音频86\", \"tone_id=86\"],\n [\"音频87\", \"tone_id=87\"],\n [\"音频88\", \"tone_id=88\"],\n [\"音频89\", \"tone_id=89\"],\n [\"音频90\", \"tone_id=90\"],\n [\"音频91\", \"tone_id=91\"],\n [\"俏皮御姐\", \"tone_id=100\"],\n \/\/ [\"邻家妹妹\", \"\"],\n [\"音频101\", \"tone_id=101\"],\n [\"音频102\", \"tone_id=102\"],\n [\"双音灵动\", \"tone_id=103\"],\n [\"音频104\", \"tone_id=104\"],\n [\"王明军音\", \"tone_id=105\"],\n [\"音频106\", \"tone_id=106\"],\n [\"音频107\", \"tone_id=107\"],\n [\"音频108\", \"tone_id=108\"],\n [\"音频109\", \"tone_id=109\"],\n [\"音频110\", \"tone_id=110\"],\n [\"音频111\", \"tone_id=111\"],\n [\"音频112\", \"tone_id=112\"],\n [\"音频113\", \"tone_id=113\"],\n [\"音频114\", \"tone_id=114\"],\n [\"音色115\", \"tone_id=114\"],\n [\"音色204\", \"tone_id=204\"]\n];\n\nvar s = JSON.parse(source.getVariable())\n\nserver = s.server? s.server: source.server;\njava.put(\"server\",server);\n\n\n\n\nif (s.st == 1) { \n book.putVariable(\"custom\", JSON.stringify(s, null, \"\\t\"));\n s.st = 0\n source.setVariable(JSON.stringify(s, null, \"\\t\"));\n}\n\nvar modeTips = {\"3\": \"\\n📖 小说模式\",\t\"2\": \"\\n🎧 听书模式\",\"8\": \"\\n🌈 漫画模式\",\"11\": \"\\n🎬 短剧模式\"\t};\n\n\n \n \n \n \n\nfunction get(index) {\n \n var currentMode = s.module || 0;\n var modeTip = modeTips[currentMode] || \"\";\n \n if (currentMode == \"2\" || currentMode == \"3\") {\n var v = (book.getVariable('custom') != \"\") ? book.getVariable('custom') : source.getVariable();\n \n \n try {\n var szStr = JSON.parse(v).sz;\n var sz = parseInt(szStr, 10);\n if (sz < 0 || sz >= model.length) {\n sz = 0;\n }\n var show = modeTip + \"\\n当前音色:\";\n java.longToast(show + model[sz][0] + \"\\n部分书籍支持真人发音\");\n } catch (e) {\n java.longToast(modeTip + \"\\n获取音色失败,使用默认。\");\n }\n } else {\n java.longToast(modeTip);\n }\n}\n\n\n\nfunction getTones(tones, run) {\n if (run == 0) {\n var voiceTones = tones.split(',').map(function(tone) {\n var voice = model.find(function(item) {\n return item[1] == `tone_id=${tone}`;\n });\n return voice ? voice[0] : '';\n });\n return '🎼 音色支持:' + voiceTones.filter(Boolean) + '\\n\\u200b\\n';\n } \n return ''\n}\n\n\n\n\n\n\n\n\nvar Regs = [\/book_id=(\\d+)\/i, \/d=(\\d+)\/i, \/(\\d+)\/i];\nvar book_id = \"\";\nfor (let Reg of Regs) {\n let mat = baseUrl.match(Reg);\n if (mat) {\n book_id = mat[1];\n break;\n }\n}\n\n\n\nvar u_Index = 0; \/\/ 0-1\nswitch (String(['API', 'TOU'][u_Index])) {\n case 'API':\n result = java.ajax(xGorgon(\n \"detail\",\n \"book_id=\" + book_id\n ));\n if (JSON.parse(result).code == 0) break;\n \/\/ java.log(\"接口异常,使用头条接口获取\");\n\n \/\/ 这两个接口信息不全\n \/\/ result = java.ajax(\"https:\/\/fanqienovel.com\/page\/\"+book_id).match(\/__INITIAL_STATE__=([^;]+)\/)[1];\n \/\/ result = java.ajax(getHost(1,3,1,5)+\"\/reading\/bookapi\/multi-detail\/v\/?aid=1967&iid=1&version_code=999&book_id=\"+book_id);\n\n \/\/ 头条接口\n default:\n result = java.ajax(\"https:\/\/novel.snssdk.com\/api\/novel\/book\/directory\/list\/v1\/?device_platform=android&version_code=1207&novel_version=&app_name=gold_browser&version_name=2.0.7&channel=vivo_6589_64&device_type=wldw&os_api=28&os_version=9&book_id=\" + book_id);\n break;\n}\nvar Res = JSON.parse(result);\nvar data = Res.page || Res.data;\ndata = (Array.isArray(data) ? data[0] : data.book_info) || data;\n\n\nvar type = data.genre;\njava.put(\"type\",type);\nget(type);\nvar tts_info = getTones(data.tones, data.genre);\njava.put(\"tts_info\", tts_info);\n\n\n\n\nJSON.stringify(data);\n\n\n\n\n\n\n\n\n<\/js>\n",
"intro": " \n🗑 接口:{{getArguments(source.getVariable(),'server');}}\n🆔 书号:{{$.book_id}}\n📕 源名:{{$.original_book_name}}\n📖 别名:{{$.book_flight_alias_name}}\n🎚 状态:__status__\n✏️ 开坑:{{$.create_time##T|\\+.*## }}\n🕰️ 更新:{{String(java.timeFormatUTC(java.getString('$..last_chapter_update_time')*1000,'yyyy-MM-dd HH:mm:ss',8)).replace(\/.*1970\\-.*\/,'')}}\n🏷️ 标签:{{$.tags}}\n👤 主角:{{$.roles##\\[|\\\"|\\]}}\n⚙️ 当前模式:syms\n🗣 当前音色:{{cache.get(\"tone\")}}\n🔊 可选音色:{{$.tones}}\n👁️ 在线:{{$.read_count}}人在读\n📜 简介:{{$.abstract}}\n📍 {{$.copyright_info##,.*##。}}\n@js:\n\nfaxian=source.getVariable()\nlet tone = getArguments('tone_id').tone_id;\nlet type = getArguments('type');\nlet syms = '小说';\nif (faxian.match(\/短剧\/)) {\n\tsyms = '短剧模式'\n\t} else \n\tif (faxian.match(\/听书\/)) {\n\tsyms = '听书模式'\n\t} else \n\t\n\tif (faxian.match(\/漫画\/)) {\n\tsyms = '漫画模式'\n\t} else {\n\tsyms = '小说模式'\n\t}\ntry {\n\tlet tone_id = source.getLoginInfoMap()['听书Ai音色填写详情页序号'];\n if (tone_id!='') {\n \ttone = String(tone_id)\n \t}\n} catch (e) {}\nresult.replace(\/.+:(人在读)?\\n\/g,\"\").replace('ystone',tone).replace('syms',syms).replace('__status__', (java.getString('$.book_search_visible') == 'true' ? '正常' : (java.getString('$.tomato_book_status') == '3' ? '下架' : '小黑屋')));",
"kind": "男生{{$.gender}}女生\n{{$.category}}\n连载{{$.creation_status}}完结\n{{$.score}}分\n{{java.timeFormatUTC(java.getString(\"last_chapter_update_time\")*1000,'yyyy-MM-dd',8)}}\n##连载0|1完结\n@js:result\n.replace(\/男生.女生\/, String(java.getString(\"$.isbn\")) ? \"出版\" : `男生${java.getString(\"$.gender\")}女生`)\n.replace(\"男生0\", \"\")\n.replace(\"1女生\", \"\")\n.replace(\"男生2女生\", \"出版\")\n.replace(\"连载4完结\",\"断更\")\n.replace(\"连载-1完结\",\"未知\");",
"lastChapter": "{{$.last_chapter_title}} • {{java.timeFormat(java.getString(\"last_chapter_update_time\")*1000)}}",
"name": "book_name",
"tocUrl": "book_id\n<js>java.base64Encode(result)<\/js>\ndata:book_id;base64,{{result}},{\"type\":\"fqnovel\"}",
"wordCount": "word_number"
},
"ruleContent": {
"content": "<js>\nvar item_id = java.hexDecodeToString(result);\n\nvar v = JSON.parse((book.getVariable('custom') != \"\") ? book.getVariable('custom') : source.getVariable());\nvar type = v.module;\n\n\nvar v = (book.getVariable('custom') != \"\") ? book.getVariable('custom') : source.getVariable();\nvar v = JSON.parse(v)\nvar sz = v.sz;\nvar tone = v.tone;\nvar server = java.get(\"server\");\n\n\n\nif (type == 8) {\n book.type = 64;\n} else if (type == 2 || sz != 0) {\n book.type = 32;\n} else {\n book.type = 8;\n}\n\n\n\nif (type == 2 || sz != 0) {\n if (!tone) {\n url = server + '\/api\/index.php?api=content&ts=听书&item_ids=' + item_id+'&tone=1';\n java.log(url)\n } else {\n url =server + `\/api\/index.php?api=content&ts=听书&item_ids=${item_id}&${tone}`;\n java.log(url)\n }\n try {\n result = JSON.parse(java.ajax(url)).data.content;\n } catch(e) {\n result = \"该书不支持当前音色,请更换并刷新\";\n }\n\n} else if (type == 11) {\n var url =server + `\/api\/index.php?api=video&ts=短剧&item_id=${item_id}`; \n \n \n try {\nresult = JSON.parse(java.ajax(url)).data.video_url;\n\n\n \n \n \tintro1=String(book.intro);\n \ta=intro1.split('\\n');\n \tvar intro='';\n \ta.forEach(n=>{\n \t\tintro+=n;\n \t\tintro+='<br>';\n \t\t});\n \t\/\/java.log(intro);\n if (book['durChapterIndex'] == chapter['index']) { \n\t\tb64 = java['base64Encode'](`\n <html>\n <head>\n <title>${chapter.title}<\/title>\n <meta name=\"viewport\" content=\"width=device-width\">\n <style>\n body {\n margin: 0;\n font-family: Arial, sans-serif;\n background: linear-gradient(135deg, #ece9e6, #ffffff);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n padding: 20px;\n }\n .container {\n width: 100%;\n max-width: 800px;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n margin-bottom: 20px;\n }\n h3 {\n margin: 0;\n padding: 10px 20px;\n font-size: 0.9em;\n background: #333;\n color: #fff;\n border-radius: 10px 10px 0 0;\n }\n .video-container {\n width: 100%;\n background: #000;\n position: relative;\n }\n video {\n width: 100%;\n height: auto;\n display: block;\n }\n .info-container {\n padding: 20px;\n }\n .info-container p {\n margin: 10px 0;\n color: #555;\n }\n .info-container p span {\n font-weight: bold;\n color: #000;\n }\n <\/style>\n <\/head>\n\n <body>\n <div class=\"container\">\n <h3>{{book.name}}<\/h3>\n <div class=\"video-container\">\n <video id=\"video\" src=\"${result}\" poster=\"{{$.model.coverUrl}}\" controls><\/video>\n <\/div>\n <\/div>\n <div class=\"info-container\">\n <p><br>${intro} <\/p>\n <\/div>\n <script>\n \/\/ 获取视频元素\n const video = document.getElementById('video');\n let touchStartX = 0;\n let touchStartY = 0;\n let touchStartTime = 0;\n let isLongPress = false;\n \/\/ 滑动快进\n video.addEventListener('touchstart', (e) =>\n {\n touchStartX = e.touches[0].clientX;\n touchStartY = e.touches[0].clientY;\n touchStartTime = Date.now();\n isLongPress = false;\n });\n video.addEventListener('touchmove', (e) =>\n {\n const deltaX = e.touches[0].clientX - touchStartX;\n const deltaY = e.touches[0].clientY - touchStartY;\n \/\/ 如果是水平滑动,且未进入长按状态\n if(Math.abs(deltaX) > Math.abs(deltaY) && !isLongPress)\n {\n const duration = video.duration;\n const seekTime = video.currentTime + (deltaX \/ 50); \/\/ 每滑动100px快进1秒\n video.currentTime = Math.min(Math.max(seekTime, 0), duration);\n }\n e.preventDefault(); \/\/ 防止默认行为(如页面滚动)\n });\n \/\/ 长按快进\n video.addEventListener('touchend', (e) =>\n {\n const touchEndTime = Date.now();\n const touchDuration = touchEndTime - touchStartTime;\n \/\/ 如果长按时间超过500ms,进入长按快进状态\n if(touchDuration > 500)\n {\n isLongPress = true;\n \/\/ 在长按状态下,根据滑动距离快进\n const deltaX = e.changedTouches[0].clientX - touchStartX;\n const duration = video.duration;\n const seekTime = video.currentTime + (deltaX \/ 100); \/\/ 每滑动100px快进1秒\n video.currentTime = Math.min(Math.max(seekTime, 0), duration);\n }\n else\n {\n isLongPress = false;\n }\n });\n <\/script>\n <\/body>\n\n <\/html> `); \n \n \n baseUrl = 'data:text\/html;base64,' + b64;\n \njava.startBrowser(baseUrl,chapter.title);\n\n java['toast']('正在加载视频\\n视频加载较慢,请耐心等待'); } '【刷新正文】播放\\n✅直链:\\n' +`${url}`; \n\n } catch(e) { \n result = '视频获取失败,尝试重新获取';\n }\n} else\n\n if (type == 8) {\n \t\n \t\n let url = getServerHost() + '\/api\/index.php?&api=raw_full&item_id=' +item_id;\n \n \/\/java.log( url)\nlet res =\nJSON.parse(java.ajax(url)).data.content;\n\nfunction getComic(result) {\n let mat = result.match(\/<article>([\\s\\S]*?)<\\\/article>\/);\n try {\n let cnt = JSON.parse(\n mat\n ? mat[1].replace(\/\\&\/g, '\"').replace(\/\\;\/g, \"\").replace(\/\\#34\/g, \"\")\n : result\n );\n return (mat ? cnt.skeleton.data : cnt.picInfos)\n .map((i) => {\n let path = mat\n ? cnt.materials[i.element_name].data.web_uri\n : \"novel-pic\/\" + i.md5;\n return `<img src=\"https:\/\/p3-novel.byteimg.com\/origin\/${path}\">`;\n })\n .join(\"<br>\");\n } catch (e) { \/\/ not comic content\n mat = result.match(\/<body>([\\s\\S]*?)<\\\/body>\/)\n \/\/ java.log(result)\n return (mat ? mat[1] : result).toString().replace(\/\\<\\!DOCTYPE html.*\/g, \"\").replace(\/\\<tt_keyword_ad.*\\<\\\/tt_keyword_ad\\>\/, \"\").replace(\/\\<a epub.*\\>\\<\\\/a\\>\/g, \"\")\n }\n}\nresult = getComic(String(res));\nresult.replace(\/\\{\\!\\-\\- PGC_VOICE\\:.*\\-\\-\\}\/g, \"\")\n\n \n \n\n} else {\n let url = server + '\/api\/index.php?api=content&api_type=batch&item_ids=' + item_id;\n \n result = JSON.parse(java.ajax(url)).data[0].content;\n \n } \n \nresult;\n<\/js>",
"imageStyle": "FULL"
},
"ruleExplore": {
"author": "$.author||$.copyright",
"bookList": "<js>\n\nlet ck = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['手动登录Token'])\n\ngetShelf = () => {\nlet book_shelf_url = 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=57700&update_version_code=57700'\nlet book_shelf_info = java.ajax(book_shelf_url + ', ' + JSON.stringify({\n headers: {\n 'Cookie': ck\n }\n}))\n\nbid = getBookIdFull(book_shelf_info)\nlet id_list = splitArray(bid, 100)\nlet urls = []\nid_list.forEach(i => {\n urls.push(xGorgon(\"multi-detail\", \"book_id=\" + i.join(\",\"), null, ck))\n})\n\nres = java.ajaxAll(urls)\n\nlet resp = {book_info: []}\nres.forEach(r => {\n resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n})\n\nreturn resp\n}\n\nfunction getByGroupName(name) {\n let book_shelf_url = 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=57700&update_version_code=57700'\n\n let book_shelf_info = JSON.parse(java.ajax(book_shelf_url + ', ' + JSON.stringify({\n headers: {\n 'Cookie': ck,\n }\n })))\n let group_bookids = {\n \"未分组\": []\n }\n \/\/ java.log(\n book_shelf_info.data.book_shelf_info.forEach(i => {\n if (!group_bookids[i.group_name ? i.group_name : \"未分组\"]) group_bookids[i.group_name] = []\n group_bookids[i.group_name ? i.group_name : \"未分组\"].push(i.book_id)\n })\n \/\/ java.log(JSON.stringify(group_bookids[\"未分组\"]))\n \/\/ java.log(decodeURIComponent(name))\n if (!group_bookids[decodeURIComponent(name)]) return {data: []}\n \/\/java.log(\"awa\")\n let book_ids = splitArray(group_bookids[decodeURIComponent(name)], 100)\n let urls = []\n\n book_ids.forEach(i => {\n urls.push(xGorgon(\"multi-detail\", \"book_id=\" + i.join(\",\"), null, ck))\n })\n \n res = java.ajaxAll(urls)\n\n let resp = {book_info: []}\n res.forEach(r => {\n resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n })\n\n return resp\n}\n\nfunction getByTabIndex(index) {\n let url = xGorgon(\n\t \"bookmall\/tab\",\n \"version_name=5.8.9.32&device_id=1024&device_type=114514&iid=2048\",\n\t null,\n\t ck\n )\n let all = JSON.parse(java.ajax(url))\n let tab = all.data.tab_item[0].cell_data[index]\n \/\/ java.log(JSON.stringify(tab))\n tab = tab.cell_data\n if (!tab) tab = []\n let bookList = []\n for (let i of tab) {\n bookList = bookList.concat(i.book_data)\n \/\/ java.log(JSON.stringify(i.book_data))\n }\n return { book_info: bookList }\n}\n\nif (baseUrl.endsWith(\"bookshelf\")) result = getShelf(\"bookshelf\/info\")\nelse {\n let w = baseUrl.split(\"\/\")\n if (baseUrl.includes(\"groupName\")) {\n result = getByGroupName(w[w.length - 1])\n } else if (baseUrl.includes(\"tab\")) {\n result = getByTabIndex(parseInt(w[w.length - 1]))\n } else result = JSON.parse(result)\n}\nJSON.stringify({data: result.book_info || result.data.book_info || result.detail_list || result.data.video_info || result.data})\n<\/js>\n$.data[*]",
"bookUrl": "\/reading\/bookapi\/detail\/v\/?book_id={{$.book_id||$.series_id}}",
"coverUrl": "@js:replaceCover(java.getString(\"thumb_url||cover\"))",
"intro": "$.abstract||$..video_desc##\\n",
"kind": "男生{{$.gender}}女生\n{{$.category}}\n连载{{$.creation_status}}完结\n{{$.score}}分\n{{java.timeFormatUTC(java.getString(\"last_chapter_update_time\")*1000,'yyyy-MM-dd',8)}}\n##连载0|1完结\n@js:result\n.replace(\/男生.女生\/, String(java.getString(\"$.isbn\")) ? \"出版\" : `男生${java.getString(\"$.gender\")}女生`)\n.replace(\"男生0\", \"\")\n.replace(\"1女生\", \"\")\n.replace(\"男生2女生\", \"出版\")\n.replace(\"连载4完结\",\"断更\")\n.replace(\"连载-1完结\",\"未知\")\n.replace(\"1970-01-01\", \"\");",
"name": "$.book_name||$.title",
"wordCount": "$.word_number"
},
"ruleSearch": {
"author": "$.author||$.copyright",
"bookList": "<js>\nlet res = JSON.parse(result)\n\nlet list = [];\nlet book_list = [];\n\ntry {\n if (res.search_tabs) {\n for (let i = 0; i < res.search_tabs.length; i++) {\n let books = res[\"search_tabs\"][i][\"data\"];\n if (books != null) list = list.concat(books);\n }\n }\n} catch (e) {\n java.log(\"出错\")\n}\n\nfor (let $ of list) {\n book_list.push($.book_data ? $.book_data[0] : ($.video_data ? $.video_data[0] : $));\n}\n\nJSON.stringify(book_list)\n<\/js>$[*]",
"bookUrl": "\/reading\/bookapi\/detail\/v\/?book_id={{$.book_id||$.series_id}}",
"checkKeyWord": "https:\/\/www.baidu.com\/删书示例?book_id=7285555567827880975",
"coverUrl": "@js:replaceCover(java.getString(\"thumb_url||cover\"))",
"intro": "$.abstract||$.series_intro##\\n",
"kind": "男生{{$.gender}}女生\n{{$.category}}\n连载{{$.creation_status}}完结\n{{$.score}}分\n##连载0|1完结\n@js:result\n.replace(\/男生.女生\/, String(java.getString(\"$.isbn\")) ? \"出版\" : `男生${java.getString(\"$.gender\")}女生`)\n.replace(\"男生0\", \"\")\n.replace(\"1女生\", \"\")\n.replace(\"男生2女生\", \"出版\")\n.replace(\"连载4完结\",\"断更\")\n.replace(\"连载-1完\/reading\/bookapi\/detail\/v\/?book_id={{$.book_id||$.series_id}}结\",\"未知\");",
"name": "$.book_name||$..series_title##(别名:.*?)",
"wordCount": "word_number"
},
"ruleToc": {
"chapterList": "@js:\n\nvar v = JSON.parse((book.getVariable('custom') != \"\") ? book.getVariable('custom') : source.getVariable());\nvar type = v.module;\nvar sz = v.sz;\nvar tone = v.tone;\nif (type == 8) {\n book.type = 64;\n} else if (type == 2 || sz != 0) {\n book.type = 32;\n} else {\n book.type = 8;\n}\n\n\nvar u_Index = 1; \/\/ 0-2\n\nvar u_Types = ['API', 'WEB', 'TOU'];\nvar v_Index = [];\nvar v_Names = [];\nvar c_Array = [];\nvar book_id = java.hexDecodeToString(result);\n\nfunction b64Url(item_id) {\n return `data:item_id;base64,${java.base64Encode(item_id)},{\"type\":\"fqnovel\"}`;\n}\n\nfunction push_a(a, b, c, d) {\n c_Array.push({\n \"ChapterName\": a || \"\",\n \"isVolume\": b || false,\n \"chapterUrl\": c ? b64Url(c) : \"\",\n \"ChapterInfo\": d || \"\",\n });\n}\n\nfunction push_b(list) {\n for (let c of list) {\n let c_name = c.volume_name || \"第一卷:默认\";\n let c_time = java.timeFormat(c.first_pass_time * 1000);\n let c_word = c.chapter_word_number + \"字\";\n let c_info = [c_name, c_time, c_word];\n let v_name = v_Names[v_Names.length - 1];\n if (v_name != c_name) {\n \t \/\/ java.log(c_name);\n v_Index.push(c_Array.length);\n v_Names.push(c_name);\n push_a(c_name, true);\n }\n push_a(c.title, false, c.item_id, c_info.join(\" | \"));\n }\n}\n\nfunction tocUrl(utype, params, run) {\n let url = `https:\/\/novel.snssdk.com\/api\/novel\/book\/directory\/${utype}\/v1\/?${params}`;\n if (run) return url;\n return JSON.parse(java.ajax(url)).data;\n}\n\nfunction push_c(arr) {\n let newArr = [];\n for (let i = 0; i < arr.length;) {\n let item_ids = arr.slice(i, (i += 100));\n newArr.push(tocUrl(\"detail\", \"item_ids=\" + item_ids, true));\n }\n return java.ajaxAll(newArr).map(Get => {\n let response = String(Get.body()).replace(\/\\\\\/g, \"\\\\\")\n .replace(\/\\\\+([\\u4e00-\\u9fa5])\/g, \"$1\")\n .replace(\/\\\\([^fnrt\"'])\/g, \"$1\");\n return push_b(JSON.parse(response).data);\n });\n}\n\n\n\n\/\/ app接口 ##卷名&时间&字数\nswitch (String(u_Types[u_Index])) {\n case 'API':\n let data = JSON.parse(java.ajax(xGorgon(\n \"directory\/all_items\",\n \"book_id=\" + book_id\n )));\n if (data.code == 0) {\n push_b(data.data.item_data_list);\n break;\n }\n \/\/ java.log(\"下架书籍,使用web接口获取目录\");\n\n\n\n \/\/ web接口 ##卷名&时间\n case 'WEB':\n let Json, Host = \"https:\/\/fanqienovel.com\";\n if (false) {\n Json = java.ajax(Host + \"\/page\/\" + book_id)\n .match(\/__INITIAL_STATE__=([^;]+)\/)[1];\n } else {\n Json = java.ajax(Host + \"\/api\/reader\/directory\/detail?bookId=\" + book_id);\n }\n let List = JSON.parse(Json).data.chapterListWithVolume;\n for (let list of List) {\n v_Index.push(c_Array.length);\n list.map((_, i) => {\n let c_name = _.volume_name || \"第一卷:默认\";\n let c_time = java.timeFormat(_.firstPassTime * 1000);\n if (!i) push_a(c_name, true);\n push_a(_.title, false, _.itemId, [c_name, c_time].join(\" | \"))\n });\n }\n break;\n\n\n \/\/ 头条接口 ##无章节信息(需要请求)\n default:\n let item_list = tocUrl(\"list\", \"device_platform=android&version_code=1207&novel_version=&app_name=gold_browser&version_name=2.0.7&channel=vivo_6589_64&device_type=wldw&os_api=28&os_version=9&book_id=\" + book_id).item_list;\n if (false) {\n item_list.map((t, i) => {\n push_a(\"第\" + (i + 1) + \"章\", false, t);\n });\n } else push_c(item_list);\n break;\n}\n\n\n\n\/\/ 返回数组\nlet len = v_Index.length;\nif (len < 2) { \/\/ 分卷太少不显示\n for (; len > 0; len--) {\n c_Array.splice(v_Index[len - 1], 1);\n }\n} else if (false) { \/\/ 显示效果不好看\n for (let a, b, i = 0; i < len; i++) {\n a = v_Index[i];\n b = v_Index[i + 1];\n if (b == undefined) b = len;\n c_Array[a][\"ChapterInfo\"] = \"共 \" + (b - a - 1) + \" 章\";\n }\n}\nc_Array",
"chapterName": "ChapterName",
"chapterUrl": "chapterUrl",
"isVolume": "isVolume",
"updateTime": "ChapterInfo##\/##-"
},
"searchUrl": "@js:\n\nvar r = {\n\t\n\t\n\t\"search\": \"-1\",\n\t\"tone_id\": \"-1\",\n\t\"sz\": \"0\",\n\t\"server\": \"http:\/\/nove.98tx.cn\",\n\t\"tone\": \"\",\n\t\"st\": 0,\n\t\"type\": \"小说模式\",\n\t\"module\": \"3\",\n\t\"faxian\": \"小说\"\n\t\n\t\n\t\n};\nif (source.getVariable()==\"\") {\n \n source.setVariable(JSON.stringify(r, null, \"\\t\"));\n java.toast('\\n已初始化,使用默认站源');\n}\n\n\nmodule=JSON.parse(source.getVariable()).module;\n\ntab_type = + module;\n\nif (String(key).startsWith(\"m:\")) {\n tab_type = 8\n key = key.slice(2)\n}\n\nif (String(key).startsWith(\"t:\")||String(key).startsWith(\"t:\")) {\n tab_type = 2\n key = key.slice(2)\n}\n\nif (String(key).startsWith(\"d:\")||String(key).startsWith(\"d:\")) {\n tab_type = 11\n key = key.slice(2)\n}\n\nif (String(key).startsWith(\"e:\")) {\n key = key.slice(2)\n java.put(\"extra\", true)\n} else {\n java.put(\"extra\", false)\n}\n\n研希 =xGorgon(\n \"search\/tab\",\n [\n \"tab_type=\" + tab_type,\n \"query=\" + encodeURI(java.put(\"key\", key)),\n \"passback=\" + ((java.put(\"page\", page) - 1) * 10),\n \"update_version_code=58932\",\n \"iid=1\"\n ].join(\"&\"),\n null,\n \n);\n\n\nif (key.length === 19 && !Number.isNaN(key)) { \/\/ book_id\n 研希 = `\/reading\/bookapi\/detail\/v\/?book_id=${key}`\n}\n\n研希",
"weight": 0
}