🍅 团夕番茄

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": "&nbsp;&nbsp;\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
}
广告