智能书库(zzbook MO版)
https://www.zzbook.net
momomo12312 (15125)10/08 11:06
UAA盗版站,国内环境访问,速度比较慢
{
"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
}