[
    {
        "bookSourceComment": "起点限免，锁2天\n\n搜索/免费章节无法加载时可以过验证后重试\n\nemail: jiujiu@nethogs01.de",
        "bookSourceName": "玖玖书吧-V2.1",
        "bookSourceType": 0,
        "bookSourceUrl": "https://QDReader/s6",
        "concurrentRate": "800",
        "customButton": false,
        "customOrder": 1,
        "enabled": true,
        "enabledCookieJar": true,
        "enabledExplore": true,
        "eventListener": false,
        "exploreUrl": "@js:let url=\"https://www.qidian.com/all/\",html=java.ajax(url),src=(/fffffffffffffffffff/.test(html)&&(java.longToast(\"发现列表正在热更新…\"),ck=java.webView(null,url,\"document.cookie\"),html=java.get(url,{cookie:ck}).body()),org.jsoup.Jsoup.parse(html)),list=[],addListItem=(e,t,a)=>{list.push({title:e,url:t,style:{layout_flexGrow:\"1\",layout_flexBasisPercent:a}})},processCategories=(e,i,s)=>{e.forEach(e=>{let t=e.text(),a=\"https:\"+e.attr(\"href\");a=\"girl\"==s&&\"全部\"==t?\"https://www.qidian.com/all/signsite3-orderId11-siteid999/\":a,a=/all\\/$/.test(a)?a.replace(/\\/$/,\"<,/page{{page}}>/\"):a.replace(/\\/$/,\"<,-page{{page}}>/\"),addListItem(t,a,i)})},time=new Date,rankings=[[\"༺ˇ»`ʚ 排行 ɞ´«ˇ༻\",null],[\"月票榜\",\"https://www.qidian.com/rank/yuepiao/\"+`<,year${time.getFullYear()}-month${(time.getMonth()+1).toString().padStart(2,\"0\")}-page{{page}}/>`],[\"畅销榜\",\"https://www.qidian.com/rank/hotsales/<,page{{page}}/>\"],[\"指数榜\",\"https://www.qidian.com/rank/readIndex/<,page{{page}}/>\"],[\"推荐榜\",\"https://www.qidian.com/rank/recom/<,page{{page}}/>\"],[\"收藏榜\",\"https://www.qidian.com/rank/collect/<,page{{page}}/>\"],[\"签新榜\",\"https://www.qidian.com/rank/signnewbook/<,page{{page}}/>\"],[\"公新榜\",\"https://www.qidian.com/rank/pubnewbook/<,page{{page}}/>\"],[\"VIP榜\",\"https://www.qidian.com/rank/vipcollect/<,page{{page}}/>\"],[\"新签榜\",\"https://www.qidian.com/rank/newsign/<,page{{page}}/>\"],[\"更新榜\",\"https://www.qidian.com/rank/vipup/<,page{{page}}/>\"],[\"书友榜\",\"https://www.qidian.com/rank/newfans/<,page{{page}}/>\"],[\"总字数\",\"https://www.qidian.com/all/orderId3-page{{page}}/\"]],mainCategories=(rankings.forEach(([e,t])=>{addListItem(e,t,t?\"0.25\":\"1\")}),addListItem(\"༺ˇ»`ʚ 免费 ɞ´«ˇ༻\",null,\"1\"),addListItem(\"连载\",\"https://www.qidian.com/all/action0-vip0-page{{page}}/\",\"0.25\"),addListItem(\"完结\",\"https://www.qidian.com/all/action1-vip0-page{{page}}/\",\"0.25\"),addListItem(\"限免\",\"https://www.qidian.com/free/\",\"0.25\"),addListItem(\"༺ˇ»`ʚ 男生 ɞ´«ˇ༻\",null,\"1\"),src.select(\".type-filter\").get(1).select(\"a\")),tags=(processCategories(mainCategories.subList(1,mainCategories.size()),\"0.25\",\"man\"),addListItem(\"༺ˇ»`ʚ 女生 ɞ´«ˇ༻\",null,\"1\"),mainCategories=src.select(\".type-filter\").get(0).select(\"a\"),processCategories(mainCategories,\"0.25\",\"girl\"),addListItem(\"༺ˇ»`ʚ 出版 ɞ´«ˇ༻\",null,\"1\"),mainCategories=src.select(\".type-filter\").get(2).select(\"a\"),processCategories(mainCategories.subList(1,mainCategories.size()),\"0.25\",\"pub\"),addListItem(\"༺ˇ»`ʚ 标签 ɞ´«ˇ༻\",null,\"1\"),src.select(\".tag\").first().select(\"a\"));processCategories(tags,null),JSON.stringify(list);",
        "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\", \"Referer\": \"https://www.qidian.com\"}",
        "jsLib": "let host=\"https://s6.nethogs01.de\";function getQuota(){var{java:o,result:t}=this;try{var a,e,n=t.get(\"卡密\");\"\"==n?o.longToast(\"请先输入卡密\"):(o.longToast(\"查询中...\"),(e=(a=JSON.parse(o.ajax(host+`/user/info,{\"headers\":{\"Authorization\":${n}}}`))).data?.item)?o.longToast(`查询成功\n已用: ${\"daily\"==e.quota_mode?e.used_today:e.total_used}\n剩余: `+(e.remaining_today||e.remaining_total)):o.longToast(a.msg))}catch(t){o.longToast(\"错误：\"+t.message)}}function logon() {const java = this.java;java.startBrowser(`${host}/portal,{\"headers\":{\"User-Agent\":\"${java.getWebViewUA()}\"}}`,\"用户登录\")};function getCsrfToken(t){var t=t.cookie,o=\"https://m.qidian.com\";let a=t.getKey(o,\"_csrfToken\");return String(a)||(a=Array(40).fill(\"\").map(()=>\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"[Math.floor(62*Math.random())]).join(\"\"),t.replaceCookie(o,\"_csrfToken=\"+a)),\"_csrfToken=\"+a}\nfunction v(){const {java,cookie}=this;cookie.removeCookie(\"https://www.qidian.com\");java.startBrowserAwait('https://www.qidian.com', '起点')}\n\nconst ENCRYPTION_KEY_1 = \"{1dYgqE)h9,R)hKqEcv4]k[h\";\nconst ENCRYPTION_IV_1 = \"01234567\";\nconst ENCRYPTION_KEY_2 = \"0821CAAD409B84020821CAAD\";\nconst ENCRYPTION_IV_2_B64 = \"AAAAAAAAAAA=\";\nconst EMOJI_MAP = { 31: \"😳\", 21: \"😍\", 11: \"🙄\", 32: \"😎\", 12: \"😭\", 43: \"☺️\", 50: \"🤐\", 45: \"😴\", 19: \"😂\", 37: \"😡\", 47: \"😱\", 26: \"🤪\", 4: \"😁\", 40: \"😞\", 36: \"🤓\", 17: \"😓\", 24: \"😫\", 51: \"🥴\", 33: \"🤭\", 7: \"🙂\", 49: \"😪\", 16: \"🥵\", 14: \"😥\", 5: \"😄\", 46: \" 🤠🚬 \", 29: \"💪\", 44: \"🤬\", 39: \" 😄❓ \", 18: \"🤫\", 13: \"😵\", 28: \"😣\", 20: \"😢\", 30: \"💀\", 22: \" 🤕🔨 \", 34: \" 😄👏 \", 10: \" 👆🏻🐽 \", 1: \"👏\", 23: \"😑\", 8: \"😏\", 41: \"😧\", 15: \"🖕🏻\", 38: \"🙁\", 58: \"😒\", 9: \"😙\", 60: \"😮\", 6: \"🥺\", 54: \"🔪\", 48: \"🐷\", 2: \"🌹\", 42: \"💋\", 53: \"❤️\", 56: \"💔\", 52: \"🌙\", 55: \"🎁\", 25: \"🤗\", 35: \"👍🏻\", 3: \"🤝\", 59: \"✌🏻️\", 27: \"🙏\", 57: \"👊🏻\", 61: \"🤨\", 62: \"😴\", 63: \"👏🏻\", 64: \"🐲\" };\nfunction sjzc(t){var{java:t,cache:e}=t||this,a=Math.floor(1001*Math.random())+1e3,n=Math.floor(7*Math.random()),o=[\"RMX3366\",\"PHY120\",\"24030PN60C\",\"V2324A\",\"ALN-AL10\",\"SM-S9280\",\"Pixel 4 XL\",\"MAA-AN10\"][n],n=[\"realme\",\"OPPO\",\"Xiaomi\",\"vivo\",\"HUAWEI\",\"samsung\",\"Google\",\"HONOR\"][n],r=t.timeFormatUTC(Date.now(),\"yyyyMMddHHmmsss\",288e5)+sjmac(),a=String([a,o,n,r]);e.put(\"zssj\",a),t.log(\"注册信息：\"+a),t.toast(\"\\n注册成功\")}function sjmac(){function e(t){let e=1==t?\"0123456789\":\"0123456789abcdef\";return e[Math.floor(Math.random()*e.length)]}let a=\"\";for(let t=0;t<6;t++){0<t&&(a+=\":\");for(let t=0;t<2;t++)a+=e(0)}for(let t=0;t<6;t++)a+=e(1);return a}function formatEmoji(t){if(!(t=String(t))||!/\\[fn=\\d+\\]/.test(t))return t;let e=t;for(var[a,n]of Object.entries(EMOJI_MAP)){a=new RegExp(`\\\\[fn=${a}\\\\]`,\"g\");e=e.replace(a,n)}return e}function QDSign(t){var e=this.java,t=t.split(\"?\")[1].split(\"&\").sort().join(\"&\");let a=this.cache.get(\"zssj\");a||(this.sjzc(),a=this.cache.get(\"zssj\"));var[,n,o,r]=a.split(\",\"),i=Date.now().toString(),t=`Rv1rPTnczce|${i}|0|${r}||||${e.md5Encode(t.toLowerCase())}|f189adc92b816b3e9da29ea304d4a7e4`,t=e.tripleDESEncodeBase64Str(t,ENCRYPTION_KEY_1,\"CBC\",\"PKCS5Padding\",ENCRYPTION_IV_1),s=e.base64Decode(ENCRYPTION_IV_2_B64);return{QDSign:t,QDInfo:e.tripleDESEncodeBase64Str(r+`|7.9.378|1080|1184|1000009|10|1|${n}|1436|1000009|4|0|${i}|1|${r}|||||0`,ENCRYPTION_KEY_2,\"CBC\",\"PKCS5Padding\",s),tstamp:i,\"User-Agent\":String(\"Mozilla/mobile QDReaderAndroid/7.9.378/1436/1000009/\"+o)}}",
        "lastUpdateTime": 1783292067315,
        "loginCheckJs": "(() => { let res = result; let body = String(res.body()); if (body && body.length < 500 && body.indexOf('probe.js') !== -1) { let url = String(res.url()); if (url.indexOf('webView') === -1) { java.webView(null,java.ruleUrl,\"document.cookie\");res = java.connect(url); } } return res; })();",
        "loginUi": "[\n    {\n        \"name\": \"卡密\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"登录\",\n        \"type\": \"button\",\n        \"action\": \"logon()\"\n    },\n    {\n        \"name\": \"查询\",\n        \"type\": \"button\",\n        \"action\": \"getQuota()\"\n    },\n    {\n        \"name\": \"过验证\",\n        \"type\": \"button\",\n        \"action\": \"v()\"\n    }\n]",
        "loginUrl": "function login(){var o=source.getLoginInfoMap()?.get(\"卡密\");source.putLoginHeader(JSON.stringify({Authorization:o}))}",
        "respondTime": 180000,
        "ruleBookInfo": {
            "author": "span.author@text##作者:##",
            "coverUrl": "meta[property=\"og:image\"]@content",
            "intro": "meta[property=\"og:description\"]@content",
            "kind": "@js:bid=baseUrl.match(/book\\/(\\d+)/)[1],u=`https://m.qidian.com/majax/book/category?bookId=${bid}&`+getCsrfToken(this),h=java.ajax(u);kind=Array.from(book.kind.split(\"\\n\")),free=JSON.parse(h).data.limitFreeType,\"3\"!=String(free)||book.kind.contains(\"\\u9650\\u514d\")||kind.push(\"\\u9650\\u514d\"),kind;",
            "lastChapter": "a.book-latest-chapter@text",
            "name": "h1@text",
            "wordCount": "p.count em:first-child@text"
        },
        "ruleContent": {
            "content": "@js:let content;if(chapter.isVip()){function isLatest(t){t=new Date(t.replace(/-/g,\"/\")).getTime();return Date.now()-t<=1728e5}if(isLatest(String(chapter.tag)))throw new Error(\"\\u6682\\u672a\\u66f4\\u65b0\");let t=baseUrl.match(/\\/(\\d+)\\/(\\d+)\\//),e=java.ajax(`${host}/qd/content?bookId=${t[1]}&chapterId=`+t[2]);if(e=JSON.parse(e),!(content=e.data))throw new Error(e.msg)}else content=java.getString(\"main[id^=c-] p@html\");content;"
        },
        "ruleExplore": {
            "author": "$.author",
            "bookList": "@js:list=[],blist=java.getElements(\".all-img-list@li||li[data-rid]\"),$=(t,i)=>java.getString(t,i),blist.forEach(t=>{list.push({title:$(\"h2@text\",t),author:$(\"class.name.0@text\",t),kind:$(\".author > a:nth-child(4)@text&&.go-sub-type@text&&span:nth-child(8)@text\",t),intro:$(\".intro@html\",t),img:$(\"a@img@src\",t),link:$(\".book-img-box > a@href\",t)})}),0<list.length?list.map(t=>JSON.stringify(t)):list=[{}];",
            "bookUrl": "$.link",
            "coverUrl": "$.img",
            "intro": "$.intro",
            "kind": "$.kind",
            "name": "$.title"
        },
        "ruleReview": {
            "detailAvatarRule": "$.UserHeadIcon",
            "detailBadgeRule": "$.TitleInfoList[*].TitleImage",
            "detailContentRule": "@js:\nconst J = (a) => java.getString(a);\n\nJSON.stringify({\n  text: formatEmoji(String(J(\"$.Content\"))),\n  img: J(\"$.ImageDetail\"),\n  audio: J(\"$.AudioUrl\"),\n  time: java.timeFormat(J(\"$.CreateTime\")) + J(\"$.IpLocation\"),\n  likeCount: J(\"$.AgreeAmount\"),\n  //replyCount,\n});",
            "detailIdRule": "$.Id",
            "detailListRule": "@js:\nconst data = JSON.parse(result).Data.DataList;\nconst R1 = new Map();\n\nfor (const item of data) {\n  if (item.Id === item.RootReviewId) {\n    item.replyList = [];\n    R1.set(item.Id, item);\n  } else {\n    const root = R1.get(item.RootReviewId);\n    if (root) {\n      root.replyList.push(item);\n    }\n  }\n}\n\nconst arr = [...R1.values()];arr",
            "detailNameRule": "$.UserName",
            "enabled": true,
            "replyAvatarRule": "$.UserHeadIcon",
            "replyBadgeRule": "$.TitleInfoList[*].TitleImage",
            "replyContentRule": "@js:\nconst J = (a) => java.getString(a);\n\nJSON.stringify({\n  text: formatEmoji(String(J(\"$.Content\"))),\n  img: J(\"$.ImageDetail\"),\n  audio: J(\"$.AudioUrl\"),\n  time: java.timeFormat(J(\"$.CreateTime\")) + J(\"$.IpLocation\"),\n  likeCount: J(\"$.AgreeAmount\"),\n  //replyCount,\n});",
            "replyIdRule": "$.Id",
            "replyListRule": "$.replyList[*]",
            "replyNameRule": "$.UserName",
            "reviewDetailNextPageUrl": "@js:\nlet u = String(baseUrl).replace(/pg=\\d+/, `pg=${++page}`);\n`${u},{\"headers\":${JSON.stringify(QDSign(u))}}`",
            "reviewDetailUrl": "@js:\nlet t=baseUrl.match(/\\/(\\d+)\\/(\\d+)\\//),bid = t[1],cid = t[2];\nlet u = `https://druidv6.if.qidian.com/argus/api/v2/chapterreview/getparagraphscomments?anchorId=0&bookId=${bid}&chapterId=${cid}&from=0&paragraphId=${paraIndex}&pg=${page}&pz=20&type=0`;\n`${u},{\"headers\":${JSON.stringify(QDSign(u))}}`",
            "reviewSummaryUrl": "@js:\nlet t=baseUrl.match(/\\/(\\d+)\\/(\\d+)\\//),bid = t[1],cid = t[2];;`https://m.qidian.com/majax/chapterReview/reviewSummary?bookId=${bid}&chapterId=${cid}&${getCsrfToken(this)}`",
            "summaryCountRule": "$.textCount",
            "summaryListRule": "$.data.list",
            "summaryParagraphIndexRule": "$.paragraphId"
        },
        "ruleSearch": {
            "author": "p.author a.name@text",
            "bookList": "li.res-book-item",
            "bookUrl": "h3.book-info-title a@href",
            "checkKeyWord": "凡人修仙传",
            "coverUrl": ".book-img-box img@src",
            "intro": "p.intro@text",
            "kind": "p.author a:not(.name)@text",
            "lastChapter": "p.update a@text",
            "name": "h3.book-info-title a@text",
            "wordCount": ".book-right-info .total p:first-child span@text"
        },
        "ruleToc": {
            "chapterList": "<js>(()=>{let r=[];let vs=java.getElements('.catalog-volume');for(let i=0;i<vs.size();i++){let v=vs.get(i);let vn=String(java.getString('h3.volume-name@text',v)||'').replace(/·共\\d+章.*$/,'').trim();if(vn){r.push({n:vn,u:'',iv:true,ip:false,t:''});}let cs=v.select('.chapter-item');for(let j=0;j<cs.size();j++){let c=cs.get(j);let tl=String(java.getString('a.chapter-name@title',c)||'');let m=tl.match(/首发时间：(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})/);r.push({n:String(java.getString('a.chapter-name@text',c)||''),u:String(java.getString('a.chapter-name@href',c)||''),iv:false,ip:!!String(java.getString('em.chapter-locked@html',c)),t:m?m[1]:''});}}return r.map(a=>JSON.stringify(a));})();</js>",
            "chapterName": "$.n",
            "chapterUrl": "$.u",
            "isVip": "$.ip",
            "isVolume": "$.iv",
            "updateTime": "$.t"
        },
        "searchUrl": "https://www.qidian.com/so/{{key}}.html",
        "weight": 0
    }
]