mirror of
https://github.com/Tthfyth/source.git
synced 2026-03-30 07:39:47 +08:00
1 line
137 KiB
JSON
1 line
137 KiB
JSON
[{"bookSourceComment":"\u6f2b\u753b\u53d1\u5e03\u9875\uff1ahttps:\/\/wn01.link\/\n1\u20e3\ufe0f\u65e0\u9700\u7ffb\u5899\uff0c\u56fd\u5185\u76f4\u8fde\n2\u20e3\ufe0f\u6f2b\u753b\u6ca1\u52a0\u8f7d\u51fa\u6765\u5c1d\u8bd5\u5237\u65b0\u4e00\u4e0b\n3\u20e3\ufe0f\u8138\u9ed1\ud83c\udf1a\u5237\u4e0d\u51fa\u6765\u7684\uff0c\u522b\u7528wifi\uff0c\u7528\u6d41\u91cf\u770b\u3002","bookSourceGroup":"\u6f2b\u753b","bookSourceName":"\u7ec5\u58eb\u6f2b\u753b( \u4f18+++ )","bookSourceType":2,"bookSourceUrl":"https:\/\/www.wnacg.ru\/","customOrder":472,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n {\n \"title\": \"\ud83d\udd16\u6392\u884c\ud83d\udd16\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"title\": \"\u6708\u699c\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-favorite_ranking-page-{{page}}-type-month.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u5468\u699c\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-favorite_ranking-page-{{page}}-type-week.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u65e5\u699c\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-favorite_ranking-page-{{page}}-type-day.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\ud83d\udd16\u540c\u4eba\u5fd7\ud83d\udd16\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-1.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-1.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u56fe\u7247\u6570\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-1.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\ud83d\udd16\u97e9\u6f2b\ud83d\udd16\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-20.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-20.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u56fe\u7247\u6570\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-20.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n\n {\n \"title\": \"\ud83d\udd16\u5355\u884c\u672c\ud83d\udd16\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-9.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-9.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u56fe\u7247\u6570\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-9.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\ud83d\udd16\u6742\u5fd7&\u77ed\u7bc7\ud83d\udd16\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-10.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-10.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"title\": \"\u56fe\u7247\u6570\",\n \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-10.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n }\n]","header":"@js:\nJSON.stringify({\n\"Referer\":baseUrl\n})","lastUpdateTime":"1763999238954","respondTime":180000,"ruleBookInfo":{"coverUrl":"\/\/div[@class='asTB']\/div[@class='asTBcell uwthumb']\/img\/@src##\/\/\/\/##https:\/\/","downloadUrls":"\/\/div[@id='ads']\/a[1]\/@href","intro":"\/\/div[@class='asTBcell uwconn']\/p\/text()@js:result.split('\\n').join('')","kind":"\/\/div[@class='addtags']\/a[@class='tagshow']\/text()","wordCount":"\/\/div[@class='asTBcell uwconn']\/label\/text()@js:\nconst infoSplit = result.split('\\n')\nconst info = []\nfor(var i = 0;i<infoSplit .length;i++){\ninfo.push(infoSplit[i].split('\uff1a')[1])\n}\ninfo.join(' ')"},"ruleContent":{"content":"\/\/span[@id='imgarea']\/a\/img\/@src##\/\/##https:\/\/@js:\n\n\/\/ \u83b7\u53d6\u524d\u7f00URL\nconst regexStr = \"^https:\/\/img5\\\\.qy0\\\\.ru\/data\/\\\\d+\/\\\\d+\/\";\nconst regex = new RegExp(regexStr, \"g\");\nconst prefixUrlMatch = result.match(regex);\nconst prefixUrl = prefixUrlMatch ? prefixUrlMatch[0] : \"\";\n\n\/\/ \u89e3\u6790\u56fe\u7247\u4fe1\u606f\u6570\u7ec4\uff08\u5bb9\u9519\uff1a\u6570\u7ec4\u4e3a\u7a7a\u65f6\u8bbe\u4e3a[]\uff09\nconst imgInfoList = JSON.parse(java.get('imgInfoList') || '[]');\n\n\/\/ \u62fc\u63a5\u5b8c\u6574\u56fe\u7247\u94fe\u63a5\uff08\u76f4\u63a5\u4f7f\u7528\u539f\u59cbimgName\uff09\nconst imgUrlList = [];\nif (prefixUrl) {\n imgInfoList.forEach(item => {\n \/\/ \u4ec5\u505a\u7a7a\u503c\u5bb9\u9519\uff0c\u4e0d\u4fee\u6539imgName\u539f\u59cb\u503c\n const imgName = item.imgName || '';\n const imgExtension = item.imgExtension || 'jpg';\n const fullImgUrl = prefixUrl + imgName + \".\" + imgExtension;\n imgUrlList.push(fullImgUrl);\n });\n}\n\n\/\/ \u89c4\u5219\u8f93\u51fa\u62fc\u63a5\u540e\u7684img\u6807\u7b7e\nimgUrlList.map(x=>'<img src=\\\"'+x+'\\\">')\n.join(\"\\n\")","imageStyle":"FULL"},"ruleExplore":[],"ruleSearch":{"bookList":"\/\/div[@class='gallary_wrap']\/ul\/li","bookUrl":"\/\/div[@class='info']\/div[@class='title']\/a\/@href,{\"webView\":true}","checkKeyWord":"\u5143\u9b54\u6cd5","coverUrl":"\/\/li\/div[1]\/a\/img\/@src","intro":"\/\/li\/div[@class='info']\/div[@class='info_col']\/text()@js:\nvar timeStr = result.split(\"\uff0c\")[1] || \"\";\nvar updateTime = timeStr.match(\/\u5275\u5efa\u65bc(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})\/)?.[1] || \"\u65e0\u65f6\u95f4\";\n'\u66f4\u65b0\u65f6\u95f4: ' + updateTime;","kind":"\/\/li\/div[1]\/@class@js:\nif (result[0].indexOf('cate-1') !== -1) { \n '\u540c\u4eba\u5fd7\/\u6c49\u5316'; \/\/ \u52a0return\uff0c\u5426\u5219\u65e0\u8fd4\u56de\u503c\n} else if (result[0].indexOf('cate-12') !== -1) {\n '\u540c\u4eba\u5fd7\/\u65e5\u8bed'; \n} else if (result[0].indexOf('cate-9') !== -1) {\n '\u5355\u884c\u672c\/\u6c49\u5316';\n} else if (result[0].indexOf('cate-13') !== -1) {\n '\u5355\u884c\u672c\/\u65e5\u8bed';\n} else if (result[0].indexOf('cate-10') !== -1) {\n '\u6742\u5fd7&\u77ed\u7bc7\/\u6c49\u5316';\n} else if (result[0].indexOf('cate-14') !== -1) {\n '\u6742\u5fd7&\u77ed\u7bc7\/\u65e5\u8bed';\n} else if (result[0].indexOf('cate-18') !== -1) {\n '\u6742\u5fd7&\u77ed\u7bc7\/English';\n} else if (result[0].indexOf('cate-20') !== -1) {\n '\u97e9\u6f2b\/\u6c49\u5316';\n} else if (result[0].indexOf('cate-21') !== -1) {\n '\u97e9\u6f2b\/\u751f\u8089';\n} else {\n ''; \n}","name":"\/\/div[@class='info']\/div[@class='title']\/a\/\/text()@js:\nconst bookname= result.split('\\n').join('').replace(\/^.*?]\/g, '')\nbookname","wordCount":"\/\/li\/div[@class='info']\/div[@class='info_col']\/text()@js:\nvar imgNum = result.split(\"\uff0c\")[0].match(\/\\d+(?=\u5f35\u5716\u7247)\/g)[0]\nimgNum+'\u9875'"},"ruleToc":{"chapterList":"\/\/div[@class='gallary_wrap tb']\/ul\/li[1]@js:\nvar imgInfoList = [];\nvar nextPageUrl = [];\n\n\/\/ 1. \u5904\u7406\u5206\u9875URL\uff08\u4fdd\u7559\u6709\u6548\u903b\u8f91\uff09\nvar rawHrefs = java.getString(\"\/\/div[@class='f_left paginator']\/a\/@href\") || \"\";\nnextPageUrl = rawHrefs.split('\\n').filter(x => x.trim());\nnextPageUrl = nextPageUrl.map(x => {\n var url = x.trim();\n while (url.startsWith(\"\/\")) {\n url = url.slice(1);\n }\n return url.startsWith(\"http\") ? url : \"https:\/\/www.wnacg.ru\/\" + url;\n});\nnextPageUrl.unshift(baseUrl);\n\n\/\/ 2. \u6838\u5fc3\u5de5\u5177\u51fd\u6570\uff1a\u9884\u5904\u7406HTML\uff08\u79fb\u9664\u6ce8\u91ca+\u6e05\u7406\u7a7a\u683c\uff09\nfunction cleanHtml(html) {\n if (!html) return \"\";\n \/\/ \u6b65\u9aa41\uff1a\u79fb\u9664\u6240\u6709HTML\u6ce8\u91ca\uff08<!-- ... -->\uff09\uff0c\u5f7b\u5e95\u6d88\u9664\u5e72\u6270\n html = html.replace(\/<!--[\\s\\S]*?-->\/g, \"\");\n \/\/ \u6b65\u9aa42\uff1a\u79fb\u9664\u591a\u4f59\u7a7a\u767d\u5b57\u7b26\uff08\u6362\u884c\u3001\u5236\u8868\u7b26\u7b49\uff09\uff0c\u7b80\u5316\u5339\u914d\n html = html.replace(\/\\s+\/g, \" \");\n return html;\n}\n\n\/\/ 3. \u6838\u5fc3\u5de5\u5177\u51fd\u6570\uff1a\u63d0\u53d6\u5355\u9875\u7684\u201c\u5e8f\u53f7\u6570\u7ec4\u201d\u548c\u201c\u56fe\u7247src\u6570\u7ec4\u201d\nfunction extractPageData(cleanedHtml) {\n var names = []; \/\/ \u5e8f\u53f7\u6570\u7ec4\uff08001\u3001002\u3001003...\uff09\n var srcs = []; \/\/ \u56fe\u7247src\u6570\u7ec4\uff08\u4e0e\u5e8f\u53f7\u4e00\u4e00\u5bf9\u5e94\uff09\n\n \/\/ \u63d0\u53d6\u6240\u6709\u5e8f\u53f7\uff08<span class=\"name tb\">xxx<\/span>\uff09\n var nameRegex = \/<span class=\"name tb\">([\\d]+)<\\\/span>\/g;\n var nameMatch;\n while ((nameMatch = nameRegex.exec(cleanedHtml)) !== null) {\n names.push(nameMatch[1]);\n }\n\n \/\/ \u63d0\u53d6\u6240\u6709\u6709\u6548\u56fe\u7247src\uff08\u4e0e\u5e8f\u53f7\u5bf9\u5e94\u7684img\uff0calt\u5305\u542b\u201c_\u5e8f\u53f7\u201d\uff09\n var srcRegex = \/<img src=\"([^\"]+)\" alt=\"[^\"]+_([\\d]+)\"\/g;\n var srcMatch;\n while ((srcMatch = srcRegex.exec(cleanedHtml)) !== null) {\n \/\/ \u786e\u4fddsrc\u5bf9\u5e94\u7684\u5e8f\u53f7\u5728names\u6570\u7ec4\u4e2d\uff08\u907f\u514d\u65e0\u5173\u56fe\u7247\uff09\n if (names.includes(srcMatch[2])) {\n srcs.push(srcMatch[1]);\n }\n }\n\n return { names: names, srcs: srcs };\n}\n\n\/\/ 4. \u6267\u884c\u591a\u9875\u63d0\u53d6\ntry {\n for (var p = 0; p < nextPageUrl.length; p++) {\n var pageUrl = nextPageUrl[p];\n var pageNum = p + 1;\n\n \/\/ \u6b65\u9aa41\uff1a\u83b7\u53d6\u5e76\u6e05\u7406HTML\uff08\u79fb\u9664\u6ce8\u91ca+\u591a\u4f59\u7a7a\u683c\uff09\n var rawHtml = new String(java.ajax(pageUrl)) || \"\";\n var cleanedHtml = cleanHtml(rawHtml);\n\n \/\/ \u6b65\u9aa42\uff1a\u63d0\u53d6\u5f53\u524d\u9875\u7684\u5e8f\u53f7\u548csrc\u6570\u7ec4\n var pageData = extractPageData(cleanedHtml);\n var pageNames = pageData.names;\n var pageSrcs = pageData.srcs;\n\n \/\/ \u6b65\u9aa43\uff1a\u6309\u7d22\u5f15\u914d\u5bf9\uff08\u5e8f\u53f7\u548csrc\u4e00\u4e00\u5bf9\u5e94\uff09\uff0c\u907f\u514d\u6f0f\u914d\n var addedNum = 0;\n for (var i = 0; i < pageNames.length; i++) {\n var imgName = pageNames[i];\n var imgSrc = pageSrcs[i] || \"\";\n var imgExtension = \"\";\n\n \/\/ \u63d0\u53d6\u6269\u5c55\u540d\n if (imgSrc) {\n var dotIndex = imgSrc.lastIndexOf(\".\");\n if (dotIndex !== -1) {\n imgExtension = imgSrc.slice(dotIndex + 1).toLowerCase().split(\/[?#]\/)[0];\n }\n }\n\n \/\/ \u53bb\u91cd\u5e76\u6dfb\u52a0\u5230\u6570\u7ec4\n if (imgName && imgExtension && !imgInfoList.some(item => item.imgName === imgName)) {\n imgInfoList.push({ imgName: imgName, imgExtension: imgExtension });\n addedNum++;\n }\n }\n\n }\n} catch (e) {\n java.log(\"\u63d0\u53d6\u62a5\u9519\uff1a\" + e.message);\n}\n\nimgInfoList.sort((a, b) => parseInt(a.imgName) - parseInt(b.imgName));\n\n\/\/ \u8fd4\u56de\u539f\u7ed3\u679c\uff0c\u4e0d\u5f71\u54cd\u76ee\u5f55\u5217\u8868\njava.put('imgInfoList',JSON.stringify(imgInfoList))\nresult;","chapterName":"\/\/li\/text()@js:'\u5168\u8bdd\u9605\u8bfb'","chapterUrl":"\/\/li\/\/a\/@href,{\"webView\":true}","updateTime":"\/\/li\/div[@class='info']\/div[@class='info_col']\/text()"},"searchUrl":"https:\/\/www.wnacg.ru\/search\/?q={{key}}&f=_all&s=create_time_DESC&syn=yes","weight":500},{"bookSourceName":"\u98d8\u5929(\u68af\u5b50 \u6a21\u7cca\u641c\u7d22)","bookSourceType":0,"bookSourceUrl":"https:\/\/www.piaotia.com","customOrder":0,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"lastUpdateTime":"1764413976626","respondTime":30000,"ruleBookInfo":{"intro":"tr:nth-child(1) > td:nth-child(2) > div@text","tocUrl":"caption > a@href"},"ruleContent":{"content":"@js:result=result.match(\/style4.js[\\s\\S]+<br>([\\s\\S]+)<\\\/div>[\\s\\S]+!-- \u7ffb\u9875\u4e0a\\\/)[1]\n"},"ruleExplore":[],"ruleSearch":{"author":".odd:nth-child(3)@text","bookList":"tr:nth-child(n+2)","bookUrl":".odd > a@href","kind":".even:nth-child(6)@text","lastChapter":".even > a@text","name":".odd > a@text","wordCount":".even:nth-child(4)@text@js:String(parseInt(result.replace('k',''))*1000)"},"ruleToc":{"chapterList":".centent ul li","chapterName":"a@text","chapterUrl":"a@href"},"searchUrl":"\/modules\/article\/search.php?searchkey={{java.encodeURI(key,'gbk')}}&searchtype=articlename","weight":0},{"bookSourceComment":"\u66f4\u65b0\u65e5\u5fd7\u8bf7\u70b9\u51fb\u767b\u5f55\uff0c\u66f4\u65b0\u4e66\u6e90\u4e2d\u67e5\u770b\n\n\u517c\u5bb9\u6b63\u5f0f\u7248\u9605\u8bfbapp","bookSourceGroup":"\u5927\u7070\u72fc\u805a\u5408","bookSourceName":"\ud83c\udf45\u5927\u7070\u72fc\u878d\u54084.11.25(\u5b8c\u5168\u7248)","bookSourceType":0,"bookSourceUrl":"\u5927\u7070\u72fc\u878d\u54084.0","bookUrlPattern":"https?:\\\/\\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\\/detail.*","customOrder":22,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"exploreUrl":"<js>\nfunction setArgument(key, value) {\n var open_argument = source.getVariable();\n open_argument = getArguments(open_argument, '') || {};\n open_argument[key] = value;\n var result = JSON.stringify(open_argument);\n source.setVariable(result);\n return result;\n}\n\nvar open_argument = source.getVariable();\nvar base_url = getArguments(open_argument, 'server') || '';\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '\u7537\u9891';\nvar tab = getArguments(open_argument, 'media') || '\u5c0f\u8bf4';\nvar sources = getArguments(open_argument, 'source') || '\u756a\u8304';\n\n\nvar sdtoken;\ntry {\n var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie) {\n java.toast('\u60a8\u8fd8\u672a\u767b\u9646\u756a\u8304\u8d26\u53f7\uff0c\u65e0\u6cd5\u540c\u6b65\u6570\u636e\u54e6\uff01');\n} else {\n fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"\/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"\/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"\/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [];\n\nfunction deviceType() {\n try {\n return !!java.androidId();\n } catch (e) {\n return false;\n }\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie) {\n function groupQuery() {\n try {\n var url = base_url + \"\/group_name?ssionid=\" + fqssionid;\n var res = java.ajax(url);\n var response = JSON.parse(res);\n\n if (!(response && response.data)) {}\n\n response.data.forEach(function(group) {\n var keys = Object.keys(group);\n if (keys.length > 0) {\n var key = keys[0];\n var value = group[key];\n if (value && value.length) {\n var option = {\n \"method\": \"POST\",\n \"body\": {\n \"book_ids\": value,\n \"page\": \"{{page}}\"\n }\n };\n groupDatas.push({\n title: key,\n url: base_url + \"\/bookshelf,\" + JSON.stringify(option),\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: 0.45\n }\n });\n }\n }\n });\n\n if (groupDatas.length % 2 !== 0) {\n groupDatas.push({\n title: \"--\",\n url: \"\",\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: 0.45\n }\n });\n }\n } catch (e) {\n java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n }\n }\n\n try {\n java.longToast(\"\u6b63\u5728\u52a0\u8f7d\u5206\u7ec4\u6570\u636e...\");\n var userUrl = base_url + \"\/fquser?ssionid=\" + fqssionid;\n var userRes = java.ajax(userUrl);\n var userData = JSON.parse(userRes);\n\n var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '\u672a\u77e5\u7528\u6237';\n if (!userName.includes('\u672a\u77e5\u7528\u6237')) {\n infoData = [{\n title: userName + \"\u4e2a\u4eba\u4e2d\u5fc3\",\n url: fqsjurl,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: 1\n }\n }, {\n title: \"\u4e2a\u6027\u63a8\u8350(\u756a\u8304)\",\n url: fqtjurl,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: 0.45\n }\n }, {\n title: \"\u5386\u53f2\u9605\u8bfb(\u756a\u8304)\",\n url: fqlsurl,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: 0.45\n }\n }];\n }\n groupQuery();\n } catch (e) {\n java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n }\n}\n\nvar style_list = [];\ntry {\n var durl = `${base_url}\/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n var res = java.ajax(durl);\n var result = JSON.parse(res);\n style_list = result.data || [];\n if (result.msg) {\n java.toast(result.msg);\n }\n} catch (e) {\n java.toast(\"\u53d1\u73b0\u6837\u5f0f\u83b7\u53d6\u5931\u8d25\");\n}\n\nvar finalData = infoData.concat(groupDatas, style_list);\nJSON.stringify(finalData);\n<\/js>","header":"{ \"User-Agent\":\"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\" }","jsLib":"var host = [\n 'http:\/\/219.154.201.122:5006'\n];\n\nfunction getArguments(open_argument, key) {\n try {\n open_argument = JSON.parse(open_argument);\n } catch (e) {\n open_argument = {\n media: \"\u5c0f\u8bf4\",\n tone_id: \"\u9ed8\u8ba4\u97f3\u8272\",\n server: host[0],\n source: \"\u5168\u90e8\",\n source_type: \"\u7537\u9891\",\n };\n }\n if (key) {\n return open_argument[key];\n } else {\n return open_argument;\n }\n}\n\nfunction setArguments(key, value) {\n const {\n source\n } = this;\n let open_argument = source.getVariable();\n open_argument = getArguments(open_argument, '');\n open_argument[key] = value;\n open_argument = JSON.stringify(open_argument);\n source.setVariable(open_argument);\n return open_argument;\n}\n\nfunction decrypt(Text) {\n return Text;\n}\n\nfunction paraForAndroid(content, sources) {\n let {\n java,\n cache,\n source\n } = this;\n let plcolor = getArguments(source.getVariable(), \"plcolor\");\n if (!plcolor) {\n plcolor = \"#000000\";\n }\n\n const createSvg = this.createSvg.bind(this);\n\n return content.replace(\/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n (match, text, url, count) => {\n if (url && count) {\n const click = 0;\n cache.putMemory(url, click);\n const encodedUrl = url;\n return `<p>${text}<img src=\"${createSvg(count, plcolor,encodedUrl,sources)}\"><\/p>`;\n } else {\n return `<p>${text}<\/p>`;\n }\n }\n );\n}\n\n\nfunction showCmt(url, sources) {\n let {\n java,\n cache\n } = this;\n\n const currentTime = Date.now();\n const click = cache.getFromMemory(url);\n let isqread = false;\n try {\n java.qread();\n isqread = true;\n } catch (e) {}\n if (click < 1 && !isqread) {\n cache.putMemory(url, click + 1);\n return;\n } else {\n try {\n java.startBrowserDp(url, sources + '\u6bb5\u8bc4');\n } catch (e) {\n java.startBrowser(url, sources + '\u6bb5\u8bc4');\n }\n }\n}\n\n\n\nfunction createSvg(number, color, encodedUrl, sources) {\n var displayText = number > 99 ? \"99+\" : number.toString();\n var loginInfoMap = {};\n\n if (this.source && typeof this.source.getLoginInfoMap == 'function') {\n loginInfoMap = this.source.getLoginInfoMap() || {};\n }\n\n var bubbleStyle = String(loginInfoMap['\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f'] || '0');\n var svg;\n\n \/\/ \u6837\u5f0f1\uff1a\u7cbe\u81f4\u5706\u5f62 - \u7b80\u6d01\u4f18\u96c5\n if (bubbleStyle == '1') {\n svg = '<svg width=\"1000\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"32\" opacity=\"0.2\"\/>' +\n '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"4\"\/>' +\n '<text x=\"500\" y=\"500\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n 'font-size=\"400\" fill=\"' + color + '\" dy=\"0.35em\" font-weight=\"500\">' + displayText + '<\/text>' +\n '<\/svg>';\n }\n \/\/ \u6837\u5f0f2\uff1a\u5fae\u4fe1\u98ce\u683c - \u719f\u6089\u4eb2\u5207\u7684\u5bf9\u8bdd\u6c14\u6ce1\n else if (bubbleStyle == '2') {\n svg = '<svg width=\"1000\" height=\"900\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n '<path d=\"M120,120 L880,120 Q920,120 920,160 L920,680 Q920,720 880,720 L280,720 L120,840 L120,720 Q80,720 80,680 L80,160 Q80,120 120,120 Z\" ' +\n 'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n '<text x=\"500\" y=\"440\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n 'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\">' + displayText + '<\/text>' +\n '<\/svg>';\n }\n \/\/ \u6837\u5f0f3\uff1a\u60ac\u6d6e\u6807\u7b7e - \u6241\u5e73\u73b0\u4ee3\u98ce\u683c\n else if (bubbleStyle == '3') {\n svg = '<svg width=\"1000\" height=\"600\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n '<rect x=\"80\" y=\"80\" width=\"840\" height=\"440\" rx=\"220\" ry=\"220\" ' +\n 'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"6\"\/>' +\n '<rect x=\"100\" y=\"100\" width=\"800\" height=\"400\" rx=\"200\" ry=\"200\" ' +\n 'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"20\" opacity=\"0.3\"\/>' +\n '<text x=\"500\" y=\"310\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n 'font-size=\"280\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\" letter-spacing=\"8\">' + displayText + '<\/text>' +\n '<\/svg>';\n }\n \/\/ \u6837\u5f0f4\uff1a\u4e66\u7b7e\u6807\u6ce8 - \u7b26\u5408\u9605\u8bfb\u573a\u666f\n else if (bubbleStyle == '4') {\n svg = '<svg width=\"900\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n '<path d=\"M150,80 L750,80 Q800,80 800,130 L800,870 Q800,920 750,920 L480,920 L450,980 L420,920 L150,920 Q100,920 100,870 L100,130 Q100,80 150,80 Z\" ' +\n 'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n '<line x1=\"150\" y1=\"280\" x2=\"750\" y2=\"280\" stroke=\"' + color + '\" stroke-width=\"3\" opacity=\"0.3\"\/>' +\n '<text x=\"450\" y=\"520\" font-family=\"Georgia, serif\" text-anchor=\"middle\" ' +\n 'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"400\">' + displayText + '<\/text>' +\n '<text x=\"450\" y=\"800\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n 'font-size=\"70\" fill=\"' + color + '\" opacity=\"0.6\" letter-spacing=\"3\">\u8bc4\u8bba<\/text>' +\n '<\/svg>';\n }\n \/\/ \u9ed8\u8ba4\u8fd4\u56de\u6837\u5f0f0\n else {\n svg = '<svg width=\"160\" height=\"120\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n '<path d=\"M 55 10 ' +\n 'L 120 10 ' +\n 'Q 150 10 150 40 ' +\n 'L 150 80 ' +\n 'Q 150 110 120 110 ' +\n 'L 55 110 ' +\n 'Q 25 110 25 80 ' +\n 'L 25 75 ' +\n 'L 3 60 ' +\n 'L 25 45 ' +\n 'L 25 40 ' +\n 'Q 25 10 55 10 Z\" ' +\n 'fill=\"none\" ' +\n 'stroke=\"' + color + '\" ' +\n 'stroke-width=\"2\" ' +\n 'stroke-linejoin=\"round\"\/>' +\n '<!-- \u6570\u5b57\u6587\u672c -->' +\n '<text x=\"87\" y=\"75\" ' +\n 'font-family=\"Arial, sans-serif\" ' +\n 'text-anchor=\"middle\" ' +\n 'dominant-baseline=\"middle\" ' +\n 'font-size=\"50\" ' +\n 'font-weight=\"bold\" ' +\n 'fill=\"' + color + '\">' +\n displayText +\n '<\/text>' +\n '<!-- \u63d0\u793a\u6587\u672c -->' +\n '<text x=\"87\" y=\"95\" ' +\n 'font-family=\"Arial, sans-serif\" ' +\n 'text-anchor=\"middle\" ' +\n 'dominant-baseline=\"middle\" ' +\n 'font-size=\"9\" ' +\n 'fill=\"' + color + '\" ' +\n 'opacity=\"0.7\">' +\n '\u5237\u65b0\u67e5\u770b' +\n '<\/text>' +\n '<\/svg>';\n }\n\n var encodedSvg = this.java.base64Encode(svg);\n return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"js\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources + '\\')\",\"style\":\"text\"}';\n}\n\n\n\nfunction cleanHTML(html) {\n let result = html\n .replace(\/<header[^>]*>[\\s\\S]*?<\\\/header>\/gi, \"\")\n .replace(\/<div class=\"tt-title\"[^>]*>[\\s\\S]*?<\\\/div>\/gi, \"\")\n .replace(\/<(?!\\\/?p\\b|\\\/?img\\b)[^>]+>\/gi, \"\");\n result = result.replace(\/<\\\/?p[^>]*>\/g, \"\\n\");\n return result.replace(\/\\n+\/g, \"\\n\").trim();\n}\n\nfunction getSessionId(cookieString) {\n const match = cookieString.match(\/sessionid=([^;]+)\/);\n return match ? match[1] : null;\n}\n\nfunction getKey(key) {\n let parts = key.split(\";\");\n for (let part of parts) {\n if (part.includes(\"qttoken\")) {\n return part.split(\"=\")[1];\n }\n }\n return \"\";\n}\n\nfunction getFanqieCookie() {\n const {\n cookie\n } = this;\n try {\n return String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com') || '');\n } catch (e) {\n return '';\n }\n}\n\n\nfunction paraForiOS(html, sources) {\n return html.replace(\n \/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n function(match, text, url, count) {\n if (url && count) {\n const encodedUrl = url.replace(\/&\/g, '&');\n return `<span rs-native>${text}<comment count=\"${count}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}\u6bb5\u8bc4')\"><\/span>`;\n } else {\n return `<span rs-native>${text}<\/span>`;\n }\n }\n );\n}","lastUpdateTime":"1764434902238","loginUi":"[{\n \"name\": \"\u90ae\u7bb1\",\n \"type\": \"text\"\n },\n {\n \"name\": \"\u5bc6\u7801\",\n \"type\": \"password\"\n },\n {\n \"name\": \"\u2665\u767b\u5f55\u4e66\u6e90\",\n \"type\": \"button\",\n \"action\": \"login(true)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83c\udf45\u756a\u8304\u767b\u5f55\",\n \"type\": \"button\",\n \"action\": \"fq_login()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n },\n {\n \"name\": \"\ud83c\udfdd\u7528\u6237\u540e\u53f0\/\u6ce8\u518c\",\n \"type\": \"button\",\n \"action\": \"loginqt()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n },\n {\n \"name\": \" \ud83d\udd1a \u9000\u51fa\u767b\u5f55\",\n \"type\": \"button\",\n \"action\": \"logout()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83d\udd2e \u68c0\u6d4b\u767b\u5f55\",\n \"type\": \"button\",\n \"action\": \"checkStatus()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n\n }, {\n \"name\": \" \ud83d\uddd1 \u6e05\u9664\u8bbe\u5907\",\n \"type\": \"button\",\n \"action\": \"clearDevice()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n\n }, {\n \"name\": \"\ud83d\udcd1\u66f4\u5c11\u7b80\u4ecb\",\n \"type\": \"button\",\n \"action\": \"set_info()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83d\udcdd\u6bb5\u8bc4\u5f00\u5173\",\n \"type\": \"button\",\n \"action\": \"paracomment('fqpara')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83d\udc68\u200d\ud83e\uddb1\u7537\u9891\u53d1\u73b0\",\n \"type\": \"button\",\n \"action\": \"set_source_type('\u7537\u9891')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83d\udc69\u200d\ud83e\uddb0\u5973\u9891\u53d1\u73b0\",\n \"type\": \"button\",\n \"action\": \"set_source_type('\u5973\u9891')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\u2615\u6253\u8d4f\u4eab\u798f\u5229\",\n \"type\": \"button\",\n \"action\": \"vip()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\u2747\ufe0f \u66f4\u65b0\u4e66\u6e90\",\n \"type\": \"button\",\n \"action\": \"renderVersionPage()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83d\uddc2\u5f53\u524d\u6a21\u5f0f\",\n \"type\": \"button\",\n \"action\": \"get_media()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n }, {\n \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\u6a21\u5f0f\",\n \"type\": \"button\",\n \"action\": \"set_media('\u5c0f\u8bf4')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83d\udd0a\u542c\u4e66\u6a21\u5f0f\",\n \"type\": \"button\",\n \"action\": \"set_media('\u542c\u4e66')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83c\udfde\u6f2b\u753b\u6a21\u5f0f\",\n \"type\": \"button\",\n \"action\": \"set_media('\u6f2b\u753b')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83d\uddb2\u77ed\u5267\u6a21\u5f0f\",\n \"type\": \"button\",\n \"action\": \"set_media('\u77ed\u5267')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83c\udf9a\u5207\u6362\u670d\u52a1\u5668\",\n \"type\": \"button\",\n \"action\": \"set_server()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\u267b\ufe0f\u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\",\n \"type\": \"button\",\n \"action\": \"checkNet()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\u2695\ufe0f\u672c\u5730\/\u670d\u52a1\u5668 \",\n \"type\": \"button\",\n \"action\": \"get_proxy()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83d\udccc\u6c38\u4e45\u53d1\u5e03\u9875\ud83d\udccc\",\n \"type\": \"button\",\n \"action\": \"api()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\u2193\u2193\u4e0b\u65b9\u53ef\u5207\u6362\u6765\u6e90\u7528\u4e8e\u641c\u7d22\/\u53d1\u73b0\u9875\u2193\u2193\",\n \"type\": \"button\",\n \"action\": \"get_media()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n }, {\n \"name\": \"\u2728\ufe0f\u7f51\u53cb\u63a8\u8350\",\n \"type\": \"button\",\n \"action\": \"set_source('\u63a8\u8350')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\ud83d\udc96\u6211\u6765\u63a8\u8350\",\n \"type\": \"button\",\n \"action\": \"put_book()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\u5168\u90e8\",\n \"type\": \"button\",\n \"action\": \"set_source('\u5168\u90e8')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u756a\u8304')\",\n 'name': '\u756a\u8304',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('69\u4e66\u5427')\",\n 'name': '69\u4e66\u5427',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u4e03\u732b')\",\n 'name': '\u4e03\u732b',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u767e\u5ea6')\",\n 'name': '\u767e\u5ea6',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u8d77\u70b9')\",\n 'name': '\u8d77\u70b9(\u7b2c\u4e09\u65b9)',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5f97\u95f4')\",\n 'name': '\u5f97\u95f4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5854\u8bfb')\",\n 'name': '\u5854\u8bfb',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u4e66\u65d7')\",\n 'name': '\u4e66\u65d7',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('QQ')\",\n 'name': 'QQ',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u732b\u773c')\",\n 'name': '\u732b\u773c',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u641c\u4e66\u795e\u5668')\",\n 'name': '\u641c\u4e66\u795e\u5668',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5f97\u5947')\",\n 'name': '\u5f97\u5947',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u4f2a69')\",\n 'name': '\u4f2a69',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u7231\u4e0b\u7535\u5b50\u4e66')\",\n 'name': '\u7231\u4e0b\u7535\u5b50\u4e66',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5c0f\u7c73')\",\n 'name': '\u5c0f\u7c73',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u661f\u661f\u5c0f\u8bf4')\",\n 'name': '\u661f\u661f\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u7b14\u8da3\u960122')\",\n 'name': '\u7b14\u8da3\u960122',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u9876\u70b9')\",\n 'name': '\u9876\u70b9',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n 'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u6c5f\u6e56')\",\n 'name': '\u6c5f\u6e56',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u6b6a\u745e\u53e4\u5fb7')\",\n 'name': '\u6b6a\u745e\u53e4\u5fb7\u6f2b\u753b',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u6cb3\u9a6c')\",\n 'name': '\u6cb3\u9a6c\u77ed\u5267',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u77e5\u4e4e')\",\n 'name': '\u77e5\u4e4e',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('vip')\",\n 'name': '\u4e0b\u65b9\u4e3aVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709vip)',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n }, {\n 'action': \"set_source('\u559c\u9a6c\u62c9\u96c5')\",\n 'name': '\u559c\u9a6c\u62c9\u96c5',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u9177\u6211')\",\n 'name': '\u9177\u6211',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('svip')\",\n 'name': '\u4e0b\u65b9\u4e3aSVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709svip)',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n }, {\n 'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267')\",\n 'name': '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4')\",\n 'name': '\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u53f0\u6e7e\u5c0f\u8bf4')\",\n 'name': '\u53f0\u6e7e\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('3A\u5c0f\u8bf4')\",\n 'name': '3A\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5305\u5b50\u6f2b\u753b')\",\n 'name': '\u5305\u5b50\u6f2b\u753b',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, { \t \t\n 'action': \"set_source('QQ\u9605\u8bfb')\",\n 'name': 'QQ(\u4f1a\u5458\u4e66\u7c4d\u514d\u8d39)',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u4e66\u9999\u4e4b\u5bb6')\",\n 'name': '\u4e66\u9999\u4e4b\u5bb6',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \t 'action': \"set_source('\u8ffd\u66f4\u4eba')\",\n 'name': '\u8ffd\u66f4\u4eba',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u6f2b\u753b\u5c4b')\",\n 'name': '\u6f2b\u753b\u5c4b',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u6f2b\u753b\u7f51')\",\n 'name': '\u6f2b\u753b\u7f51',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u6d77\u6d0b\u542c\u4e66')\",\n 'name': '\u6d77\u6d0b\u542c\u4e66',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u9e7f\u9e7f')\",\n 'name': '\u9e7f\u9e7f',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5b8c\u672c\u5c0f\u8bf4')\",\n 'name': '\u5b8c\u672c\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u76d0\u9009\u6587\u5e93')\",\n 'name': '\u76d0\u9009\u6587\u5e93',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, { \t \t\n 'action': \"set_source('\u798f\u5229\u5c0f\u8bf4')\",\n 'name': '\u798f\u5229\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u8f7b\u4e4b\u6587\u5e93')\",\n 'name': '\u8f7b\u4e4b\u6587\u5e93',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5c0f\u8bf4\u4e09\u5343')\",\n 'name': '\u5c0f\u8bf4\u4e09\u5343',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u9605\u53cb\u5c0f\u8bf4')\",\n 'name': '\u9605\u53cb\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u661f\u7a7a\u5c0f\u8bf4')\",\n 'name': '\u661f\u7a7a\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5168\u514d\u6f2b\u753b')\",\n 'name': '\u5168\u514d\u6f2b\u753b',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('365\u5c0f\u8bf4')\",\n 'name': '365\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u798f\u5229\u6f2b\u753b')\",\n 'name': '\u798f\u5229\u6f2b\u753b',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u4e07\u76f8\u4e66\u57ce')\",\n 'name': '\u4e07\u76f8\u4e66\u57ce',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u72ec\u6b65\u5c0f\u8bf4')\",\n 'name': '\u72ec\u6b65\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u94c5\u7b14\u8f7b\u5c0f\u8bf4')\",\n 'name': '\u94c5\u7b14\u8f7b\u5c0f\u8bf4',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u6ca7\u5143\u56fe')\",\n 'name': '\u6ca7\u5143\u56fe',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u5168\u672c\u540c\u4eba')\",\n 'name': '\u5168\u672c\u540c\u4eba',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n 'action': \"set_source('\u6bd2\u820c\u5f71\u89c6')\",\n 'name': '\u6bd2\u820c\u5f71\u89c6',\n 'type': 'button',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n }, {\n \"name\": \"\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)\",\n \"type\": \"text\"\n }, {\n \"name\": \"\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714\",\n \"type\": \"text\"\n }, {\n \"name\": \"\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)\",\n \"type\": \"text\"\n }, {\n \"name\": \"\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)\",\n \"type\": \"text\"\n }, {\n \"name\": \"\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f\",\n \"type\": \"text\"\n }, {\n \"name\": \"\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)\",\n \"type\": \"text\"\n }\n]","loginUrl":"\/\/ \u5f53\u524d\u4e66\u6e90\u7248\u672c\u53f7\uff0c\u5207\u52ff\u4fee\u6539\uff0c\u5426\u5219\u5f71\u54cd\u66f4\u65b0\u7684\u8bc6\u522b\nconst localVersion = '4.11.25';\n\nfunction login(flag) {\n if (flag == undefined) {\n result = JSON.parse(source.getLoginInfo())\n } else {\n java.longToast(\"\\n\\n\ud83d\udc9e\u6b63\u5728\u767b\u5f55\u4e2d...\")\n putLoginInfo(JSON.stringify(result))\n }\n let base_url = getArgument('server')\n let zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n if (zdyserver.includes('http')) {\n setArgument('server', zdyserver);\n if (getKey(String(cookie.getCookie(base_url)))) {\n let cookies = cookie.getCookie(base_url)\ntry{cookie.removeCookie(base_url)} catch(e){cookie.removeCookie(base_url)}\n cookie.setCookie(zdyserver, cookies)\n }\n java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n }\n let zdytone_id = String(result['\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714'] || '');\n if (zdytone_id) {\n setArgument('tone_id', zdytone_id);\n } else {\n setArgument('tone_id', '\u9ed8\u8ba4\u97f3\u8272');\n }\n let plcolor = String(result['\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)'] || '#000000');\n if (plcolor) {\n setArgument('plcolor', plcolor);\n } else {\n setArgument('plcolor', '#000000');\n }\n let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n if (zdysources) {\n setArgument('source', zdysources);\n };\n base_url = getArgument('server')\n let register_email = String(result['\u90ae\u7bb1'])\n let password = String(result['\u5bc6\u7801'])\n let key = String(result['\u5bc6\u94a5'] || '')\n\n \/\/java.log(cookie.getCookie(base_url))\n if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n try{cookie.removeCookie(base_url)} catch(e){cookie.removeCookie(base_url)}\n let deviceKey = '';\n try {\n deviceKey = java.deviceID();\n } catch (e) {\n deviceKey = java.androidId();\n };\n let deviceId = deviceKey;\n if (register_email && password) {\n let options = JSON.stringify({\n method: 'POST',\n headers: {\n 'Content-Type': 'application\/json'\n },\n body: JSON.stringify({\n register_email: result['\u90ae\u7bb1'],\n password: result['\u5bc6\u7801']\n })\n })\n try {\n let data = JSON.parse(java.ajax(`${base_url}\/login_api,${options}`))\n if (data.code == 0) {\n \/\/java.toast(deviceId)\n java.toast(\"\\n\\n\u2705\ufe0f\u767b\u5f55\u6210\u529f\")\n cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`)\n result['\u5bc6\u94a5'] = data.key\n putLoginInfo(JSON.stringify(result))\n } else {\n java.toast('\\n\\n\ud83d\udc94' + data.msg || \"\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\")\n }\n } catch (e) {\n java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\\n\" + e.message)\n }\n } else {\n cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n try {\n res = JSON.parse(res)\n if (res.id != undefined) {\n java.toast('\\n\\n\u5bc6\u94a5\u767b\u5f55\u6210\u529f')\n result['\u90ae\u7bb1'] = res.email\n putLoginInfo(JSON.stringify(result))\n } else {\n throw new Error()\n }\n } catch (e) {\n java.log(e)\n java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\")\n }\n }\n } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n java.toast(\"\\n\\n\u5f53\u524d\u2705\ufe0f\u5df2\u767b\u5f55\uff0c\u8bf7\ud83d\udeab\u9000\u51fa\u767b\u5f55\u540e\u91cd\u65b0\u767b\u5f55\");\n \/\/checkStatus();\n } else if (flag) {\n java.toast(\"\\n\\n\u26d4\ufe0f\u8bf7\u5148\u586b\u5199\u90ae\u7bb1\u548c\u5bc6\u7801\");\n }\n}\n\n\/\/ \u68c0\u6d4b\u670d\u52a1\u5668\nfunction checkNet() {\n let url = getArgument('server');\n java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\uff1a${url}\\n\u8bf7\u7a0d\u7b49~`);\n let date1 = new Date().getTime();\n let html = java.ajax(url + '\/login');\n let date2 = new Date().getTime();\n let t = date2 - date1;\n let c = String(html).indexOf('\u5927\u7070\u72fc');\n let code = 1;\n let time = t \/ 1000 + 's';\n let logTime = '\u3010' + url + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n if (c == -1 || t > 5000) {\n java.longToast('\\n\ud83d\udc94\u3010\u8bbf\u95ee\u5931\u8d25\u63d0\u793a\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u65e0\u6cd5\u8bbf\u95ee(\u53ef\u80fd\u88ab\u5899)\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n } else if (t < 1000) {\n java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n } else if (t >= 1000 && t < 2000) {\n java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n } else if (t >= 2000 && t < 5000) {\n java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n }\n}\n\nfunction isVips(res) {\n let isVIP = '';\n let vipEndTime = res.vip_end_time;\n let formattedDate = '';\n\n if (vipEndTime && vipEndTime !== 0) {\n let date = new Date(vipEndTime * 1000);\n formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n let currentTime = Math.floor(Date.now() \/ 1000);\n let remainingDays = Math.ceil((vipEndTime - currentTime) \/ (24 * 60 * 60));\n if (currentTime > vipEndTime) {\n isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u5df2\u8fc7\u671f)`;\n } else if (remainingDays <= 7) {\n isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} \u5269\u4f59${remainingDays}\u5929`;\n } else {\n if (vipEndTime < 1912946812) {\n isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n } else {\n isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u6c38\u4e45)`;\n }\n }\n } else {\n isVIP = '\u60a8\u5c1a\u672a\u5f00\u901aVIP';\n }\n return isVIP;\n}\n\nfunction checkStatus() {\n java.longToast('\\n\\n\u267b\ufe0f\u68c0\u6d4b\u4e2d...');\n let base_url = getArgument('server')\n let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n try {\n res = JSON.parse(res)\n if (res.id != undefined) {\n result['\u90ae\u7bb1'] = res.email\n putLoginInfo(JSON.stringify(result))\n let devices\n try {\n devices = JSON.parse(res.device).length;\n } catch (e) {\n devices = res.device ? 1 : 0;\n }\n let isVip = isVips(res);\n tips = `\n\u250f\u2505\u2505\u2505\u2505\u2505\u2505\u2531\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2510\n\u3000 \ud83e\udde2\u6635\u79f0 \u3000\u3000\u3000\u3000${res.nickname.padEnd(20,\"\\t\") || \"\u672a\u8bbe\u7f6e\".padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\u2709\ufe0f\u90ae\u7bb1\u3000\u3000\u3000\u3000${res.email.replace(\/(.{3}).*?@\/,\"$1***@\").padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd11\u5bc6\u94a5\u3000\u3000\u3000\u3000${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcc5\u6ce8\u518c\u65f6\u95f4\u3000\u3000${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\uddd2\ufe0f\u4eca\u65e5\u9605\u8bfb\u3000\u3000${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcda\u7d2f\u8ba1\u9605\u8bfb\u3000\u3000${res.all_read_count.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd53\u6700\u540e\u9605\u8bfb\u3000\u3000${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'\u672a\u9605\u8bfb').padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcf1\u5173\u8054\u8bbe\u5907\u3000\u3000${devices.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udc51\u4f1a\u5458\u72b6\u6001\u3000\u3000${isVip.padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udeab\u5c01\u7981\u72b6\u6001\u3000\u3000${res.is_banned?'\u5df2\u5c01\u7981':'\u6b63\u5e38\u3000'}\u3000\u3000\u3000\u3000\u3000\u3000\u3000\n\u2517\u2505\u2505\u2505\u2505\u2505\u2505\u2539\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2518\n`\n java.log(tips)\n java.longToast(tips)\n } else {\n throw new Error(res.msg)\n }\n } catch (e) {\n \/\/java.log(e)\n java.toast(\"\\n\u68c0\u6d4b\u767b\u5f55\u5931\u8d25\\n\" + e.message)\n }\n}\n\nfunction clearDevice() {\n let base_url = getArgument('server')\n let res = java.ajax(`${base_url}\/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n java.toast(res.code === 0 ? \"\\n\\n\ud83d\udcf4\u8bbe\u5907\u6e05\u9664\u6210\u529f\" : res.msg)\n Packages.java.lang.Thread.sleep(500)\n checkStatus()\n}\n\/\/ \u4fdd\u5b58\u767b\u5f55UI\u4fe1\u606f\nfunction putLoginInfo(info) {\n try {\n let key = java.androidId()\n let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n cache.put(`userInfo_${source.getKey()}`, encodeStr)\n return true\n } catch (e) {\n java.log(e)\n return source.putLoginInfo(info)\n }\n}\n\n\/\/ \u586b\u5199\u5bc6\u94a5\nfunction loginqt() {\n java.startBrowserAwait(getArgument('server') + '\/login', '\u767b\u5f55\u5927\u7070\u72fc\u5c0f\u8bf4\u4e66\u6e90');\n}\n\n\/\/\u767b\u5f55\u756a\u8304\nfunction fq_login() {\n try {\n java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\")\n } catch (e) {\n java.toast(e)\n }\n try {\n cookie.removeCookie(\"snssdk.com\")\n } catch (e) {}\n var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token'])\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) {\n java.log(e)\n }\n if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n return false\n }\n java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n return true\n}\n\n\/\/\u9000\u51fa\u767b\u5f55\nfunction logout() {\n cookie.removeCookie(\"fanqienovel.com\");\n cookie.removeCookie(\"snssdk.com\");\n cookie.removeCookie(\"69shuba.com\");\n \/*\n let servers = host\n for (let server of servers) {\n \ttry{cookie.removeCookie(server )} catch(e){cookie.removeCookie(server )}\n }\n *\/\ntry{cookie.removeCookie(getArgument('server'))} catch(e){cookie.removeCookie(getArgument('server'))}\n java.toast(\"\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\n\/\/\u83b7\u53d6\u53c2\u6570\nfunction getArgument(key) {\n let open_argument = source.getVariable();\n open_argument = getArguments(open_argument, '');\n return open_argument[key];\n}\n\n\/\/\u8bbe\u7f6e\u53c2\u6570\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);\n source.setVariable(open_argument);\n return open_argument;\n}\n\n\/\/ \u8bbe\u7f6e\u672c\u5730or\u4e91\u7aef\u8bbf\u95ee\nfunction get_proxy() {\n let proxy = getArgument('proxy');\n if (proxy == '\u672c\u5730') {\n setArgument('proxy', '\u4e91\u7aef');\n java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u670d\u52a1\u5668\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5207\u6362\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\uff0c\u598269\u4e66\u5427');\n } else {\n setArgument('proxy', '\u672c\u5730');\n java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5f00\u542f\u7f51\u7edc\u4ee3\u7406\uff0c\u598269\u4e66\u5427');\n }\n}\n\n\n\/\/\u8bbe\u7f6e\u7537\u5973\u9891\nfunction set_source_type(source_type) {\n setArgument(\"source_type\", source_type);\n java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\" + source_type);\n}\n\n\/\/\u9996\u9875\nfunction api() {\n java.startBrowserAwait('http:\/\/fb.langge.cf', \"\u9996\u9875\");\n}\n\n\/\/\u6253\u8d4f\nfunction vip() {\n java.startBrowserAwait(getArgument('server') + '\/coffee', \"\u559d\u5496\u5561\");\n}\n\nvar server = getArgument('server');\n\n\/\/\u8bbe\u7f6e\u641c\u7d22\u5a92\u4f53\nfunction set_media(media) {\n const mediaConfig = {\n '\u559c\u9a6c\u62c9\u96c5': ['\u542c\u4e66'],\n '\u756a\u8304': '*',\n '\u798f\u5229\u5c0f\u8bf4':['\u5c0f\u8bf4'],\n '\u5168\u514d\u6f2b\u753b':['\u6f2b\u753b'],\n '\u5305\u5b50\u6f2b\u753b':['\u6f2b\u753b'],\n '\u6f2b\u753b\u7f51':['\u6f2b\u753b'],\n '\u98ce\u8f66\u6f2b\u753b':['\u6f2b\u753b'],\n '\u798f\u5229\u6f2b\u753b':['\u6f2b\u753b'],\n '\u597d\u770b\u6f2b\u753b':['\u6f2b\u753b'],\n '\u9177\u6211':['\u542c\u4e66'],\n '\u6d77\u6d0b\u542c\u4e66':['\u542c\u4e66'],\n '\u4e03\u732b': ['\u5c0f\u8bf4', '\u542c\u4e66'],\n '\u6cb3\u9a6c': ['\u77ed\u5267'],\n '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267': ['\u77ed\u5267'],\n '\u6b6a\u745e\u53e4\u5fb7': ['\u6f2b\u753b'],\n '\u6bd2\u820c\u5f71\u89c6':['\u77ed\u5267'],\n '\u5168\u90e8': '*', \/\/ \u5141\u8bb8\u6240\u6709\u6a21\u5f0f\n '\u9ed8\u8ba4': ['\u5c0f\u8bf4']\n };\n\n const source = getArgument('source');\n const allowedModes = mediaConfig[source] || mediaConfig['\u9ed8\u8ba4'];\n let targetMedia = mediaConfig['\u9ed8\u8ba4'][0];\n let isAllowed = false;\n\n if (allowedModes === '*' || allowedModes.includes(media)) {\n targetMedia = media;\n isAllowed = true;\n } else if (Array.isArray(allowedModes)) {\n targetMedia = allowedModes[0];\n }\n\n const message = isAllowed ?\n `\\n\\n\u5df2\u5207\u6362\u81f3\uff1a${targetMedia}\\n\u8bf7\u91cd\u65b0\u641c\u7d22\u4e66\u7c4d\uff01` :\n `\\n\\n\u76ee\u524d${source}\uff1a\u4e0d\u652f\u6301\u3010${media}\u3011\u6a21\u5f0f\uff01\\n\u5df2\u81ea\u52a8\u5207\u6362\u81f3\uff1a${targetMedia}`;\n\n setArgument('media', targetMedia);\n java.toast(message);\n}\n\n\/\/\u83b7\u53d6\u641c\u7d22\u5a92\u4f53\nfunction get_media() {\n let media = getArgument('media');\n let source = getArgument('source');\n if (media == '') {\n media = '\u5168\u90e8';\n }\n var tishi = '\\n\\n\u5f53\u524d\u670d\u52a1\u5668\uff1a' + getArgument('server')\n java.longToast(`\\n\\n\u5f53\u524d\u4f7f\u7528\u6e90\uff1a${source}-${media}${tishi}`);\n}\n\n\n\/\/\u8bbe\u7f6e\u670d\u52a1\u5668\nfunction set_server() {\n putLoginInfo(JSON.stringify(result))\n let zdyserver;\n let base_url = getArgument('server')\n try {\n zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n if (zdyserver.includes('http')) {\n setArgument('server', zdyserver);\n if (getKey(String(cookie.getCookie(base_url)))) {\n let cookies = cookie.getCookie(base_url)\n try{cookie.removeCookie(base_url)} catch(e){cookie.removeCookie(base_url)}\n cookie.setCookie(zdyserver, cookies)\n }\n java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\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 if (getKey(String(cookie.getCookie(currentServer)))) {\n let cookies = cookie.getCookie(currentServer)\ntry{cookie.removeCookie(currentServer)} catch(e){cookie.removeCookie(currentServer)}\n cookie.setCookie(nextServer, cookies)\n }\n java.longToast(`\\n\\n\u670d\u52a1\u5668\u3010${nextIndex+1}\u3011\uff1a${nextServer}`);\n }\n}\n\n\/\/\u83b7\u53d6\u97f3\u8272\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n var datadist = {\n \"0\": \"\u9ed8\u8ba4\u97f3\u8272\",\n \"-1\": \"\u9605\u8bfb\u6a21\u5f0f\",\n \"-2\": \"\u6f2b\u753b\u6a21\u5f0f\",\n \"51\": \"\u591a\u4eba\u53d1\u97f3\",\n \"1\": \"\u751c\u7f8e\u5c11\u5973\",\n \"2\": \"\u6e05\u4eae\u9752\u53d4\",\n \"5\": \"\u5f00\u6717\u9752\u5e74\",\n \"6\": \"\u6e29\u67d4\u6dd1\u5973\",\n \"4\": \"\u6210\u719f\u5927\u53d4\",\n \"74\": \"\u5927\u53d4\u5347\u7ea7\",\n \"30\": \"\u4f18\u96c5\u5fa1\u59d0\"\n };\n var tone_id = datadist[arg] || arg;\n var tishi = '\\n\\n\u5f53\u524d\u97f3\u8272\uff1a' + tone_id;\n java.toast(tishi);\n}\n\n\/\/\u8bbe\u7f6e\u97f3\u8272\nfunction set_tone_id(mode, name) {\n putLoginInfo(JSON.stringify(result))\n let zdytone_id;\n try {\n zdytone_id = String(result['\u5176\u4ed6\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714']);\n if (zdytone_id) {\n setArgument('tone_id', zdytone_id);\n java.toast(`\\n\\n\u5f53\u524d\u97f3\u8272\u4e3a\u81ea\u5b9a\u4e49\u97f3\u8272\\n${zdytone_id}\\n\\n\u5207\u6362\u97f3\u8272\u8bf7\u5148\u6e05\u7a7a\u97f3\u8272\u8f93\u5165\u6846\u4e2d\u7684\u6570\u636e`);\n } else {\n zdytone_id = '';\n }\n } catch (error) {\n zdytone_id = '';\n }\n if (!zdytone_id) {\n let toast = \"\\n\\n\u5df2\u5207\u6362\u81f3\uff1a\" + name + '\\n\\n\u5207\u6362\u540e\u9700\u8981\u5237\u65b0\u8be6\u60c5\u9875';\n setArgument('tone_id', mode);\n java.toast(toast);\n }\n}\n\n\/\/\u8bbe\u7f6e\u6765\u6e90\nfunction set_source(sources) {\n let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n if (zdysources.length > 1 && zdysources != 'undefined') {\n java.toast('\\n\\n\u8bf7\u5148\u6e05\u7a7a\u81ea\u5b9a\u4e49\u6e90\u518d\u8bbe\u7f6e');\n } else {\n setArgument('source', sources);\n set_media('\u5c0f\u8bf4');\n java.toast(`\\n\\n\u5f53\u524d\u6765\u6e90\u5df2\u5207\u6362\u4e3a:\\n${sources}\\n\\n\u5207\u6362\u540e\u8bf7\u91cd\u65b0\u641c\u7d22`);\n }\n}\n\n\/\/ \u8bbe\u7f6e\u7b80\u4ecb\nfunction set_info() {\n var info = getArgument('info');\n if (info == 'on') {\n setArgument('info', 'off');\n java.toast('\\n\\n\u5df2\u6062\u590d\u8be6\u60c5\u9875\u8be6\u7ec6\u7b80\u4ecb');\n } else {\n setArgument('info', 'on');\n java.toast('\\n\\n\u5df2\u7cbe\u7b80\u8be6\u60c5\u9875\u7b80\u4ecb');\n }\n}\n\n\/\/ \u756a\u8304\u6bb5\u8bc4\nfunction paracomment() {\n var fqpara = getArgument('fqpara');\n if (fqpara == 'on') {\n setArgument('fqpara', 'off');\n java.longToast('\\n\\n\u6bb5\u8bc4\u5df2\u5173\u95ed');\n } else {\n setArgument('fqpara', 'on');\n java.longToast(\"\\n\\n\u6bb5\u8bc4\u5df2\u5f00\u542f\\n\\n\u957f\u6309\u5237\u65b0\u6bb5\u540e\u9762\u7684\u56fe\u7247\u5373\u53ef\\n\\n\u5982\u679c\u56fe\u7247\u4e0d\u663e\u793a\uff0c\u5237\u65b0\u65e0\u53cd\u5e94\\n\u8bf7\u66f4\u65b0\u6d4b\u8bd5\u7248\u9605\u8bfbapp\");\n }\n}\n\n\n\/\/ \u6211\u8981\u63a8\u8350\nfunction put_book() {\n java.startBrowserAwait(getArgument('server') + '\/put_book', '\u6211\u6765\u63a8\u8350');\n}\n\n\/\/ \u4e66\u6e90\u66f4\u65b0\nfunction renderVersionPage() {\n let yd = '';\n let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\" \/>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n <title>\u4e66\u6e90\u66f4\u65b0<\/title>\n <!-- Font Awesome \u56fe\u6807\u5e93 -->\n <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\" \/>\n <style>\n :root {\n --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n --success-color: #28c76f;\n --warning-color: #ff9f43;\n --error-color: #ea5455;\n --text-main: #1f2937;\n --text-secondary: #6b7280;\n --card-bg: #ffffff;\n --border-color: #e5e7eb;\n --light-bg: #f9fafb;\n --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n --modal-bg: rgba(31, 41, 55, 0.8);\n --modal-content-bg: #ffffff;\n }\n\n * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n }\n\n body {\n background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n color: var(--text-main);\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 16px;\n }\n\n \/* \u52a0\u8f7d\u52a8\u753b *\/\n .loading-wrapper {\n text-align: center;\n animation: fadeIn 0.3s ease;\n }\n\n .loading-spinner {\n width: 50px;\n height: 50px;\n border: 4px solid rgba(78, 110, 242, 0.3);\n border-top-color: #4e6ef2;\n border-radius: 50%;\n margin: 0 auto 20px;\n animation: spin 1s linear infinite;\n }\n\n .loading-text {\n color: var(--text-main);\n font-size: 16px;\n font-weight: 500;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n @keyframes fadeIn {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateY(30px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n }\n\n @keyframes gradientAnimation {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n\n @keyframes breathe {\n 0%, 100% { \n transform: scale(1);\n box-shadow: var(--glow-shadow), var(--shadow);\n }\n 50% { \n transform: scale(1.02);\n box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n }\n }\n\n @keyframes shimmer {\n 0% {\n background-position: -200% center;\n }\n 100% {\n background-position: 200% center;\n }\n }\n\n \/* \u4e3b\u5bb9\u5668 *\/\n .container {\n width: 100%;\n max-width: 420px;\n background: var(--card-bg);\n border-radius: 24px;\n overflow: hidden;\n box-shadow: var(--shadow);\n position: relative;\n z-index: 1;\n animation: slideIn 0.5s ease;\n display: none;\n }\n\n \/* \u5934\u90e8 *\/\n .header {\n background: var(--primary-gradient);\n color: #ffffff;\n padding: 24px 16px;\n text-align: center;\n position: relative;\n overflow: hidden;\n }\n\n .header::before {\n content: '';\n position: absolute;\n top: -30px;\n left: -30px;\n width: 80px;\n height: 80px;\n background: rgba(255, 255, 255, 0.15);\n border-radius: 50%;\n }\n\n .header::after {\n content: '';\n position: absolute;\n bottom: -60px;\n right: -60px;\n width: 150px;\n height: 150px;\n background: rgba(255, 255, 255, 0.1);\n border-radius: 50%;\n }\n\n .header h1 {\n font-size: 1.4rem;\n font-weight: 700;\n margin-bottom: 8px;\n position: relative;\n z-index: 2;\n }\n\n .header p {\n font-size: 0.9rem;\n opacity: 0.9;\n line-height: 1.4;\n position: relative;\n z-index: 2;\n }\n\n .header-icon {\n font-size: 48px;\n margin-bottom: 10px;\n display: inline-block;\n animation: bounce 2s ease infinite;\n }\n\n @keyframes bounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-10px); }\n }\n\n \/* \u7248\u672c\u5bf9\u6bd4 *\/\n .version-comparison {\n display: flex;\n flex-wrap: nowrap;\n gap: 12px;\n padding: 16px;\n margin-top: 8px;\n position: relative;\n z-index: 10;\n }\n\n .version-card {\n flex: 1;\n min-width: 45%;\n background: var(--card-bg);\n border-radius: 16px;\n padding: 28px 16px 16px;\n box-shadow: var(--shadow);\n text-align: center;\n position: relative;\n transition: transform 0.3s ease, box-shadow 0.3s ease;\n overflow: hidden;\n border: 1px solid rgba(120, 130, 240, 0.1);\n }\n\n .version-card:hover {\n transform: translateY(-4px);\n box-shadow: var(--shadow-hover);\n }\n\n .version-card.current-version {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n border: 1px solid rgba(78, 110, 242, 0.15);\n }\n\n .version-card.current-version:hover {\n box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n }\n\n .version-card.current-version h3,\n .version-card.current-version .version-number,\n .version-card.current-version .version-date {\n color: var(--text-main);\n }\n\n .version-card.latest-version {\n background: var(--latest-gradient);\n background-size: 300% 300%;\n box-shadow: var(--glow-shadow), var(--shadow);\n color: #fff;\n z-index: 2;\n animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n position: relative;\n overflow: hidden;\n }\n\n .version-card.latest-version::before {\n content: '';\n position: absolute;\n top: -50%;\n left: -50%;\n width: 200%;\n height: 200%;\n background: linear-gradient(\n 90deg,\n transparent,\n rgba(255, 255, 255, 0.3),\n transparent\n );\n transform: rotate(45deg);\n animation: shimmer 3s infinite;\n }\n\n .version-card.latest-version h3,\n .version-card.latest-version .version-number,\n .version-card.latest-version .version-date {\n color: #fff;\n text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n position: relative;\n z-index: 1;\n }\n\n .version-status {\n position: absolute;\n top: 6px;\n right: 6px;\n padding: 3px 7px;\n font-size: 0.65rem;\n font-weight: 600;\n border-radius: 6px;\n color: #fff;\n line-height: 1.2;\n white-space: nowrap;\n z-index: 2;\n }\n\n .version-card.latest-version .version-status {\n background: rgba(255, 255, 255, 0.25);\n backdrop-filter: blur(5px);\n border: 1px solid rgba(255, 255, 255, 0.3);\n color: #fff;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n }\n\n .status-outdated { background: var(--warning-color); }\n .status-latest { background: var(--success-color); }\n .status-invalid { background: var(--error-color); }\n\n .version-card h3 {\n font-size: 0.9rem;\n color: var(--text-secondary);\n margin-bottom: 8px;\n font-weight: 500;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n }\n\n .version-number {\n font-size: 1.25rem;\n font-weight: 700;\n color: var(--text-main);\n margin: 8px 0;\n transition: all 0.3s ease;\n font-family: 'Courier New', monospace;\n }\n\n .version-card.latest-version .version-number {\n font-size: 1.4rem;\n transform: scale(1.05);\n text-shadow: \n 0 2px 4px rgba(0, 0, 0, 0.3),\n 0 0 10px rgba(212, 175, 55, 0.8),\n 0 0 20px rgba(212, 175, 55, 0.5);\n animation: pulse-glow 2s ease-in-out infinite;\n }\n\n @keyframes pulse-glow {\n 0%, 100% {\n text-shadow: \n 0 2px 4px rgba(0, 0, 0, 0.3),\n 0 0 10px rgba(212, 175, 55, 0.8),\n 0 0 20px rgba(212, 175, 55, 0.5);\n }\n 50% {\n text-shadow: \n 0 2px 4px rgba(0, 0, 0, 0.3),\n 0 0 15px rgba(212, 175, 55, 1),\n 0 0 30px rgba(212, 175, 55, 0.7);\n }\n }\n\n .version-date {\n font-size: 0.8rem;\n color: var(--text-secondary);\n margin-top: 4px;\n }\n\n \/* \u7248\u672c\u5bf9\u6bd4\u6307\u793a\u5668 *\/\n .version-indicator {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n z-index: 5;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n color: white;\n }\n\n .version-indicator.update-needed {\n background: var(--error-color);\n box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n animation: pulse-indicator 1.5s infinite;\n }\n\n .version-indicator.is-latest {\n background: var(--success-color);\n box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n }\n\n @keyframes pulse-indicator {\n 0% { transform: translate(-50%, -50%) scale(1); }\n 50% { transform: translate(-50%, -50%) scale(1.1); }\n 100% { transform: translate(-50%, -50%) scale(1); }\n }\n\n \/* \u5185\u5bb9\u533a *\/\n .content-container {\n padding: 16px;\n }\n\n \/* \u72b6\u6001\u63d0\u793a *\/\n .status-alert {\n background: var(--card-bg);\n border-radius: 16px;\n box-shadow: var(--shadow);\n margin-bottom: 16px;\n overflow: hidden;\n border: 1px solid rgba(120, 130, 240, 0.1);\n padding: 12px 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n font-weight: 500;\n font-size: 14px;\n animation: slideIn 0.5s ease 0.3s backwards;\n }\n\n .status-alert i {\n font-size: 20px;\n }\n\n .status-alert.update-available {\n background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n color: #d63031;\n box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n }\n\n .status-alert.up-to-date {\n background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n color: white;\n box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n }\n\n \/* \u66f4\u65b0\u5bb9\u5668 *\/\n .update-container {\n background: var(--card-bg);\n border-radius: 16px;\n box-shadow: var(--shadow);\n margin-bottom: 16px;\n overflow: hidden;\n border: 1px solid rgba(120, 130, 240, 0.1);\n animation: slideIn 0.5s ease 0.4s backwards;\n }\n\n .update-header {\n background: var(--light-bg);\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--border-color);\n }\n\n .update-header h2 {\n font-size: 1rem;\n font-weight: 600;\n color: var(--text-main);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .update-header h2 i {\n color: #4e6ef2;\n }\n\n .update-tag {\n background: rgba(78, 110, 242, 0.1);\n color: #4e6ef2;\n padding: 4px 8px;\n border-radius: 8px;\n font-size: 0.75rem;\n font-weight: 600;\n }\n\n .update-content {\n padding: 16px;\n }\n\n .update-date {\n font-weight: 600;\n color: #4e6ef2;\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 0;\n border-bottom: 1px dashed #e0e0e0;\n }\n\n .update-text {\n margin: 8px 0;\n position: relative;\n padding-left: 16px;\n line-height: 1.5;\n color: var(--text-main);\n font-size: 0.95rem;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .update-text::before {\n content: '\u2022';\n position: absolute;\n left: 0;\n font-weight: bold;\n color: #4e6ef2;\n font-size: 1.2rem;\n line-height: 1;\n }\n\n \/* \u5386\u53f2\u65e5\u5fd7 *\/\n .history-container {\n background: var(--card-bg);\n border-radius: 16px;\n box-shadow: var(--shadow);\n margin-bottom: 16px;\n border: 1px solid rgba(120, 130, 240, 0.1);\n animation: slideIn 0.5s ease 0.5s backwards;\n }\n\n .history-header {\n background: var(--light-bg);\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--border-color);\n cursor: pointer;\n user-select: none;\n }\n\n .history-header:hover {\n opacity: 0.8;\n }\n\n .history-header h2 {\n font-size: 1rem;\n font-weight: 600;\n color: var(--text-main);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .history-header h2 i {\n color: #4e6ef2;\n }\n\n .toggle-history {\n background: none;\n border: none;\n color: var(--text-secondary);\n cursor: pointer;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 0.85rem;\n transition: color 0.2s ease;\n }\n\n .toggle-history:hover {\n color: #4e6ef2;\n }\n\n .history-content {\n padding: 0 16px;\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.4s ease, padding 0.4s ease;\n }\n\n .history-content.expanded {\n max-height: 60vh;\n overflow-y: auto;\n padding: 16px;\n scrollbar-width: thin;\n scrollbar-color: #4e6ef2 #f0f0f0;\n }\n\n .history-content.expanded::-webkit-scrollbar {\n width: 6px;\n }\n\n .history-content.expanded::-webkit-scrollbar-track {\n background: #f0f0f0;\n border-radius: 4px;\n }\n\n .history-content.expanded::-webkit-scrollbar-thumb {\n background: #4e6ef2;\n border-radius: 4px;\n }\n\n .history-content.expanded::-webkit-scrollbar-thumb:hover {\n background: #3a56d0;\n }\n\n .history-item {\n margin-bottom: 16px;\n padding-bottom: 16px;\n border-bottom: 1px dashed var(--border-color);\n }\n\n .history-item:last-child {\n border-bottom: none;\n margin-bottom: 0;\n padding-bottom: 0;\n }\n\n .history-date {\n font-weight: 600;\n color: var(--text-main);\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 0.9rem;\n background: rgba(78, 110, 242, 0.05);\n padding: 6px 10px;\n border-radius: 6px;\n }\n\n .history-text {\n margin: 8px 0;\n padding-left: 16px;\n line-height: 1.4;\n color: var(--text-secondary);\n position: relative;\n font-size: 0.9rem;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .history-text::before {\n content: '\u2022';\n position: absolute;\n left: 0;\n color: #4e6ef2;\n font-weight: bold;\n font-size: 1.2rem;\n line-height: 1;\n }\n\n \/* \u6309\u94ae\u7ec4 *\/\n .button-group {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-bottom: 16px;\n }\n\n .button {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 14px 28px;\n text-align: center;\n font-size: 1rem;\n border: none;\n border-radius: 12px;\n text-decoration: none;\n background: var(--primary-gradient);\n color: white;\n font-weight: 600;\n transition: all 0.3s ease;\n box-shadow: var(--shadow);\n position: relative;\n overflow: hidden;\n cursor: pointer;\n }\n\n .button i {\n font-size: 1rem;\n }\n\n .button::after {\n content: '';\n position: absolute;\n top: -50%;\n left: -50%;\n width: 200%;\n height: 200%;\n background: rgba(255, 255, 255, 0.1);\n transform: rotate(30deg);\n transition: all 0.6s ease;\n pointer-events: none;\n }\n\n .button:hover {\n transform: translateY(-3px);\n box-shadow: var(--shadow-hover);\n }\n\n .button:hover::after {\n transform: rotate(30deg) translate(20%, 20%);\n }\n\n .button:active {\n transform: scale(0.95);\n }\n\n \/* \u9519\u8bef\u72b6\u6001 *\/\n .error-state {\n text-align: center;\n padding: 40px 20px;\n color: var(--text-main);\n }\n\n .error-icon {\n font-size: 64px;\n margin-bottom: 20px;\n color: var(--error-color);\n }\n\n .error-text {\n font-size: 16px;\n line-height: 1.6;\n margin-bottom: 20px;\n }\n\n .retry-button {\n background: var(--primary-gradient);\n color: white;\n padding: 12px 30px;\n border-radius: 12px;\n border: none;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s ease;\n font-size: 14px;\n box-shadow: var(--shadow);\n }\n\n .retry-button:hover {\n transform: translateY(-2px);\n box-shadow: var(--shadow-hover);\n }\n\n .retry-button:active {\n transform: scale(0.95);\n }\n\n \/* \u88c5\u9970\u5143\u7d20 *\/\n .decoration {\n position: absolute;\n z-index: 0;\n pointer-events: none;\n }\n\n .decoration.circle {\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: rgba(107, 45, 216, 0.05);\n top: 10%;\n left: 10%;\n }\n\n .decoration.square {\n width: 80px;\n height: 80px;\n transform: rotate(45deg);\n background: rgba(78, 110, 242, 0.05);\n bottom: 10%;\n right: 10%;\n }\n\n \/* \u54cd\u5e94\u5f0f *\/\n @media (max-width: 768px) {\n body {\n padding: 12px;\n }\n\n .container {\n max-width: 100%;\n border-radius: 20px;\n }\n\n .header {\n padding: 20px 15px;\n }\n\n .header h1 {\n font-size: 1.3rem;\n }\n\n .header-icon {\n font-size: 40px;\n }\n\n .version-comparison {\n flex-direction: row;\n flex-wrap: nowrap;\n gap: 10px;\n padding: 12px;\n margin-top: 6px;\n overflow-x: auto;\n }\n\n .version-card {\n min-width: 45%;\n padding: 26px 12px 12px;\n }\n\n \/* \u79fb\u52a8\u7aef\u51cf\u5f31\u547c\u5438\u52a8\u6548 *\/\n .version-card.latest-version {\n animation: gradientAnimation 6s ease infinite;\n }\n\n .version-status {\n top: 5px;\n right: 5px;\n padding: 2px 5px;\n font-size: 0.6rem;\n }\n\n .version-number {\n font-size: 1.1rem;\n }\n\n .version-card.latest-version .version-number {\n font-size: 1.2rem;\n }\n\n .update-header h2, .history-header h2 {\n font-size: 0.9rem;\n }\n\n .button {\n padding: 12px 24px;\n font-size: 0.95rem;\n }\n\n .history-content.expanded {\n max-height: 50vh;\n -webkit-overflow-scrolling: touch;\n }\n }\n\n @media (max-width: 380px) {\n .header h1 {\n font-size: 1.2rem;\n }\n\n .version-number {\n font-size: 1rem;\n }\n\n .version-card.latest-version .version-number {\n font-size: 1.1rem;\n }\n\n .button {\n padding: 11px;\n font-size: 0.9rem;\n }\n }\n <\/style>\n<\/head>\n<body>\n <div class=\"decoration circle\"><\/div>\n <div class=\"decoration square\"><\/div>\n\n <div id=\"loading\" class=\"loading-wrapper\">\n <div class=\"loading-spinner\"><\/div>\n <div class=\"loading-text\"><i class=\"fas fa-search\"><\/i> \u6b63\u5728\u68c0\u67e5\u66f4\u65b0...<\/div>\n <\/div>\n\n <div class=\"container\" id=\"container\">\n <div class=\"header\">\n <div class=\"header-icon\"><i class=\"fas fa-book\"><\/i><\/div>\n <h1>\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0<\/h1>\n <p>\u8bf7\u4f7f\u7528\u9605\u8bfb\u6d4b\u8bd5\u7248\uff0c\u4e0d\u652f\u6301\u6b63\u5f0f\u7248<\/p>\n <\/div>\n\n <div class=\"version-comparison\">\n <div class=\"version-card current-version\">\n <div class=\"version-status status-outdated\" id=\"currentStatus\">\u5f85\u68c0\u67e5<\/div>\n <h3><i class=\"fas fa-cube\"><\/i> \u5f53\u524d\u7248\u672c<\/h3>\n <div class=\"version-number\" id=\"currentVersion\">-<\/div>\n <div class=\"version-date\">\u60a8\u7684\u5f53\u524d\u7248\u672c<\/div>\n <\/div>\n\n <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n <i class=\"fas fa-arrow-right\"><\/i>\n <\/div>\n\n <div class=\"version-card latest-version\">\n <div class=\"version-status status-latest\" id=\"latestStatus\">\u6700\u65b0\u7248\u672c<\/div>\n <h3><i class=\"fas fa-star\"><\/i> \u6700\u65b0\u7248\u672c<\/h3>\n <div class=\"version-number\" id=\"latestVersion\">-<\/div>\n <div class=\"version-date\">\u53ef\u7528\u6700\u65b0\u7248\u672c<\/div>\n <\/div>\n <\/div>\n\n <div class=\"content-container\">\n <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"><\/div>\n\n <div id=\"latestLogContainer\" style=\"display: none;\">\n <div class=\"update-container\">\n <div class=\"update-header\">\n <h2><i class=\"fas fa-bolt\"><\/i> \u6700\u65b0\u66f4\u65b0<\/h2>\n <div class=\"update-tag\">\u6700\u65b0\u53d1\u5e03<\/div>\n <\/div>\n <div class=\"update-content\">\n <div class=\"update-date\" id=\"latestLogDate\"><\/div>\n <div class=\"update-text\" id=\"latestLogContent\"><\/div>\n <\/div>\n <\/div>\n <\/div>\n\n <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"><\/div>\n\n <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n <div class=\"history-header\" onclick=\"toggleLogs()\">\n <h2><i class=\"fas fa-history\"><\/i> \u5386\u53f2\u66f4\u65b0 <span id=\"historyCount\"><\/span><\/h2>\n <button class=\"toggle-history\" id=\"toggleButton\">\n <span id=\"toggleText\">\u5c55\u5f00\u5386\u53f2<\/span>\n <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"><\/i>\n <\/button>\n <\/div>\n <div class=\"history-content\" id=\"logList\"><\/div>\n <\/div>\n <\/div>\n <\/div>\n\n <script>\n let logsCollapsed = true;\n\n function toggleLogs() {\n logsCollapsed = !logsCollapsed;\n const logList = document.getElementById('logList');\n const toggleText = document.getElementById('toggleText');\n const toggleIcon = document.getElementById('toggleIcon');\n \n if (logsCollapsed) {\n logList.classList.remove('expanded');\n toggleText.textContent = '\u5c55\u5f00\u5386\u53f2';\n toggleIcon.className = 'fas fa-chevron-down';\n } else {\n logList.classList.add('expanded');\n toggleText.textContent = '\u6536\u8d77\u5386\u53f2';\n toggleIcon.className = 'fas fa-chevron-up';\n }\n }\n\n (async function() {\n const loading = document.getElementById('loading');\n const container = document.getElementById('container');\n const currentVersion = document.getElementById('currentVersion');\n const latestVersion = document.getElementById('latestVersion');\n const currentStatus = document.getElementById('currentStatus');\n const latestStatus = document.getElementById('latestStatus');\n const versionIndicator = document.getElementById('versionIndicator');\n const statusAlert = document.getElementById('statusAlert');\n const buttonGroup = document.getElementById('buttonGroup');\n const latestLogContainer = document.getElementById('latestLogContainer');\n const latestLogDate = document.getElementById('latestLogDate');\n const latestLogContent = document.getElementById('latestLogContent');\n const logsContainer = document.getElementById('logs');\n const logList = document.getElementById('logList');\n const historyCount = document.getElementById('historyCount');\n\n const localVer = '${String(localVersion)}';\n\n \/\/ \u7edf\u4e00\u7684\u670d\u52a1\u5668\u914d\u7f6e - \u65b9\u4fbf\u7ef4\u62a4\n const serverConfig = {\n main: {\n name: '\u4e3b\u7ebf\u8def',\n icon: 'rocket',\n baseUrl: 'https:\/\/sy.dashabi.tk',\n downloadPath: '\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n },\n backup1: {\n name: '\u5907\u7528\u7ebf\u8def1',\n icon: 'box',\n baseUrl: 'https:\/\/api.langge.cf',\n downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n },\n backup2: {\n name: '\u5907\u7528\u7ebf\u8def2',\n icon: 'satellite',\n baseUrl: 'https:\/\/20.langge.tk',\n downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n },\n backup3: {\n name: '\u5907\u7528\u7ebf\u8def3',\n icon: 'link',\n baseUrl: 'http:\/\/219.154.201.122:5006',\n downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n },\n backup4: {\n name: '\u5907\u7528\u7ebf\u8def4',\n icon: 'bolt',\n baseUrl: 'https:\/\/v2.czyl.cf',\n downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n },\n backup5: {\n name: '\u5907\u7528\u7ebf\u8def5',\n icon: 'globe',\n baseUrl: 'https:\/\/v7.czyl.cf',\n downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n },\n backup6: {\n name: '\u5907\u7528\u7ebf\u8def6',\n icon: 'broadcast-tower',\n baseUrl: 'https:\/\/v8.czyl.cf',\n downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n }\n };\n\n \/\/ \u7248\u672c\u6bd4\u8f83\u51fd\u6570\n function compareVersions(vs) {\n const normalize = (v) => {\n return v.split('.').map(n => {\n const num = parseInt(n, 10);\n return isNaN(num) ? 0 : num;\n });\n };\n\n const parts1 = normalize(localVer);\n const parts2 = normalize(vs);\n const maxLength = Math.max(parts1.length, parts2.length);\n \n for (let i = 0; i < maxLength; i++) {\n const num1 = parts1[i] || 0;\n const num2 = parts2[i] || 0;\n if (num1 > num2) return 1;\n if (num1 < num2) return -1;\n }\n return 0;\n }\n\n async function fetchVersionData() {\n \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u4e2d\u9664\u4e3b\u7ebf\u8def\u5916\u7684\u5907\u7528\u7ebf\u8def\u8fdb\u884c\u7248\u672c\u68c0\u67e5\n const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('czyl.cf') || s.baseUrl.includes('langge.tk') || s.baseUrl.includes('langge.cf') || s.baseUrl.includes('219.154'));\n \n for (const server of serversToCheck) {\n try {\n const response = await fetch(server.baseUrl + '\/version', { timeout: 2000 });\n if (response.ok) {\n return await response.json();\n }\n } catch (e) {\n console.warn(\\`\u63a5\u53e3\u5931\u8d25\uff1a\\${server.baseUrl}\\`, e);\n }\n }\n throw new Error('\u6240\u6709\u66f4\u65b0\u63a5\u53e3\u90fd\u8bf7\u6c42\u5931\u8d25');\n }\n\n function showError(message) {\n loading.innerHTML = \\`\n <div class=\"error-state\">\n <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"><\/i><\/div>\n <div class=\"error-text\">\\${message}<\/div>\n <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"><\/i> \u91cd\u8bd5<\/button>\n <\/div>\n \\`;\n }\n\n try {\n const data = await fetchVersionData();\n const cloudVersion = String(data.version3);\n const updateLog = data.update_log || {};\n\n \/\/ \u663e\u793a\u7248\u672c\u4fe1\u606f\n currentVersion.textContent = \\`v\\${localVer}\\`;\n latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n \/\/ \u5904\u7406\u65e5\u5fd7\n const logEntries = Object.entries(updateLog);\n if (logEntries.length > 0) {\n \/\/ \u663e\u793a\u6700\u65b0\u65e5\u5fd7\n const [latestDate, latestContent] = logEntries[0];\n latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"><\/i> \\${latestDate}\\`;\n latestLogContent.textContent = latestContent;\n latestLogContainer.style.display = 'block';\n\n \/\/ \u663e\u793a\u5386\u53f2\u65e5\u5fd7\n if (logEntries.length > 1) {\n const historyLogs = logEntries.slice(1);\n historyCount.textContent = \\`(\\${historyLogs.length}\u6761)\\`;\n logList.innerHTML = historyLogs.map(([date, content]) => \\`\n <div class=\"history-item\">\n <div class=\"history-date\">\n <i class=\"fas fa-calendar-day\"><\/i>\n <span>\\${date}<\/span>\n <\/div>\n <div class=\"history-text\">\\${content}<\/div>\n <\/div>\n \\`).join('');\n logsContainer.style.display = 'block';\n }\n }\n\n \/\/ \u68c0\u67e5\u66f4\u65b0\u72b6\u6001\n const compareResult = compareVersions(cloudVersion);\n \n \/\/ \u663e\u793a\u7248\u672c\u6307\u793a\u5668\n versionIndicator.style.display = 'flex';\n \n if (compareResult === -1) {\n \/\/ \u9700\u8981\u66f4\u65b0\n currentStatus.textContent = '\u5f85\u66f4\u65b0';\n currentStatus.className = 'version-status status-outdated';\n versionIndicator.className = 'version-indicator update-needed';\n versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"><\/i>';\n\n \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u751f\u6210\u4e0b\u8f7d\u6309\u94ae\n buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n const fullUrl = server.baseUrl + server.downloadPath;\n return \\`\n <a href=\"yuedu:\/\/booksource\/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n <i class=\"fas fa-\\${server.icon}\"><\/i>\n <span>\\${server.name}<\/span>\n <\/a>\n \\`;\n }).join('');\n buttonGroup.style.display = 'flex';\n } else {\n \/\/ \u5df2\u662f\u6700\u65b0\u7248\u672c\n currentStatus.textContent = '\u6700\u65b0';\n currentStatus.className = 'version-status status-latest';\n versionIndicator.className = 'version-indicator is-latest';\n versionIndicator.innerHTML = '<i class=\"fas fa-check\"><\/i>';\n \n statusAlert.className = 'status-alert up-to-date';\n statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> <div>\u60a8\u5df2\u662f\u6700\u65b0\u7248\u672c<\/div>';\n statusAlert.style.display = 'flex';\n }\n\n \/\/ \u663e\u793a\u4e3b\u5bb9\u5668\uff0c\u9690\u85cf\u52a0\u8f7d\n loading.style.display = 'none';\n container.style.display = 'block';\n\n } catch (err) {\n console.error('\u7248\u672c\u68c0\u67e5\u5931\u8d25\uff1a', err);\n showError('<i class=\"fas fa-exclamation-circle\"><\/i> \u68c0\u67e5\u66f4\u65b0\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5<br><small>' + err.message + '<\/small>');\n }\n })();\n <\/script>\n<\/body>\n<\/html>\n`;\n java.startBrowser(`data:text\/html;base64,${java.base64Encode(html)}`, '\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0');\n}","respondTime":180000,"ruleBookInfo":{"author":"$.author","canReName":"1","coverUrl":"$.thumb_url","init":"<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n let res = JSON.parse(java.hexDecodeToString(result));\n let book_id = res.book_id;\n let tab = res.tab;\n let sources = res.sources;\n let url = res.url;\n let html = \"\";\n let proxy = getArguments(source.getVariable(), \"proxy\");\n if (url != \"\" && proxy == \"\u672c\u5730\") {\n if (sources == '69\u4e66\u5427') {\n let ck69 = String(cookie.getCookie(url));\n let headers = {\n \"Cookie\": ck69\n };\n let op = JSON.stringify({\n \"headers\": headers\n });\n html = java.ajax(url + ',' + op);\n } else {\n html = java.ajax(url);\n }\n \/\/java.log(html);\n if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n cookie.removeCookie(url);\n var x = `https:\/\/www.69shuba.com`;\n java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n let ck69 = String(cookie.getCookie(url));\n let headers = {\n \"Cookie\": ck69\n };\n let op = JSON.stringify({\n \"headers\": headers\n });\n java.log(op);\n html = java.ajax(url + ',' + op);\n \/\/java.log(html);\n }\n }\n let base_url = getArguments(source.getVariable(), \"server\");\n let op = {\n method: \"POST\",\n body: {\n html: html\n }\n };\n op = JSON.stringify(op);\n let varia = String(book.getVariable('custom'));\n if (varia == 'null') {\n varia = '';\n }\n varia = JSON.stringify({\n 'custom': varia\n });\n \/\/varia = java.base64Encode(varia);\n java.log(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n result = java.ajax(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n}\nresult\n<\/js>$.data","intro":"<js>\nlet {\n book_id,\n source: sources,\n tab,\n book_tts,\n tags,\n role,\n last_chapter_title,\n last_chapter_update_time,\n word_number,\n status,\n score,\n abstract,\n copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"\u672c\u5730\") {\n proxy = \"\u672c\u5730\u7f51\u7edc\";\n} else {\n proxy = \"\u670d\u52a1\u5668\u7f51\u7edc\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\n\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key = \"\";\ntry {\n let cookieValue =\n String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n key = getKey(cookieValue);\n} catch (e) {\n key = \"\";\n}\n\nif (key == \"\") {\n java.log(\"\u5f53\u524d\u670d\u52a1\u5668\u672a\u67e5\u8be2\u5230\u767b\u5f55\u72b6\u6001\uff0c\u5c1d\u8bd5\u67e5\u8be2\u5176\u4ed6\u670d\u52a1\u5668\u767b\u5f55\u72b6\u6001...\");\n let cookieValue;\n for (let h of host) {\n try {\n cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n key = getKey(cookieValue);\n } catch (e) {\n key = \"\";\n }\n if (key) {\n java.log(`\u5df2\u5728${h}\u767b\u5f55\uff0c\u9000\u51fa\u67e5\u8be2\uff0c\u6b63\u5728\u8f6c\u79fb\u767b\u5f55\u72b6\u6001\u5230\u5f53\u524d\u670d\u52a1${base_url}`);\n \/\/java.log(cookieValue)\n cookie.removeCookie(h);\n cookie.removeCookie(base_url);\n cookie.setCookie(base_url, cookieValue);\n break;\n }\n }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n book.setUseReplaceRule(false);\n}\n\nlet nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u26a0\ufe0f \u672a\u767b\u5f55 | \u70b9\u51fb\u53f3\u4e0a\u89d2 \ud83d\udd16 \u767b\u5f55';\ntry {\n let opcx = {\n method: \"GET\",\n headers: {\n cookie: 'qttoken=' + key + ';'\n },\n };\n opcx = JSON.stringify(opcx);\n let user_info = JSON.parse(java.ajax(base_url + '\/get_avatar,' + opcx));\n if (user_info.code == 0) {\n if (user_info.nickname) {\n nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.nickname\n } else {\n nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.email + \"(\u8bf7\u524d\u5f80\u7528\u6237\u540e\u53f0\u8bbe\u7f6e\u7528\u6237\u540d)\"\n }\n }\n} catch (e) {\n if (key) {\n nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u5df2\u767b\u5f55'\n }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\";\nlet heavyDivider = \"‎\\n‎\";\n\nlet isValid = (value) => String(value).length > 1;\n\nlet info = `\n \ud83d\udce1 \u5f53\u524d\u670d\u52a1\uff1a${base_url}\n \ud83d\udd11 ${loginStatus}\n \ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\n \ud83d\udd04 \u5f53\u524d\u6a21\u5f0f\uff1a${tab}\n \u2699\ufe0f \u8bbf\u95ee\u6a21\u5f0f\uff1a${proxy}\n`;\n\nif (tab == \"\u542c\u4e66\") {\n let toneId = getArguments(source.getVariable(), \"tone_id\");\n if (isValid(book_tts)) {\n info += `${lightDivider}\n \ud83c\udfb5 \u97f3\u8272\u914d\u7f6e\uff1a${toneId}\n ${book_tts}\n`;\n }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n if (isValid(value)) basicInfo += ` ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"\u4e66\u7c4d\u5206\u7c7b\uff1a\", \"\ud83c\udf08\");\naddBasicInfo(role, \"\u4e66\u7c4d\u4e3b\u89d2\uff1a\", \"\ud83d\udc51\");\naddBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\naddBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\naddBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\naddBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\naddBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n let indentedAbstract = abstract\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n info += `${heavyDivider}\n \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n} else {\n info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n info += `${lightDivider}\n \u00a9 ${copyright_info}\n`;\n} else {\n info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n \ud83d\udca0\ud83d\udca0\ud83d\udca0 \u6570\u636e\u66f4\u65b0\u4e8e ${new Date().toLocaleString()} \ud83d\udca0\ud83d\udca0\ud83d\udca0\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"on\") {\n info = String(info)\n .split(\"\\n\")\n .map((line) => line.replace(\/^ {4}\/, \"\"))\n .join(\"\\n\");\n} else {\n basicInfo = \"\";\n addBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\n addBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\n addBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\n addBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\n addBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n if (isValid(abstract)) {\n let indentedAbstract = abstract\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n basicInfo += `\n \\n‎\n \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n } else {\n basicInfo += `${heavyDivider}`;\n }\n info = `‎\\n\ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\\n` + basicInfo;\n}\n<\/js>","lastChapter":"{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}","name":"$.book_name","tocUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"\u5c0f\u8bf4\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n book_id: book_id,\n sources: sources,\n tab: tab,\n url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n<\/js>","wordCount":"$.word_number"},"ruleContent":{"content":"<js>\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(\/\u5927\u7070\u72fc\u878d\u5408\/)) {\n result = result.split(\"\u5927\u7070\u72fc\u878d\u54084\");\n res = {\n item_id: result[0],\n tab: result[1],\n title: result[2],\n sources: result[3],\n url: \"\"\n };\n} else {\n res = JSON.parse(result);\n}\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n varia = '';\n}\nvaria = JSON.stringify({\n 'custom': varia\n});\n\/\/ varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n if (sources == '69\u4e66\u5427') {\n let ck69 = String(cookie.getCookie(url));\n let headers = {\n \"Cookie\": ck69,\n \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\"\n };\n let op = JSON.stringify({\n \"headers\": headers\n });\n java.log(url);\n java.log(op);\n html = java.ajax(url + ',' + op);\n } else {\n html = java.ajax(url);\n }\n java.log(html);\n if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427' && book.durChapterIndex === chapter.index) {\n cookie.removeCookie(url);\n var x = url;\n java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n let ck69 = String(cookie.getCookie(url));\n let headers = {\n \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\",\n \"Cookie\": ck69\n };\n let op = JSON.stringify({\n \"headers\": headers\n });\n java.log(op);\n html = java.ajax(url + ',' + op);\n \/\/java.log(html);\n }\n};\nlet content = \"\";\nlet data;\nlet tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet device, device_type;\ntry {\n device = java.deviceID();\n device_type = \"\u82f9\u679c\";\n} catch (e) {\n try {\n device = java.androidId();\n device_type = \"\u5b89\u5353\";\n } catch (e) {\n device = \"\";\n device_type = \"\u5b89\u5353\";\n }\n}\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device};`\n} catch (e) {}\n\nvar params = {\n html: html,\n item_id: item_id,\n source: sources,\n tab: tab,\n tone_id: tone_id,\n variable: varia,\n version: '4.11.5.1'\n};\n\nvar content_url = '\/content';\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n content_url = '\/content?review=1';\n}\n\n\/\/var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n\/\/var signedParams = copyObject(params);\n\/\/signedParams.timestamp = signInfo.timestamp;\n\/\/signedParams.nonce = signInfo.nonce;\n\/\/signedParams.sign = signInfo.sign;\n\n\nvar op = {\n method: \"POST\",\n body: JSON.stringify(params),\n headers: {\n cookie: qtcookie,\n 'Content-Type': 'application\/json'\n }\n};\n\nop = JSON.stringify(op);\njava.log(op);\ndata = java.ajax(base_url + content_url + `,${op}`);\n\ntry {\n data = JSON.parse(data);\n if (data.msg) {\n java.toast(data.msg);\n }\n} catch (e) {}\n\ncontent = data.content\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n content = content\n .replace(\/ident=\"\/g, 'ident=\"' + base_url)\n .replace(\/book_id=\/g, 'book_id=' + book_id + '&ssionid=' + fqssionid);\n if (device_type == \"\u82f9\u679c\") {\n content = paraForiOS(content, sources);\n } else {\n content = paraForAndroid(content, sources);\n }\n\n\n}\ndata = JSON.stringify({\n content: content,\n});\n\nif (device_type == \"\u5b89\u5353\" && (tab == \"\u77ed\u5267\" || tab == \"\u89c6\u9891\" || sources == '\u6bd2\u820c\u5f71\u89c6')) {\n data = {\n content: `\u3010\u53f3\u4e0a\u89d2\u5237\u65b0\u3011\u5f00\u542f\u64ad\u653e(\u4e0b\u4e00\u96c6\u8bf7\u5207\u6362\u4e0b\u4e00\u7ae0\u5237\u65b0)\\n\u64ad\u653e\u76f4\u94fe\uff1a\\n${content}`,\n };\n data = JSON.stringify(data);\n if (book.durChapterIndex === chapter.index) {\n let video_url = `${base_url}\/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n if (sources == '\u6bd2\u820c\u5f71\u89c6') {\n video_url = content;\n };\n java.startBrowser(video_url, title);\n java.toast(\"\u6b63\u5728\u52a0\u8f7d\u89c6\u9891...\");\n }\n\n}\ndata;\n<\/js>$.content","imageStyle":"TEXT"},"ruleExplore":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n book_id: book_id,\n sources: sources,\n tab: tab,\n url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}","lastChapter":"{{$.last_chapter_title}} \u2022 {{$.last_update_time}}","name":"$.book_name","wordCount":"$.word_number"},"ruleSearch":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n book_id: book_id,\n sources: sources,\n tab: tab,\n url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","checkKeyWord":"\u6211\u768426\u5c81\u5973\u623f\u5ba2@\u756a\u8304","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}","lastChapter":"{{$.source}} {{$.last_chapter_title}}","name":"$.book_name##\uff08\u522b\u540d\uff1a.*?\uff09","wordCount":"$.word_number"},"ruleToc":{"chapterList":"<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n res = Object.fromEntries(\n res.body\n .replace(\"source\", \"sources\")\n .split(\"&\")\n .map((query) => query.split(\"=\"))\n );\n res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n if (sources == '69\u4e66\u5427') {\n let ck69 = String(cookie.getCookie(url));\n let headers = {\n \"Cookie\": ck69\n };\n let op = JSON.stringify({\n \"headers\": headers\n });\n html = java.ajax(url + ',' + op);\n } else {\n html = java.ajax(url);\n }\n \/\/java.log(html);\n if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n cookie.removeCookie(url);\n var x = `https:\/\/www.69shuba.com`;\n java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n let ck69 = String(cookie.getCookie(url));\n let headers = {\n \"Cookie\": ck69\n };\n let op = JSON.stringify({\n \"headers\": headers\n });\n \/\/java.log(op);\n html = java.ajax(url + ',' + op);\n \/\/java.log(html);\n }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n method: \"POST\",\n body: {\n html: html\n }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n varia = '';\n}\nvaria = JSON.stringify({\n 'custom': varia\n});\n\/\/ varia = java.base64Encode(varia);\n\/\/java.log(`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n `${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet device, device_type;\ntry {\n device = java.deviceID();\n device_type = \"\u82f9\u679c\";\n} catch (e) {\n try {\n device = java.androidId();\n device_type = \"\u5b89\u5353\";\n } catch (e) {\n device = \"\";\n device_type = \"\u5b89\u5353\";\n }\n}\n\nif (tab == \"\u5c0f\u8bf4\") {\n if (device_type == \"\u5b89\u5353\") {\n book.type = 8;\n } else {\n book.type = 0;\n }\n} else if (tab == \"\u542c\u4e66\") {\n if (device_type == \"\u5b89\u5353\") {\n book.type = 32;\n } else {\n book.type = 1;\n }\n} else if (tab == \"\u6f2b\u753b\") {\n if (device_type == \"\u5b89\u5353\") {\n book.type = 64;\n } else {\n book.type = 2;\n }\n} else if (tab == \"\u77ed\u5267\") {\n if (device_type == \"\u5b89\u5353\") {\n book.type = 8;\n } else {\n book.type = 3;\n }\n} else {\n if (device_type == \"\u5b89\u5353\") {\n book.type = 8;\n } else {\n book.type = 0;\n }\n}\ndata;\n<\/js>$.data","chapterName":"$.title","chapterUrl":"<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n book_id: book_id,\n item_id: item_id,\n title: title,\n sources: sources,\n tab: tab,\n url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '\u5377') {\n content_url = item_id\n} else if ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && tab == \"\u5c0f\u8bf4\") {\n var base_url = getArguments(source.getVariable(), \"server\") || \"\";\n var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n let sourcess = sources.replace('svip_', '');\n content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\",\"js\":\"book ? result : '${base_url}\/get_review?book_id=${book_id}&item_id=${item_id}&ssionid=${fqssionid}&source=${sourcess}'\"}`;\n} else {\n content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n<\/js>","updateTime":"$.first_pass_time"},"searchUrl":"<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'source');\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m\uff1a\")) {\n media = \"\u6f2b\u753b\"\n key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t\uff1a\")) {\n media = \"\u542c\u4e66\"\n key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d\uff1a\")) {\n media = \"\u77ed\u5267\"\n key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x\uff1a\")) {\n media = \"\u5c0f\u8bf4\"\n key = key.slice(2)\n} else {\n media = getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n var parts = key.split('@');\n key = parts[0];\n sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n method: \"GET\",\n headers: {\n cookie: qtcookie\n },\n};\nop = JSON.stringify(op);\n`${base_url}\/search?title=${key}&tab=${media}&source=${sources}&page={{page}},${op}`\n<\/js>","weight":0},{"bookSourceComment":"00shu\u5c0f\u8bf4\u7f51\u4e66\u6e90\uff0c\u7f16\u7801GBK\uff0c\u9002\u914d\u7ae0\u8282\/\u641c\u7d22\/\u8be6\u60c5\u89e3\u6790","bookSourceGroup":"CSS; \u6b63\u5219","bookSourceName":"00shu\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"https:\/\/www.00shu.la","bookUrlPattern":"","customOrder":0,"enabled":true,"enabledExplore":false,"exploreUrl":"","lastUpdateTime":"1764478609406","loginUrl":"","ruleBookInfo":{"author":"##:author\"[^\"]+\"([^\"]*)##$1###","coverUrl":"##og:image\"[^\"]+\"([^\"]*)##$1###","intro":"##:description\"[^\"]+\"([\\w\\W]*?)\"\/##$1###","kind":"##:category\"[^\"]+\"([^\"]*)##$1###","lastChapter":"##_chapter_name\"[^\"]+\"([^\"]*)##$1###","name":"##:book_name\"[^\"]+\"([^\"]*)##$1###","tocUrl":""},"ruleContent":{"content":"@css:#content p@textNodes##\u5e7f\u544a|\u5f39\u7a97|\u624b\u673a\u9605\u8bfb|\u8bb0\u4f4f\u7f51\u5740|<!\\[CDATA\\[|\\]\\]>","nextContentUrl":""},"ruleExplore":[],"ruleSearch":{"author":"@css:.s2>a@text","bookList":"@css:div.result-list>ul>li","bookUrl":"@css:.s1>a@href","coverUrl":"@css:.s3>img@src","intro":"@css:.s4@text","kind":"@css:.s5@text","lastChapter":"@css:.s6@text","name":"@css:.s1>a@text"},"ruleToc":{"chapterList":"-:<li><a[^\"]+\"([^\"]*)\">([^<]*)","chapterName":"$2","chapterUrl":"$1","nextTocUrl":""},"searchUrl":"\/search.aspx?key={{key}}&page={{page}},{\"charset\": \"gbk\"}","weight":0},{"bookSourceComment":"","bookSourceName":"22\u7b14\u8da3\u9601\uff08pc\uff09","bookSourceType":0,"bookSourceUrl":"https:\/\/www.22biqu.com","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n{\n \"title\": \"\u2655 \u5206\u7c7b \u2655\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"title\": \"\u7384\u5e7b\u9b54\u6cd5\",\n \"url\": \"\/fenlei\/1_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u6b66\u4fa0\u4fee\u771f\",\n \"url\": \"\/fenlei\/2_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u90fd\u5e02\u8a00\u60c5\",\n \"url\": \"\/fenlei\/3_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u5386\u53f2\u519b\u4e8b\",\n \"url\": \"\/fenlei\/4_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u79d1\u5e7b\u7075\u5f02\",\n \"url\": \"\/fenlei\/6_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u6e38\u620f\u7ade\u6280\",\n \"url\": \"\/fenlei\/5_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u5973\u751f\u803d\u7f8e\",\n \"url\": \"\/fenlei\/7_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u5176\u4ed6\u7c7b\u578b\",\n \"url\": \"\/fenlei\/8_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u2655 \u6392\u884c\u699c \u2655\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"title\": \"\u603b\u6392\u884c\u699c\",\n \"url\": \"\/rank\/allvisit\/\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u6708\u6392\u884c\u699c\",\n \"url\": \"\/rank\/monthvisit\/\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u5468\u6392\u884c\u699c\",\n \"url\": \"\/rank\/weekvisit\/\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u6536 \u85cf \u699c\",\n \"url\": \"\/rank\/goodnum\/\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u2655 \u5168\u672c \u2655\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"title\": \"\u7384\u5e7b\u9b54\u6cd5\",\n \"url\": \"\/quanben\/fenlei\/1_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u6b66\u4fa0\u4fee\u771f\",\n \"url\": \"\/quanben\/fenlei\/2_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u90fd\u5e02\u8a00\u60c5\",\n \"url\": \"\/quanben\/fenlei\/3_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u5386\u53f2\u519b\u4e8b\",\n \"url\": \"\/quanben\/fenlei\/4_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u79d1\u5e7b\u7075\u5f02\",\n \"url\": \"\/quanben\/fenlei\/6_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u6e38\u620f\u7ade\u6280\",\n \"url\": \"\/quanben\/fenlei\/5_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u5973\u751f\u803d\u7f8e\",\n \"url\": \"\/quanben\/fenlei\/7_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"title\": \"\u5176\u4ed6\u7c7b\u578b\",\n \"url\": \"\/quanben\/fenlei\/8_{{page}}.html\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n }\n]","header":"{\n \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 8.0.0; MI 5s Plus Build\/OPR1.170623.032; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/71.0.3578.99 Mobile Safari\/537.36\"\n}","lastUpdateTime":"1764552038415","respondTime":180000,"ruleBookInfo":{"author":"[property=\"og:novel:author\"]@content","coverUrl":"[property=\"og:image\"]@content","intro":"[property=\"og:description\"]@content","kind":"[property~=category|status|update_time]@content","lastChapter":"[property~=las?test_chapter_name]@content","name":"[property=\"og:novel:book_name\"]@content","tocUrl":""},"ruleContent":{"content":"#content@p@html##\u672c\u7ae0\u672a\u5b8c.*","nextContentUrl":"text.\u4e0b\u4e00\u9875@href"},"ruleExplore":{"author":".author@text##\u4f5c\u8005\uff1a|\uff08\\d.*\uff09","bookList":".hot_sale","bookUrl":"a@href","coverUrl":"a.0@href##.+\\D((\\d+)\\d{3})\\D##https:\/\/img.22biqu.com\/$2\/$1\/$1s.jpg###","intro":".review@text","name":".title@text##^\\d+\\."},"ruleSearch":{"author":".s4@text","bookList":"class.txt-list txt-list-row5@li!0","bookUrl":"a.0@href","coverUrl":"","kind":".s1@text","lastChapter":".s3@text","name":".s2@text","checkKeyWord":"\u7cfb\u7edf"},"ruleToc":{"chapterList":"class.section-list fix@li@a","chapterName":"text","chapterUrl":"href","nextTocUrl":"option@value"},"searchUrl":"{{cookie.removeCookie(source.key)}}\/ss\/,{\n \"body\": \"searchkey={{key}}&submit=\u641c\u7d22\",\n \"method\": \"POST\"\n}","weight":0}] |