74小说网
https://www.74xswz.com
ycbsteamed-buns (14809)10/06 00:47
修复目录
{
"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
}