久久小说(修复版)

http://www.ijjxs.org/

laizhiyu (6509)6天前

修复作者
二维码导入
{
    "bookSourceComment": "\/\/ 261108 修复:站点改版为笔趣阁Bootstrap模板;搜索改 POST \/searchNN.html(form action 动态取);\n\/\/ 域名 www.ijjxs.org 被宝塔WAF图形验证码拦截(首次访问即拦, Secure Cookie 与仅HTTP站点冲突),\n\/\/ 默认线路用源站裸IP 177.5.49.192 直连免验证;登录面板可切换线路\/测速\/检查登录状态。\n\/\/ 本站搜索\/详情\/目录\/正文无需账号,\/bookcase\/ 书架功能才需登录,故不写账号登录UI。\n\/\/ ★站点搜索限频是「会话级配额」:HTTP日志实锤 200+alert(\"搜索间隔: 30 秒\"),隔 2 分钟仍被拒,\n\/\/   清 Cookie 换新会话立即成功(与 xsbook 同型)。searchUrl 的 URL 选项 js(请求前置JS环境)每次搜索前清线路域 Cookie 自愈\n\/\/   (★{{}} 内联 JS 环境不注入 cookie 绑定,调用抛 ReferenceError 被 try\/catch 吞掉=静默失效;\n\/\/   必须放 URL 选项 js 字段=请求前置JS环境。注意 removeCookie 作用于本次请求的会话Cookie栈,\n\/\/   使本次请求不携带旧键;持久层 Cookie 与响应 Set-Cookie 不受影响);\n\/\/   不主动探测搜索频率、不连发验证,避免触发风控。loginCheckJs 对限频页给出提示。\n\/\/ 兼容 LegadoTeam(gedoor) 与 legado-E(Luoyacheng):列表返回 java.util.ArrayList;字段名\/返回类型两版一致。\n\/\/ ★261108 二次修复「换路线失败」:jsLib 函数编译期捕获 source 快照会冻结,面板 source.put 写入后规则仍读旧值;\n\/\/   ★三环境键空间实锤:{{}} 内联JS(AnalyzeUrl.evalJS) 里 source.get 实时、java.get 恒空、cookie 未绑定;\n\/\/   eval_js 环境 java.get\/source.get 互通;jsLib 函数编译期捕获 source 快照会冻结。\n\/\/   ⇒ 正解=所有入口 {{}} 内联 IIFE 直接用 source.get('ijLine') 实时取,不经过 jsLib 函数;\n\/\/     面板按钮 action 用 source.put 写入同一键空间;清 Cookie 仍走 URL 选项 js。\n\/\/ ★261108 三次修复「触发人机验证应弹验证码」:loginCheckJs 检测宝塔WAF页 → 抓 \/get_btwaf_captcha_base64 真图\n\/\/   → java.getVerificationCode(data:image\/png;base64,真图) 弹窗让用户填 → \/Verification_auth_btwaf 提交\n\/\/   → 成功后从 result.raw().request() 取 method\/body\/headers 原样重放 → new StrResponse(url,body) 返回,搜索继续。\n\/\/   探针实锤 loginCheckJs 环境有 key\/page\/result.raw().request()\/java.getVerificationCode\/cookie;1px透明PNG探针不能当图用。\n\/\/ ★261108 四次修复「填码后没继续搜索」:HTTP日志实锤 验证成功(status:true)→重放 POST \/search7e.html 得 404。\n\/\/   根因=同一A记录按Host分发两套站:域名过盾后是「久久小说网」模板(GET \/search\/?searchkey= + .item + #booktxt),\n\/\/   裸IP是「笔趣阁」模板(POST \/search7e.html + #bookcon)。且过盾票是短时\/IP会话,必须验证后立刻重放。\n\/\/   修法=loginCheckJs 按Host分派重放接口(域名用GET \/search\/、裸IP原样POST),不再回填原请求头(避免重复头);\n\/\/   ruleSearch\/ruleExplore\/详情\/正文\/目录全部改双模板兼容。\n\/\/ ★261108 五次修复「目录排序错误·最新章节排前面」:域名侧 #list 是单个 dl,\n\/\/   dt[0]=最新章节(9条倒序) + dt[1]=全部章节目录(277条正序) + 末尾又重复最新9条。\n\/\/   原兜底 doc.select('dl') 全收 → 最新章节置顶。修法=从「全部章节目录」dt 锚点之后取所有数字章节 a、\n\/\/   按 href 去重保先出现;裸IP侧仍用「a最多的 ul.list-charts」段。\n\/\/ ★261108 六次修复「域名侧作者有多余内容」:域名 .btm = 作者 + <em>字数<\/em> + <em>日期<\/em>,\n\/\/   原 .btm@text 把字数\/日期一起吞了(如「墨染江山 94万字 11-08」)。\n\/\/   修法=.btm@a.0@text(分类\/排行作者在a里)||.btm@ownText(首页作者是纯文本,ownText排除em子节点)||td.2@a@text(裸IP表格)。\n\/\/   补充:裸IP .media 卡片作者是 .book_author(不是 .btm\/td.2),author 组合末尾追加 .book_author a@text 兜底。",
    "bookSourceGroup": "AI",
    "bookSourceName": "久久小说(修复版)",
    "bookSourceType": 0,
    "bookSourceUrl": "http:\/\/www.ijjxs.org\/",
    "bookUrlPattern": "https?:\/\/(?:www\\.)?ijjxs\\.org\/\\d+_\\d+\/?|https?:\/\/177\\.5\\.49\\.192\/\\d+_\\d+\/?",
    "customButton": false,
    "customOrder": 1,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": false,
    "exploreUrl": "[{\"title\": \"全部小说\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/class\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"玄幻\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/class\/xuanhuan\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"仙侠\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/class\/xianxia\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"都市\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/class\/dushi\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"历史\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/class\/lishi\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"网游\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/class\/wangyou\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"科幻\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/class\/kehuan\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女生\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/class\/nvsheng\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"其他\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/class\/qita\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"全本\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/quanben\/class\/{{page}}\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"总排行\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/rank\/allvisit\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"月排行\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/rank\/monthvisit\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"周排行\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\\\/+$\/,'')})()}}\/rank\/weekvisit\/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}]",
    "header": "{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Mobile Safari\/537.36\", \"Accept\": \"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}",
    "jsLib": "function IJ_base(){\n var L='';\n \/\/ ★java.get 在规则\/内联 JS 环境读的是实时值;jsLib 函数编译期捕获的 source 快照会冻结\n try{ L=String(source.get('ijLine')||''); }catch(e){}\n if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0) L='http:\/\/177.5.49.192';\n return L.replace(\/\\\/+$\/,'');\n}\nfunction IJ_action(){\n var L=IJ_base();\n try{\n  var h=String(java.ajax(L+'\/'));\n  var m=h.match(\/action=['\"](\\\/search[^'\"]*\\.html)['\"]\/);\n  if(m) return L+m[1];\n }catch(e){}\n return L+'\/search7e.html';\n}\nfunction IJ_cookieJs(){\n return \"try{cookie.removeCookie('\"+IJ_base()+\"\/')}catch(e){}\";\n}",
    "lastUpdateTime": "1794116839698",
    "loginCheckJs": "(function(){\n var R=result;\n try{\n  var b=String(R.body()||'');\n  var waf=b.indexOf('宝塔防火墙')>=0||b.indexOf('Verification_auth_btwaf')>=0||b.indexOf('请输入验证码')>=0;\n  if(!waf){\n   if(b.indexOf('搜索间隔: 30 秒')>=0) java.toast('久久小说:站点搜索间隔 30 秒,已自动清会话重试;若仍出现请稍后再搜');\n   return R;\n  }\n  var u=String(R.url());\n  var root=u.replace(\/^(https?:\\\/\\\/[^\\\/]+).*$\/,'$1');\n  java.toast('久久小说:① 触发宝塔人机验证,正在获取验证码图片…');\n  var capUrl=root+'\/get_btwaf_captcha_base64?captcha='+Date.now();\n  var capRaw=String(java.ajax(capUrl));\n  var cap='';\n  try{ var cj=JSON.parse(capRaw); if(cj&&cj.msg) cap=String(cj.msg); }catch(e){}\n  if(!cap||cap.indexOf('iVBOR')<0){ java.toast('久久小说:✗ 验证码图片获取失败,请稍后重试或切换线路'); return R; }\n  var code='';\n  try{ code=String(java.getVerificationCode('data:image\/png;base64,'+cap)||'').replace(\/^\\s+|\\s+$\/g,''); }\n  catch(e){ java.toast('久久小说:✗ 验证码弹窗失败:'+e); return R; }\n  if(!code){ java.toast('久久小说:✗ 已取消验证码输入,本次搜索终止'); return R; }\n  java.toast('久久小说:② 已收到验证码,正在提交校验…');\n  var vUrl=root+'\/Verification_auth_btwaf?captcha='+encodeURIComponent(code);\n  var vRaw=String(java.ajax(vUrl));\n  var ok=false;\n  try{ var vj=JSON.parse(vRaw); ok=!!(vj&&vj.status); }catch(e){ ok=vRaw.indexOf('true')>=0; }\n  if(!ok){ java.toast('久久小说:✗ 验证码错误或已过期,请重新搜索再试'); return R; }\n  java.toast('久久小说:③ 验证通过,正在继续本次搜索…');\n\n  \/\/ ★按 Host 分派重放接口:域名过盾后是「久久小说网」模板(GET \/search\/?searchkey=),\n  \/\/   裸IP是「笔趣阁」模板(POST \/search7e.html)。验证成功后的放行窗口很短,必须立刻重放。\n  var isDomain=root.indexOf('ijjxs.org')>=0;\n  var kw='';\n  try{ kw=String(key||''); }catch(e){}\n  if(!kw){\n   try{\n    var rb0=R.raw().request().body();\n    if(rb0){ var B0=new Packages.okio.Buffer(); rb0.writeTo(B0);\n     var m=String(B0.readUtf8()).match(\/searchkey=([^&]*)\/); if(m) kw=decodeURIComponent(m[1]); }\n   }catch(e){}\n  }\n  var replayUrl='', replay='';\n  if(isDomain){\n   \/\/ 域名侧:搜索\/发现\/详情\/正文全部用 GET 路径;这里只重放「本次被拦的请求」对应的域名侧等价 URL\n   var path=u.slice(root.length);\n   if(path.indexOf('\/search')===0){\n    replayUrl=root+'\/search\/?searchkey='+encodeURIComponent(kw);\n   }else if(path.indexOf('\/class')===0||path.indexOf('\/rank')===0||path.indexOf('\/quanben')===0){\n    replayUrl=root+path;   \/\/ 分类\/排行\/全本路径两侧同名\n   }else{\n    replayUrl=root+path;   \/\/ 详情\/章节路径两侧同名\n   }\n   try{ replay=String(java.ajax(replayUrl)); }\n   catch(e){ java.toast('久久小说:✗ 过盾后重放失败:'+e); return R; }\n  }else{\n   \/\/ 裸IP侧:原样重放(method+body),但不回填全部原请求头,避免重复 Connection\/Keep-Alive\/Cookie\n   var req=R.raw().request();\n   var method=String(req.method()||'GET');\n   replayUrl=String(req.url());\n   var body='';\n   try{\n    var rb=req.body();\n    if(rb){ var B=new Packages.okio.Buffer(); rb.writeTo(B); body=String(B.readUtf8()); }\n   }catch(e){}\n   var opt={method:method};\n   if(body) opt.body=body;\n   try{ replay=String(java.ajax(replayUrl+','+JSON.stringify(opt))); }\n   catch(e){ java.toast('久久小说:✗ 过盾后重放失败:'+e); return R; }\n  }\n  if(replay.indexOf('宝塔防火墙')>=0||replay.indexOf('请输入验证码')>=0){\n   java.toast('久久小说:⚠ 验证已提交但页面仍被拦截,请在浏览器过盾后再搜,或切到裸IP线路');\n   return R;\n  }\n  if(replay.indexOf('404 Not Found')>=0){\n   java.toast('久久小说:⚠ 过盾成功但重放地址不存在('+replayUrl+'),请切到裸IP线路');\n   return R;\n  }\n  try{\n   var NR=new Packages.io.legado.app.help.http.StrResponse(replayUrl,replay);\n   return NR;\n  }catch(e){\n   java.toast('久久小说:✗ 响应重建失败:'+e);\n   return R;\n  }\n }catch(e){\n  try{ java.toast('久久小说:✗ 人机验证处理异常:'+e); }catch(e2){}\n  return R;\n }\n})()",
    "loginUi": "[{\"name\": \"发布页\", \"type\": \"text\", \"viewName\": \"'发布页地址'\"}, {\"name\": \"应用\", \"type\": \"button\", \"action\": \"IJ_pub(java,result)\"}, {\"name\": \"🧭 一键获取网址路线\", \"type\": \"button\", \"action\": \"IJ_toast(java,'开始获取路线');IJ_fetch(java)\"}, {\"name\": \"⏱ 测试延时\", \"type\": \"button\", \"action\": \"IJ_toast(java,'开始测速');IJ_speed(java)\"}, {\"name\": \"🔍 检查登录状态\", \"type\": \"button\", \"action\": \"IJ_check(java)\"}, {\"name\": \"线路1\", \"type\": \"button\", \"action\": \"IJ_switch(java,1)\", \"viewName\": \"IJ_btn(source,1)\"}, {\"name\": \"线路2\", \"type\": \"button\", \"action\": \"IJ_switch(java,2)\", \"viewName\": \"IJ_btn(source,2)\"}, {\"name\": \"线路3\", \"type\": \"button\", \"action\": \"IJ_switch(java,3)\", \"viewName\": \"IJ_btn(source,3)\"}, {\"name\": \"线路4\", \"type\": \"button\", \"action\": \"IJ_switch(java,4)\", \"viewName\": \"IJ_btn(source,4)\"}, {\"name\": \"线路5\", \"type\": \"button\", \"action\": \"IJ_switch(java,5)\", \"viewName\": \"IJ_btn(source,5)\"}, {\"name\": \"线路6\", \"type\": \"button\", \"action\": \"IJ_switch(java,6)\", \"viewName\": \"IJ_btn(source,6)\"}, {\"name\": \"🌐 打开当前线路\", \"type\": \"button\", \"action\": \"java.startBrowser(IJ_line(java)+'\/', '久久小说')\"}]",
    "loginUrl": "function login(){return 'ok';}\nfunction IJ_toast(jv,s){try{jv.toast(s)}catch(e){}try{jv.longToast(s)}catch(e){}}\nfunction IJ_gv(jv,k,d){\n var v='';try{v=String(jv.get(k)||'')}catch(e){}\n if(!v||v==='null'||v==='undefined')v=d||'';return v;\n}\nfunction IJ_line(jv){\n var v=IJ_gv(jv,'ijLine','');\n if(!v||v.indexOf('http')!==0)v='http:\/\/177.5.49.192';\n return v.replace(\/\\\/+$\/,'');\n}\nfunction IJ_btn(jv,n){\n var list=IJ_gv(jv,'ijLines','').split('|'),i=Number(n)-1;\n if(i<0||i>=list.length||!list[i])return '━━ 线路'+n+' 未获取 ━━';\n var cur=IJ_line(jv),mark=(list[i]===cur)?'▶ ':'  ';\n var d=IJ_gv(jv,'ijDelay'+n,'');if(d)mark+=d+' ';\n return mark+list[i].replace(\/^https?:\\\/\\\/\/,'').replace(\/\\\/+$\/,'');\n}\nfunction IJ_reUi(jv){try{jv.reLoginView(false)}catch(e){try{jv.reUiView(false)}catch(e2){}}}\nfunction IJ_apply(jv){\n var v=IJ_gv(jv,'ijPub','').replace(\/^\\s+|\\s+$\/g,'');\n if(!v)return '';\n if(v.indexOf('http')!==0)v='http:\/\/'+v;\n v=v.replace(\/\\\/+$\/,'');\n var pool=IJ_gv(jv,'ijLines','');\n if(pool.split('|').indexOf(v)<0)pool=(pool?pool+'|':'')+v;\n jv.put('ijLines',pool);jv.put('ijLine',v);\n return v;\n}\nfunction IJ_fetch(jv){\n IJ_toast(jv,'① 正在从发布页\/输入框获取网址路线…');\n var pub=IJ_gv(jv,'ijPub','').replace(\/^\\s+|\\s+$\/g,'');\n var found=[];\n if(pub){\n  if(pub.indexOf('http')!==0)pub='http:\/\/'+pub;\n  try{\n   var h=String(jv.ajax(pub));\n   IJ_toast(jv,'② 已打开发布页,正在解析页面中的网址…');\n   var re=\/https?:\\\/\\\/[a-z0-9.\\-]+(?:\\\/[^\\s\"'<>]*)?\/gi,m;\n   while((m=re.exec(h))!==null){\n    var u=m[0].replace(\/\\\/+$\/,'');\n    var host=u.replace(\/^https?:\\\/\\\/\/,'').split('\/')[0];\n    if(\/^(www\\.)?(w3\\.org|cloudflare|cloudfront|google|baidu|alicdn|qq|weibo|cnzz|51\\.la|doubleclick|gstatic|bootstrapcdn|jquery|jsdelivr|unpkg)\\b\/i.test(host))continue;\n    if(found.indexOf(u)<0)found.push(u);\n   }\n  }catch(e){IJ_toast(jv,'发布页读取失败:'+e);}\n }else{\n  IJ_toast(jv,'② 未填发布页,改用内置线路池:域名 + 裸IP直连');\n }\n var defs=['http:\/\/www.ijjxs.org','http:\/\/177.5.49.192'];\n for(var i=0;i<defs.length;i++)if(found.indexOf(defs[i])<0)found.push(defs[i]);\n jv.put('ijLines',found.join('|'));\n IJ_toast(jv,'③ 获取完成,共 '+found.length+' 条路线;点「⏱ 测试延时」测速');\n IJ_reUi(jv);\n return found.join('|');\n}\nfunction IJ_body(x){\n try{ if(x&&x.body) return String(x.body()); }catch(e){}\n return String(x||'');\n}\nfunction IJ_speed(jv){\n IJ_toast(jv,'① 开始测速(并发,跳过全局限速)…');\n var list=IJ_gv(jv,'ijLines','').split('|'),clean=[];\n for(var z=0;z<list.length;z++)if(list[z])clean.push(list[z].replace(\/\\\/+$\/,''));\n if(!clean.length){IJ_toast(jv,'✗ 线路池为空,请先点「🧭 一键获取网址路线」');return '';}\n var urls=[];\n for(var i=0;i<clean.length;i++)urls.push(clean[i]+'\/');\n var res=[],t0=Date.now(),done=false;\n try{\n  var rs=jv.ajaxAll(urls,true);\n  for(var k=0;k<clean.length;k++){\n   var rr=null;try{rr=rs.get(k)}catch(e){}\n   var s=IJ_body(rr);\n   var ok=s.length>5000&&s.indexOf('Exception')<0&&s.indexOf('宝塔防火墙')<0;\n   var ct='';\n   try{if(rr&&rr.callTime)ct=String(rr.callTime())+'ms';}catch(e){}\n   if(!ok)ct='超时\/验证';\n   if(!ct)ct=ok?'可达':'超时\/验证';\n   jv.put('ijDelay'+(k+1),ct);\n   res.push(clean[k]+'='+ct);\n  }\n  done=true;\n }catch(e){IJ_toast(jv,'并发测速不可用,改串行:'+e);}\n if(!done){\n  for(var q=0;q<clean.length;q++){\n   var st=Date.now(),ok2=false;\n   try{\n    var s2=String(jv.ajax(clean[q]+'\/,'+JSON.stringify({timeout:8000})));\n    ok2=s2.length>5000&&s2.indexOf('宝塔防火墙')<0&&s2.indexOf('Exception')<0;\n   }catch(e2){}\n   var ct2=ok2?(Date.now()-st)+'ms':'超时\/验证';\n   jv.put('ijDelay'+(q+1),ct2);res.push(clean[q]+'='+ct2);\n  }\n }\n IJ_toast(jv,'② 测速完成(总 '+(Date.now()-t0)+'ms):'+res.join(' , ')+';点各线路按钮即时切换');\n IJ_reUi(jv);\n return res.join('|');\n}\nfunction IJ_switch(jv,n){\n IJ_toast(jv,'① 正在切换到线路 '+n+' …');\n var list=IJ_gv(jv,'ijLines','').split('|'),i=Number(n)-1;\n if(i<0||i>=list.length||!list[i]){IJ_toast(jv,'✗ 线路 '+n+' 不存在,请先获取路线');return '';}\n var v=list[i].replace(\/\\\/+$\/,'');\n jv.put('ijLine',v);\n IJ_toast(jv,'② 已切换:'+v+'(下一次搜索\/发现\/目录即时生效)');\n IJ_reUi(jv);\n return v;\n}\nfunction IJ_check(jv){\n IJ_toast(jv,'① 正在检查线路连通性与登录状态…');\n var base=IJ_line(jv),s='';\n try{s=String(jv.ajax(base+'\/'))}catch(e){s='ERR '+e;}\n var waf=s.indexOf('宝塔防火墙')>=0||s.indexOf('请输入验证码')>=0;\n var real=s.indexOf('笔趣阁')>=0&&s.length>5000;\n var logged=s.indexOf('退出登录')>=0||s.indexOf('ss_username')>=0;\n var tip=waf?'⚠ 当前线路被宝塔人机验证拦截(建议切到裸IP线路或浏览器过盾)':(real?'✓ 线路连通,返回真实页面':'✗ 线路异常:'+s.slice(0,60));\n IJ_toast(jv,'② '+tip+' | 账号登录:'+(logged?'已登录':'未登录(本站搜索\/阅读\/正文无需登录,书架功能才需要账号)'));\n try{jv.put('ijStatus',tip)}catch(e){}\n IJ_reUi(jv);\n return tip;\n}\nfunction IJ_pub(jv,r){\n var v='';\n try{v=String(r.get('发布页')||'')}catch(e){}\n try{if(!v)v=String(r['发布页']||'')}catch(e){}\n if(!v){IJ_toast(jv,'✗ 请先填发布页地址');return '';}\n jv.put('ijPub',v);\n var a=IJ_apply(jv);\n IJ_toast(jv,'③ 已应用发布页网址:'+a+';点「🧭 一键获取网址路线」拉取全部路线');\n IJ_reUi(jv);\n return a;\n}",
    "respondTime": 180000,
    "ruleBookInfo": {
        "author": ".info2 h3 a@text||[property=\"og:novel:author\"]@content",
        "coverUrl": ".info1 img@src||[property=\"og:image\"]@content",
        "intro": ".info2 div p@text||[property=\"og:description\"]@content",
        "kind": ".info3 p.0@text||[property~=category|status|update_time]@content",
        "lastChapter": ".info3 p.2 a@text||[property=\"og:novel:lastest_chapter_name\"]@content",
        "name": ".info2 h1@text||[property=\"og:novel:book_name\"]@content"
    },
    "ruleContent": {
        "content": ".content-body@p@html||#booktxt@p@html||#booktxt@html",
        "nextContentUrl": "#next_url@href||text.下一页@href",
        "replaceRegex": "##本章未完[^<]*|<center>[\\s\\S]*?<\/center>|最近转码严重.*退出阅读模式。谢谢|<script[\\s\\S]*?<\/script>"
    },
    "ruleExplore": {
        "author": ".btm@a.0@text||.btm@ownText||td.2@a@text||.book_author a@text||.book_author@text",
        "bookList": ".item||.media||#bookcon tr:gt(0)",
        "bookUrl": ".image@a.0@href||h4.book-title a@href||td.1@a@href",
        "coverUrl": "img@data-original||img@src",
        "intro": "dd@text||p.book-intro-index@text||td.3@text",
        "kind": "class.blue.visible-xs@text||td.4@text",
        "name": "dt@a@text||h4.book-title a@text||td.1@a@text",
        "wordCount": "class.orange.visible-xs@text"
    },
    "ruleSearch": {
        "author": ".btm@a.0@text||.btm@ownText||td.2@a@text||.book_author a@text||.book_author@text",
        "bookList": ".item||#bookcon tr:gt(0)",
        "bookUrl": ".image@a.0@href||a.0@href||td.1@a@href",
        "coverUrl": "img@data-original||img@src",
        "intro": "dd@text||td.3@text",
        "kind": "class.blue.visible-xs@text||td.4@text",
        "name": "dt@a@text||td.1@a@text",
        "wordCount": "class.orange.visible-xs@text"
    },
    "ruleToc": {
        "chapterList": "@js:\n(function(){\n var raw=String(result||'');\n var out=[];\n try{\n  var doc=Packages.org.jsoup.Jsoup.parse(raw);\n  var cand=null;\n  \/\/ A) 裸IP「笔趣阁」模板:多个 ul.list-charts,选章节链接最多的段(全部章节段)\n  var uls=doc.select('ul.list-charts');\n  var best=0;\n  for(var i=0;i<uls.size();i++){\n   var n=uls.get(i).select('a[href*=.html]').size();\n   if(n>best){best=n;cand=uls.get(i);}\n  }\n  \/\/ B) 域名「久久小说网」模板:单个 dl,dt[0]=最新章节(倒序9) \/ dt[1]=全部章节目录(正序)\n  \/\/    必须从「全部章节目录」dt 之后开始取,避免最新章节排到最前;末尾还会重复最新9条 → 按 href 去重\n  if(!cand || best<20){\n   var dls=doc.select('dl');\n   for(var d=0;d<dls.size();d++){\n    var dl=dls.get(d);\n    var dts=dl.select('dt');\n    var anchor=null;\n    for(var t=0;t<dts.size();t++){\n     if(dts.get(t).text().indexOf('全部章节目录')>=0){anchor=dts.get(t);break;}\n    }\n    if(anchor){\n     var kids=dl.children();\n     var start=kids.indexOf(anchor);\n     \/\/ 收集 anchor 之后所有带数字章节 href 的 a(含 dt[2] 之后的 hc 段,仍正序)\n     var tmp=[];\n     for(var q=start+1;q<kids.size();q++){\n      var e=kids.get(q);\n      var as=e.tagName()==='a'?[e]:e.select('a');\n      for(var z=0;z<as.length;z++){\n       var a=as[z],h=a.attr('href')||'',tx=a.text()||'';\n       if(\/\\\/\\d+_\\d+\\\/\\d+\\.html\/.test(h))tmp.push(JSON.stringify({n:tx,u:h}));\n      }\n     }\n     if(tmp.length>best){best=tmp.length;cand={_items:tmp};}\n    }\n   }\n  }\n  if(cand){\n   var items=[];\n   if(cand._items){ items=cand._items; }\n   else{\n    var as2=cand.select('a');\n    for(var j=0;j<as2.size();j++){\n     var a2=as2.get(j),h2=a2.attr('href')||'',t2=a2.text()||'';\n     if(!\/\\\/\\d+_\\d+\\\/\\d+\\.html\/.test(h2))continue;\n     items.push(JSON.stringify({n:t2,u:h2}));\n    }\n   }\n   \/\/ 按 href 去重(保先出现):域名侧末尾会重复最新9条,裸IP侧各段互不重叠\n   var seen={};\n   for(var k=0;k<items.length;k++){\n    var o=JSON.parse(items[k]);\n    if(seen[o.u])continue;seen[o.u]=1;\n    out.push(items[k]);\n   }\n  }\n }catch(e){}\n var list=new Packages.java.util.ArrayList();\n for(var m=0;m<out.length;m++)list.add(out[m]);\n return list;\n})()",
        "chapterName": "$.n",
        "chapterUrl": "$.u"
    },
    "searchUrl": "{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';L=L.replace(\/\\\/+$\/,'');try{var h=String(java.ajax(L+'\/'));var m=h.match(\/action=['\"](\\\/search[^'\"]*\\.html)['\"]\/);if(m)return L+m[1]}catch(e){}return L+'\/search7e.html'})()}},{\"method\":\"POST\",\"body\":\"searchkey={{key}}\",\"headers\":{\"Content-Type\":\"application\/x-www-form-urlencoded\",\"Referer\":\"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return L.replace(\/\\\/+$\/,'')})()}}\/\"},\"js\":\"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http:\/\/177.5.49.192';return \"try{cookie.removeCookie('\"+L.replace(\/\\\/+$\/,'')+\"\/')}catch(e){}\"})()}}\"}",
    "weight": 0
}
广告