🐛 fix(bookSource): 修复登录表单不显示与正文环境 source 未定义

- option 为魔改版控件,官方阅读渲染失败导致登录无表单:改用 text 输入框 + 保存按钮(预填默认值、白名单校验、双入口等效)
- 部分阅读版本正文规则不注入 source 变量:设置存取改走 cache(全规则环境可用),BaseUrl 三级兜底(source → book.origin → baseUrl 提取),各级 typeof 防护
- 服务器 443 证书生效,书源地址切回 https://fq.20010117.xyz
This commit is contained in:
chenxin committed 2026-10-10 01:26:12 +08:00
1 parent 803e6fb3fd
commit d42895cc0b
1 file changed
+6 -6
+6 -6
View File
@@ -1,19 +1,19 @@
[ [
{ {
"bookSourceComment": "fanqie-go 聚合书源:一个源覆盖 小说/听书/漫画/短剧。\n\n【设置入口】① 书源编辑 → 登录:填写表单后点底部「登录」保存;② 发现页顶部「模式」筛选按钮直接切换,切换后刷新发现页。\n【快捷搜索】搜索时可用前缀临时指定模式:x:小说(可省略)、t:听书、m:漫画、d:短剧,如「t:十日终焉」。\n【段评】正文气泡为段落评论,点击打开评论页(设置中段评=开)。\n【正文分流】听书:短剧视频章优先返回原声音轨,其余回退 TTS 音色;短剧:自动打开视频代理直链;小说/漫画:正文为空(漫画章)自动回退图片列表。\n【参数】音色 0/1/2/4/5/6(默认 0);清晰度仅视频生效(默认 max)。\n【依赖】全部计算由自建服务端完成,服务失效则书源整体失效。动态书籍类型需较新版本阅读。已在书架的书切换模式后需刷新目录。\n\n【当前走 http】服务器 443 的 fq 证书未挂载(两个 SNI 都返回 shuyuan 证书),修复后可把书源地址改回 https。", "bookSourceComment": "fanqie-go 聚合书源:一个源覆盖 小说/听书/漫画/短剧。\n\n【设置入口】① 书源编辑 → 登录:填写各项(值不合规则回默认)后点「保存设置」或底部「登录」;② 发现页顶部「模式」筛选按钮直接切换,切换后刷新发现页。\n【快捷搜索】搜索时可用前缀临时指定模式:x:小说(可省略)、t:听书、m:漫画、d:短剧,如「t:十日终焉」。\n【段评】正文气泡为段落评论,点击打开评论页(设置中段评=开)。\n【正文分流】听书:短剧视频章优先返回原声音轨,其余回退 TTS 音色;短剧:自动打开视频代理直链;小说/漫画:正文为空(漫画章)自动回退图片列表。\n【参数】音色 0/1/2/4/5/6(默认 0);清晰度仅视频生效(默认 max)。\n【依赖】全部计算由自建服务端完成,服务失效则书源整体失效。动态书籍类型需较新版本阅读。已在书架的书切换模式后需刷新目录。",
"bookSourceGroup": "🍅 番茄", "bookSourceGroup": "🍅 番茄",
"bookSourceName": "🍅 番茄聚合", "bookSourceName": "🍅 番茄聚合",
"bookSourceType": 0, "bookSourceType": 0,
"bookSourceUrl": "http://fq.20010117.xyz", "bookSourceUrl": "https://fq.20010117.xyz",
"customOrder": 0, "customOrder": 0,
"enabled": true, "enabled": true,
"enabledCookieJar": false, "enabledCookieJar": false,
"enabledExplore": true, "enabledExplore": true,
"header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; 2210132C Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.5845.92 Mobile Safari/537.36\"}", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; 2210132C Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.5845.92 Mobile Safari/537.36\"}",
"jsLib": "// ============ 源变量配置(照光遇模式:defaultConfig 兜底,全 try-catch) ============\nconst defaultConfig = {\n 模式: \"小说\",\n 音色: \"0\",\n 清晰度: \"max\",\n 段评: \"开\",\n 图片: \"保留\"\n};\n\nfunction getVariable(k) {\n if (k == undefined) k = \"\";\n let parsed = {}\n try {\n parsed = JSON.parse(source.getVariable())\n } catch {}\n if (k == \"\") {\n return parsed;\n }\n let value = parsed[k];\n if (value == undefined) {\n value = defaultConfig[k];\n }\n return value != undefined ? value : \"\";\n}\n\nfunction setVariable(k, v, t) {\n if (t == undefined) t = true;\n const vs = this.getVariable();\n vs[k] = v;\n source.setVariable(JSON.stringify(vs, null, 4));\n if (t) {\n java.toast(`\\n设置 ${k} 为 ${v}`)\n }\n}\n\n// 发现页筛选按钮回调:存变量并刷新发现页\nfunction show(m, t) {\n let data = {};\n try {\n data = JSON.parse(source.getVariable())\n } catch {}\n data[t] = m;\n source.setVariable(JSON.stringify(data, null, 2));\n java.toast(`\\n已设置${t}:${m}\\n已在书架的书切换模式后需刷新目录`);\n try {\n java.refreshExplore();\n } catch {}\n}\n\nfunction createFilter(title, chars, defaultVal, paramKey, size, viewName) {\n if (viewName == undefined) viewName = \"'请选择类型'\";\n return {\n title: title,\n type: \"select\",\n chars: chars,\n default: defaultVal,\n \"viewName\": viewName,\n action: `show(infoMap['${title}'],'${paramKey}')`,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: size\n }\n };\n}\n\n// ============ 基础工具 ============\nfunction BaseUrl() {\n return String(source.getKey()).replace(/\\/+$/, '');\n}\n\nfunction request(url) {\n let urla = url;\n if (!url.includes('http')) urla = this.BaseUrl() + url;\n return java.ajax(urla);\n}\n\nfunction parseJsonSafely(str, defaultValue) {\n if (defaultValue == null) defaultValue = null;\n try {\n return JSON.parse(str);\n } catch (e) {\n return defaultValue;\n }\n}\n\nfunction isIOS() {\n try {\n java.deviceID();\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction isMod() {\n try {\n if (typeof java.reLoginView == 'function') return true;\n new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// ============ 段评气泡(/content?review=keep 注入 <comment> 标记,点击打开 /review_html 页面) ============\nfunction createSvg(number, url) {\n var t = number > 99 ? '99+' : String(number);\n var svg = `<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='0 0 25 17' fill='none'><path stroke='currentColor' stroke-width='1.00' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='4.00' style='stroke:#A7A7A7;stroke-opacity:0.5;stroke-width:1px;stroke-linejoin:round;fill:transparent;fill-opacity:0.5;' d='M 7.5 0.5 L 16.5 0.5 A 7 7 0 0 1 23.5 7.5 L 23.5 7.5 A 7 7 0 0 1 16.5 14.5 L 8.5 14.5 L 5.192 16.5 L 5.5 14.5 A 7 7 30 0 1 0.5 7.5 L 0.5 7.5 A 7 7 0 0 1 7.5 0.5 Z'/><text fill='#A7A7A7' font-family='Arial, sans-serif' font-size='10' font-weight='500' text-anchor='middle' dy='0.35em' x='12.00' y='7.50'>${t}</text></svg>`;\n var k = isMod() ? 'click' : 'js';\n return `data:image/svg+xml;base64,${java.base64Encode(svg)},{\"${k}\":\"showCmt('${url}','段评')\",\"style\":\"text\"}`;\n}\n\nfunction showCmt(url, title) {\n var t = title || '段评';\n try {\n java.startBrowser(url, t);\n return;\n } catch (e) {}\n try {\n java.startBrowserDp(url, t);\n } catch (e2) {}\n}\n\nfunction paraForAndroid(content) {\n return content.replace(/<p\\b[^>]*>([\\s\\S]*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n function (m, text, url, count) {\n if (url && count) return `<p>${text}<img src=\"${createSvg(count, url)}\"></p>`;\n return `<p>${text}</p>`;\n });\n}\n\nfunction paraForiOS(content) {\n return content.replace(/<p\\b[^>]*>([\\s\\S]*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n function (m, text, url, count) {\n if (url && count) {\n var u = url.replace(/&/g, '&amp;');\n return `<div rs-native>${text}<comment count=\"${count > 99 ? '99' : count}\" onPress=\"java.showReadingBrowser('${u}','段评')\"></div>`;\n }\n return `<div rs-native>${text}</div>`;\n }).replace(/&#34;/g, '\"');\n}", "jsLib": "// ============ 源变量配置(照光遇模式:defaultConfig 兜底,全 try-catch) ============\nconst defaultConfig = {\n 模式: \"小说\",\n 音色: \"0\",\n 清晰度: \"max\",\n 段评: \"开\",\n 图片: \"保留\"\n};\n\nconst fqVarsKey = 'fq_vars';\n\nfunction getVariable(k) {\n if (k == undefined) k = \"\";\n var parsed = {};\n try {\n var raw = String(cache.get(fqVarsKey) || '');\n if (raw) parsed = JSON.parse(raw);\n } catch (e) {}\n if (k == \"\") return parsed;\n var value = parsed[k];\n if (value == undefined) value = defaultConfig[k];\n return value != undefined ? value : \"\";\n}\n\nfunction setVariable(k, v, t) {\n if (t == undefined) t = true;\n var parsed = {};\n try {\n var raw = String(cache.get(fqVarsKey) || '');\n if (raw) parsed = JSON.parse(raw);\n } catch (e) {}\n parsed[k] = v;\n try { cache.put(fqVarsKey, JSON.stringify(parsed)); } catch (e) {}\n if (t) java.toast('\\n设置 ' + k + ' 为 ' + v);\n}\n\n// 发现页筛选按钮回调:存变量并刷新发现页\nfunction show(m, t) {\n setVariable(t, m, false);\n java.toast('\\n已设置' + t + ':' + m + '\\n已在书架的书切换模式后需刷新目录');\n try { java.refreshExplore(); } catch (e) {}\n}\n\nfunction createFilter(title, chars, defaultVal, paramKey, size, viewName) {\n if (viewName == undefined) viewName = \"'请选择类型'\";\n return {\n title: title,\n type: \"select\",\n chars: chars,\n default: defaultVal,\n \"viewName\": viewName,\n action: `show(infoMap['${title}'],'${paramKey}')`,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: size\n }\n };\n}\n\n// ============ 基础工具 ============\nfunction BaseUrl() {\n var u = '';\n try {\n if (typeof source != 'undefined' && source && source.getKey) u = String(source.getKey());\n } catch (e) {}\n if (!u) {\n try {\n if (typeof book != 'undefined' && book && book.origin) u = String(book.origin);\n } catch (e) {}\n }\n if (!u) {\n try {\n if (typeof baseUrl != 'undefined') {\n var m = String(baseUrl).match(/^https?:\\/\\/[^\\/]+/);\n if (m) u = m[0];\n }\n } catch (e) {}\n }\n return u.replace(/\\/+$/, '');\n}\n\nfunction request(url) {\n let urla = url;\n if (!url.includes('http')) urla = this.BaseUrl() + url;\n return java.ajax(urla);\n}\n\nfunction parseJsonSafely(str, defaultValue) {\n if (defaultValue == null) defaultValue = null;\n try {\n return JSON.parse(str);\n } catch (e) {\n return defaultValue;\n }\n}\n\nfunction isIOS() {\n try {\n java.deviceID();\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction isMod() {\n try {\n if (typeof java.reLoginView == 'function') return true;\n new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// ============ 段评气泡(/content?review=keep 注入 <comment> 标记,点击打开 /review_html 页面) ============\nfunction createSvg(number, url) {\n var t = number > 99 ? '99+' : String(number);\n var svg = `<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='0 0 25 17' fill='none'><path stroke='currentColor' stroke-width='1.00' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='4.00' style='stroke:#A7A7A7;stroke-opacity:0.5;stroke-width:1px;stroke-linejoin:round;fill:transparent;fill-opacity:0.5;' d='M 7.5 0.5 L 16.5 0.5 A 7 7 0 0 1 23.5 7.5 L 23.5 7.5 A 7 7 0 0 1 16.5 14.5 L 8.5 14.5 L 5.192 16.5 L 5.5 14.5 A 7 7 30 0 1 0.5 7.5 L 0.5 7.5 A 7 7 0 0 1 7.5 0.5 Z'/><text fill='#A7A7A7' font-family='Arial, sans-serif' font-size='10' font-weight='500' text-anchor='middle' dy='0.35em' x='12.00' y='7.50'>${t}</text></svg>`;\n var k = isMod() ? 'click' : 'js';\n return `data:image/svg+xml;base64,${java.base64Encode(svg)},{\"${k}\":\"showCmt('${url}','段评')\",\"style\":\"text\"}`;\n}\n\nfunction showCmt(url, title) {\n var t = title || '段评';\n try {\n java.startBrowser(url, t);\n return;\n } catch (e) {}\n try {\n java.startBrowserDp(url, t);\n } catch (e2) {}\n}\n\nfunction paraForAndroid(content) {\n return content.replace(/<p\\b[^>]*>([\\s\\S]*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n function (m, text, url, count) {\n if (url && count) return `<p>${text}<img src=\"${createSvg(count, url)}\"></p>`;\n return `<p>${text}</p>`;\n });\n}\n\nfunction paraForiOS(content) {\n return content.replace(/<p\\b[^>]*>([\\s\\S]*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n function (m, text, url, count) {\n Line truncated
"loginUi": "[{\"name\": \"填写后点击底部「登录」保存设置\", \"type\": \"button\", \"action\": \"\"}, {\"name\": \"模式\", \"type\": \"option\", \"value\": \"小说\", \"options\": [\"小说\", \"听书\", \"漫画\", \"短剧\"]}, {\"name\": \"音色\", \"type\": \"option\", \"value\": \"0\", \"options\": [\"0\", \"1\", \"2\", \"4\", \"5\", \"6\"]}, {\"name\": \"清晰度\", \"type\": \"option\", \"value\": \"max\", \"options\": [\"max\", \"720p\", \"540p\", \"480p\", \"360p\"]}, {\"name\": \"段评\", \"type\": \"option\", \"value\": \"开\", \"options\": [\"开\", \"关\"]}, {\"name\": \"图片\", \"type\": \"option\", \"value\": \"保留\", \"options\": [\"保留\", \"移除\"]}]", "loginUi": "[{\"name\": \"填好后点「保存设置」或底部「登录」\", \"type\": \"button\", \"action\": \"\"}, {\"name\": \"模式(小说/听书/漫画/短剧)\", \"type\": \"text\", \"value\": \"小说\"}, {\"name\": \"音色(0/1/2/4/5/6)\", \"type\": \"text\", \"value\": \"0\"}, {\"name\": \"清晰度(max/720p/540p/480p/360p)\", \"type\": \"text\", \"value\": \"max\"}, {\"name\": \"段评(开/关)\", \"type\": \"text\", \"value\": \"开\"}, {\"name\": \"图片(保留/移除)\", \"type\": \"text\", \"value\": \"保留\"}, {\"name\": \"✅ 保存设置\", \"type\": \"button\", \"action\": \"saveSettings()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}]",
"loginUrl": "// 登录页即设置页:点「登录」提交表单后,表单值同步进源变量(顶层执行,确保有反馈)\n(function () {\n var li = {};\n try {\n li = JSON.parse(source.getLoginInfo());\n } catch (e) {}\n var names = ['模式', '音色', '清晰度', '段评', '图片'];\n for (var i = 0; i < names.length; i++) {\n var k = names[i];\n if (li[k] != undefined && li[k] != '') setVariable(k, li[k], false);\n }\n java.longToast('\\n✅ 设置已保存\\n模式:' + getVariable('模式') + '\\n音色:' + getVariable('音色') + '\\n清晰度:' + getVariable('清晰度') + '\\n段评:' + getVariable('段评') + '\\n图片:' + getVariable('图片') + '\\n\\n提示:已在书架的书切换模式后需刷新目录');\n})();\ntrue;", "loginUrl": "// 登录页即设置页:表单填写后点「保存设置」或底部「登录」均可生效\nfunction pick(v, list, def) {\n v = String(v || '').trim();\n return list.indexOf(v) >= 0 ? v : def;\n}\nfunction applySettings(li) {\n var m = pick(li['模式(小说/听书/漫画/短剧)'], ['小说', '听书', '漫画', '短剧'], '小说');\n var tn = pick(li['音色(0/1/2/4/5/6)'], ['0', '1', '2', '4', '5', '6'], '0');\n var q = pick(li['清晰度(max/720p/540p/480p/360p)'], ['max', '720p', '540p', '480p', '360p'], 'max');\n var rv = pick(li['段评(开/关)'], ['开', '关'], '开');\n var ig = pick(li['图片(保留/移除)'], ['保留', '移除'], '保留');\n setVariable('模式', m, false);\n setVariable('音色', tn, false);\n setVariable('清晰度', q, false);\n setVariable('段评', rv, false);\n setVariable('图片', ig, false);\n java.longToast('\\n✅ 设置已保存\\n模式:' + m + '\\n音色:' + tn + '\\n清晰度:' + q + '\\n段评:' + rv + '\\n图片:' + ig + '\\n\\n已在书架的书切换模式后需刷新目录');\n}\n// 「保存设置」按钮回调(result 为表单值)\nfunction saveSettings() {\n applySettings(result);\n}\n// 点底部官方「登录」按钮时执行(表单值已存入 loginInfo)\n(function () {\n var li = {};\n try {\n if (typeof source != 'undefined' && source && source.getLoginInfo) li = JSON.parse(source.getLoginInfo()) || {};\n } catch (e) {}\n applySettings(li);\n})();\ntrue;",
"lastUpdateTime": 1791565772423, "lastUpdateTime": 1791566613299,
"respondTime": 180000, "respondTime": 180000,
"exploreUrl": "<js>\nvar groups = {\"🔥 男频精选\": [{\"title\": \"玄幻\", \"url\": \"/category-landing?category_id=7&offset={{(page-1)*20}}\"}, {\"title\": \"都市\", \"url\": \"/category-landing?category_id=1&offset={{(page-1)*20}}\"}, {\"title\": \"历史\", \"url\": \"/category-landing?category_id=12&offset={{(page-1)*20}}\"}, {\"title\": \"悬疑\", \"url\": \"/category-landing?category_id=10&offset={{(page-1)*20}}\"}, {\"title\": \"衍生\", \"url\": \"/category-landing?category_id=1079&offset={{(page-1)*20}}\"}, {\"title\": \"同人\", \"url\": \"/category-landing?category_id=538&offset={{(page-1)*20}}\"}, {\"title\": \"科幻末世\", \"url\": \"/category-landing?category_id=8&offset={{(page-1)*20}}\"}, {\"title\": \"奇幻仙侠\", \"url\": \"/category-landing?category_id=259&offset={{(page-1)*20}}\"}, {\"title\": \"种田\", \"url\": \"/category-landing?category_id=23&offset={{(page-1)*20}}\"}, {\"title\": \"游戏体育\", \"url\": \"/category-landing?category_id=746&offset={{(page-1)*20}}\"}, {\"title\": \"系统\", \"url\": \"/category-landing?category_id=19&offset={{(page-1)*20}}\"}, {\"title\": \"重生\", \"url\": \"/category-landing?category_id=36&offset={{(page-1)*20}}\"}, {\"title\": \"穿越\", \"url\": \"/category-landing?category_id=37&offset={{(page-1)*20}}\"}, {\"title\": \"多女主\", \"url\": \"/category-landing?category_id=91&offset={{(page-1)*20}}\"}, {\"title\": \"修仙\", \"url\": \"/category-landing?category_id=517&offset={{(page-1)*20}}\"}, {\"title\": \"二次元\", \"url\": \"/category-landing?category_id=39&offset={{(page-1)*20}}\"}, {\"title\": \"搞笑轻松\", \"url\": \"/category-landing?category_id=778&offset={{(page-1)*20}}\"}, {\"title\": \"单女主\", \"url\": \"/category-landing?category_id=389&offset={{(page-1)*20}}\"}, {\"title\": \"悬疑灵异\", \"url\": \"/category-landing?category_id=751&offset={{(page-1)*20}}\"}, {\"title\": \"末日求生\", \"url\": \"/category-landing?category_id=515&offset={{(page-1)*20}}\"}, {\"title\": \"娱乐圈\", \"url\": \"/category-landing?category_id=43&offset={{(page-1)*20}}\"}, {\"title\": \"末世\", \"url\": \"/category-landing?category_id=68&offset={{(page-1)*20}}\"}], \"🌸 女频精选\": [{\"title\": \"现代言情\", \"url\": \"/category-landing?category_id=3&offset={{(page-1)*20}}\"}, {\"title\": \"古代言情\", \"url\": \"/category-landing?category_id=5&offset={{(page-1)*20}}\"}, {\"title\": \"纯爱\", \"url\": \"/category-landing?category_id=1012&offset={{(page-1)*20}}\"}, {\"title\": \"甜宠\", \"url\": \"/category-landing?category_id=96&offset={{(page-1)*20}}\"}, {\"title\": \"总裁\", \"url\": \"/category-landing?category_id=29&offset={{(page-1)*20}}\"}, {\"title\": \"幻想言情\", \"url\": \"/category-landing?category_id=32&offset={{(page-1)*20}}\"}, {\"title\": \"双男主\", \"url\": \"/category-landing?category_id=275&offset={{(page-1)*20}}\"}, {\"title\": \"双女主\", \"url\": \"/category-landing?category_id=704&offset={{(page-1)*20}}\"}, {\"title\": \"年代\", \"url\": \"/category-landing?category_id=79&offset={{(page-1)*20}}\"}, {\"title\": \"快穿\", \"url\": \"/category-landing?category_id=24&offset={{(page-1)*20}}\"}, {\"title\": \"豪门总裁\", \"url\": \"/category-landing?category_id=748&offset={{(page-1)*20}}\"}, {\"title\": \"追妻火葬场\", \"url\": \"/category-landing?category_id=616&offset={{(page-1)*20}}\"}, {\"title\": \"无CP\", \"url\": \"/category-landing?category_id=392&offset={{(page-1)*20}}\"}, {\"title\": \"大女主\", \"url\": \"/category-landing?category_id=760&offset={{(page-1)*20}}\"}, {\"title\": \"女强\", \"url\": \"/category-landing?category_id=86&offset={{(page-1)*20}}\"}], \"🏷️ 男频标签\": [{\"title\": \"古代\", \"url\": \"/category-landing?category_id=758&offset={{(page-1)*20}}\"}, {\"title\": \"历史古代\", \"url\": \"/category-landing?category_id=273&offset={{(page-1)*20}}\"}, {\"title\": \"轻小说\", \"url\": \"/category-landing?category_id=858&offset={{(page-1)*20}}\"}, {\"title\": \"都市生活\", \"url\": \"/category-landing?category_id=2&offset={{(page-1)*20}}\"}, {\"title\": \"都市高武\", \"url\": \"/category-landing?category_id=1014&offset={{(page-1)*20}}\"}, {\"title\": \"游戏动漫\", \"url\": \"/category-landing?category_id=57&offset={{(page-1)*20}}\"}, {\"title\": \"抗战谍战\", \"url\": \"/category-landing?category_id=504&offset={{(page-1)*20}}\"}, {\"title\": \"体育\", \"url\": \"/category-landing?category_id=15&offset={{(page-1)*20}}\"}, {\"title\": \"都市异能\", \"url\": \"/category-landing?category_id=516&offset={{(page-1)*20}}\"}, {\"title\": \"武侠\", \"url\": \"/category-landing?category_id=16&offset={{(page-1)*20}}\"}, {\"title\": \"东方仙侠\", \"url\": \"/category-landing?category_id=1140&offset={{(page-1)*20}}\"}, {\"title\": \"东方玄幻\", \"url\": \"/category-landing?category_id=511&offset={{(page-1)*20}}\"}, {\"title\": \"男频衍生\", \"url\": \"/category-landing?categorLine truncated "exploreUrl": "<js>\nvar groups = {\"🔥 男频精选\": [{\"title\": \"玄幻\", \"url\": \"/category-landing?category_id=7&offset={{(page-1)*20}}\"}, {\"title\": \"都市\", \"url\": \"/category-landing?category_id=1&offset={{(page-1)*20}}\"}, {\"title\": \"历史\", \"url\": \"/category-landing?category_id=12&offset={{(page-1)*20}}\"}, {\"title\": \"悬疑\", \"url\": \"/category-landing?category_id=10&offset={{(page-1)*20}}\"}, {\"title\": \"衍生\", \"url\": \"/category-landing?category_id=1079&offset={{(page-1)*20}}\"}, {\"title\": \"同人\", \"url\": \"/category-landing?category_id=538&offset={{(page-1)*20}}\"}, {\"title\": \"科幻末世\", \"url\": \"/category-landing?category_id=8&offset={{(page-1)*20}}\"}, {\"title\": \"奇幻仙侠\", \"url\": \"/category-landing?category_id=259&offset={{(page-1)*20}}\"}, {\"title\": \"种田\", \"url\": \"/category-landing?category_id=23&offset={{(page-1)*20}}\"}, {\"title\": \"游戏体育\", \"url\": \"/category-landing?category_id=746&offset={{(page-1)*20}}\"}, {\"title\": \"系统\", \"url\": \"/category-landing?category_id=19&offset={{(page-1)*20}}\"}, {\"title\": \"重生\", \"url\": \"/category-landing?category_id=36&offset={{(page-1)*20}}\"}, {\"title\": \"穿越\", \"url\": \"/category-landing?category_id=37&offset={{(page-1)*20}}\"}, {\"title\": \"多女主\", \"url\": \"/category-landing?category_id=91&offset={{(page-1)*20}}\"}, {\"title\": \"修仙\", \"url\": \"/category-landing?category_id=517&offset={{(page-1)*20}}\"}, {\"title\": \"二次元\", \"url\": \"/category-landing?category_id=39&offset={{(page-1)*20}}\"}, {\"title\": \"搞笑轻松\", \"url\": \"/category-landing?category_id=778&offset={{(page-1)*20}}\"}, {\"title\": \"单女主\", \"url\": \"/category-landing?category_id=389&offset={{(page-1)*20}}\"}, {\"title\": \"悬疑灵异\", \"url\": \"/category-landing?category_id=751&offset={{(page-1)*20}}\"}, {\"title\": \"末日求生\", \"url\": \"/category-landing?category_id=515&offset={{(page-1)*20}}\"}, {\"title\": \"娱乐圈\", \"url\": \"/category-landing?category_id=43&offset={{(page-1)*20}}\"}, {\"title\": \"末世\", \"url\": \"/category-landing?category_id=68&offset={{(page-1)*20}}\"}], \"🌸 女频精选\": [{\"title\": \"现代言情\", \"url\": \"/category-landing?category_id=3&offset={{(page-1)*20}}\"}, {\"title\": \"古代言情\", \"url\": \"/category-landing?category_id=5&offset={{(page-1)*20}}\"}, {\"title\": \"纯爱\", \"url\": \"/category-landing?category_id=1012&offset={{(page-1)*20}}\"}, {\"title\": \"甜宠\", \"url\": \"/category-landing?category_id=96&offset={{(page-1)*20}}\"}, {\"title\": \"总裁\", \"url\": \"/category-landing?category_id=29&offset={{(page-1)*20}}\"}, {\"title\": \"幻想言情\", \"url\": \"/category-landing?category_id=32&offset={{(page-1)*20}}\"}, {\"title\": \"双男主\", \"url\": \"/category-landing?category_id=275&offset={{(page-1)*20}}\"}, {\"title\": \"双女主\", \"url\": \"/category-landing?category_id=704&offset={{(page-1)*20}}\"}, {\"title\": \"年代\", \"url\": \"/category-landing?category_id=79&offset={{(page-1)*20}}\"}, {\"title\": \"快穿\", \"url\": \"/category-landing?category_id=24&offset={{(page-1)*20}}\"}, {\"title\": \"豪门总裁\", \"url\": \"/category-landing?category_id=748&offset={{(page-1)*20}}\"}, {\"title\": \"追妻火葬场\", \"url\": \"/category-landing?category_id=616&offset={{(page-1)*20}}\"}, {\"title\": \"无CP\", \"url\": \"/category-landing?category_id=392&offset={{(page-1)*20}}\"}, {\"title\": \"大女主\", \"url\": \"/category-landing?category_id=760&offset={{(page-1)*20}}\"}, {\"title\": \"女强\", \"url\": \"/category-landing?category_id=86&offset={{(page-1)*20}}\"}], \"🏷️ 男频标签\": [{\"title\": \"古代\", \"url\": \"/category-landing?category_id=758&offset={{(page-1)*20}}\"}, {\"title\": \"历史古代\", \"url\": \"/category-landing?category_id=273&offset={{(page-1)*20}}\"}, {\"title\": \"轻小说\", \"url\": \"/category-landing?category_id=858&offset={{(page-1)*20}}\"}, {\"title\": \"都市生活\", \"url\": \"/category-landing?category_id=2&offset={{(page-1)*20}}\"}, {\"title\": \"都市高武\", \"url\": \"/category-landing?category_id=1014&offset={{(page-1)*20}}\"}, {\"title\": \"游戏动漫\", \"url\": \"/category-landing?category_id=57&offset={{(page-1)*20}}\"}, {\"title\": \"抗战谍战\", \"url\": \"/category-landing?category_id=504&offset={{(page-1)*20}}\"}, {\"title\": \"体育\", \"url\": \"/category-landing?category_id=15&offset={{(page-1)*20}}\"}, {\"title\": \"都市异能\", \"url\": \"/category-landing?category_id=516&offset={{(page-1)*20}}\"}, {\"title\": \"武侠\", \"url\": \"/category-landing?category_id=16&offset={{(page-1)*20}}\"}, {\"title\": \"东方仙侠\", \"url\": \"/category-landing?category_id=1140&offset={{(page-1)*20}}\"}, {\"title\": \"东方玄幻\", \"url\": \"/category-landing?category_id=511&offset={{(page-1)*20}}\"}, {\"title\": \"男频衍生\", \"url\": \"/category-landing?categorLine truncated
"searchUrl": "<js>\nvar tab = getVariable('模式');\nvar m = String(key).match(/^([xtmdXTMD])[:::]/);\nvar q = String(key);\nif (m) {\n tab = {x: '小说', t: '听书', m: '漫画', d: '短剧'}[m[1].toLowerCase()];\n q = q.slice(2);\n}\njava.put('fq_search_tab', tab);\nvar typeMap = {'小说': 3, '听书': 2, '漫画': 8, '短剧': 11};\n`/search?query=${encodeURIComponent(q)}&tab_type=${typeMap[tab] || 3}&offset=${(page - 1) * 10}`;\n</js>", "searchUrl": "<js>\nvar tab = getVariable('模式');\nvar m = String(key).match(/^([xtmdXTMD])[:::]/);\nvar q = String(key);\nif (m) {\n tab = {x: '小说', t: '听书', m: '漫画', d: '短剧'}[m[1].toLowerCase()];\n q = q.slice(2);\n}\njava.put('fq_search_tab', tab);\nvar typeMap = {'小说': 3, '听书': 2, '漫画': 8, '短剧': 11};\n`/search?query=${encodeURIComponent(q)}&tab_type=${typeMap[tab] || 3}&offset=${(page - 1) * 10}`;\n</js>",