🎨包子漫画
https://cn.bzmgcn.com/
dev-xx (13787)07/23 09:24
该用户很懒,什么介绍也没有写!
{
"bookSourceUrl": "https:\/\/cn.bzmgcn.com\/",
"bookSourceName": "🎨包子漫画",
"enabledExplore": true,
"enabled": true,
"bookSourceGroup": "",
"author": "",
"help": false,
"html": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>包子漫画<\/title>\n<\/head>\n<body>\n\n<\/body>\n<script src=\"https:\/\/vc.jd.com\/web\/js\/jquery-3.1.1.min.js\"><\/script>\n<script>\n var isCookieJar = true;\n class FlutterJSBridge {\n constructor() { this.init(); }\n init() {\n if (window.flutter_inappwebview) { this.isReady = true; this.CookieJar(); } else {\n window.addEventListener('flutterInAppWebViewPlatformReady', () => { this.isReady = true; this.CookieJar(); });\n }\n }\n async CookieJar() { try { await window.flutter_inappwebview.callHandler('CookieJar', isCookieJar); } catch (e) {} }\n async log(str) { try { return await window.flutter_inappwebview.callHandler('log', str); } catch (e) { return false; } }\n async text(type, str) { try { return await window.flutter_inappwebview.callHandler('text', type, str); } catch (e) { return false; } }\n async showToast(str) { try { return await window.flutter_inappwebview.callHandler('showToast', str); } catch (e) { return false; } }\n async webview(url, js, html, body, header) { try { return await window.flutter_inappwebview.callHandler('webview', url, js, html, body, header, \"\", \"\"); } catch (e) { return \"\"; } }\n async startBrowser(url, title, header) { try { return await window.flutter_inappwebview.callHandler('startBrowser', url, title, header); } catch (e) { return \"\"; } }\n async getWebViewUA() { try { return await window.flutter_inappwebview.callHandler('getWebViewUA'); } catch (e) { return \"\"; } }\n }\n class Http {\n async Get(url, headers, followRedirects) {\n try { return await window.flutter_inappwebview.callHandler('http', \"get\", url, \"\", JSON.stringify(headers), followRedirects, \"\"); } catch (e) { return null; }\n }\n async Head(url, headers, followRedirects) {\n try { return await window.flutter_inappwebview.callHandler('http', \"head\", url, \"\", JSON.stringify(headers), followRedirects, \"\"); } catch (e) { return null; }\n }\n async Post(url, headers, body, contenttype, followRedirects) {\n try { return await window.flutter_inappwebview.callHandler('http', \"post\", url, body, JSON.stringify(headers), followRedirects, contenttype); } catch (e) { return null; }\n }\n }\n class Cache {\n constructor() {}\n async get(key) { try { return await window.flutter_inappwebview.callHandler('cache.get', key); } catch (e) { return null; } }\n async set(key, value) { try { return await window.flutter_inappwebview.callHandler('cache.set', key, value); } catch (e) { return null; } }\n async remove(key) { try { return await window.flutter_inappwebview.callHandler('cache.remove', key); } catch (e) { return null; } }\n async getbookVariable(bookurl) { return await this.get(bookurl); }\n async setbookVariable(bookurl, value) { return await this.set(bookurl, value); }\n }\n class Cookie {\n async get(url) { try { return await window.flutter_inappwebview.callHandler('cookie.get', url); } catch (e) { return null; } }\n async remove(url) { try { return await window.flutter_inappwebview.callHandler('cookie.remove', url); } catch (e) { return null; } }\n async set(url, value) { try { return await window.flutter_inappwebview.callHandler('cookie.set', url, value); } catch (e) { return null; } }\n }\n\n function parseHTMLSafely(htmlStr) {\n try {\n var tempDiv = document.createElement('div');\n tempDiv.innerHTML = htmlStr;\n return $(tempDiv);\n } catch (e) {\n flutterBridge.log(\"HTML解析错误:\" + e.message);\n return $('<div>');\n }\n }\n\n function removeHTMLSafely(tempContainer) {\n try {\n if (tempContainer[0]) { tempContainer = tempContainer[0]; }\n tempContainer.innerHTML = '';\n if (tempContainer.parentNode) { tempContainer.parentNode.removeChild(tempContainer); }\n } catch (e) {\n flutterBridge.log(\"HTML移除失败:\" + e.message);\n }\n }\n\n function removeHTMLTags(htmlString) {\n var result = htmlString.replace(\/<script\\b[^<]*(?:(?!<\\\/script>)<[^<]*)*<\\\/script>\/gi, '');\n result = result.replace(\/<style\\b[^<]*(?:(?!<\\\/style>)<[^<]*)*<\\\/style>\/gi, '');\n result = result.replace(\/<link\\b[^<]*(?:(?!<\\\/link>)<[^<]*)*<\\\/link>\/gi, '');\n return result;\n }\n\n function parseCards($container) {\n var results = [];\n $container.find(\".comics-card\").each(function() {\n var $card = $(this);\n var $titleEl = $card.find(\".comics-card__title h3\");\n var $linkEl = $card.find(\"a.comics-card__info\");\n if ($titleEl.length === 0 || $linkEl.length === 0) return;\n var name = $titleEl.text().trim();\n var author = $card.find(\"small.tags\").text().trim();\n var $coverImg = $card.find(\".comics-card__poster amp-img\").first();\n var cover = $coverImg.attr(\"src\") || \"\";\n var link = $linkEl.attr(\"href\");\n if (link && link.indexOf(\"http\") !== 0 && link.indexOf(\"\/\") === 0) link = baseurl + link;\n results.push({\n bookUrl: link,\n name: name,\n author: author,\n coverUrl: cover,\n kind: \"\",\n wordCount: \"\",\n type: 2\n });\n });\n return results;\n }\n\n const flutterBridge = new FlutterJSBridge();\n const cache = new Cache();\n const http = new Http();\n const cookie = new Cookie();\n var baseurl = \"https:\/\/cn.bzmgcn.com\";\n var header = {\n \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Safari\/537.36\",\n \"Referer\": baseurl\n };\n\n async function search(key, page) {\n var url = baseurl + \"\/search?q=\" + encodeURIComponent(key);\n var resp = await http.Get(url, header, true);\n if (!resp || !resp.data) return \"[]\";\n var $temp = parseHTMLSafely(removeHTMLTags(resp.data));\n var cards = parseCards($temp);\n removeHTMLSafely($temp);\n return JSON.stringify(cards);\n }\n\n async function getfinds() {\n var result = [];\n var push = function(title, url, type) { result.push({ title: title, url: url, type: type || 0 }); };\n push(\"最新上架\", \"\/list\/new\", 0);\n push(\"全部分类\", \"\/classify?type=all®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"国漫\", \"\/classify?type=all®ion=cn&state=all&filter=*&page={{page}}\", 0);\n push(\"日本\", \"\/classify?type=all®ion=jp&state=all&filter=*&page={{page}}\", 0);\n push(\"韩国\", \"\/classify?type=all®ion=kr&state=all&filter=*&page={{page}}\", 0);\n push(\"欧美\", \"\/classify?type=all®ion=en&state=all&filter=*&page={{page}}\", 0);\n push(\"连载中\", \"\/classify?type=all®ion=all&state=serial&filter=*&page={{page}}\", 0);\n push(\"已完结\", \"\/classify?type=all®ion=all&state=pub&filter=*&page={{page}}\", 0);\n push(\"玄幻\", \"\/classify?type=xuanhuan®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"热血\", \"\/classify?type=rexie®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"恋爱\", \"\/classify?type=lianai®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"奇幻\", \"\/classify?type=qihuan®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"冒险\", \"\/classify?type=mouxian®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"古风\", \"\/classify?type=gufeng®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"科幻\", \"\/classify?type=kehuan®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"悬疑\", \"\/classify?type=xuanyi®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"格斗\", \"\/classify?type=gedou®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"搞笑\", \"\/classify?type=gaoxiao®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"穿越\", \"\/classify?type=chuanyue®ion=all&state=all&filter=*&page={{page}}\", 0);\n push(\"都市\", \"\/classify?type=dushi®ion=all&state=all&filter=*&page={{page}}\", 0);\n return JSON.stringify(result);\n }\n\n async function find(url, page) {\n var u = url;\n var hasPagePlaceholder = u.indexOf(\"{{page}}\") >= 0;\n if (hasPagePlaceholder) {\n u = u.replace(\"{{page}}\", page);\n }\n if (u.indexOf(\"\/classify\") === 0) {\n if (page > 1) {\n var queryStr = u.split(\"?\")[1] || \"\";\n var params = {};\n queryStr.split(\"&\").forEach(function(p) {\n var kv = p.split(\"=\");\n if (kv.length === 2) params[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);\n });\n var apiUrl = \"\/api\/bzmhq\/amp_comic_list?type=\" + (params.type || \"all\") +\n \"®ion=\" + (params.region || \"all\") +\n \"&state=\" + (params.state || \"all\") +\n \"&filter=\" + (params.filter || \"*\") +\n \"&page=\" + page + \"&limit=36&language=cn\";\n var resp = await http.Get(baseurl + apiUrl, header, true);\n if (!resp || !resp.data) return \"[]\";\n try {\n var json = JSON.parse(resp.data);\n var items = json.items || [];\n var cards = [];\n for (var i = 0; i < items.length; i++) {\n var item = items[i];\n var link = baseurl + \"\/comic\/\" + item.comic_id;\n var cover = \"https:\/\/static-tw.bzmgcn.com\/cover\/\" + item.topic_img + \"?w=285&h=375&q=100\";\n var kind = (item.type_names || []).join(\",\");\n cards.push({\n bookUrl: link,\n name: item.name || \"\",\n author: item.author || \"\",\n coverUrl: cover,\n kind: kind,\n wordCount: \"\",\n type: 2\n });\n }\n return JSON.stringify(cards);\n } catch (e) {\n return \"[]\";\n }\n }\n u = u.replace(\"&page=1\", \"\");\n }\n if (u.indexOf(\"\/list\/\") === 0) {\n if (page > 1) {\n u = u.replace(\"{{page}}\", page);\n }\n u = u.replace(\"{{page}}\", page);\n }\n if (!u.startsWith(\"http\")) u = baseurl + u;\n var resp = await http.Get(u, header, true);\n if (!resp || !resp.data) return \"[]\";\n var $temp = parseHTMLSafely(removeHTMLTags(resp.data));\n var $container = $temp;\n var $grid = $temp.find(\".pure-g.classify-items\");\n if ($grid.length > 0) $container = $grid;\n var cards = parseCards($container);\n removeHTMLSafely($temp);\n return JSON.stringify(cards);\n }\n\n async function info(bookurl) {\n var resp = await http.Get(bookurl, header, true);\n if (!resp || !resp.data) return JSON.stringify({ bookUrl: bookurl, type: 2 });\n var $temp = parseHTMLSafely(removeHTMLTags(resp.data));\n var name = $temp.find(\"h1.comics-detail__title\").text().trim();\n var author = $temp.find(\"h2.comics-detail__author\").text().trim();\n var cover = $temp.find(\".de-info__box amp-img\").first().attr(\"src\") || \"\";\n var intro = $temp.find(\"p.comics-detail__desc\").text().trim();\n var $tagEls = $temp.find(\".tag-list .tag\");\n var status = \"\";\n var kind = \"\";\n if ($tagEls.length > 0) {\n status = $tagEls.first().text().trim();\n var kinds = [];\n $tagEls.each(function() {\n var t = $(this).text().trim();\n if (t !== \"国漫\" && t !== \"日本\" && t !== \"韩国\" && t !== \"欧美\") kinds.push(t);\n });\n kinds.shift();\n kind = kinds.join(\",\");\n }\n var tocUrl = bookurl;\n removeHTMLSafely($temp);\n return JSON.stringify({\n bookUrl: bookurl,\n name: name,\n author: author,\n coverUrl: cover,\n intro: intro,\n kind: kind,\n status: status,\n wordCount: \"\",\n tocUrl: tocUrl,\n type: 2\n });\n }\n\n async function chapter(tocUrl) {\n var resp = await http.Get(tocUrl, header, true);\n if (!resp || !resp.data) return \"[]\";\n var html = resp.data;\n var chapIdx = html.indexOf(\"章节目录\");\n if (chapIdx >= 0) html = html.substring(chapIdx);\n var tagRe = \/<a[^>]*class=\"[^\"]*comics-chapters__item[^\"]*\"[^>]*>[\\s\\S]*?<\\\/a>\/g;\n var tags = html.match(tagRe);\n var chapters = [];\n if (tags) {\n var seen = {};\n for (var i = 0; i < tags.length; i++) {\n var tag = tags[i];\n var h = tag.match(\/href=\"([^\"]+)\"\/);\n var s = tag.match(\/<span[^>]*>([\\s\\S]*?)<\\\/span>\/);\n if (!h || !s) continue;\n var href = h[1];\n var title = s[1].replace(\/\\s+\/g, \" \").trim();\n if (!href || !title || title.length < 1 || title.indexOf(\"点击阅读\") >= 0) continue;\n if (seen[href]) continue;\n seen[href] = true;\n if (href.indexOf(\"&\") >= 0) href = href.replace(\/&\/g, \"&\");\n if (href.indexOf(\"\/\") === 0) href = baseurl + href;\n chapters.push({ name: title, chapterId: href, index: chapters.length, isPay: false, isVip: false, isVolume: false, tag: \"\" });\n }\n }\n return chapters.length === 0 ? \"[]\" : JSON.stringify(chapters);\n }\n\n async function content(url) {\n var allUrls = [];\n var firstResp = await http.Get(url, header, true);\n if (firstResp && firstResp.data) {\n var tagRe = \/<amp-img[^>]*class=\"[^\"]*comic-contain__item[^\"]*\"[^>]*>\/g;\n var m;\n while ((m = tagRe.exec(firstResp.data)) !== null) {\n var tag = m[0];\n var src = null;\n var ds = tag.match(\/data-src=\"([^\"]+)\"\/);\n if (ds) src = ds[1];\n if (!src) { var s = tag.match(\/src=\"([^\"]+)\"\/); if (s) src = s[1]; }\n if (src && src.indexOf(\"http\") === 0 && allUrls.indexOf(src) < 0) allUrls.push(src);\n }\n }\n if (allUrls.length === 0) {\n var js = \"(function(){\" +\n \"var imgs=[];var els=document.querySelectorAll('amp-img.comic-contain__item');\" +\n \"for(var i=0;i<els.length;i++){\" +\n \"var s=els[i].getAttribute('data-src')||els[i].getAttribute('src');\" +\n \"if(s&&s.indexOf('http')===0)imgs.push(s);\" +\n \"}\" +\n \"return JSON.stringify({imgs:imgs});\" +\n \"})()\";\n var res = await flutterBridge.webview(url, js, \"\", \"\", JSON.stringify(header));\n if (!res) return \"\";\n try {\n var data = JSON.parse(res);\n for (var i = 0; i < data.imgs.length; i++) {\n if (allUrls.indexOf(data.imgs[i]) < 0) allUrls.push(data.imgs[i]);\n }\n } catch (e) { return \"\"; }\n }\n if (allUrls.length === 0) {\n flutterBridge.showToast(\"未找到漫画图片\");\n return \"\";\n }\n var result = \"\";\n for (var i = 0; i < allUrls.length; i++) {\n result += '<img src=\"' + allUrls[i] + ',{headers:{Referer:\\'' + baseurl + '\\'}}\" \/>';\n }\n return result;\n }\n\n async function getloginurl() { return baseurl; }\n async function login() {}\n async function pay(bookurl, url) {}\n async function imagedecrypt(url, image) {}\n async function shouldOverrideUrlLoading(url) { return true; }\n<\/script>\n<\/html>\n",
"login": false,
"lastUpdateTime": "1784769860212"
}