{
"bookDelayTime": "",
"bookSingleThread": "否",
"bookSourceGroup": "漫画",
"bookSourceName": "看漫画",
"bookSourceType": "漫画",
"bookSourceUrl": "https:\/\/m.manhuagui.com",
"enable": true,
"httpUserAgent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/152.0.0.0 Safari\/537.36",
"lastUpdateTime": 0,
"loginUrl": "",
"loginUrlResult": "",
"ruleSearchUrl": "https:\/\/m.manhuagui.com\/s\/searchKey.html",
"ruleSearchList": "[id=detail] li",
"ruleSearchUrlNext": "",
"ruleSearchName": "h3@text",
"ruleSearchAuthor": "",
"ruleSearchKind": "",
"ruleSearchLastChapter": "",
"ruleSearchCoverUrl": "img@data-src",
"ruleSearchNoteUrl": "a@href",
"ruleBookName": ".main-bar h1@text",
"ruleCoverUrl": ".book-detail .thumb img@src",
"ruleBookAuthor": "a[href^='\/author\/']@text",
"ruleBookKind": "",
"ruleIntroduce": "[id=bookIntro]@text",
"ruleBookLastChapter": "",
"ruleBookUrlPattern": "",
"ruleChapterUrl": "",
"ruleChapterList": "-.chapter-list li a",
"ruleChapterName": "b@text",
"ruleContentUrl": "href",
"ruleChapterId": "",
"ruleChapterUrlNext": "",
"ruleChapterParentId": "",
"ruleChapterParentName": "",
"ruleContentUrlNext": "",
"ruleBookContent": "@js:\/\/ ================= manhuagui 阅读页解码器 =================\n\/\/ 阅读页里那段 packer 是**诱饵**(第 4 个参数用 '…'['splic'](...),浏览器里也会抛错),\n\/\/ 真数据是 packer 的第 1 个参数(payload)+ 第 4 个参数(lz-string 压缩的关键字表)。\n\/\/ 流程:lz-string 解压关键字表 → 按 | 切开 → 生成 token 字典 → 替换 payload 里的 token\n\/\/ → 得到 SMH.imgData({...}) \/ SMH.reader({...}),里面就有 files\/path\/images 和签名 e\/m。\n\/\/ 参考实现:github.com\/lanyeeee\/manhuagui-downloader-wails 的 backend\/decoder\/decoder.go\nfunction mhgDecode(s) {\n var m = s.match(\/}\\('([\\s\\S]*?)',(\\d+),(\\d+),'([\\w|+\\\/=]*)'\/);\n if (!m) return [];\n var payload = m[1], a = parseInt(m[2], 10), c = parseInt(m[3], 10), blob = m[4];\n var K = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=\", rev = {}, q;\n for (q = 0; q < K.length; q++) rev[K.charAt(q)] = q;\n\n function lz(b) {\n var dic = [], enl = 4, ds = 4, nb = 3, entry = \"\", res = [], w, x, d, rv;\n d = { v: rev[b.charAt(0)] || 0, p: 32, i: 1 };\n for (q = 0; q < 3; q++) dic[q] = q;\n function rb(n) {\n var t = 0, mm = Math.pow(2, n), pp = 1;\n while (pp != mm) {\n rv = d.v & d.p;\n d.p >>= 1;\n if (d.p == 0) { d.p = 32; d.v = rev[b.charAt(d.i++)] || 0; }\n t += (rv > 0 ? 1 : 0) * pp;\n pp <<= 1;\n }\n return t;\n }\n x = rb(2);\n if (x == 0) { w = String.fromCharCode(rb(8)); }\n else if (x == 1) { w = String.fromCharCode(rb(16)); }\n else { return \"\"; }\n dic[3] = w;\n res.push(w);\n while (true) {\n if (d.i > b.length) return \"\";\n x = rb(nb);\n if (x == 0) { dic[ds] = String.fromCharCode(rb(8)); x = ds; ds++; enl--; }\n else if (x == 1) { dic[ds] = String.fromCharCode(rb(16)); x = ds; ds++; enl--; }\n else if (x == 2) return res.join(\"\");\n if (enl == 0) { enl = Math.pow(2, nb); nb++; }\n entry = dic[x] ? dic[x] : (x == ds ? w + w.charAt(0) : null);\n if (entry === null) return \"\";\n res.push(entry);\n dic[ds] = w + entry.charAt(0);\n ds++;\n enl--;\n w = entry;\n if (enl == 0) { enl = Math.pow(2, nb); nb++; }\n }\n }\n\n var plain = lz(blob);\n if (!plain) return [];\n var data = plain.split(\"|\");\n function ee(n) {\n var cc = n % a;\n var ch = (cc > 35 ? String.fromCharCode(cc + 29) : cc.toString(36));\n if (n < a) return ch;\n return ee(parseInt(n \/ a, 10)) + ch;\n }\n var dict = {}, i, kk;\n for (i = c - 1; i >= 0; i--) {\n kk = ee(i);\n dict[kk] = (data[i] === \"\" || data[i] === undefined) ? kk : data[i];\n }\n var out = payload.replace(\/\\b\\w+\\b\/g, function (t) {\n return dict[t] !== undefined ? dict[t] : t;\n });\n\n var pe = out.match(\/\"e\":(\\d+)\/), pm = out.match(\/\"m\":\"([^\"]*)\"\/);\n if (!pe || !pm) return [];\n var paths = [], im = out.match(\/\"images\":\\[([^\\]]*)\\]\/), pt = out.match(\/\"path\":\"([^\"]*)\"\/), fl;\n if (im) {\n paths = im[1].replace(\/\"\/g, \"\").split(\",\");\n } else if (pt) {\n fl = out.match(\/\"files\":\\[([^\\]]*)\\]\/);\n if (!fl) return [];\n fl = fl[1].replace(\/\"\/g, \"\").split(\",\");\n for (i = 0; i < fl.length; i++) paths.push(pt[1] + fl[i]);\n } else {\n return [];\n }\n var urls = [];\n for (i = 0; i < paths.length; i++) {\n \/\/ 路径里的中文要转义,但已经 %XX 过的部分不能二次转义 —— 所以只动非 ASCII\n var p = paths[i].replace(\/[^\\x00-\\x7F]\/g, function (ch) { return encodeURIComponent(ch); });\n urls.push(\"https:\/\/i.hamreus.com\" + p + \"?e=\" + pe[1] + \"&m=\" + pm[1]);\n }\n return urls;\n}\nmhgDecode(String(result))@Header:{\"Referer\": \"https:\/\/m.manhuagui.com\/\", \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/152.0.0.0 Safari\/537.36\"}",
"ruleBookContentDecoder": "",
"ruleFindUrl": "最近更新::https:\/\/m.manhuagui.com\/update\/?page=searchPage\n排行榜::https:\/\/m.manhuagui.com\/rank\/\n全部漫画::https:\/\/m.manhuagui.com\/list\/?page=searchPage\n日本漫画::https:\/\/m.manhuagui.com\/list\/japan\/?page=searchPage\n韩国漫画::https:\/\/m.manhuagui.com\/list\/korea\/?page=searchPage\n港台漫画::https:\/\/m.manhuagui.com\/list\/hongkong\/?page=searchPage\n内地漫画::https:\/\/m.manhuagui.com\/list\/china\/?page=searchPage",
"serialNumber": 1,
"sourceRemark": "看漫画手机版",
"weight": 1000
}