[{"bookSourceComment":"作者：纳兰容若\n74小说网 · 目录AES密钥动态抓取+按章号排序版","bookSourceGroup":"自制","bookSourceName":"74小说网","bookSourceType":0,"bookSourceUrl":"https:\/\/www.74xswz.com","concurrentRate":"500","customButton":false,"customOrder":13,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"玄幻::\/list-4\/{{page}}.html\n奇幻::\/list-5\/{{page}}.html\n武侠::\/list-6\/{{page}}.html\n仙侠::\/list-7\/{{page}}.html\n历史::\/list-10\/{{page}}.html\n游戏::\/list-11\/{{page}}.html\n科幻::\/list-13\/{{page}}.html\n诸天无限::\/list-14\/{{page}}.html\n悬疑::\/list-15\/{{page}}.html\n现代言情::\/list-18\/{{page}}.html\n玄幻言情::\/list-20\/{{page}}.html\n衍生同人::\/list-27\/{{page}}.html","header":"{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Mobile Safari\/537.36\"}","lastUpdateTime":"1791218847196","respondTime":30000,"ruleBookInfo":{"author":".author a@text","coverUrl":".pic img@src","intro":".intro.font14@text","kind":".label a span@text","lastChapter":".direList.font16 ul li.0 .name a@text","name":"h1@text"},"ruleContent":{"content":"#content@html||.content@html","nextContentUrl":"text.下一页@href"},"ruleExplore":[],"ruleSearch":{"author":".book-card__meta-item.0@text##作者：","bookList":"<js>\nvar resp = \"\";\nvar base = String(baseUrl);\nvar kw = \"\";\nvar km = base.match(\/[?&]kw=([^&]*)\/);\nif (km) { try { kw = decodeURIComponent(km[1]); } catch (e) { kw = km[1]; } }\nvar html = String(result);\nvar tm = html.match(\/name=\"_t\"\\s+value=\"([^\"]+)\"\/);\nvar token = tm ? tm[1] : \"\";\nvar sm = html.match(\/src=\"(\\\/\\?action=signJs[^\"]*)\"\/);\nvar signUrl = sm ? sm[1] : \"\";\nif (kw && token && signUrl) {\n  var signJs = String(java.ajax(\"https:\/\/www.rrssk.com\" + signUrl, 10000));\n  var m1 = \/if\\s*\\(\\s*typeof\\s+(\\w+)\\s*!==\\s*\"number\"\\s*\\|\\|\\s*\\1\\s*!==\\s*(\\d+)\\s*\\)\/.exec(signJs);\n  var m2 = \/if\\s*\\(\\s*(\\w+)\\s*!==\\s*1\\s*\\)\/.exec(signJs);\n  if (m1 && m2) {\n    var sv = m1[1], th = m1[2], tv = m2[1];\n    var code = signJs.replace(new RegExp(\"var\\\\s+\"+sv+\"\\\\s*=\\\\s*0\\\\s*;\",\"g\"), \"var \"+sv+\"=\"+th+\";\")\n      .replace(new RegExp(sv+\"\\\\s*\\\\+=\\\\s*[^;]*;\",\"g\"), \"\")\n      .replace(new RegExp(\"var\\\\s+\"+tv+\"\\\\s*=\\\\s*0\\\\s*;\",\"g\"), \"var \"+tv+\"=1;\");\n    var window = {addEventListener: function(){}, location: {href: \"https:\/\/www.rrssk.com\/003Q.html\"}};\n    try { eval(code); } catch (e) { }\n    if (window.__SIGN) {\n      var ts = Math.floor(new Date().getTime() \/ 1000);\n      var enc = encodeURIComponent(kw).replace(\/[!'()*]\/g, function(c){return \"%\"+c.charCodeAt(0).toString(16).toUpperCase();});\n      var sig = String(window.__SIGN.f(enc, token, ts));\n      if (sig !== \"00000000\") {\n        var body = \"keyword=\" + encodeURIComponent(kw) + \"&_t=\" + token + \"&_ts=\" + ts + \"&_s=\" + sig;\n        resp = String(java.ajax(\"https:\/\/www.rrssk.com\/?action=search,\" + JSON.stringify({method:\"POST\", body:body, header:{\"Referer\":\"https:\/\/www.rrssk.com\/003Q.html\", \"Content-Type\":\"application\/x-www-form-urlencoded\"}}), 20000));\n      }\n    }\n  }\n}\nresp;\n<\/js>class.book-card","bookUrl":"<js>\nvar oc = String(result.attr(\"onclick\"));\nvar m = oc.match(\/[?&]t=([^&']+)\/);\nvar u = m ? m[1] : \"\";\ntry { u = decodeURIComponent(u); } catch (e) { }\nvar s = u.replace(\/-\/g, \"+\").replace(\/_\/g, \"\/\");\nwhile (s.length % 4 != 0) { s += \"=\"; }\ntry { u = String(java.base64Decode(s)); } catch (e) { }\nu;\n<\/js>","coverUrl":".book-card__cover img@src","intro":".book-card__desc@text","kind":".book-card__meta-item.1@text##分类：","name":".book-card__title@text"},"ruleToc":{"chapterList":"<js>\nvar html = String(result);\nvar arr = [];\n\n\/\/ ---- 1. 抓 aid ----\nvar aid = \"\";\nvar am = html.match(\/data-aid\\s*=\\s*[\"']([^\"']+)[\"']\/);\nif (am) aid = am[1];\nif (!aid) { var am2 = html.match(\/articleid\\s*=\\s*[\"']([^\"']+)[\"']\/); if (am2) aid = am2[1]; }\njava.log('TOC aid=' + aid);\n\n\/\/ ---- 2. 抓随机名 JS，提取新 key \/ iv ----\nvar key = \"9Ug2kRcmX9MxFyRR0lbX4OayTqgVtsQ2\";\nvar iv  = \"7011822584532415\";\nvar jm = html.match(\/\\\/templates\\\/js\\\/([A-Za-z0-9]{16,})\\.js\/);\nif (jm) {\n  var jsUrl = \"https:\/\/www.74xswz.com\/templates\/js\/\" + jm[1] + \".js\";\n  try {\n    var js = String(java.ajax(jsUrl, 15000));\n    var km = js.match(\/new\\s+AESCrypt\\s*\\(\\s*[\"']([A-Za-z0-9+\/=]{16,64})[\"']\\s*\\)\/);\n    if (km) key = km[1];\n    var im = js.match(\/iv\\s*[:=]\\s*CryptoJS\\.enc\\.Utf8\\.parse\\s*\\(\\s*[\"']([^\"']{16})[\"']\\s*\\)\/);\n    if (im) iv = im[1];\n  } catch (e) { java.log('TOC jsERR=' + e); }\n}\njava.log('TOC key=' + key + ' iv=' + iv);\n\n\/\/ ---- 3. 抓总页数 ----\nvar pages = 1;\nvar re = \/<option[^>]*value=\"(\\d+)\"[^>]*>\/g, mm;\nwhile ((mm = re.exec(html)) !== null) {\n  var p = parseInt(mm[1], 10);\n  if (p > pages) pages = p;\n}\n\n\/\/ ---- 4. AES 分页 → 收集到数组 ----\nif (aid && pages > 0) {\n  try {\n    var cipher = java.createSymmetricCrypto(\"AES\/CBC\/PKCS5Padding\", key, iv);\n    for (var p = 1; p <= pages; p++) {\n      try {\n        var enc = cipher.encryptBase64(JSON.stringify({id: aid, page: p}));\n        var body = \"data=\" + java.encodeURI(enc);\n        var res = String(java.ajax(\"https:\/\/www.74xswz.com\/index.php?action=loadChapterPage,\" + JSON.stringify({method:\"POST\", body:body, header:{\"Content-Type\":\"application\/x-www-form-urlencoded\", \"Referer\": String(baseUrl)}}), 20000));\n        var jo = JSON.parse(res);\n        if (jo && jo.code == 0 && jo.data) {\n          for (var k = 0; k < jo.data.length; k++) {\n            arr.push({url: jo.data[k].chapterurl, name: jo.data[k].chaptername});\n          }\n        }\n      } catch (e) { java.log('TOC P' + p + ' err=' + e); }\n    }\n  } catch (e) { java.log('TOC cipher err=' + e); }\n}\n\n\/\/ ---- 5. 按 URL 中的章节序号升序排序 ----\narr.sort(function(a, b) {\n  var na = 0, nb = 0;\n  var ma = String(a.url).match(\/-(\\d+)\\.html\/);\n  var mb = String(b.url).match(\/-(\\d+)\\.html\/);\n  if (ma) na = parseInt(ma[1], 10);\n  if (mb) nb = parseInt(mb[1], 10);\n  return na - nb;\n});\njava.log('TOC sorted first=' + (arr[0] ? arr[0].name : '') + ' last=' + (arr[arr.length-1] ? arr[arr.length-1].name : ''));\n\n\/\/ ---- 6. 拼 HTML ----\nvar all = \"\";\nfor (var i = 0; i < arr.length; i++) {\n  all += '<a href=\"' + arr[i].url + '\">' + arr[i].name + '<\/a>';\n}\n\n\/\/ ---- 7. 兜底 ----\nif (all.length == 0) {\n  var doc = java.getElement('.direList.listData') || java.getElement('.listData') || java.getElement('.direList');\n  if (doc) {\n    var as = doc.select('a');\n    for (var i = 0; i < as.size(); i++) {\n      all += '<a href=\"' + as.get(i).attr('href') + '\">' + as.get(i).text() + '<\/a>';\n    }\n  }\n}\nall;\n<\/js>a","chapterName":"text","chapterUrl":"href"},"searchUrl":"https:\/\/www.rrssk.com\/003Q.html?kw={{key}}&page={{page}}","weight":0}]