[{"bookSourceComment":"智能书库（zzbook.net）书源，支持发现、搜索、书籍详情、目录、正文与跨页续读。\n\n【站点特征】\n站点以短篇同人作品为主，全站启用 JS Cookie 校验：由前端脚本 document.cookie 写入 ge_js_validator_20（末尾数字为版本号，站点升级时可能变化），响应头不下发 Set-Cookie；请求未携带该 Cookie 时，所有页面均只返回约 278 字节的壳页。搜索接口为 POST \/search.html，目录按 \/go\/{分类}\/{书号}\/{页}\/ 分页，正文以 document.writeln(fn('base64')) 形式混淆输出，超长章节拆分为 {章节id}_1.html 续页。\n\n【实现说明】\n1. Cookie 获取与续期：jsLib 中的 zzMint 通过 java.ajax 请求首页，从返回内容中提取 Cookie 值写入 CookieStore 并随请求发送；若首页返回真实页面则沿用本地已存值，仅在无法取得时退化为 webView 加载。\n2. 请求头格式：Cookie 须以 \"ge_js_validator_20=值\" 的完整形式置于 headers 中，仅发送值会被服务端拒绝。Legado 的 java.ajax 不会自动携带 CookieStore 中的 Cookie，因此本源在规则内显式拼接请求头。\n3. jsLib 作用域：jsLib 在独立作用域中求值，其中的函数访问不到规则执行时才注入的 java 与 cookie 对象，因此本源所有 jsLib 函数均采用显式传参方式调用。\n4. 有效期处理：站点实际作废时间早于响应头声明的 max-age，故不依赖本地时间戳判断，改为每次请求前访问首页自校验，避免复用已失效的 Cookie 导致页面空白。\n5. 正文解码：正文规则先取 #booktxt 节点内容，再用 java.base64Decode 还原 writeln 中的 base64 片段，并清除残留的 banner 占位段。\n\n【已知限制】\n1. 站点自身的列表分页失效，发现页各分类的后续页与首页内容相同，本源未提供真翻页。\n2. 目录固定从第 1 页进入，正常使用流程不受影响。\n3. 部分分类条目由站点返回空书名，属站点数据问题。\n4. 每次请求需额外访问一次首页以校验 Cookie 有效性，是为保证稳定性的必要代价。\n5. 详情页无法附加 Cookie 守卫（其 URL 由列表项直接给出，不经书源规则），正常流程（先搜索或浏览分类）不受影响。\n\n本源仅供个人学习与阅读使用。站点若改版导致页面空白或解析异常，通常为 Cookie 校验机制变动所致，需同步更新书源。","bookSourceGroup":"R18+","bookSourceName":"智能书库(zzbook MO版)","bookSourceType":0,"bookSourceUrl":"https:\/\/www.zzbook.net","bookUrlPattern":"https?:\/\/www\\.zzbook\\.net\/go\/\\d+\/\\d+\/","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"首页推荐::<js>zzGet(java,cookie,'\/')<\/js>\n玄幻::<js>zzGet(java,cookie,'\/list\/1\/1\/')<\/js>\n重生::<js>zzGet(java,cookie,'\/list\/2\/1\/')<\/js>\n都市::<js>zzGet(java,cookie,'\/list\/3\/1\/')<\/js>\n军史::<js>zzGet(java,cookie,'\/list\/4\/1\/')<\/js>\n网游::<js>zzGet(java,cookie,'\/list\/5\/1\/')<\/js>\n科幻::<js>zzGet(java,cookie,'\/list\/6\/1\/')<\/js>\n灵异::<js>zzGet(java,cookie,'\/list\/7\/1\/')<\/js>\n言情::<js>zzGet(java,cookie,'\/list\/8\/1\/')<\/js>\n其他::<js>zzGet(java,cookie,'\/list\/9\/1\/')<\/js>","header":"{\"User-Agent\":\"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Safari\/537.36\"}","jsLib":"function zzKey(){\n  return 'ge_js_validator_20';\n}\nfunction zzHome(){\n  return 'https:\/\/www.zzbook.net\/';\n}\nfunction zzJar(ck){\n  try{\n    var v = ck.getKey(zzHome(), zzKey());\n    return v ? String(v) : '';\n  }catch(e){ }\n  return '';\n}\nfunction zzMint(jv, ck){\n  var cached = zzJar(ck);\n  var s = '';\n  try{ s = String(jv.ajax(zzHome()) || ''); }catch(e){ s = ''; }\n  if(s.indexOf('hotcontent') >= 0){\n    return cached;\n  }\n  var m = s.match(\/ge_js_validator_\\d+=[^;\"']+\/);\n  if(m){\n    try{ ck.setCookie(zzHome(), m[0]); }catch(e){ }\n    var i = m[0].indexOf('=');\n    if(i > 0){ return m[0].substring(i + 1); }\n  }\n  return cached;\n}\nfunction zzHead(v){\n  if(!v){ return ',{\"webView\":true,\"webViewDelayTime\":2500}'; }\n  return ',{\"headers\":{\"Cookie\":\"' + zzKey() + '=' + v + '\"}}';\n}\nfunction zzGet(jv, ck, path){\n  var u = 'https:\/\/www.zzbook.net' + path;\n  var v = zzMint(jv, ck);\n  try{ jv.log('[zzbook] get ' + path + ' ck=' + (v ? 'Y' : 'N')); }catch(e){ }\n  return u + zzHead(v);\n}\nfunction zzPost(jv, ck){\n  var v = zzMint(jv, ck);\n  try{ jv.log('[zzbook] search ck=' + (v ? 'Y' : 'N')); }catch(e){ }\n  var o = '{\"method\":\"POST\",\"body\":\"s={{key}}\"';\n  if(v){ o += ',\"headers\":{\"Cookie\":\"' + zzKey() + '=' + v + '\"}'; }\n  else { o += ',\"webView\":true,\"webViewDelayTime\":2500'; }\n  return 'https:\/\/www.zzbook.net\/search.html,' + o + '}';\n}\nfunction zzToc(jv, ck, u){\n  var v = zzMint(jv, ck);\n  try{ jv.log('[zzbook] toc ck=' + (v ? 'Y' : 'N')); }catch(e){ }\n  return String(u) + zzHead(v);\n}","lastUpdateTime":"1791428813654","respondTime":0,"ruleBookInfo":{"author":"@css:meta[property='og:novel:author']@content","coverUrl":"@css:meta[property='og:image']@content","intro":"@css:meta[property='og:description']@content##(<br\\s*\/?>)?\\s*三秒记住本站[\\s\\S]*|^\\s*p\\s*|\\s*\/p\\s*$|(?<![A-Za-z])rn(?![A-Za-z])","kind":"@css:meta[property='og:novel:category']@content","lastChapter":"@css:meta[property='og:novel:latest_chapter_name']@content","name":"@css:meta[property='og:novel:book_name']@content","tocUrl":"@js:(function(){var u=String((book&&book.bookUrl)||baseUrl||'');u=u.replace(\/\\\/$\/,'');u=u?(u+'\/1\/'):'1\/';if(u.indexOf('http')!==0){return u;}return zzToc(java,cookie,u);})()","wordCount":"@css:#info p.visible-xs:contains(万)@text##字数：","updateTime":"@css:meta[property='og:novel:update_time']@content"},"ruleContent":{"content":"@css:#booktxt@all@js:zzMint(java,cookie);var h=String(result);var re=\/writeln\\([^']*'([^']+)'\/g;var m,o='';while((m=re.exec(h))!==null){try{o+=java.base64Decode(m[1]);}catch(e){ }}o.replace(\/<p>banner\"?<\\\/p>|<p>><\\\/p>\/gi,'')","nextContentUrl":"@js:var r=String(java.getString('class.next@href',null,true));var c=String((chapter&&chapter.url)||baseUrl||'');c=c.replace(\/\\.html.*$\/,'').replace(\/_\\d+$\/,'');var id=c.substring(c.lastIndexOf('\/')+1);var f=r.replace(\/.*\\\/\/,'').replace(\/\\.html.*$\/,'');(id&&r&&f.indexOf(id+'_')===0)?r:'javascript:;'","sourceRegex":"","webJs":""},"ruleExplore":{"author":"@css:.btm@ownText||.s4@text||.s5@text||i@text","bookList":"@css:#hotcontent .item, #hotcontent li, .novelslist li, #newscontent li","bookUrl":"@css:dt a@href||.s2 a@href||a@href","coverUrl":"@css:img@data-original","intro":"@css:dd@text##^[.…]+$","kind":"@css:.s1@text","lastChapter":"@css:.s3 a@text","name":"@css:dt a@text||.s2 a@text||a@text","wordCount":"@css:.btm em.orange@text"},"ruleSearch":{"author":"@css:.btm@ownText","bookList":"@css:#hotcontent .item","bookUrl":"@css:dt a@href","checkKeyWord":"总裁","coverUrl":"@css:img@data-original","intro":"@css:dd@text##^[.…]+$","kind":"@css:.btm em.orange@text","lastChapter":"","name":"@css:dt a@text","wordCount":""},"ruleToc":{"chapterList":"@css:#list a[rel=chapter]","chapterName":"@css:dd@text","chapterUrl":"href","isVip":"","nextTocUrl":"@css:#list dl>dt:first-child option@value","updateTime":""},"searchUrl":"<js>zzPost(java,cookie)<\/js>","weight":0}]