可乐小说
https://www.rrssk.com/
laizhiyu (6509)3天前
可乐小说(人人搜书库),搜索使用AES-256-CBC加密。目录分页支持HTML首页+AJAX后续页,密钥动态提取+硬编码兜底。chapterList返回JS对象数组,chapterName/chapterUrl直接属性访问。v4.0
【搜索修复 v5.0】
搜索URL格式变更:k-{enc}.html(已404) → ?action=result&keyword={enc}&page={page}
搜索结果HTML结构变更:.rankIBox.searchIBox → .book-card
bookUrl提取:onclick属性解码(URL解码→提取t参数→Base64解码→kelexs.com URL)
新增header和bookUrlPattern字段
【搜索修复 v5.1】
搜索请求 ?action=result 会重定向到 ?action=find&v=12&q={enc2},返回的 book-card onclick 中 t 参数 Base64 解码后为 /{数字ID}.html(rrssk 相对路径,非 kelexs 完整URL),导致 bookUrl 不匹配 bookUrlPattern 被过滤、搜索失效。
修复:bookUrl 规则在解码 t 后,将 /{数字ID}.html 转换为 https://www.kelexs.com/book/{数字ID}.html(该格式在 kelexs.com 上可直接打开详情/目录/正文)。 {
"bookSourceComment": "可乐小说(人人搜书库),搜索使用AES-256-CBC加密。目录分页支持HTML首页+AJAX后续页,密钥动态提取+硬编码兜底。chapterList返回JS对象数组,chapterName\/chapterUrl直接属性访问。v4.0\n\n【搜索修复 v5.0】\n搜索URL格式变更:k-{enc}.html(已404) → ?action=result&keyword={enc}&page={page}\n搜索结果HTML结构变更:.rankIBox.searchIBox → .book-card\nbookUrl提取:onclick属性解码(URL解码→提取t参数→Base64解码→kelexs.com URL)\n新增header和bookUrlPattern字段\n\n【搜索修复 v5.1】\n搜索请求 ?action=result 会重定向到 ?action=find&v=12&q={enc2},返回的 book-card onclick 中 t 参数 Base64 解码后为 \/{数字ID}.html(rrssk 相对路径,非 kelexs 完整URL),导致 bookUrl 不匹配 bookUrlPattern 被过滤、搜索失效。\n修复:bookUrl 规则在解码 t 后,将 \/{数字ID}.html 转换为 https:\/\/www.kelexs.com\/book\/{数字ID}.html(该格式在 kelexs.com 上可直接打开详情\/目录\/正文)。",
"bookSourceGroup": "小说",
"bookSourceName": "可乐小说",
"bookSourceType": 0,
"bookSourceUrl": "https:\/\/www.rrssk.com\/",
"bookUrlPattern": "https?:\/\/www\\.kelexs\\.com\/book\/\\w+\\.html",
"customButton": false,
"customOrder": 23,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": false,
"exploreUrl": "————————二次元——————————\n原生幻想::https:\/\/www.kelexs.com\/list-25-{{page}}\/\n恋爱日常::https:\/\/www.kelexs.com\/list-26-{{page}}\/\n衍生同人::https:\/\/www.kelexs.com\/list-27-{{page}}\/\n搞笑吐槽::https:\/\/www.kelexs.com\/list-28-{{page}}\/\n综合排行::https:\/\/www.kelexs.com\/rank-{{page}}.html\n————————男生———————————\n玄幻小说::https:\/\/www.kelexs.com\/list-4-{{page}}\/\n奇幻小说::https:\/\/www.kelexs.com\/list-5-{{page}}\/\n武侠小说::https:\/\/www.kelexs.com\/list-6-{{page}}\/\n仙侠小说::https:\/\/www.kelexs.com\/list-7-{{page}}\/\n都市小说::https:\/\/www.kelexs.com\/list-8-{{page}}\/\n军事小说::https:\/\/www.kelexs.com\/list-9-{{page}}\/\n历史小说::https:\/\/www.kelexs.com\/list-10-{{page}}\/\n游戏小说::https:\/\/www.kelexs.com\/list-11-{{page}}\/\n体育小说::https:\/\/www.kelexs.com\/list-12-{{page}}\/\n科幻小说::https:\/\/www.kelexs.com\/list-13-{{page}}\/\n诸天无限::https:\/\/www.kelexs.com\/list-14-{{page}}\/\n悬疑小说::https:\/\/www.kelexs.com\/list-15-{{page}}\/\n——————女生—————————————\n古代言情::https:\/\/www.kelexs.com\/list-16-{{page}}\/\n仙侠奇缘::https:\/\/www.kelexs.com\/list-17-{{page}}\/\n现代言情::https:\/\/www.kelexs.com\/list-18-{{page}}\/\n浪漫青春::https:\/\/www.kelexs.com\/list-19-{{page}}\/\n玄幻言情::https:\/\/www.kelexs.com\/list-20-{{page}}\/\n悬疑推理::https:\/\/www.kelexs.com\/list-21-{{page}}\/\n科幻空间::https:\/\/www.kelexs.com\/list-22-{{page}}\/\n游戏竞技::https:\/\/www.kelexs.com\/list-23-{{page}}\/\n短篇言情::https:\/\/www.kelexs.com\/list-24-{{page}}\/\n轻小说::https:\/\/www.kelexs.com\/list-42-{{page}}\/",
"header": "{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 12; Pixel 6) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Mobile Safari\/537.36\"}",
"lastUpdateTime": "1786676165434",
"loginUrl": "https:\/\/www.rrssk.com\/",
"respondTime": 180000,
"ruleBookInfo": {
"author": "meta[property=og:novel:author]@content",
"coverUrl": "meta[property=og:image]@content",
"intro": "meta[property=og:description]@content",
"kind": "meta[property=og:novel:category]@content",
"lastChapter": "meta[property=og:novel:latest_chapter_name]@content",
"name": "meta[property=og:novel:book_name]@content",
"tocUrl": "<js>var tocUrl=baseUrl.replace('\/book\/','\/chapter\/');try{var html=java.ajax(book.bookUrl);if(html){var jsMatch=html.match(\/script type=\"text\\\/javascript\" src=\"(\\\/templates\\\/js\\\/[A-Za-z0-9]+\\.js)\"\/)||html.match(\/src=\"(\\\/templates\\\/js\\\/[A-Za-z0-9]+\\.js)\"\/);if(jsMatch){var jsUrl='https:\/\/www.kelexs.com'+jsMatch[1];var jsContent=java.ajax(jsUrl);if(jsContent){var keyMatch=jsContent.match(\/new AESCrypt\\('([A-Za-z0-9]{32})'\\)\/);var ivMatch=jsContent.match(\/CryptoJS\\.enc\\.Utf8\\.parse\\('(\\d{16})'\\)\/);if(keyMatch){cache.put('kelexs_key',keyMatch[1],86400);}if(ivMatch){cache.put('kelexs_iv',ivMatch[1],86400);}}}}}catch(e){}tocUrl<\/js>"
},
"ruleContent": {
"content": "<js>\nvar html = String(result);\nvar source = \"内暴强情缝肏插逼操潮喷阴艳裸乳荡穴鸡淫苞奸胸射嫩肉骚性蒂茎陰騷奶屄成人药春迷尿粉肛龟头A精屌口狂蜜处女唇道阳虐虫妇液色颜熟交爽臀爆舔做爱欲吹自慰点gG玉幼援抽Bb水母狗户部要了奴小脚痒酥死我兽揉搓捏扣抠棍棒洞密美少摩腿春乱伦露漏浪开巨根菊巴黑豪好肥送艳被干拔乱理白刺体下面诱感快货比日妈你娘婊子配仙火叫在里子宫给聊照流群屁眼马无码友拳洞片黄偷禁套弄位脱光舒服溜舞丢还糜妻换妓招嫖娼aA毛Hh一夜本热推图书娃男抓浑圆饱满润湿滑丰腴韵尤物横陈存娇喘息麻桃透风腹长粗肿胀人紧夹吸撅起来雪发翘硕大胴双草坐挲跨柔软臂瘫媚秘破\";\nvar replacementChars = source.split(\"\");\nreplacementChars[43] = \"AV\";\nhtml = html.replace(\/<i class=\"icon icon-uni([0-9a-fA-F]{4})\"><\\\/i>\/g, function(_, p1) {\n return String.fromCharCode(parseInt(p1, 16));\n});\nvar decoded = [];\nfor (var i = 0; i < html.length; i++) {\n var code = html.charCodeAt(i);\n if (code >= 0xE001 && code <= 0xE101) {\n decoded.push(replacementChars[code - 0xE001]);\n } else {\n decoded.push(html.charAt(i));\n }\n}\nhtml = decoded.join('');\nvar doc = Packages.org.jsoup.Jsoup.parse(html);\nvar contentDiv = doc.selectFirst('div.content');\nvar lines = [];\nif (contentDiv) {\n var ps = contentDiv.select('p');\n for (var i = 0; i < ps.size(); i++) {\n var t = String(ps.get(i).text()).replace(\/\\u00a0\/g, ' ').trim();\n if (t) lines.push(t);\n }\n var startIdx = -1;\n for (var i = 0; i < lines.length; i++) {\n if (\/^第\\d+章|^序章|^楔子|^引子\/.test(lines[i])) {\n startIdx = i;\n break;\n }\n }\n if (startIdx > 0) {\n lines = lines.slice(startIdx);\n } else if (startIdx === -1) {\n lines = lines.filter(function(l) {\n return !\/本书由.*?发行|版权所有|侵权必究|^\\s*·\\s*$\/.test(l);\n });\n }\n}\nlines.join('\\n');\n<\/js>",
"nextContentUrl": ".btnW a:contains(下一页)@href",
"title": "h1@text"
},
"ruleExplore": {
"author": ".txtb .info:not(.infoM2) dl:nth-child(1) dd@text",
"bookList": ".rankIBox .list.dList li",
"bookUrl": ".picb .pic a@href",
"coverUrl": ".picb .pic a img@src",
"intro": ".txtb .intro@text",
"kind": ".txtb .info:not(.infoM2) dl:nth-child(2) dd@text",
"name": ".txtb .name a@text"
},
"ruleSearch": {
"author": ".book-card__meta@text##[\\s\\S]*?作者:([\\s\\S]*?)分类[\\s\\S]*##$1",
"bookList": ".book-card",
"bookUrl": "<js>var oc='';try{oc=result.attr?result.attr('onclick'):String(result)}catch(e){oc=String(result)}var m=oc.match(\/open\\('([^']+)'\/);if(m){var path=decodeURIComponent(m[1]);var t=path.match(\/t=([^&]+)\/);if(t){var b64=t[1];try{b64=decodeURIComponent(b64)}catch(e){}var decoded=String(java.base64Decode(b64));if(\/^https?:\\\/\\\/\/.test(decoded)){result=decoded;}else if(\/^\\\/book\\\/\/.test(decoded)){result='https:\/\/www.kelexs.com'+decoded;}else{var idMatch=decoded.match(\/(\\d+)\\.html\/);if(idMatch){result='https:\/\/www.kelexs.com\/book\/'+idMatch[1]+'.html';}else{result='https:\/\/www.kelexs.com'+decoded;}}}else{result='';}}else{result='';}<\/js>",
"coverUrl": ".book-card__cover img@src",
"intro": ".book-card__desc@text",
"kind": ".book-card__meta@text##[\\s\\S]*?分类:([\\s\\S]*?)$##$1",
"lastChapter": ".book-tag--status@text",
"name": ".book-card__title@text"
},
"ruleToc": {
"chapterList": "<js>var resStr = result.toString().trim(); var elements = []; if (resStr.charAt(0) == '{' || resStr.charAt(0) == '[') { var parsed = false; try { var json = JSON.parse(resStr); if (json.code == 0 && json.data && json.data.length > 0) { for (var i = 0; i < json.data.length; i++) { var ch = json.data[i]; elements.push({ chaptername: ch.chaptername, chapterurl: 'https:\/\/www.kelexs.com' + ch.chapterurl }); } parsed = true; } } catch (e) {} if (!parsed || elements.length == 0) { var nameRegex = \/\"chaptername\":\"([^\"]+)\"\/g; var urlRegex = \/\"chapterurl\":\"([^\"]+)\"\/g; var names = []; var urls = []; var m; while ((m = nameRegex.exec(resStr)) !== null) { names.push(m[1]); } while ((m = urlRegex.exec(resStr)) !== null) { urls.push(m[1]); } for (var i = 0; i < names.length && i < urls.length; i++) { elements.push({ chaptername: names[i], chapterurl: 'https:\/\/www.kelexs.com' + urls[i] }); } } } else { var startIdx = resStr.indexOf('class=\"chapList chapListBody\"'); if (startIdx == -1) { startIdx = resStr.indexOf(\"class='chapList chapListBody'\"); } if (startIdx != -1) { var endIdx = resStr.indexOf('<\/ul>', startIdx); if (endIdx != -1) { var section = resStr.substring(startIdx, endIdx + 5); var liRegex = \/<li[\\s\\S]*?<\\\/li>\/g; var m; while ((m = liRegex.exec(section)) !== null) { var aMatch = m[0].match(\/<a\\s+[^>]*href=\"([^\"]+)\"[^>]*>([^<]+)<\\\/a>\/i); if (aMatch) { elements.push({ chaptername: aMatch[2], chapterurl: 'https:\/\/www.kelexs.com' + aMatch[1] }); } } } } } elements<\/js>",
"chapterName": "chaptername",
"chapterUrl": "chapterurl",
"nextTocUrl": "<js>var resStr = result.toString().trim(); var nextUrl = ''; var id = ''; var currentPage = 1; var idMatch = baseUrl.match(\/[?&]id=([^&]+)\/); id = idMatch ? idMatch[1] : ''; if (!id) { var chapterMatch = baseUrl.match(\/chapter\\\/([^.]+)\\.html\/); id = chapterMatch ? chapterMatch[1] : ''; } if (!id && book) { var bookMatch = book.bookUrl.match(\/book\\\/([^.]+)\\.html\/); id = bookMatch ? bookMatch[1] : ''; } var pageMatch = baseUrl.match(\/[?&]page=(\\d+)\/); if (pageMatch) { currentPage = parseInt(pageMatch[1]); } if (id) { var hasMore = false; if (resStr.charAt(0) == '{' || resStr.charAt(0) == '[') { try { var json = JSON.parse(resStr); if (json.code == 0 && json.data) { if (json.data.length >= 100) { hasMore = true; } } } catch (e) { var countMatch = resStr.match(\/\"chaptername\"\/g); if (countMatch && countMatch.length >= 100) { hasMore = true; } } } else { var countMatch = resStr.match(\/<li[\\s>]\/g); if (countMatch && countMatch.length >= 100) { hasMore = true; } } if (hasMore) { var nextPage = currentPage + 1; var keyStr = cache.get('kelexs_key'); var ivStr = cache.get('kelexs_iv'); if (!keyStr || !ivStr) { try { var html = java.ajax(book.bookUrl); if (html) { var jsMatch = html.match(\/script type=\"text\\\/javascript\" src=\"(\\\/templates\\\/js\\\/[A-Za-z0-9]+\\.js)\"\/) || html.match(\/src=\"(\\\/templates\\\/js\\\/[A-Za-z0-9]+\\.js)\"\/); if (jsMatch) { var jsUrl = 'https:\/\/www.kelexs.com' + jsMatch[1]; var jsContent = java.ajax(jsUrl); if (jsContent) { var keyMatch = jsContent.match(\/new AESCrypt\\('([A-Za-z0-9]{32})'\\)\/); var ivMatch = jsContent.match(\/CryptoJS\\.enc\\.Utf8\\.parse\\('(\\d{16})'\\)\/); if (keyMatch) { keyStr = keyMatch[1]; cache.put('kelexs_key', keyStr, 86400); } if (ivMatch) { ivStr = ivMatch[1]; cache.put('kelexs_iv', ivStr, 86400); } } } } } catch (e) {} if (!keyStr) { keyStr = 'fx2zcphhn3MhznJlrfGMXN7ZefBa6eny'; } if (!ivStr) { ivStr = '5486678252717425'; } } if (keyStr && ivStr) { var crypto = java.createSymmetricCrypto('AES\/CBC\/PKCS5Padding', keyStr, ivStr); var data = JSON.stringify({id: id, page: nextPage}); var enc = crypto.encryptBase64(data); nextUrl = 'https:\/\/www.kelexs.com\/index.php?action=loadChapterPage&id=' + id + '&page=' + nextPage + ',{\"method\":\"POST\",\"body\":\"data=' + enc + '\"}'; } } } nextUrl<\/js>"
},
"searchUrl": "<js>var keyStr='lzxHpH8PLGXcrCIQ';var key32=keyStr;while(key32.length < 32){key32 += String.fromCharCode(0);}var crypto=java.createSymmetricCrypto('AES\/CBC\/PKCS5Padding',key32,keyStr);var enc=crypto.encryptBase64(key);var url='https:\/\/www.rrssk.com\/?action=result&keyword='+java.encodeURI(enc)+'&page='+page;url<\/js>",
"weight": 0
}