G社漫画/包子漫画
https://manhuafree.com
lzjuns (4418)7天前
修复源仓库原有的包子漫画图片正文失效
对比原来的源就改了下正文链接,以及解密图片加密
{
"bookSourceComment": "by ljun223 修复目录和正文 2026\/06\/10\nby天天的鸟蛋蛋 2025\/04\/20\n使用明月大佬的多线路选择器\n新包子漫画",
"bookSourceGroup": "漫画",
"bookSourceName": "G社漫画\/包子漫画",
"bookSourceType": 2,
"bookSourceUrl": "https:\/\/manhuafree.com",
"customButton": false,
"customOrder": 171,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": false,
"exploreUrl": "[{\"title\":\"---------✨分类------------\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"全部\",\"url\":\"{{bhost()}}\/manga\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"韩漫\",\"url\":\"{{bhost()}}\/manga-genre\/kr\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"热门\",\"url\":\"{{bhost()}}\/manga-genre\/hots\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"国漫\",\"url\":\"{{bhost()}}\/manga-genre\/cn\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"其他\",\"url\":\"{{bhost()}}\/manga-genre\/qita\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日漫\",\"url\":\"{{bhost()}}\/manga-genre\/jp\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"欧美\",\"url\":\"{{bhost()}}\/manga-genre\/ou-mei\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"---------🔥热门标签------------\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"#复仇\",\"url\":\"{{bhost()}}\/manga-tag\/fuchou\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#古风\",\"url\":\"{{bhost()}}\/manga-tag\/gufeng\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#奇幻\",\"url\":\"{{bhost()}}\/manga-tag\/qihuan\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#逆袭\",\"url\":\"{{bhost()}}\/manga-tag\/nixi\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#异能\",\"url\":\"{{bhost()}}\/manga-tag\/yineng\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#宅向\",\"url\":\"{{bhost()}}\/manga-tag\/zhaixiang\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#穿越\",\"url\":\"{{bhost()}}\/manga-tag\/chuanyue\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#热血\",\"url\":\"{{bhost()}}\/manga-tag\/rexue\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#纯爱\",\"url\":\"{{bhost()}}\/manga-tag\/chunai\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#系统\",\"url\":\"{{bhost()}}\/manga-tag\/xitong\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#重生\",\"url\":\"{{bhost()}}\/manga-tag\/zhongsheng\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#冒险\",\"url\":\"{{bhost()}}\/manga-tag\/maoxian\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#灵异\",\"url\":\"{{bhost()}}\/manga-tag\/lingyi\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#大女主\",\"url\":\"{{bhost()}}\/manga-tag\/danvzhu\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#剧情\",\"url\":\"{{bhost()}}\/manga-tag\/juqing\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#恋爱\",\"url\":\"{{bhost()}}\/manga-tag\/lianai\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#玄幻\",\"url\":\"{{bhost()}}\/manga-tag\/xuanhuan\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#女神\",\"url\":\"{{bhost()}}\/manga-tag\/nvshen\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#科幻\",\"url\":\"{{bhost()}}\/manga-tag\/kehuan\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#魔幻\",\"url\":\"{{bhost()}}\/manga-tag\/mohuan\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#推理\",\"url\":\"{{bhost()}}\/manga-tag\/tuili\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#猎奇\",\"url\":\"{{bhost()}}\/manga-tag\/lieqi\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#治愈\",\"url\":\"{{bhost()}}\/manga-tag\/zhiyu\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#都市\",\"url\":\"{{bhost()}}\/manga-tag\/doushi\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#异形\",\"url\":\"{{bhost()}}\/manga-tag\/yixing\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#青春\",\"url\":\"{{bhost()}}\/manga-tag\/qingchun\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#末日\",\"url\":\"{{bhost()}}\/manga-tag\/mori\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#悬疑\",\"url\":\"{{bhost()}}\/manga-tag\/xuanyi\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#修仙\",\"url\":\"{{bhost()}}\/manga-tag\/xiuxian\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#战斗\",\"url\":\"{{bhost()}}\/manga-tag\/zhandou\/page\/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]",
"header": "<js>\nheaders={\"Referer\":baseUrl};\nJSON.stringify(headers)\n<\/js>",
"jsLib": "function bhost() {\n var d = \"manhuafree.com\",\n s = this.source;\n try {\n var u = (p => p ? Object.values(p[0])[0] : d)(s.getVariable() && JSON.parse(s.getVariable())) || d;\n return (\/^https?:\/.test(u) ? u : \"https:\/\/\" + u).replace(\/\\\/$\/, \"\")\n } catch (e) {\n return (\/^https?:\/.test(d) ? d : \"https:\/\/\" + d).replace(\/\\\/$\/, \"\")\n }\n}",
"lastUpdateTime": "1791635312774",
"loginUi": "[\n{\"name\":\"多线路优选\",\"type\":\"button\",\n\"action\":\"checkHostsLatency(hosts)\"}\n]",
"loginUrl": "var Importer = new JavaImporter(\n Packages.java.net,\n Packages.java.io,\n Packages.java.util,\n Packages.java.lang,\n Packages.java.util.concurrent\n);\n\nvar hosts = [\n \"manhuafree.com\",\n \"m.g-mh.org\",\n \"baozimh.org\",\n \"bzmh.org\"\n \n];\n\nfunction getTimestamp() {\n return Packages.java.lang.System.currentTimeMillis();\n}\n\nfunction checkLatency(urlString) {\n var connection = null;\n try {\n if (!urlString.startsWith(\"http:\/\/\") && !urlString.startsWith(\"https:\/\/\")) {\n urlString = \"https:\/\/\" + urlString;\n }\n var startTime = getTimestamp();\n var url = new Packages.java.net.URL(urlString);\n connection = url.openConnection();\n connection.setRequestMethod(\"GET\");\n connection.setConnectTimeout(3000);\n connection.setReadTimeout(3000);\n \n var inputStream = connection.getInputStream();\n inputStream.close();\n \n var latency = getTimestamp() - startTime;\n java.log(\"[SUCCESS] \" + urlString + \" | \" + latency + \"ms\");\n return latency;\n } catch (e) {\n java.log(\"[FAILED] \" + urlString + \" | \" + e);\n return null;\n } finally {\n try {\n if (connection) connection.disconnect();\n } catch (e) {}\n }\n}\n\nfunction checkHostsLatency(hosts) {\n with (Importer) {\n try {\n var totalStart = getTimestamp();\n java.longToast(\"🚀 启动检测\");\n \n var results = [];\n var total = hosts.length;\n \n for (var i = 0; i < hosts.length; i++) {\n var host = hosts[i];\n \/\/ 更新进度提示\n java.longToast(\"🔍 检测中 (\" + (i+1) + \"\/\" + total + \")\");\n \n var latency = checkLatency(host);\n if (latency !== null) {\n results.push({\n host: host,\n latency: latency\n });\n }\n }\n\n var totalTime = getTimestamp() - totalStart;\n java.log(\"总耗时: \" + totalTime + \"ms\");\n \n if (results.length === 0) {\n java.toast(\"❌ 无可用主机\");\n } else {\n results.sort(function(a, b) {\n return a.latency - b.latency;\n });\n \n var best = results[0];\n var summary = \"✅ 完成检测\\n最佳: \" + best.host + \"\\n⏱️ \" + best.latency + \"ms\";\n java.longToast(summary);\n let ms = \"共找到 \" + results.length + \"\/\" + total + \" 可用节点\"\n java.longToast(ms);\n java.log(ms);\n source.setVariable(JSON.stringify(results, null, 2));\n }\n } catch (e) {\n java.log(\"[FATAL] \" + e);\n }\n }\n}",
"respondTime": 180000,
"ruleBookInfo": {
"author": ".text-small@a@span@text##\\s",
"intro": "<js>\nvar novelIntro=({title,author,genre,score,desc})=>['','✧*̥₊˚‧☆・゚'.repeat(3),`📖书名:《${title}》`,`👤作者:${author}`,`🏷️类型:${genre}`,`✨最新章节:${latestChapterTitle}`,'✦ ─────────────── ✦',`${desc}`,'❈'.padEnd(20,'~*')].join('\\n').replace(\/^\/gm,' ');\nvar latestChapterTitle=`{{@@.my-unit-md@span@text}}`\nvar intro=`{{@@.text-medium@text##最近章節}}`\nnovelIntro({\n \"title\": book.name,\n \"author\": book.author,\n \"genre\": book.kind,\n \"latestChapterTitle\":latestChapterTitle,\n \"desc\": intro\n})\n<\/js>##(^|[。!?]+[”」)】]?)##$1<br>",
"kind": ".text-sm:nth-child(3)>a@text&&.text-xl@span@text&&.py-1:nth-child(4) > a:nth-child(n+1)@text<js>java.t2s(result);<\/js>##\\[|\\]",
"lastChapter": ".my-unit-md@span@text",
"name": ".text-xl@textNodes",
"tocUrl": "<js>\n\nvar mid=src.match(\/data\\-mid\\=\"(\\d+)\"\/)[1];\njava.put(\"mid\",mid)\nvar r=`https:\/\/api-get-v3.mgsearcher.com\/api\/manga\/get?mid=${mid}&mode=all`\nr;\n\n<\/js>"
},
"ruleContent": {
"content": "<js>\nvar data=JSON.parse(result)\nvar encrypted=data.data.info.images.images;\n\n\nfunction decryptImages(encrypted) {\n var prefix = \"J7r\";\n var suffix = \"nQ\";\n var kD = \"kD\";\n var W4s = \"W4s\";\n var STEP = 7;\n\n \/\/ 注意:这两个字符串必须完全一致,一个字符都不能少\/错\n \/\/ source 用来 indexOf\n var source = \"_-9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n \/\/ target 用来取字符\n var target = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n \/\/ java.log(\"source.len=\" + source.length + \" target.len=\" + target.length); \/\/ 都应该是 64\n\n if (!encrypted.startsWith(prefix) || !encrypted.endsWith(suffix)) {\n throw new Error(\"x2 prefix\/suffix\");\n }\n\n var body = encrypted.slice(prefix.length, encrypted.length - suffix.length);\n var L = body.length - kD.length - W4s.length;\n var cols = Math.floor(L \/ 3);\n var rem2 = Math.floor((L - cols) \/ 2);\n var rest = L - cols - rem2;\n\n \/\/ java.log(\"L=\" + L + \" cols=\" + cols + \" rem2=\" + rem2 + \" rest=\" + rest);\n\n var a = body.slice(0, rem2);\n var b = body.slice(rem2, rem2 + 2);\n var c = body.slice(rem2 + 2, rem2 + 2 + rest);\n var d = body.slice(rem2 + 2 + rest, rem2 + 2 + rest + 3);\n var e = body.slice(rem2 + 2 + rest + 3);\n\n \/\/ java.log(\"b=\" + b + \" d=\" + d + \" e.len=\" + e.length);\n if (b !== kD || d !== W4s || e.length !== cols) {\n throw new Error(\"x4 marker\");\n }\n\n \/\/ 1. 拼接\n var input = e + a + c;\n java.log(\"input[0..40]=\" + input.slice(0, 40));\n\n \/\/ 2. 每 7 字符一组,奇数索引反转\n var swapped = \"\";\n for (var i = 0, gi = 0; i < input.length; i += STEP, gi++) {\n var part = input.slice(i, i + STEP);\n if (gi % 2 === 1) {\n part = part.split(\"\").reverse().join(\"\");\n }\n swapped += part;\n }\n \/\/java.log(\"swapped[0..40]=\" + swapped.slice(0, 40));\n\n \/\/ 3. 映射(这里最容易出问题)\n var mapped = \"\";\n for (var j = 0; j < swapped.length; j++) {\n var ch = swapped.charAt(j); \/\/ 用 charAt 更稳\n var idx = source.indexOf(ch);\n if (idx < 0) {\n java.log(\"bad char at \" + j + \" : [\" + ch + \"] code=\" + ch.charCodeAt(0));\n throw new Error(\"x1\");\n }\n mapped += target.charAt(idx);\n }\n\n \/\/ java.log(\"mapped[0..60]=\" + mapped.slice(0, 60));\n \/\/ 正常应该类似:W3sib3JkZXIiOjAsInVybCI6Ii9ocC9tYW5qaXdhbmppYWRlZGk...\n\n \/\/ 4. base64url → 标准 base64\n var b64 = mapped.replace(\/-\/g, \"+\").replace(\/_\/g, \"\/\");\n while (b64.length % 4 !== 0) b64 += \"=\";\n var jsonStr=java.base64Decode(b64);\n return JSON.parse(jsonStr)\n}\n\nvar imageList=decryptImages(encrypted)\n\/\/java.log(imageList)\n\nvar imgTags = imageList.map(item => `<img src=\"https:\/\/t-nd2-1.6wm.top${item.url}\">`).join('\\n');\nimgTags;\n\n<\/js>"
},
"ruleExplore": {},
"ruleSearch": {
"bookList": ".grid-cols-3@.pb-2",
"bookUrl": "a@href",
"coverUrl": "img@src",
"name": "h3@text"
},
"ruleToc": {
"chapterList": ".chapters[*]",
"chapterName": ".title",
"chapterUrl": "<js>\nvar mid=java.get(\"mid\")\nvar id=`{{$..id}}`\nvar r=`https:\/\/v2.apikk.top\/api\/v2\/chapter\/getinfo?m=${mid}&c=${id}`\nr;\n<\/js>",
"updateTime": ".updatedAt"
},
"searchUrl": "{{bhost()}}\/s\/{{key}}?page={{page}}",
"weight": 0
}