🗨️ 轻之国度
https://api.lightnovel.fun
t2157111 (9598)4天前
轻之国度 API源 by sjshb57
附注:
做了一些细节处理,对epub等正文进行了细节优化
Tips:默认支付和章末评论是否开启的这个功能下个版本会加
*转载请标明原作者
//2026/07/07/ By sjshb57 首次发布
// 2026/07/10/ By sjshb57 添加功能
// 添加了章末评论功能,UI致谢 @吉王义昊
⚠️必须登录:填账号密码点【🔑登录账号】。
【精准搜索】过滤epub/下载(外链)。
【繁转简】把繁体转简体。
【发现】小说/漫画/资讯/动画各子分类。
注意付费章节默认支付轻币,如无需要可以去登录那里关掉
{
"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, '&')\n .replace(\/<\/g, '<')\n .replace(\/>\/g, '>')\n .replace(\/\"\/g, '"');\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(\/<br\\s*\\\/?>\/gi, \"<br>\");\n s = s.replace(\/<img\\s+src="([^&]+)"[\\s\\S]*?>\/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
}