159txt小说(多线路)
159txt小说
laizhiyu (6509)5天前
测试软件:sigma,legado-team
{
"bookSourceComment": "\/\/ 159txt 多线路书源:m.159txt.com \/ m.34kanshu.com \/ m.43kanshu.com\n\/\/ ★ 发现页顶部「域名」下拉切换线路(rrssk 聚合模式),切换后自动清发现缓存\n\/\/ 搜索走 sososhu.com 网关:需登录(每日10次),登录界面可登录\/检查登录态\/查剩余额度\/签到\n\/\/ 目录修复:站点每5章会有1章链接id重复前一条,jsLib 用 gap\/2 算法自动修正(1658章实测99.7%)\n\/\/ UA 必须是移动端,桌面UA会被WAF拦截\n\/\/ v20: loginUi select action 改 result[name](loginUi 上下文 bindings 无 infoMap,用 infoMap 会直接抛错=登录界面切线路完全无反应);v19: exploreUrl 改纯文本JSON+{{}}模板(域名动态求值,彻底绕开 kinds 缓存);v18: T9_setvar 改走 java.putVariable(ExploreAdapter.evalButtonClick 不注入 source 全局,原写法静默失效=切换无效的真根因);v17: 入口URL带 host 指纹;切域名后若入口未变,退出发现页再进(App 的 ExploreAdapter.sourceKinds 进程级缓存规则侧清不到)",
"bookSourceGroup": "AI",
"bookSourceName": "159txt小说(多线路)",
"bookSourceType": 0,
"bookSourceUrl": "159txt小说",
"bookUrlPattern": "^https?:\/\/(?:m[.])?(?:159txt|34kanshu|43kanshu)[.]com\/\\d+(\/\\d+)*\/?",
"customButton": false,
"customOrder": 8,
"enabled": true,
"enabledCookieJar": false,
"enabledExplore": true,
"eventListener": false,
"exploreUrl": "<js>\n(function(){\n var H = T9_HOST.call(this);\n var P = T9_base();\n var res = [];\n res.push({ title: '域名', url: '', type: 'select',\n chars: T9_HOSTS, default: H, viewName: \"'域名'\",\n action: \"var _v=infoMap['域名'];if(!_v||_v=='null')_v='m.159txt.com';T9_SET('server', _v);java.refreshExplore();T9_T(java,'已切到: '+_v)\",\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n res.push({ title: '当前网址', url: '', type: 'button',\n viewName: \"'线路: ' + (function(){try{return T9_HOST.call(this);}catch(e){return 'm.159txt.com';}})()\",\n action: \"java.toast('当前网址: '+T9_base())\",\n style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_justifySelf: 'flex_start' } });\n for (var i = 0; i < T9_CATS.length; i++)\n res.push({ title: T9_CATS[i][0], url: P + '\/fenlei\/' + T9_CATS[i][1] + '\/{{page}}\/', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.32 } });\n for (var i = 0; i < T9_QBC.length; i++)\n res.push({ title: T9_QBC[i][0], url: P + '\/quanben\/fenlei\/' + T9_QBC[i][1] + '\/{{page}}\/', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.32 } });\n for (var i = 0; i < T9_RANKS.length; i++)\n res.push({ title: T9_RANKS[i][0], url: P + '\/rank\/' + T9_RANKS[i][1] + '\/', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.32 } });\n return JSON.stringify(res);\n})()\n<\/js>",
"header": "{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 14; Pixel 8) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/126.0.0.0 Mobile Safari\/537.36\", \"Referer\": \"https:\/\/m.159txt.com\/\"}",
"jsLib": "var T9_UA = \"Mozilla\/5.0 (Linux; Android 14; Pixel 8) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/126.0.0.0 Mobile Safari\/537.36\";\nvar T9_HOSTS = [\"m.159txt.com\", \"m.34kanshu.com\", \"m.43kanshu.com\"];\nvar T9_DEFHOST = \"m.159txt.com\";\nvar T9_SOSO = \"https:\/\/www.sososhu.com\/\";\nvar T9_CATS = [[\"玄幻\",1],[\"奇幻\",2],[\"武侠\",3],[\"仙侠\",4],[\"都市\",5],[\"军事\",6],[\"历史\",7],[\"游戏\",8],[\"竞技\",9],[\"科幻\",10],[\"悬疑\",11],[\"灵异\",12],[\"其他\",13],[\"古代言情\",14],[\"仙侠奇缘\",15],[\"现代言情\",16],[\"浪漫青春\",17],[\"玄幻言情\",18],[\"悬疑灵异\",19],[\"科幻空间\",20],[\"游戏竞技\",21],[\"BL文\",22],[\"GL文\",23],[\"二次元\",24]];\nvar T9_QBC = [[\"完本·玄幻\",1],[\"完本·都市\",5],[\"完本·古代言情\",14]];\nvar T9_RANKS = [[\"总榜\",\"allvisit\"],[\"月榜\",\"monthvisit\"],[\"收藏榜\",\"goodnum\"],[\"周榜\",\"weekvisit\"]];\nfunction T9_T(jv, s) { try { jv.toast(String(s)); return 1; } catch (e) {} try { jv.longToast(String(s)); return 1; } catch (e2) {} return 0; }\nfunction T9_U(s) {\n var t = String(s);\n if (t.indexOf(String.fromCharCode(92) + \"u\") < 0) return t;\n try {\n var out = \"\", i = 0, BS = String.fromCharCode(92);\n while (i < t.length) {\n if (t.charAt(i) === BS && t.charAt(i + 1) === \"u\" && t.charAt(i + 2) >= \"0\" && t.charAt(i + 2) <= \"9\") {\n var hx = t.substr(i + 2, 4), ok = 1;\n for (var q = 0; q < 4; q++) {\n var ch = hx.charAt(q);\n var isH = (ch >= \"0\" && ch <= \"9\") || (ch >= \"a\" && ch <= \"f\") || (ch >= \"A\" && ch <= \"F\");\n if (!isH) { ok = 0; break; }\n }\n if (ok) { out += String.fromCharCode(parseInt(hx, 16)); i += 6; continue; }\n }\n out += t.charAt(i); i++;\n }\n return out;\n } catch (e) { return t; }\n}\nfunction T9_msg(t) {\n var m = String(t).match(\/\"msg\":\"([^\"]*)\"\/);\n if (!m) m = String(t).match(\/\"msg\":\\s*\"([^\"]*)\"\/);\n if (!m) m = String(t).match(\/msg[\\s:]+\"([^\"]*)\"\/);\n return m ? T9_U(m[1]) : \"\";\n}\nfunction T9_code(t) {\n var m = String(t).match(\/\"(?:code|ret|status)\"\\s*:\\s*(-?[0-9]+)\/);\n return m ? parseInt(m[1], 10) : null;\n}\nvar T9_DEF = 'm.159txt.com';\nfunction T9_SET(k, v) {\n var java, source;\n var ctx = this;\n if (ctx && ctx.source) { source = ctx.source; java = ctx.java; }\n else { source = (typeof source !== 'undefined') ? source : null; java = (typeof java !== 'undefined') ? java : null; }\n var d = {};\n try { d = JSON.parse(source.getVariable() || '{}'); } catch (e) { d = {}; }\n d[k] = v;\n try { source.putVariable(JSON.stringify(d)); } catch (e2) {}\n return d;\n}\nfunction T9_GET(k) {\n var ctx = this, source = (ctx && ctx.source) ? ctx.source : ((typeof source !== 'undefined') ? source : null);\n var d = {};\n try { d = JSON.parse(source.getVariable() || '{}'); } catch (e) { d = {}; }\n return d[k] || '';\n}\nfunction T9_HOST() {\n var h = '';\n try { h = String(T9_GET.call(this, 'server')); } catch (e) { h = ''; }\n if (!h || h == 'null' || h == 'undefined') h = '';\n if (h) {\n var bare = h.toLowerCase().replace(\/^https?:\\\/\\\/\/, '').replace(\/\\\/+$\/, '');\n for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n }\n return T9_DEF;\n}\nfunction T9_host_UNUSED(jv) {\n var h = \"\";\n try { h = String(T9_var(jv).server || \"\"); } catch (e) { h = \"\"; }\n if (!h || h == \"null\" || h == \"undefined\") h = \"\";\n if (h) {\n var bare = h.toLowerCase().replace(\/^https?:\\\/\\\/\/, \"\").replace(\/\\\/+$\/, \"\");\n for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n }\n return T9_DEFHOST;\n}\nfunction T9_host_UNUSED(jv) {\n var h = \"\";\n try { h = String(T9_var(jv).server || \"\"); } catch (e) { h = \"\"; }\n if (!h || h == \"null\" || h == \"undefined\") h = \"\";\n if (h) {\n var bare = h.toLowerCase().replace(\/^https?:\\\/\\\/\/, \"\").replace(\/\\\/+$\/, \"\");\n for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n }\n return T9_DEFHOST;\n}\nfunction T9_base() { return \"https:\/\/\" + T9_HOST.call(this); }\nfunction T9_srv(u) {\n var m = String(u || \"\").match(\/^(https?:\\\/\\\/[^\\\/]+)\/i);\n var g = T9_HOST.call(this);\n if (m) {\n var dh = m[1].toLowerCase().replace(\/^https?:\\\/\\\/\/, \"\").replace(\/\\\/+$\/, \"\");\n if (g && g === dh) return \"https:\/\/\" + g;\n return m[1];\n }\n return \"https:\/\/\" + g;\n}\nfunction T9_abs(u) {\n var s = String(u || \"\");\n if (s.indexOf(\"http\") === 0) return s;\n if (s.charAt(0) !== \"\/\") s = \"\/\" + s;\n return T9_base();\n}\nfunction T9_fixToc(html) {\n var s = html.indexOf(\"ul_all_chapters\");\n if (s < 0) s = 0;\n var re = \/href=\"([^\"]*\\\/(\\d+)\\\/(\\d+)\\\/(\\d+)[.]html)\">\/g;\n var q = String.fromCharCode(34);\n var arr = [], m;\n re.lastIndex = s;\n while ((m = re.exec(html))) {\n var url = m[1];\n var slash = url.lastIndexOf(\"\/\");\n arr.push({ pfx: url.substring(0, slash + 1), id: parseInt(m[4], 10), pos: m.index, len: m[0].length });\n }\n if (!arr.length) return html;\n var out = html.substring(0, arr[0].pos), prev = 0;\n for (var i = 0; i < arr.length; i++) {\n var fromHere = (i === 0) ? arr[0].pos : (arr[i - 1].pos + arr[i - 1].len);\n out += html.substring(fromHere, arr[i].pos);\n var cid = arr[i].id, keep = cid;\n if (cid <= prev) {\n var nxt = null;\n for (var j = i + 1; j < arr.length; j++) { if (arr[j].id > cid) { nxt = arr[j].id; break; } }\n var gap = (nxt === null) ? 2 : (nxt - cid);\n var step = Math.floor(gap \/ 2);\n if (step < 1) step = 1;\n keep = cid + step;\n if (keep <= prev) keep = prev + 1;\n if (nxt !== null && keep >= nxt) keep = prev + 1;\n }\n out += \"href=\" + q + arr[i].pfx + keep + \".html\" + q + \">\";\n prev = keep;\n }\n out += html.substring(arr[arr.length - 1].pos + arr[arr.length - 1].len);\n return out;\n}\nfunction T9_nextPage(jv, sv, result, baseUrl) {\n var s = (\"\" + result).indexOf(\"indexselect\");\n if (s < 0) return \"\";\n var e = (\"\" + result).indexOf(\"<\/select>\", s);\n if (e < 0) return \"\";\n var seg = (\"\" + result).substring(s, e);\n var opts = seg.match(\/<option value=\"([^\"]+)\"([^>]*)>\/g) || [];\n var cur = 0, vals = [];\n for (var i = 0; i < opts.length; i++) {\n var v = opts[i].match(\/value=\"([^\"]+)\"\/);\n var sel = \/selected\/.test(opts[i]);\n if (v) vals.push(v[1]);\n if (sel) cur = i;\n }\n if (cur + 1 < vals.length) return vals[cur + 1];\n return \"\";\n}\nfunction T9_search(jv, sv, result) {\n var html = String(result || \"\");\n if (html.length < 50) return [];\n var m = html.match(\/var books = JSON[.]parse[(]d[(]\"([^\"]+)\"[)][)]\/);\n if (!m) return [];\n var txt;\n try { txt = jv.base64Decode(m[1]); } catch (e) { return []; }\n var arr;\n try { arr = JSON.parse(txt); } catch (e) { return []; }\n var out = [];\n for (var i = 0; i < arr.length; i++) {\n var b = arr[i];\n var u = b.url || \"\";\n if (!u) continue;\n out.push(JSON.stringify({\n name: b.name || \"\",\n url: T9_abs(u),\n author: b.author || \"\",\n intro: b.intro || \"\",\n kind: b.status || \"\",\n lastChapter: b.chapter || \"\",\n cover: b.cover || \"\"\n }));\n }\n return out;\n}\nfunction T9_sign(jv, sv) {\n var opt = { method: \"POST\",\n headers: { \"User-Agent\": T9_UA, \"Content-Type\": \"application\/x-www-form-urlencoded\",\n \"Referer\": T9_SOSO + \"?action=member\", \"X-Requested-With\": \"XMLHttpRequest\" } };\n var r = \"\", tries = 0;\n while (tries < 3) {\n tries++;\n try { var CKs=T9_SCOOKIE(); if(CKs) opt.headers[\"Cookie\"]=CKs; r = String(jv.ajax(T9_SOSO + \"?action=user_api&act=sign_in,\" + JSON.stringify(opt))); } catch (e) { r = \"\"; }\n if (r.indexOf(\"code\") >= 0) break;\n try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n }\n if (r.indexOf(\"code\") < 0) { T9_T(jv, \"签到请求失败:连不上 soshu 网关(已重试3次)\"); return; }\n jv.log(\"sign resp:\" + r.substring(0, 200));\n var c = T9_code(r), msg = T9_msg(r);\n if (c === 0) { T9_T(jv, \"签到成功\" + (msg ? \":\" + msg : \"\")); }\n else if (c === null) { T9_T(jv, \"签到失败:响应无法解析 \" + r.substring(0, 60)); }\n else { T9_T(jv, \"签到失败(\" + c + \"):\" + (msg || \"可能今日已签到或未登录\")); }\n}\nfunction T9_signinfo(jv, sv) {\n var r = \"\", tries = 0;\n while (tries < 3) {\n tries++;\n try { var CKs=T9_SCOOKIE(); var HH=CKs?{\"User-Agent\":T9_UA,\"Cookie\":CKs}:{\"User-Agent\":T9_UA}; r = String(jv.ajax(T9_SOSO + \"?action=user_api&act=profile,\" + JSON.stringify({headers:HH}))); } catch (e) { r = \"\"; }\n if (r.indexOf(\"code\") >= 0) break;\n try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n }\n if (r.indexOf(\"code\") < 0) { T9_T(jv, \"查询失败:连不上 soshu 网关(已重试3次)\"); return; }\n var c = T9_code(r);\n if (c !== 0) { T9_T(jv, \"未登录,请先点「登录搜搜书」\"); return; }\n var pv = function (k) { var m = r.match(new RegExp(\"\\\"\" + k + \"\\\"\\\\s*:\\\\s*([0-9]+|true|false)\")); return m ? String(m[1]) : \"0\"; };\n var signed = r.indexOf(\"\\\"signedToday\\\":true\") >= 0 || r.indexOf(\"\\\"signedToday\\\": true\") >= 0;\n var streak = pv(\"signStreak\"), mx = pv(\"maxSignStreak\");\n var rem = pv(\"searchRemaining\"), smax = pv(\"searchMax\");\n var lv = pv(\"level\"), title = \"\";\n var tm = r.match(\/\"levelTitle\":\"([^\"]*)\"\/);\n if (tm) title = T9_U(tm[1]);\n var s1 = signed ? \"今日已签到\" : \"今日未签到\";\n var s2 = \"连续签到 \" + streak + \" 天 | 最长 \" + mx + \" 天\";\n var s3 = \"Lv\" + lv + (title ? \" \" + title : \"\");\n var s4 = \"搜索额度 \" + rem + \"\/\" + smax;\n T9_T(jv, s1 + \"\\n\" + s2 + \"\\n\" + s3 + \"\\n\" + s4);\n}\nfunction T9_SCOOKIE() {\n var ck = \"\";\n try { ck = String(java.getCookie(T9_SOSO)); } catch (e) { ck = \"\"; }\n return ck;\n}\nfunction T9_login() {\n var tel = \"\", pwd = \"\";\n try { tel = String(java.get(\"tel\")); } catch (e) {}\n try { pwd = String(java.get(\"pwd\")); } catch (e) {}\n if (tel.indexOf(\"tel=\") >= 0 || tel.indexOf(\"{\") === 0) {\n var mo = tel.match(\/tel=([^,}\\s]+)\/);\n tel = mo ? mo[1] : \"\";\n }\n if (pwd.indexOf(\"pwd=\") >= 0 || pwd.indexOf(\"{\") === 0) {\n var mp = pwd.match(\/pwd=([^,}\\s]+)\/);\n pwd = mp ? mp[1] : \"\";\n }\n if (!tel || !pwd || tel == \"null\" || pwd == \"null\" || tel.indexOf(\"tel=\") >= 0 || pwd.indexOf(\"pwd=\") >= 0) {\n T9_T(java, \"请先在登录界面的「手机号」「密码」框里填写,再点登录\"); return;\n }\n var cap = \"\";\n try {\n var t0 = Date.now();\n var CK = T9_SCOOKIE();\n var HD = { \"User-Agent\": T9_UA };\n if (CK) HD[\"Cookie\"] = CK;\n var hex = String(java.ajax(T9_SOSO + \"?action=captcha_api&t=\" + t0 + \",\" + JSON.stringify({ \"type\": \"hex\", \"headers\": HD })));\n if (!\/^[0-9a-f]+$\/i.test(hex.substring(0, 16))) { T9_T(java, \"验证码图下载失败\"); return; }\n var bytes = java.hexDecodeToByteArray(hex);\n var b64 = String(Packages.android.util.Base64.encodeToString(bytes, 2));\n var dataUri = \"data:image\/png;base64,\" + b64;\n cap = String(java.getVerificationCode(dataUri));\n } catch (e) { T9_T(java, \"获取验证码失败:\" + e); return; }\n if (!cap || cap == \"null\" || cap.length < 3) { T9_T(java, \"未取到验证码,请重试\"); return; }\n var CK2 = T9_SCOOKIE();\n var HD2 = { \"User-Agent\": T9_UA, \"Content-Type\": \"application\/x-www-form-urlencoded\",\n \"Referer\": T9_SOSO + \"?action=login\", \"X-Requested-With\": \"XMLHttpRequest\" };\n if (CK2) HD2[\"Cookie\"] = CK2;\n var opt = { method: \"POST\",\n body: \"mobile=\" + java.encodeURI(tel) + \"&password=\" + java.encodeURI(pwd) + \"&captcha=\" + java.encodeURI(cap),\n headers: HD2 };\n var r = \"\", tries = 0;\n while (tries < 3) {\n tries++;\n try { r = String(java.ajax(T9_SOSO + \"?action=user_api&act=login,\" + JSON.stringify(opt))); } catch (e) { r = \"\"; }\n if (r.indexOf(\"code\") >= 0) break;\n try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n }\n if (r.indexOf(\"code\") < 0) { T9_T(java, \"登录请求失败:连不上 soshu 网关(已重试3次)\"); return; }\n java.log(\"login resp:\" + r.substring(0, 200));\n var c = T9_code(r), msg = T9_msg(r);\n if (c === 0) { T9_T(java, \"登录成功(搜索额度已恢复)\" + (msg ? \":\" + msg : \"\")); }\n else if (c === -1) { T9_T(java, \"登录失败:\" + (msg || \"手机号或密码错误\") + \",若刚刷新过验证码请再试一次\"); }\n else if (c !== null) { T9_T(java, \"登录失败(\" + c + \"):\" + (msg || r.substring(0, 60))); }\n else { T9_T(java, \"登录失败:响应无法解析 \" + r.substring(0, 60)); }\n}\nfunction T9_check() {\n var r = \"\";\n try { var CKc=T9_SCOOKIE(); var HHc=CKc?{\"User-Agent\":T9_UA,\"Cookie\":CKc}:{\"User-Agent\":T9_UA}; r = String(java.ajax(T9_SOSO + \"?action=user_api&act=me,\" + JSON.stringify({headers:HHc}))); } catch (e) { T9_T(java, \"检查失败:网络错误\"); return; }\n var c = T9_code(r);\n if (c === 0 && r.indexOf(\"\\\"data\\\":null\") < 0) {\n var nm = r.match(\/\"name\":\"([^\"]*)\"\/);\n T9_T(java, \"已登录:\" + (nm ? T9_U(nm[1]) : \"账号\"));\n } else if (c === 0) { T9_T(java, \"未登录,请点「登录搜搜书」\"); }\n else { T9_T(java, \"检查失败(\" + (c === null ? \"?\" : c) + \")\"); }\n}\nfunction T9_quota() {\n var r = \"\";\n try { var CKq=T9_SCOOKIE(); var HHq=CKq?{\"User-Agent\":T9_UA,\"Cookie\":CKq}:{\"User-Agent\":T9_UA}; r = String(java.ajax(T9_SOSO + \"?s=x&web=m159txt,\" + JSON.stringify({headers:HHq}))); } catch (e) { T9_T(java, \"检查失败:网络错误\"); return; }\n if (r.indexOf(\"今日搜索次数已用完\") >= 0 || T9_U(r).indexOf(\"已用完\") >= 0) { T9_T(java, \"今日搜索次数已用完(10次\/天)\"); return; }\n var q = r.match(\/quota-remaining\">(\\d+)<\/);\n if (q) T9_T(java, \"今日剩余搜索次数:\" + q[1]);\n else T9_T(java, \"未获取到额度信息\");\n}",
"lastUpdateTime": "1792310465185",
"loginCheckJs": "(function(){var t=String(result);if(t.indexOf('search-blocked')>=0||t.indexOf('已用完')>=0){ throw new Error('今日搜索次数已用完(10次\/天)。搜索走 soshu 网关,额度每日重置;发现\/详情\/正文不受影响。');}try{ var ck=String(cookie.getCookie('https:\/\/www.sososhu.com\/')); var sid=ck.match(\/PHPSESSID=([^;\\s]+)\/); if(sid&&sid[1]){ var cur=String(cookie.getCookie('159txt小说')); if(cur.indexOf(sid[1])<0){ var keep=cur; var np=keep?keep+'; ':' '; cookie.setCookie('159txt小说', np+'PHPSESSID='+sid[1]); java.log('cookie 桶同步: PHPSESSID='+sid[1].substring(0,8)+'...'); } }}catch(e){java.log('cookie 同步失败: '+e);}return result;})()",
"loginUi": "[{\"name\": \"线路\", \"type\": \"select\", \"chars\": [\"m.159txt.com\", \"m.34kanshu.com\", \"m.43kanshu.com\"], \"default\": \"m.159txt.com\", \"action\": \"var _v=result['线路'];if(!_v||_v=='null')_v='m.159txt.com';T9_SET('server', _v);java.refreshExplore();T9_T(java,'已切到: '+_v)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"tel\", \"type\": \"text\", \"default\": \"\", \"viewName\": \"'手机号'\", \"action\": \"java.put('tel', (result && result['tel']) ? result['tel'] : result)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"pwd\", \"type\": \"password\", \"default\": \"\", \"viewName\": \"'密码'\", \"action\": \"java.put('pwd', (result && result['pwd']) ? result['pwd'] : result)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"登录搜搜书\", \"type\": \"button\", \"action\": \"T9_login()\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"检查登录状态\", \"type\": \"button\", \"action\": \"T9_check()\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"查看搜索额度\", \"type\": \"button\", \"action\": \"T9_quota()\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"立即签到\", \"type\": \"button\", \"action\": \"T9_sign(java,source)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"签到状态\", \"type\": \"button\", \"action\": \"T9_signinfo(java,source)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"打开搜搜书\", \"type\": \"button\", \"action\": \"java.startBrowser('https:\/\/www.sososhu.com\/','搜搜书')\", \"style\": {\"layout_flexGrow\": 1}}]",
"loginUrl": "var T9_UA = \"Mozilla\/5.0 (Linux; Android 14; Pixel 8) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/126.0.0.0 Mobile Safari\/537.36\";\nvar T9_HOSTS = [\"m.159txt.com\", \"m.34kanshu.com\", \"m.43kanshu.com\"];\nvar T9_DEFHOST = \"m.159txt.com\";\nvar T9_SOSO = \"https:\/\/www.sososhu.com\/\";\nvar T9_CATS = [[\"玄幻\",1],[\"奇幻\",2],[\"武侠\",3],[\"仙侠\",4],[\"都市\",5],[\"军事\",6],[\"历史\",7],[\"游戏\",8],[\"竞技\",9],[\"科幻\",10],[\"悬疑\",11],[\"灵异\",12],[\"其他\",13],[\"古代言情\",14],[\"仙侠奇缘\",15],[\"现代言情\",16],[\"浪漫青春\",17],[\"玄幻言情\",18],[\"悬疑灵异\",19],[\"科幻空间\",20],[\"游戏竞技\",21],[\"BL文\",22],[\"GL文\",23],[\"二次元\",24]];\nvar T9_QBC = [[\"完本·玄幻\",1],[\"完本·都市\",5],[\"完本·古代言情\",14]];\nvar T9_RANKS = [[\"总榜\",\"allvisit\"],[\"月榜\",\"monthvisit\"],[\"收藏榜\",\"goodnum\"],[\"周榜\",\"weekvisit\"]];\nfunction T9_T(jv, s) { try { jv.toast(String(s)); return 1; } catch (e) {} try { jv.longToast(String(s)); return 1; } catch (e2) {} return 0; }\nfunction T9_U(s) {\n var t = String(s);\n if (t.indexOf(String.fromCharCode(92) + \"u\") < 0) return t;\n try {\n var out = \"\", i = 0, BS = String.fromCharCode(92);\n while (i < t.length) {\n if (t.charAt(i) === BS && t.charAt(i + 1) === \"u\" && t.charAt(i + 2) >= \"0\" && t.charAt(i + 2) <= \"9\") {\n var hx = t.substr(i + 2, 4), ok = 1;\n for (var q = 0; q < 4; q++) {\n var ch = hx.charAt(q);\n var isH = (ch >= \"0\" && ch <= \"9\") || (ch >= \"a\" && ch <= \"f\") || (ch >= \"A\" && ch <= \"F\");\n if (!isH) { ok = 0; break; }\n }\n if (ok) { out += String.fromCharCode(parseInt(hx, 16)); i += 6; continue; }\n }\n out += t.charAt(i); i++;\n }\n return out;\n } catch (e) { return t; }\n}\nfunction T9_msg(t) {\n var m = String(t).match(\/\"msg\":\"([^\"]*)\"\/);\n if (!m) m = String(t).match(\/\"msg\":\\s*\"([^\"]*)\"\/);\n if (!m) m = String(t).match(\/msg[\\s:]+\"([^\"]*)\"\/);\n return m ? T9_U(m[1]) : \"\";\n}\nfunction T9_code(t) {\n var m = String(t).match(\/\"(?:code|ret|status)\"\\s*:\\s*(-?[0-9]+)\/);\n return m ? parseInt(m[1], 10) : null;\n}\nvar T9_DEF = 'm.159txt.com';\nfunction T9_SET(k, v) {\n var java, source;\n var ctx = this;\n if (ctx && ctx.source) { source = ctx.source; java = ctx.java; }\n else { source = (typeof source !== 'undefined') ? source : null; java = (typeof java !== 'undefined') ? java : null; }\n var d = {};\n try { d = JSON.parse(source.getVariable() || '{}'); } catch (e) { d = {}; }\n d[k] = v;\n try { source.putVariable(JSON.stringify(d)); } catch (e2) {}\n return d;\n}\nfunction T9_GET(k) {\n var ctx = this, source = (ctx && ctx.source) ? ctx.source : ((typeof source !== 'undefined') ? source : null);\n var d = {};\n try { d = JSON.parse(source.getVariable() || '{}'); } catch (e) { d = {}; }\n return d[k] || '';\n}\nfunction T9_HOST() {\n var h = '';\n try { h = String(T9_GET.call(this, 'server')); } catch (e) { h = ''; }\n if (!h || h == 'null' || h == 'undefined') h = '';\n if (h) {\n var bare = h.toLowerCase().replace(\/^https?:\\\/\\\/\/, '').replace(\/\\\/+$\/, '');\n for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n }\n return T9_DEF;\n}\nfunction T9_host_UNUSED(jv) {\n var h = \"\";\n try { h = String(T9_var(jv).server || \"\"); } catch (e) { h = \"\"; }\n if (!h || h == \"null\" || h == \"undefined\") h = \"\";\n if (h) {\n var bare = h.toLowerCase().replace(\/^https?:\\\/\\\/\/, \"\").replace(\/\\\/+$\/, \"\");\n for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n }\n return T9_DEFHOST;\n}\nfunction T9_host_UNUSED(jv) {\n var h = \"\";\n try { h = String(T9_var(jv).server || \"\"); } catch (e) { h = \"\"; }\n if (!h || h == \"null\" || h == \"undefined\") h = \"\";\n if (h) {\n var bare = h.toLowerCase().replace(\/^https?:\\\/\\\/\/, \"\").replace(\/\\\/+$\/, \"\");\n for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n }\n return T9_DEFHOST;\n}\nfunction T9_base() { return \"https:\/\/\" + T9_HOST.call(this); }\nfunction T9_srv(u) {\n var m = String(u || \"\").match(\/^(https?:\\\/\\\/[^\\\/]+)\/i);\n var g = T9_HOST.call(this);\n if (m) {\n var dh = m[1].toLowerCase().replace(\/^https?:\\\/\\\/\/, \"\").replace(\/\\\/+$\/, \"\");\n if (g && g === dh) return \"https:\/\/\" + g;\n return m[1];\n }\n return \"https:\/\/\" + g;\n}\nfunction T9_abs(u) {\n var s = String(u || \"\");\n if (s.indexOf(\"http\") === 0) return s;\n if (s.charAt(0) !== \"\/\") s = \"\/\" + s;\n return T9_base();\n}\nfunction T9_fixToc(html) {\n var s = html.indexOf(\"ul_all_chapters\");\n if (s < 0) s = 0;\n var re = \/href=\"([^\"]*\\\/(\\d+)\\\/(\\d+)\\\/(\\d+)[.]html)\">\/g;\n var q = String.fromCharCode(34);\n var arr = [], m;\n re.lastIndex = s;\n while ((m = re.exec(html))) {\n var url = m[1];\n var slash = url.lastIndexOf(\"\/\");\n arr.push({ pfx: url.substring(0, slash + 1), id: parseInt(m[4], 10), pos: m.index, len: m[0].length });\n }\n if (!arr.length) return html;\n var out = html.substring(0, arr[0].pos), prev = 0;\n for (var i = 0; i < arr.length; i++) {\n var fromHere = (i === 0) ? arr[0].pos : (arr[i - 1].pos + arr[i - 1].len);\n out += html.substring(fromHere, arr[i].pos);\n var cid = arr[i].id, keep = cid;\n if (cid <= prev) {\n var nxt = null;\n for (var j = i + 1; j < arr.length; j++) { if (arr[j].id > cid) { nxt = arr[j].id; break; } }\n var gap = (nxt === null) ? 2 : (nxt - cid);\n var step = Math.floor(gap \/ 2);\n if (step < 1) step = 1;\n keep = cid + step;\n if (keep <= prev) keep = prev + 1;\n if (nxt !== null && keep >= nxt) keep = prev + 1;\n }\n out += \"href=\" + q + arr[i].pfx + keep + \".html\" + q + \">\";\n prev = keep;\n }\n out += html.substring(arr[arr.length - 1].pos + arr[arr.length - 1].len);\n return out;\n}\nfunction T9_nextPage(jv, sv, result, baseUrl) {\n var s = (\"\" + result).indexOf(\"indexselect\");\n if (s < 0) return \"\";\n var e = (\"\" + result).indexOf(\"<\/select>\", s);\n if (e < 0) return \"\";\n var seg = (\"\" + result).substring(s, e);\n var opts = seg.match(\/<option value=\"([^\"]+)\"([^>]*)>\/g) || [];\n var cur = 0, vals = [];\n for (var i = 0; i < opts.length; i++) {\n var v = opts[i].match(\/value=\"([^\"]+)\"\/);\n var sel = \/selected\/.test(opts[i]);\n if (v) vals.push(v[1]);\n if (sel) cur = i;\n }\n if (cur + 1 < vals.length) return vals[cur + 1];\n return \"\";\n}\nfunction T9_search(jv, sv, result) {\n var html = String(result || \"\");\n if (html.length < 50) return [];\n var m = html.match(\/var books = JSON[.]parse[(]d[(]\"([^\"]+)\"[)][)]\/);\n if (!m) return [];\n var txt;\n try { txt = jv.base64Decode(m[1]); } catch (e) { return []; }\n var arr;\n try { arr = JSON.parse(txt); } catch (e) { return []; }\n var out = [];\n for (var i = 0; i < arr.length; i++) {\n var b = arr[i];\n var u = b.url || \"\";\n if (!u) continue;\n out.push(JSON.stringify({\n name: b.name || \"\",\n url: T9_abs(u),\n author: b.author || \"\",\n intro: b.intro || \"\",\n kind: b.status || \"\",\n lastChapter: b.chapter || \"\",\n cover: b.cover || \"\"\n }));\n }\n return out;\n}\nfunction T9_sign(jv, sv) {\n var opt = { method: \"POST\",\n headers: { \"User-Agent\": T9_UA, \"Content-Type\": \"application\/x-www-form-urlencoded\",\n \"Referer\": T9_SOSO + \"?action=member\", \"X-Requested-With\": \"XMLHttpRequest\" } };\n var r = \"\", tries = 0;\n while (tries < 3) {\n tries++;\n try { var CKs=T9_SCOOKIE(); if(CKs) opt.headers[\"Cookie\"]=CKs; r = String(jv.ajax(T9_SOSO + \"?action=user_api&act=sign_in,\" + JSON.stringify(opt))); } catch (e) { r = \"\"; }\n if (r.indexOf(\"code\") >= 0) break;\n try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n }\n if (r.indexOf(\"code\") < 0) { T9_T(jv, \"签到请求失败:连不上 soshu 网关(已重试3次)\"); return; }\n jv.log(\"sign resp:\" + r.substring(0, 200));\n var c = T9_code(r), msg = T9_msg(r);\n if (c === 0) { T9_T(jv, \"签到成功\" + (msg ? \":\" + msg : \"\")); }\n else if (c === null) { T9_T(jv, \"签到失败:响应无法解析 \" + r.substring(0, 60)); }\n else { T9_T(jv, \"签到失败(\" + c + \"):\" + (msg || \"可能今日已签到或未登录\")); }\n}\nfunction T9_signinfo(jv, sv) {\n var r = \"\", tries = 0;\n while (tries < 3) {\n tries++;\n try { var CKs=T9_SCOOKIE(); var HH=CKs?{\"User-Agent\":T9_UA,\"Cookie\":CKs}:{\"User-Agent\":T9_UA}; r = String(jv.ajax(T9_SOSO + \"?action=user_api&act=profile,\" + JSON.stringify({headers:HH}))); } catch (e) { r = \"\"; }\n if (r.indexOf(\"code\") >= 0) break;\n try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n }\n if (r.indexOf(\"code\") < 0) { T9_T(jv, \"查询失败:连不上 soshu 网关(已重试3次)\"); return; }\n var c = T9_code(r);\n if (c !== 0) { T9_T(jv, \"未登录,请先点「登录搜搜书」\"); return; }\n var pv = function (k) { var m = r.match(new RegExp(\"\\\"\" + k + \"\\\"\\\\s*:\\\\s*([0-9]+|true|false)\")); return m ? String(m[1]) : \"0\"; };\n var signed = r.indexOf(\"\\\"signedToday\\\":true\") >= 0 || r.indexOf(\"\\\"signedToday\\\": true\") >= 0;\n var streak = pv(\"signStreak\"), mx = pv(\"maxSignStreak\");\n var rem = pv(\"searchRemaining\"), smax = pv(\"searchMax\");\n var lv = pv(\"level\"), title = \"\";\n var tm = r.match(\/\"levelTitle\":\"([^\"]*)\"\/);\n if (tm) title = T9_U(tm[1]);\n var s1 = signed ? \"今日已签到\" : \"今日未签到\";\n var s2 = \"连续签到 \" + streak + \" 天 | 最长 \" + mx + \" 天\";\n var s3 = \"Lv\" + lv + (title ? \" \" + title : \"\");\n var s4 = \"搜索额度 \" + rem + \"\/\" + smax;\n T9_T(jv, s1 + \"\\n\" + s2 + \"\\n\" + s3 + \"\\n\" + s4);\n}\nfunction T9_SCOOKIE() {\n var ck = \"\";\n try { ck = String(java.getCookie(T9_SOSO)); } catch (e) { ck = \"\"; }\n return ck;\n}\nfunction T9_login() {\n var tel = \"\", pwd = \"\";\n try { tel = String(java.get(\"tel\")); } catch (e) {}\n try { pwd = String(java.get(\"pwd\")); } catch (e) {}\n if (tel.indexOf(\"tel=\") >= 0 || tel.indexOf(\"{\") === 0) {\n var mo = tel.match(\/tel=([^,}\\s]+)\/);\n tel = mo ? mo[1] : \"\";\n }\n if (pwd.indexOf(\"pwd=\") >= 0 || pwd.indexOf(\"{\") === 0) {\n var mp = pwd.match(\/pwd=([^,}\\s]+)\/);\n pwd = mp ? mp[1] : \"\";\n }\n if (!tel || !pwd || tel == \"null\" || pwd == \"null\" || tel.indexOf(\"tel=\") >= 0 || pwd.indexOf(\"pwd=\") >= 0) {\n T9_T(java, \"请先在登录界面的「手机号」「密码」框里填写,再点登录\"); return;\n }\n var cap = \"\";\n try {\n var t0 = Date.now();\n var CK = T9_SCOOKIE();\n var HD = { \"User-Agent\": T9_UA };\n if (CK) HD[\"Cookie\"] = CK;\n var hex = String(java.ajax(T9_SOSO + \"?action=captcha_api&t=\" + t0 + \",\" + JSON.stringify({ \"type\": \"hex\", \"headers\": HD })));\n if (!\/^[0-9a-f]+$\/i.test(hex.substring(0, 16))) { T9_T(java, \"验证码图下载失败\"); return; }\n var bytes = java.hexDecodeToByteArray(hex);\n var b64 = String(Packages.android.util.Base64.encodeToString(bytes, 2));\n var dataUri = \"data:image\/png;base64,\" + b64;\n cap = String(java.getVerificationCode(dataUri));\n } catch (e) { T9_T(java, \"获取验证码失败:\" + e); return; }\n if (!cap || cap == \"null\" || cap.length < 3) { T9_T(java, \"未取到验证码,请重试\"); return; }\n var CK2 = T9_SCOOKIE();\n var HD2 = { \"User-Agent\": T9_UA, \"Content-Type\": \"application\/x-www-form-urlencoded\",\n \"Referer\": T9_SOSO + \"?action=login\", \"X-Requested-With\": \"XMLHttpRequest\" };\n if (CK2) HD2[\"Cookie\"] = CK2;\n var opt = { method: \"POST\",\n body: \"mobile=\" + java.encodeURI(tel) + \"&password=\" + java.encodeURI(pwd) + \"&captcha=\" + java.encodeURI(cap),\n headers: HD2 };\n var r = \"\", tries = 0;\n while (tries < 3) {\n tries++;\n try { r = String(java.ajax(T9_SOSO + \"?action=user_api&act=login,\" + JSON.stringify(opt))); } catch (e) { r = \"\"; }\n if (r.indexOf(\"code\") >= 0) break;\n try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n }\n if (r.indexOf(\"code\") < 0) { T9_T(java, \"登录请求失败:连不上 soshu 网关(已重试3次)\"); return; }\n java.log(\"login resp:\" + r.substring(0, 200));\n var c = T9_code(r), msg = T9_msg(r);\n if (c === 0) { T9_T(java, \"登录成功(搜索额度已恢复)\" + (msg ? \":\" + msg : \"\")); }\n else if (c === -1) { T9_T(java, \"登录失败:\" + (msg || \"手机号或密码错误\") + \",若刚刷新过验证码请再试一次\"); }\n else if (c !== null) { T9_T(java, \"登录失败(\" + c + \"):\" + (msg || r.substring(0, 60))); }\n else { T9_T(java, \"登录失败:响应无法解析 \" + r.substring(0, 60)); }\n}\nfunction T9_check() {\n var r = \"\";\n try { var CKc=T9_SCOOKIE(); var HHc=CKc?{\"User-Agent\":T9_UA,\"Cookie\":CKc}:{\"User-Agent\":T9_UA}; r = String(java.ajax(T9_SOSO + \"?action=user_api&act=me,\" + JSON.stringify({headers:HHc}))); } catch (e) { T9_T(java, \"检查失败:网络错误\"); return; }\n var c = T9_code(r);\n if (c === 0 && r.indexOf(\"\\\"data\\\":null\") < 0) {\n var nm = r.match(\/\"name\":\"([^\"]*)\"\/);\n T9_T(java, \"已登录:\" + (nm ? T9_U(nm[1]) : \"账号\"));\n } else if (c === 0) { T9_T(java, \"未登录,请点「登录搜搜书」\"); }\n else { T9_T(java, \"检查失败(\" + (c === null ? \"?\" : c) + \")\"); }\n}\nfunction T9_quota() {\n var r = \"\";\n try { var CKq=T9_SCOOKIE(); var HHq=CKq?{\"User-Agent\":T9_UA,\"Cookie\":CKq}:{\"User-Agent\":T9_UA}; r = String(java.ajax(T9_SOSO + \"?s=x&web=m159txt,\" + JSON.stringify({headers:HHq}))); } catch (e) { T9_T(java, \"检查失败:网络错误\"); return; }\n if (r.indexOf(\"今日搜索次数已用完\") >= 0 || T9_U(r).indexOf(\"已用完\") >= 0) { T9_T(java, \"今日搜索次数已用完(10次\/天)\"); return; }\n var q = r.match(\/quota-remaining\">(\\d+)<\/);\n if (q) T9_T(java, \"今日剩余搜索次数:\" + q[1]);\n else T9_T(java, \"未获取到额度信息\");\n}\nfunction login(){ T9_login(); }",
"respondTime": 180000,
"ruleBookInfo": {
"author": "$.author",
"coverUrl": "$.cover",
"init": "@js:(function(){var h=String(result);var WB=h.indexOf('wanbenshenzhan')>=0||h.indexOf('chapter-list')>=0&&h.indexOf('ul_all_chapters')<0;var o={};if(WB){ var n=h.match(\/<h1>([\\s\\S]*?)<\\\/h1>\/); var nm=n?n[1].replace(\/<button[\\s\\S]*\/,'').replace(\/<[^>]*>\/g,'').replace(\/\\s+\/g,' ').trim():''; if(nm.indexOf(' ')>0)nm=nm.split(' ')[0]; o.name=nm; var a=h.match(\/作者[::]\\s*([^<\\s]{1,20})\/); o.author=a?a[1]:''; var k=h.match(\/分类[::]\\s*([^<\\s]{1,10})\/); o.kind=k?k[1]:''; var it=h.match(\/<meta property=\"og:description\" content=\"([^\"]*)\"\/); o.intro=it?it[1]:''; var cv=h.match(\/<meta property=\"og:image\" content=\"([^\"]*)\"\/); o.cover=cv?cv[1]:'';}else{ var n2=h.match(\/<h2>([\\s\\S]*?)<\\\/h2>\/); o.name=n2?n2[1].replace(\/<[^>]*>\/g,'').trim():''; var a2=h.match(\/作者:([^<\\s]{1,20})\/); o.author=a2?a2[1]:''; var k2=h.match(\/分类:([^<\\s]{1,10})\/); o.kind=k2?k2[1]:''; var im=h.match(\/<div class=\"intro str-over-dot\">([\\s\\S]*?)<\\\/div>\/); var t=im?im[1].replace(\/<[^>]*>\/g,'').replace(\/\\s+\/g,' ').trim():''; if(!t||t.indexOf('更新')<0){var d=h.match(\/<meta name=\"description\" content=\"([^\"]*)\"\/);if(d)t=d[1];} o.intro=t; var cv2=h.match(\/class=\"block_img2\"[^>]*>[\\s\\S]*?<img src=\"([^\"]*)\"\/); o.cover=cv2?cv2[1]:'';}return JSON.stringify(o);})()",
"intro": "$.intro",
"kind": "$.kind",
"lastChapter": "text.最新:@text##最新:",
"name": "$.name"
},
"ruleContent": {
"content": "<js>(function(){var q=String.fromCharCode(34), h=String(result);var LT=String.fromCharCode(60), GT=String.fromCharCode(62);var WB=h.indexOf('chapter-content')>=0;var ps=[];if(WB){ var i=h.indexOf('chapter-content'); var s=h.indexOf('>',i); var e=h.indexOf('<\/div>',s); var seg=h.substring(s+1,e); ps=seg.split(LT+'p'+GT);}else{ var i2=h.indexOf('id='+q+'nr'+q); if(i2<0)i2=h.indexOf('nr'); if(i2<0)return h; var s2=h.indexOf('>',i2); var e2=h.indexOf('<\/article>',s2); var seg2=h.substring(s2+1,e2); var tm=h.match(\/<div class=\"zhong\">([\\s\\S]*?)<\\\/div>\/); var ttl=tm?tm[1].replace(\/<[^>]*>\/g,'').replace(\/\\s+\/g,' ').trim():''; ps=seg2.split(LT+'p'+GT); var tmp=[]; for(var k2=0;k2<ps.length;k2++){ var t2=ps[k2].split(LT+'\/p'+GT).join(''); var sq2=t2.replace(\/[\\s\\u3000]\/g,''); if(ttl && sq2===ttl.replace(\/[\\s\\u3000]\/g,''))continue; tmp.push(t2); } ps=tmp;}var out=[];for(var k=0;k<ps.length;k++){ var t=ps[k].split(LT+'\/p'+GT).join(''); t=t.split(LT+'br'+GT).join(String.fromCharCode(10)); var sq=t.replace(\/[\\s\\u3000]\/g,''); var bad=0; if(sq.indexOf('完本神站')>=0)bad=1; if(sq.indexOf('神立占')>=0)bad=1; if(t.indexOf('wanbentxt')>=0||h.indexOf('wanbentxt')>=0&&t.indexOf('wanben')>=0)bad=1; if(sq.indexOf('一秒记住')>=0)bad=1; if(sq.indexOf('永不丢失')>=0)bad=1; if(sq.indexOf('章节文件读取失败')>=0)bad=1; if(sq.indexOf('推荐地址')>=0)bad=1; if(sq.indexOf('浏览器搜索')>=0&&sq.indexOf('快速找到')>=0)bad=1; if(sq.indexOf('找不到书请留言')>=0)bad=1; if(sq.indexOf('敬请投资')>=0||sq.indexOf('友友们')>=0)bad=1; if(sq.indexOf('(本章完)')>=0)bad=1; if(sq.indexOf('wanbenshenzhan')>=0)bad=1; if(sq.length<1)continue; if(bad)continue; out.push(t);}return out.join(String.fromCharCode(10));})()<\/js>"
},
"ruleExplore": {
"author": "span.1@text##作者:",
"bookList": "ul.xbk",
"bookUrl": "li.tjimg a@href||a@href",
"coverUrl": "img@src",
"intro": "span.-2@text",
"kind": "tag.i@text",
"name": ".xsm@text"
},
"ruleSearch": {
"author": "$.author",
"bookList": "@js:T9_search(java,source,result)",
"bookUrl": "$.url",
"coverUrl": "$.cover",
"intro": "$.intro",
"kind": "$.kind",
"lastChapter": "$.lastChapter",
"name": "$.name"
},
"ruleToc": {
"chapterList": "<js>(function(){var h=String(result);var WB=h.indexOf('wanbenshenzhan')>=0||(h.indexOf('chapter-list')>=0&&h.indexOf('ul_all_chapters')<0);if(WB){ var s=h.indexOf('chapter-list'); var e=h.indexOf('chapter-pagination',s); if(e<0)e=h.length; return h.substring(s,e);}var h2=T9_fixToc(h);var s2=h2.indexOf('ul_all_chapters');var e2=h2.indexOf('<\/ul>',s2);return h2.substring(s2,e2);})()<\/js>div.chapter-list a||li a",
"chapterName": "text",
"chapterUrl": "href",
"nextTocUrl": "@js:(function(){var h=String(result);var WB=h.indexOf('wanbenshenzhan')>=0||(h.indexOf('chapter-pagination')>=0&&h.indexOf('indexselect')<0);if(WB){ var m=h.match(\/class=\"next\"[^>]*href=\"([^\"]+)\"\/); if(!m)m=h.match(\/href=\"([^\"]+)\"[^>]*class=\"next\"\/); return m?m[1]:'';}return T9_nextPage(java,source,result,baseUrl);})()"
},
"searchUrl": "https:\/\/www.sososhu.com\/?s={{key}}&web=m159txt&page={{page}}&_t={{Date.now()}}",
"weight": 0
}