🌟卡拉漫画
https://www.kalamanhua.com
langzaier (13654)10/02 22:54
2026.10.2
更新了图片解密逻辑。此网站有限流。
{
"bookSourceComment": "by狼崽儿 \/\/2026.8.19\n融合了好几个有名漫画网站资源的漫画网站。bug未知,如果有问题先从登录处进去搜索查看漫画,走一遍真人搜索流程。\n有些线路或者有些漫画本身资源有问题,线路问题换线路,漫画显示章节下架就说明看不了了。",
"bookSourceGroup": "漫画书源",
"bookSourceName": "🌟卡拉漫画",
"bookSourceType": 2,
"bookSourceUrl": "https:\/\/www.kalamanhua.com",
"customOrder": 0,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"exploreUrl": "@js:\nvar result = [];\nvar push = function(title, url, size) {\n result.push({\n title: title,\n url: url,\n style: {\n layout_flexGrow: 1,\n layout_flexBasisPercent: size\n }\n });\n};\nvar regions = [\n {name: '全部', code: '26'},\n {name: '韩漫', code: 'Kc'},\n {name: '日漫', code: 'Jc'},\n {name: '中漫', code: 'Cc'},\n {name: '欧美漫', code: 'Ec'},\n {name: '其他', code: 'Oc'}\n];\nvar types = [\n 'All', '恋爱', '冒险', '生活', '校园', '热血', '魔法', '悬疑', '科幻',\n '运动', '都市', '耽美', '搞笑', '单女主', '纯爱', '总裁', '奇幻', '恐怖',\n '灵异', '异能', '穿越', '剧情', '古风', '言情', '玄幻', '复仇', '多女主',\n '霸总', '虐恋', '青春', '真人', '重生', '甜宠', '游戏竞技', '家庭', 'BL',\n '民国', '同人', '系统', '爱情', '美人', '喜剧', '纯真', '腹黑', '财阀',\n '后宫', '战争', '修真', '其他'\n];\nfor (var r = 0; r < regions.length; r++) {\n var region = regions[r];\n for (var t = 0; t < types.length; t++) {\n var type = types[t];\n var isAll = (t === 0);\n var base;\n if (isAll) {\n base = '\/type\/' + region.code;\n } else {\n var encodedType = (type === 'All' || type === 'BL') ? type : encodeURIComponent(type);\n base = '\/type\/' + region.code + '--' + encodedType;\n }\n var url;\n if (isAll) {\n url = '@js:var base=\"' + base + '\";if(page==1){base+\"-----.html\";}else{base+\"---\"+page+\"--.html\";}';\n } else {\n url = '@js:var base=\"' + base + '\";if(page==1){base+\"---.html\";}else{base+\"-\"+page+\"--.html\";}';\n }\n var title;\n if (isAll) {\n title = '📌 ' + region.name + '·全部';\n } else {\n title = region.name + '·' + type;\n }\n var size = isAll ? 1 : 0.35;\n push(title, url, size);\n }\n}\nJSON.stringify(result);",
"header": "{\n \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Mobile Safari\/537.36\",\n \"Referer\": \"https:\/\/www.kalamanhua.com\",\n \"Cookie\": \"omo_token=93920aae5a549395; cf_human_passed=true\"\n}",
"lastUpdateTime": "1790952895947",
"loginCheckJs": "",
"loginUrl": "https:\/\/www.kalamanhua.com",
"respondTime": 15781,
"ruleBookInfo": {
"author": "##作者:([^<]+)<##$1###",
"coverUrl": ".stui-content__thumb img@data-original@js:result + ',{\"headers\":{\"Referer\":\"https:\/\/www.kalamanhua.com\"}}'",
"intro": "@js:\nvar names = [];\nvar tm = result.match(\/data-toggle=\"tab\"[^>]*>([^<]+)<\/g);\nif (tm) {\n for (var i = 0; i < tm.length; i++) {\n var mm = tm[i].match(\/>([^<]+)<\/);\n if (mm) names.push(mm[1]);\n }\n}\nvar n = names.length;\nif (n === 0) {\n n = (result.match(\/<ul class=\"stui-content__playlist\/g) || []).length;\n for (var z = 0; z < n; z++) {\n names.push('线路' + (z + 1));\n }\n}\nvar xu = '0';\ntry {\n var cv = book.getVariable('custom');\n if (cv != null && cv != '') {\n xu = String(cv);\n }\n} catch(e) {}\nif (xu == '0' || xu == '') {\n var ov = String(book.variable || '');\n if (ov != '') {\n xu = ov;\n }\n}\nvar list = '';\nfor (var i2 = 0; i2 < names.length; i2++) {\n list += '◖' + i2 + '◗' + names[i2] + ' ';\n}\nvar lineInfo = '【线路列表】' + list.trim() + '\\n当前来源◖' + xu + '◗\\n(右上角书籍变量填 0-' + (n - 1) + ' 刷新切换线路)';\nvar desc = '';\nvar dcMatch = result.match(\/<span class=\"detail-content\" style=\"display: none;\">([\\s\\S]*?)<\\\/span>\/);\nif (dcMatch) {\n desc = dcMatch[1].trim();\n}\nif (!desc) {\n var dsMatch = result.match(\/<span class=\"detail-sketch\">([\\s\\S]*?)<\\\/span>\/);\n if (dsMatch) {\n desc = dsMatch[1].trim();\n }\n}\nif (!desc) {\n desc = java.getString('meta[name=\"description\"]@content') || '';\n}\nlineInfo + '\\n\\n📖 简介:' + desc;",
"kind": ".stui-content__detail@text##类型:(.+?)地区:##$1##",
"lastChapter": ".data span@text",
"name": "h1.title@text"
},
"ruleContent": {
"content": "@js:\nvar out = '';\nvar dbg = '';\nvar UA = 'Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Mobile Safari\/537.36';\nvar REF = 'https:\/\/www.kalamanhua.com\/';\nvar CDN = 'https:\/\/image.kalaimg.top';\n\nvar logd = function (m) {\n try { java.log('KALA' + m); } catch (e0) {}\n};\n\nvar bodyOf = function (r) {\n if (!r) { return ''; }\n try { if (typeof r.body === 'function') { return String(r.body()); } } catch (e1) {}\n try { if (typeof r.body === 'string') { return r.body; } } catch (e2) {}\n try { return String(r); } catch (e3) { return ''; }\n};\n\nvar got = function (s) {\n if (!s) { return false; }\n return s.indexOf('data-src') >= 0;\n};\n\nvar tryGet = function (u, h) {\n try { return bodyOf(java.get(u, h)); } catch (e) { dbg += '|gE'; return ''; }\n};\n\nvar tryAjax = function (u) {\n try { return String(java.ajax(u)); } catch (e) { dbg += '|aE'; return ''; }\n};\n\nvar pickTok = function (s) {\n if (!s) { return ''; }\n var m = s.match(\/(?:var|const|let) token = '([^']+)'\/);\n if (m) { return m[1]; }\n var k = s.indexOf('token');\n if (k < 0) { return ''; }\n var q1 = s.indexOf(\"'\", k);\n if (q1 >= 0) {\n var q2 = s.indexOf(\"'\", q1 + 1);\n if (q2 > q1) { return s.substring(q1 + 1, q2); }\n }\n q1 = s.indexOf('\"', k);\n if (q1 >= 0) {\n var q3 = s.indexOf('\"', q1 + 1);\n if (q3 > q1) { return s.substring(q1 + 1, q3); }\n }\n return '';\n};\n\nvar html = String(result);\nif (html.indexOf('player_aaaa') < 0) {\n var t0 = pickTok(html);\n if (t0) {\n var h2 = tryAjax(baseUrl + '?cf_verify=' + t0);\n if (!h2) { h2 = tryGet(baseUrl + '?cf_verify=' + t0, {Referer: REF, 'User-Agent': UA}); }\n dbg += '|heal=' + h2.length;\n if (h2.indexOf('player_aaaa') >= 0) { html = h2; }\n }\n}\n\nvar um = html.match(\/\"url\":\"([0-9a-f]+)\"\/);\nvar enc = um ? um[1] : '';\nvar tk = '';\nvar page = '';\n\nif (enc) {\n var minUrl = CDN + '\/play\/min\/' + enc;\n\n page = tryGet(minUrl, {Referer: REF, 'User-Agent': UA});\n dbg += '|p1=' + page.length;\n\n if (!got(page)) {\n page = tryAjax(minUrl);\n dbg += '|a1=' + page.length;\n }\n\n if (!got(page)) {\n tk = pickTok(page);\n dbg += '|tk=' + (tk ? tk.length : 0);\n }\n\n if (!got(page)) {\n if (tk) {\n var q = minUrl + '?cf_verify=' + tk;\n page = tryGet(q, {Referer: REF, 'User-Agent': UA, Cookie: 'omo_token=' + tk});\n dbg += '|p2=' + page.length;\n if (!got(page)) {\n page = tryAjax(q);\n dbg += '|a2=' + page.length;\n }\n if (!got(page)) {\n page = tryGet(minUrl, {Referer: REF, 'User-Agent': UA, Cookie: 'omo_token=' + tk});\n dbg += '|p3=' + page.length;\n }\n }\n }\n\n var imgs = page.match(\/data-src=\"[^\"]+\"\/g);\n if (imgs) {\n for (var i = 0; i < imgs.length; i++) {\n var s = imgs[i].substring(10, imgs[i].length - 1);\n var full = CDN + s;\n if (full.indexOf('cf_verify=') < 0) {\n if (tk) { full += '?cf_verify=' + tk; }\n }\n out += '<img src=\"' + full + '\">';\n }\n dbg += '|img=' + imgs.length;\n } else {\n out = 'ERR:no-img[' + page.length + ']' + dbg + '|h=' + page.substring(0, 40);\n }\n} else {\n out = 'ERR:no-enc' + dbg + '|h=' + html.substring(0, 40);\n}\n\nlogd(dbg);\nout;",
"imageStyle": "FULL"
},
"ruleExplore": {
"author": ".stui-vodlist__detail p@text",
"bookList": "\/\/ul[contains(@class,'vodlist')]\/li",
"bookUrl": "a@href",
"coverUrl": "a@data-original",
"intro": "@js:\nvar a = java.getString('.stui-vodlist__detail p@text');\nvar l = java.getString('.pic-text b@text');\nvar result = '作者:' + (a || '') + '\\n更新:' + (l || '');\nresult;",
"kind": ".pic-text1 b@text",
"lastChapter": ".pic-text b@text",
"name": "a@title"
},
"ruleSearch": {
"author": ".stui-vodlist__detail p@text",
"bookList": "ul.stui-vodlist > li",
"bookUrl": "a@href",
"checkKeyWord": "",
"coverUrl": "a@data-original@js:result + ',{\"headers\":{\"Referer\":\"https:\/\/www.kalamanhua.com\"}}'",
"kind": ".pic-text1 b@text",
"lastChapter": ".pic-text b@text",
"name": "a@title"
},
"ruleToc": {
"chapterList": "@js:\nvar xu = '0';\nvar mi = String(book.intro || '').match(\/来源◖(\\d+)◗\/);\nif (mi) { xu = mi[1]; }\ntry { var cv = book.getVariable('custom'); if (cv != null && cv != '') { xu = String(cv); } } catch(e) {}\nvar idx = parseInt(xu);\nif (!(idx >= 0)) { idx = 0; }\nvar doc = org.jsoup.Jsoup.parse(result);\nvar uls = doc.select('ul.stui-content__playlist');\nvar ul = uls.size() > 0 ? uls.get(Math.min(idx, uls.size() - 1)) : null;\nvar arr = [];\nif (ul) {\n var as = ul.select('li a');\n for (var i = 0; i < as.size(); i++) {\n arr.push(JSON.stringify({name: as.get(i).text(), url: 'https:\/\/www.kalamanhua.com' + as.get(i).attr('href')}));\n }\n}\narr;",
"chapterName": "$.name",
"chapterUrl": "$.url"
},
"searchUrl": "\/search\/page\/{{page}}\/wd\/{{key}}.html",
"weight": 0
}