[{"bookSourceComment":"轻之国度 API源 by sjshb57\n\n*二改请标明原作者\n\/\/ 2026\/07\/06\/ By sjshb57 首次发布\n\/\/ 2026\/07\/10\/ By sjshb57 添加功能\n\/\/ 添加了章末评论功能，UI致谢 @吉王义昊\n\t\n⚠️必须登录:填账号密码点【🔑登录账号】。\n【精准搜索】过滤epub\/下载(外链)。\n【繁转简】把繁体转简体。\n【发现】小说\/漫画\/资讯\/动画各子分类。","bookSourceGroup":"🗨️ 轻文","bookSourceName":"🗨️ 轻之国度","bookSourceType":0,"bookSourceUrl":"https:\/\/api.lightnovel.fun","concurrentRate":"0","customButton":false,"customOrder":2,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"[{\"title\": \"【动画】\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"全部\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:34,gid:0,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.28}}, {\"title\": \"发布\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:34,gid:115,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.28}}, {\"title\": \"转载\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:34,gid:116,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.28}}, {\"title\": \"【轻小说】\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"最新\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:3,gid:106,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"整卷\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:3,gid:107,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"原创\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:3,gid:111,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"EPUB\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:3,gid:110,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"下载\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:3,gid:108,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"【漫画 · 全部】\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:33,gid:0,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"发布\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:33,gid:112,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"转载\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:33,gid:113,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"下载\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:33,gid:114,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"【资讯 · 全部】\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:1,gid:0,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"小说\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:1,gid:100,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"漫画\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:1,gid:101,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"动画\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:1,gid:102,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"游戏\", \"url\": \"@js:reqUrl(cookie,'\/api\/category\/get-article-by-cate',{parent_gid:1,gid:103,page:page,pageSize:40})\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}]","header":"{\"User-Agent\":\"Dart\/3.8 (dart:io)\"}","jsLib":"var CKU = \"https:\/\/api.lightnovel.fun\";\n\nfunction rd(cookie) {\n    try {\n        var v = cookie.getKey(CKU, \"lkcfg\");\n        if (v) return JSON.parse(decodeURIComponent(v));\n    } catch (e) {}\n    return {};\n}\n\nfunction wr(cookie, c) {\n    try {\n        cookie.setCookie(CKU, \"lkcfg=\" + encodeURIComponent(JSON.stringify(c)));\n    } catch (e) {}\n}\n\nfunction gv(cookie) {\n    var c = rd(cookie);\n    return (c.key && (\"\" + c.key).indexOf(\":\") > 0) ? c.key : \"\";\n}\n\nfunction getType(cookie) {\n    var c = rd(cookie);\n    return (c.type != null && c.type !== \"\") ? parseInt(c.type) : 2;\n}\n\nfunction setType(java, cookie, t) {\n    var c = rd(cookie);\n    c.type = t;\n    wr(cookie, c);\n    var n = {\n        2: \"轻小说\",\n        5: \"漫画\",\n        4: \"动画\",\n        3: \"资讯\",\n        0: \"综合\"\n    };\n    java.toast(\"已切到「\" + (n[t] || t) + \"」,直接搜索即可\");\n}\n\nfunction getZh(cookie) {\n    var c = rd(cookie);\n    return c.zh || \"\";\n}\n\nfunction setZh(java, cookie) {\n    var c = rd(cookie);\n    c.zh = (c.zh == \"s\") ? \"\" : \"s\";\n    wr(cookie, c);\n    java.toast(c.zh == \"s\" ? \"🈶 繁→简 已开启\" : \"🈶 已关闭,显示原文(繁体)\");\n}\n\nfunction getPure(cookie) {\n    var c = rd(cookie);\n    return c.pure !== false;\n}\n\nfunction setPure(java, cookie) {\n    var c = rd(cookie);\n    var cur = (c.pure !== false);\n    c.pure = !cur;\n    wr(cookie, c);\n    java.toast(!cur ? \"🔍 精准搜索:开 (只搜可读,过滤epub\/下载)\" : \"🔍 精准搜索:关 (搜全部)\");\n}\n\nfunction clearLogin(java, cookie) {\n    var c = rd(cookie);\n    delete c.key;\n    wr(cookie, c);\n    java.toast(\"🗑️ 已清除登录\");\n}\n\nfunction showStatus(java, cookie) {\n    var k = gv(cookie);\n    var n = {\n        2: \"轻小说\",\n        5: \"漫画\",\n        4: \"动画\",\n        3: \"资讯\",\n        0: \"综合\"\n    };\n    if (!k) {\n        java.toast(\"⚪ 未登录 - 请填账号密码点登录\");\n        return;\n    }\n    try {\n        var payload = JSON.stringify({\n            platform: \"android\",\n            client: \"app\",\n            sign: \"\",\n            ver_name: \"0.11.53\",\n            ver_code: 193,\n            gz: 0,\n            d: {\n                security_key: k\n            }\n        });\n        var r = JSON.parse(String(java.post(CKU + \"\/api\/search\/get-search-tags\", payload, {\n            \"Content-Type\": \"application\/json\"\n        }).body()));\n        if (r.code == 0) {\n            java.toast(\"✅ 已登录 uid:\" + k.split(\":\")[1] + \"  分类:\" + (n[getType(cookie)] || \"\"));\n        } else {\n            java.toast(\"⚠️ 登录失效,请重登 (code:\" + r.code + \")\");\n        }\n    } catch (e) {\n        java.toast(\"检查失败:\" + e);\n    }\n}\n\nfunction reqUrl(cookie, path, d) {\n    d = d || {};\n    d.security_key = gv(cookie);\n    var payload = JSON.stringify({\n        platform: \"android\",\n        client: \"app\",\n        sign: \"\",\n        ver_name: \"0.11.53\",\n        ver_code: 193,\n        gz: 0,\n        d: d\n    });\n    var opt = JSON.stringify({\n        method: \"POST\",\n        body: payload,\n        headers: {\n            \"Content-Type\": \"application\/json\"\n        }\n    });\n    return CKU + path + \",\" + opt;\n}\n\nfunction bb(s) {\n    s = \"\" + (s || \"\");\n    s = s.replace(\/\\[img[^\\]]*\\]([^\\[]+)\\[\\\/img\\]\/gi, '\\n<img src=\"$1\">\\n');\n    s = s.replace(\/<iframe[^>]*src=[\"\\x27]?([^\"\\x27 >]+)[^>]*>[\\s\\S]*?<\\\/iframe>\/gi, \"\\n[视频] $1\\n\");\n    s = s.replace(\/\\[\\\/?[a-zA-Z][^\\]]*\\]\/g, \"\");\n    return s.replace(\/\\r\/g, \"\").replace(\/\\n{3,}\/g, \"\\n\\n\");\n}\n\nfunction doLogin(java, source, cookie) {\n    var m = source.getLoginInfoMap();\n    var u = m.get(\"账号\"),\n        p = m.get(\"密码\");\n    if (!u || !p) {\n        throw new Error(\"请先填账号和密码\");\n    }\n    var payload = JSON.stringify({\n        platform: \"android\",\n        client: \"app\",\n        sign: \"\",\n        ver_name: \"0.11.53\",\n        ver_code: 193,\n        gz: 0,\n        d: {\n            username: u,\n            password: p\n        }\n    });\n    var r = JSON.parse(String(java.post(CKU + \"\/api\/user\/login\", payload, {\n        \"Content-Type\": \"application\/json\"\n    }).body()));\n    if (r.code == 0 && r.data && r.data.security_key) {\n        var c = rd(cookie);\n        c.key = r.data.security_key;\n        wr(cookie, c);\n        java.toast(\"✅ 登录成功 uid:\" + r.data.uid);\n        return true;\n    }\n    throw new Error(r.code == 1001 ? \"账号或密码错误\" : (\"登录失败 code:\" + r.code));\n}\n\nfunction Login(java, source, cookie) {\n    doLogin(java, source, cookie);\n}\n\nfunction login() {\n    var j, s, ck;\n    try {\n        j = java;\n    } catch (e) {}\n    try {\n        s = source;\n    } catch (e) {}\n    try {\n        ck = cookie;\n    } catch (e) {}\n    if ((!j || typeof j.post !== 'function') && this) {\n        j = this.java;\n    }\n    if ((!s || !s.getLoginInfoMap) && this) {\n        s = this.source;\n    }\n    if ((!ck || !ck.getKey) && this) {\n        ck = this.cookie;\n    }\n    if (j && typeof j.post === 'function' && s && s.getLoginInfoMap && ck && ck.getKey) {\n        return doLogin(j, s, ck);\n    }\n    throw new Error('请用下方【🔑登录账号】按钮登录');\n}\n\n\/\/ ===== 评论(完整ESJ机制,数据源改lk) =====\nconst reviewHtmlTemplate = `<!doctype html>\n<html lang=\"zh-CN\">\n<head><meta charset=\"utf-8\" \/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"><meta name=\"color-scheme\" content=\"light dark\"><style>\nhtml,body{margin:0;padding:0;height:100%;overflow:hidden}body{font-family:sans-serif;display:flex;flex-direction:column}\nul{list-style:none;margin:0;padding:0}\n.comment-item{margin:15px 0;border-bottom:1px solid rgba(128,128,128,.2);padding-bottom:15px}\n.comment-item:last-child{border-bottom:none}\n.comment-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:6px}\n.comment-author{font-weight:bold;font-size:14px}.comment-author-guest{font-weight:normal;font-size:14px;color:#888;font-style:italic}\n.comment-meta{font-size:12px;color:#999;text-align:right}\n.comment-text{font-size:15px;margin:6px 0;line-height:1.5}\n.comment-quote{background:rgba(128,128,128,.1);border-left:3px solid rgba(128,128,128,.4);padding:5px 10px;margin:6px 0;font-size:13px;color:#999;border-radius:2px}\n.no-data{width:100%;height:300px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px}\n.no-data-icon{font-size:56px;line-height:1;opacity:.6}\n.no-data-title{font-size:16px;color:#808080}\n.loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}\n.loader{width:50px;height:50px;border:6px solid #f3f3f3;border-top:6px solid #3498db;border-radius:50%;animation:spin 1s linear infinite}\n@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}\n.hidden{display:none}\n.post-section{padding:10px 15px;border-bottom:1px solid rgba(128,128,128,.2)}\n#scroll-area{flex:1;overflow-y:auto;padding:0 15px 10px;position:relative;min-height:0}\n.post-section-title{font-size:14px;font-weight:bold;margin-bottom:10px;color:inherit;opacity:.8}\n.reply-hint{font-size:12px;color:#3498db;margin-bottom:8px;display:none}\n.comment-textarea{width:100%;box-sizing:border-box;border:1px solid rgba(128,128,128,.3);border-radius:8px;padding:8px 10px;font-size:14px;min-height:80px;resize:vertical;font-family:sans-serif;background:transparent;color:inherit;outline:none}\n.comment-textarea:focus{border-color:rgba(52,152,219,.6)}\n.post-footer{display:flex;justify-content:space-between;align-items:center;margin-top:8px}\n.post-status{font-size:12px;color:#999}\n.btn-submit{background:#3498db;color:#fff;border:none;border-radius:16px;padding:6px 16px;font-size:13px;cursor:pointer}\n.btn-submit:disabled{opacity:.5;cursor:default}\n.btn-reply{background:none;border:none;color:#3498db;font-size:12px;cursor:pointer;padding:2px 0}\n.btn-cancel{background:none;border:none;color:#999;font-size:12px;cursor:pointer;margin-right:6px}\n.comment-footer{margin-top:4px}\n.comment-text img,.comment-quote img{max-height:40px;vertical-align:middle}\n<\/style><\/head>\n<body>\n<div id=\"post-section\" class=\"post-section\">\n<div class=\"post-section-title\">你的回應<\/div>\n<div id=\"reply-hint\" class=\"reply-hint\"><\/div>\n<textarea id=\"comment-textarea\" class=\"comment-textarea\" placeholder=\"輸入你的回應...\"><\/textarea>\n<div class=\"post-footer\"><span id=\"post-status\" class=\"post-status\"><\/span><div><button id=\"btn-cancel-reply\" class=\"btn-cancel\" style=\"display:none\" onclick=\"cancelReply()\">取消回覆<\/button><button id=\"btn-submit\" class=\"btn-submit\" onclick=\"submitComment()\">送出<\/button><\/div><\/div>\n<\/div>\n<div id=\"scroll-area\">\n<div id=\"loading\" class=\"loading\"><div class=\"loader\"><\/div><\/div>\n<div id=\"no_data\" class=\"no-data hidden\">\n<div class=\"no-data-icon\">💬<\/div>\n<div class=\"no-data-title\">暂无评论<\/div><\/div>\n<ul id=\"comment-list\"><\/ul>\n<\/div>$2\n<script>\nvar _replyData=null,_chapterUrl=\"\",_rawParams=\"\",_scrollAfterLoad=false;\nfunction updateView(params){\n    window.run(\"getChapterComments(\"+params+\")\").then(function(result){\n        document.getElementById(\"loading\").classList.add(\"hidden\");\n        if(result&&result!==\"\"){\n            var tpl=document.createElement(\"template\");\n            tpl.innerHTML=result;\n            document.getElementById(\"comment-list\").appendChild(tpl.content);\n        }else{\n            document.getElementById(\"no_data\").classList.remove(\"hidden\");\n        }\n        if(_scrollAfterLoad){_scrollAfterLoad=false;var sa=document.getElementById(\"scroll-area\");sa.scrollTop=sa.scrollHeight;}\n    }).catch(function(){\n        document.getElementById(\"loading\").classList.add(\"hidden\");\n        document.getElementById(\"no_data\").classList.remove(\"hidden\");\n    });\n}\nfunction showReplyForm(btn){\n    _replyData=btn.getAttribute(\"data-comment\");\n    var hint=document.getElementById(\"reply-hint\");\n    hint.textContent=\"回覆 \"+btn.getAttribute(\"data-author\");\n    hint.style.display=\"block\";\n    document.getElementById(\"btn-cancel-reply\").style.display=\"\";\n    document.getElementById(\"comment-textarea\").focus();\n}\nfunction cancelReply(){\n    _replyData=null;\n    document.getElementById(\"reply-hint\").style.display=\"none\";\n    document.getElementById(\"btn-cancel-reply\").style.display=\"none\";\n}\nfunction refreshComments(){document.getElementById(\"comment-list\").innerHTML=\"\";document.getElementById(\"no_data\").classList.add(\"hidden\");document.getElementById(\"loading\").classList.remove(\"hidden\");_scrollAfterLoad=true;updateView(_rawParams);}\nfunction submitComment(){\n    var content=document.getElementById(\"comment-textarea\").value.trim();\n    if(!content){document.getElementById(\"comment-textarea\").focus();return;}\n    content=content.split(String.fromCharCode(10)).join(\"<br>\");\n    var btn=document.getElementById(\"btn-submit\");\n    var st=document.getElementById(\"post-status\");\n    btn.disabled=true;st.textContent=\"送出中...\";\n    window.run(\"postForumReply(\"+JSON.stringify(_chapterUrl)+\",\"+JSON.stringify(content)+\",\"+JSON.stringify(_replyData||\"\")+\")\").then(function(res){\n        btn.disabled=false;\n        try{\n            var r=JSON.parse(res);\n            if(r.status===200){\n                document.getElementById(\"comment-textarea\").value=\"\";\n                cancelReply();\n                st.textContent=\"已送出！\";\n                setTimeout(function(){st.textContent=\"\";refreshComments();},1500);\n            }else{st.textContent=r.msg||\"送出失敗\";}\n        }catch(e){st.textContent=\"送出失敗\";}\n    }).catch(function(){btn.disabled=false;st.textContent=\"網路錯誤\";});\n}\nvar el=document.getElementById(\"params\");\nif(el){\n    var raw=el.innerText.trim();\n    _chapterUrl=raw.charAt(0)===\"'\"?raw.slice(1,-1):raw;\n    _rawParams=raw;\n    updateView(raw);\n}\n<\/script><\/body>\n<\/html>`;\n\nfunction showChapterComments() {\n    var java = this.java,\n        chapter = this.chapter,\n        cookie = this.cookie;\n    var aid = (String(chapter.url).match(\/aid\\W+(\\d+)\/) || [])[1] || \"\";\n    var key = \"\";\n    try {\n        if (cookie && cookie.getKey) {\n            var v = cookie.getKey(\"https:\/\/api.lightnovel.fun\", \"lkcfg\");\n            if (v) {\n                var cc = JSON.parse(decodeURIComponent(v));\n                if (cc.key) key = cc.key;\n            }\n        }\n    } catch (e) {}\n    if (!key) {\n        try {\n            key = \"\" + (java.get(\"lk_key\") || \"\");\n        } catch (e) {}\n    }\n    var paramsHtml = '<div class=\"hidden\" id=\"params\">\\'' + aid + '@@' + key + '\\'<\/div>';\n    java.showBrowser(\"\", reviewHtmlTemplate.replace(\"$2\", paramsHtml), \"window.run=run\", '{\"heightPercentage\":0.8,\"expandedCornersRadius\":20,\"hideFriction\":0.9}');\n}\n\nfunction escapeHtml(str) {\n    return String(str)\n        .replace(\/&\/g, '&amp;')\n        .replace(\/<\/g, '&lt;')\n        .replace(\/>\/g, '&gt;')\n        .replace(\/\"\/g, '&quot;');\n}\n\nfunction fixRelativeUrls(html, origin) {\n    if (html == null) return '';\n    html = String(html);\n    if (!html || !origin) return html;\n    return html.replace(\/\\bsrc=\"([^\"]+)\"\/g, function(m, url) {\n        if (\/^https?:\\\/\\\/\/i.test(url) || \/^data:\/i.test(url)) return m;\n        if (url.charAt(0) === '\/') return 'src=\"' + origin + url + '\"';\n        return 'src=\"' + origin + '\/' + url + '\"';\n    });\n}\n\nfunction unescapeLkTags(s) {\n    s = s.replace(\/&lt;br\\s*\\\/?&gt;\/gi, \"<br>\");\n    s = s.replace(\/&lt;img\\s+src=&quot;([^&]+)&quot;[\\s\\S]*?&gt;\/gi, '<img src=\"$1\" style=\"height:1.4em;vertical-align:middle\">');\n    return s;\n}\n\nfunction getChapterComments(param) {\n    var java = this.java;\n    var parts = (\"\" + param).split(\"@@\");\n    var aid = parts[0] || \"\";\n    var key = parts[1] || \"\";\n    if (!key) {\n        try {\n            key = \"\" + (java.get(\"lk_key\") || \"\");\n        } catch (e) {}\n    }\n    var body = JSON.stringify({\n        platform: \"android\",\n        client: \"app\",\n        sign: \"\",\n        ver_name: \"0.11.53\",\n        ver_code: 193,\n        gz: 0,\n        d: {\n            aid: parseInt(aid),\n            page: 1,\n            page_size: 20,\n            security_key: key\n        }\n    });\n    var resp = String(java.post(\"https:\/\/api.lightnovel.fun\/api\/discuss\/get-topic\", body, {\n        \"Content-Type\": \"application\/json\"\n    }).body());\n    var r = JSON.parse(resp);\n    var lst = (r.data && r.data.list) || [];\n    if (!lst.length) return \"\";\n    var result = [];\n    for (var i = 0; i < lst.length; i++) {\n        var c = lst[i];\n        var u = c.user_info || {};\n        var item = '<li class=\"comment-item\">';\n        item += '<div class=\"comment-header\"><span class=\"comment-author\">' + escapeHtml(u.nickname || \"匿名\") + '<\/span><span class=\"comment-meta\">' + escapeHtml(c.time || \"\") + '<\/span><\/div>';\n        item += '<div class=\"comment-text\">' + unescapeLkTags(escapeHtml(c.content || \"\")) + '<\/div>';\n        var rl = c.reply_list || [];\n        for (var k = 0; k < rl.length; k++) {\n            var rc = rl[k];\n            var ru = rc.user_info || {};\n            item += '<div class=\"comment-quote\"><b>' + escapeHtml(ru.nickname || \"\") + '<\/b>: ' + unescapeLkTags(escapeHtml(rc.content || \"\")) + '<\/div>';\n        }\n        item += '<\/li>';\n        result.push(item);\n    }\n    return result.join(\"\");\n}\n\nfunction postForumReply(chapterUrl, content, replyData) {\n    var tokenBody;\n    try {\n        tokenBody = this.java.post(\n            chapterUrl,\n            'plxf=getAuthToken', {\n                'Content-Type': 'application\/x-www-form-urlencoded'\n            }\n        ).body();\n    } catch (e) {\n        return JSON.stringify({\n            status: 500,\n            msg: '無法連接伺服器'\n        });\n    }\n    var tokenMatch = \/<JinJing>(.*?)<\\\/JinJing>\/.exec(tokenBody);\n    if (!tokenMatch) {\n        return JSON.stringify({\n            status: 500,\n            msg: '獲取令牌失敗'\n        });\n    }\n    var token = tokenMatch[1];\n    var originMatch = \/^(https?:\\\/\\\/[^\\\/]+)\/.exec(chapterUrl);\n    var origin = originMatch ? originMatch[1] : source.bookSourceUrl;\n    var forumMatch = \/\\\/(\\d+)\\.html\/.exec(chapterUrl);\n    if (!forumMatch) {\n        return JSON.stringify({\n            status: 500,\n            msg: '無法解析章節ID'\n        });\n    }\n    var forumId = forumMatch[1];\n    var postBody = 'data=forum&forum_id=' + encodeURIComponent(forumId) + '&content=' + encodeURIComponent(content);\n    if (replyData) {\n        postBody += '&reply=' + encodeURIComponent(replyData);\n    }\n    var responseBody;\n    try {\n        responseBody = this.java.post(\n            origin + '\/inc\/forum_reply.php',\n            postBody, {\n                'Content-Type': 'application\/x-www-form-urlencoded',\n                'Authorization': token\n            }\n        ).body();\n    } catch (e) {\n        return JSON.stringify({\n            status: 500,\n            msg: '網路錯誤'\n        });\n    }\n    return responseBody;\n}","lastUpdateTime":"1783613032434","loginUi":"[{\n    \"name\": \"账号\",\n    \"type\": \"text\"\n}, {\n    \"name\": \"密码\",\n    \"type\": \"password\"\n}, {\n    \"name\": \"🔑 登录账号\",\n    \"type\": \"button\",\n    \"action\": \"Login(java,source,cookie)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 1\n    }\n}, {\n    \"name\": \"📖 小说\",\n    \"type\": \"button\",\n    \"action\": \"setType(java,cookie,2)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}, {\n    \"name\": \"🎨 漫画\",\n    \"type\": \"button\",\n    \"action\": \"setType(java,cookie,5)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}, {\n    \"name\": \"📺 动画\",\n    \"type\": \"button\",\n    \"action\": \"setType(java,cookie,4)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}, {\n    \"name\": \"📰 资讯\",\n    \"type\": \"button\",\n    \"action\": \"setType(java,cookie,3)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}, {\n    \"name\": \"🔀 综合\",\n    \"type\": \"button\",\n    \"action\": \"setType(java,cookie,0)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 1\n    }\n}, {\n    \"name\": \"ℹ️ 当前状态\",\n    \"type\": \"button\",\n    \"action\": \"showStatus(java,cookie)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}, {\n    \"name\": \"🗑️ 清除登录\",\n    \"type\": \"button\",\n    \"action\": \"clearLogin(java,cookie)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}, {\n    \"name\": \"🔍 精准搜索\",\n    \"type\": \"button\",\n    \"action\": \"setPure(java,cookie)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}, {\n    \"name\": \"🈶 繁转简\",\n    \"type\": \"button\",\n    \"action\": \"setZh(java,cookie)\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}]","loginUrl":"@js:","respondTime":180000,"ruleBookInfo":{"author":"@js:var o=JSON.parse(result).data;(o.author&&o.author.nickname)?o.author.nickname:(o.author||\"\")","coverUrl":"@js:JSON.parse(result).data.cover||\"\"","intro":"@js:var o=JSON.parse(result).data;var t=\"\"+(o.intro||o.summary||\"\");t=t.replace(\/\\[res\\][^\\[\\]]*\\[\\\/res\\]\/g,\"\");t=bb(t);if(\/^\\s*data:\/.test(t)||\/base64,\/.test(t.substring(0,60)))t=\"（暂无简介）\";try{if(getZh(cookie)==\"s\"&&java.t2s)t=java.t2s(t);}catch(e){}t","kind":"@js:var o=JSON.parse(result).data;var res=[o.group_name||o.parent_group_name||\"\"];var nm=o.name||o.title||\"\";var m=nm.match(\/\\[([^\\]]+)\\]\/g);if(m){for(var i=0;i<m.length;i++)res.push(m[i].replace(\/[\\[\\]]\/g,\"\"));}res.filter(function(x){return x&&x.length<20;}).join(\",\")","name":"@js:var o=JSON.parse(result).data;var n=o.name||o.title||\"\";try{if(getZh(cookie)==\"s\"&&java.t2s)n=java.t2s(n);}catch(e){}n","tocUrl":"@js:var o=JSON.parse(result).data;(o.articles&&o.articles.length)?(\"\"+baseUrl):((o.sid&&o.sid>0)?reqUrl(cookie,\"\/api\/series\/get-info\",{sid:o.sid}):(\"\"+baseUrl))"},"ruleContent":{"content":"@js:\n(function() {\n    var o = JSON.parse(result).data;\n    var c = \"\" + (o.content || \"\");\n    var info = (o.res && o.res.res_info) || {};\n    c = c.replace(\/\\[res\\]([^\\[\\]]+)\\[\\\/res\\]\/g, function(m, id) {\n        var r = info[id];\n        return (r && r.url) ? (\"\\n<img src=\\\"\" + r.url + \"\\\">\\n\") : \"\";\n    });\n    c = bb(c);\n    if (!c || c.replace(\/\\s\/g, \"\").length < 2) {\n        return \"⚠️ 本章无法查看\\n\\n可能原因:需要权限\/已删除\/是EPUB或下载类外链资源(非在线正文)\";\n    }\n    try {\n        if (getZh(cookie) == \"s\" && java.t2s) c = java.t2s(c);\n    } catch (e) {}\n    return c;\n})()","imageStyle":"FULL","subContent":"@js:\nif (!chapter.isVolume()) {\n    try {\n        var _v = cookie.getKey(\"https:\/\/api.lightnovel.fun\", \"lkcfg\");\n        if (_v) {\n            var _cc = JSON.parse(decodeURIComponent(_v));\n            if (_cc.key) java.put(\"lk_key\", _cc.key);\n        }\n    } catch (e) {}\n    var svg = '<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"1000\" height=\"80\"><rect width=\"1000\" height=\"80\" fill=\"#f0f0f0\" rx=\"15\"\/><text x=\"500\" y=\"52\" font-family=\"Arial\" font-size=\"40\" fill=\"#666\" text-anchor=\"middle\">💬 查看章节评论<\/text><\/svg>';\n    result = '<img src=\"data:image\/svg+xml;base64,' + java.base64Encode(svg) + ',{\\\"click\\\":\\\"showChapterComments()\\\"}\"\/>';\n} else {\n    result = '';\n}"},"ruleExplore":{"author":"@js:JSON.parse(result).author||\"\"","bookList":"@js:(function(){var d=JSON.parse(result).data;if(!d||!d.list)return [];return d.list.map(function(i){return JSON.stringify(i);});})()","bookUrl":"@js:var o=JSON.parse(result);(o.sid&&o.sid!=0)?reqUrl(cookie,\"\/api\/series\/get-info\",{sid:o.sid}):reqUrl(cookie,\"\/api\/article\/get-detail\",{aid:o.aid,simple:0})","coverUrl":"@js:JSON.parse(result).cover||\"\"","intro":"@js:var o=JSON.parse(result);o.series_name||o.group_name||\"\"","name":"@js:var o=JSON.parse(result);o.name||o.title||\"\""},"ruleSearch":{"author":"@js:JSON.parse(result).author||\"\"","bookList":"@js:(function(){var d=JSON.parse(result).data;if(!d||!d.list)return [];var list=d.list;try{if(getPure(cookie)){list=list.filter(function(i){return i.gid!=108&&i.gid!=110;});}}catch(e){}return list.map(function(i){return JSON.stringify(i);});})()","bookUrl":"@js:var o=JSON.parse(result);(o.sid&&o.sid!=0)?reqUrl(cookie,\"\/api\/series\/get-info\",{sid:o.sid}):reqUrl(cookie,\"\/api\/article\/get-detail\",{aid:o.aid,simple:0})","coverUrl":"@js:JSON.parse(result).cover||\"\"","intro":"@js:var o=JSON.parse(result);o.group_name||o.parent_group_name||\"\"","name":"@js:var o=JSON.parse(result);o.name||o.title||\"\""},"ruleToc":{"chapterList":"@js:\n(function() {\n    var d = JSON.parse(result).data;\n    var sn = d.name || \"\";\n    var a = d.articles;\n    if (!a || !a.length) return [JSON.stringify({\n        title: (d.title || d.name || \"正文\"),\n        aid: d.aid\n    })];\n    return a.map(function(i) {\n        var t = \"\" + (i.title || \"\");\n        var orig = t;\n        t = t.replace(\/\\[(?![^\\]]*[话話章回卷季幕])[^\\]]*\\]\/g, \"\");\n        if (sn) {\n            t = t.split(sn).join(\"\");\n        }\n        t = t.replace(\/\\s+\/g, \" \").trim();\n        if (!t) t = orig;\n        return JSON.stringify({\n            title: t,\n            aid: i.aid\n        });\n    });\n})()","chapterName":"@js:var t=\"\"+(JSON.parse(result).title||\"\");try{if(getZh(cookie)==\"s\"&&java.t2s)t=java.t2s(t);}catch(e){}t","chapterUrl":"@js:reqUrl(cookie,\"\/api\/article\/get-detail\",{aid:JSON.parse(result).aid,simple:0})"},"searchUrl":"@js:reqUrl(cookie,\"\/api\/search\/search-result\",{q:key,type:getType(cookie),page:page,page_size:20})","weight":0}]