大人漫画
https://drmh2.com
dev-xx (13787)06/24 17:05
该用户很懒,什么介绍也没有写!
{
"bookSourceUrl": "https:\/\/drmh2.com",
"bookSourceName": "大人漫画",
"enabledExplore": true,
"enabled": true,
"bookSourceGroup": "",
"author": "",
"help": false,
"html": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <title>大人漫画<\/title>\n<\/head>\n\n<body>\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() {\n this.init();\n }\n\n init() {\n if (window.flutter_inappwebview) {\n this.isReady = true;\n this.CookieJar();\n } else {\n window.addEventListener('flutterInAppWebViewPlatformReady', () => {\n this.isReady = true;\n this.CookieJar();\n });\n }\n }\n\n async CookieJar() {\n try {\n await window.flutter_inappwebview.callHandler('CookieJar', isCookieJar);\n } catch (error) { }\n }\n\n async getbuildNumber() {\n try {\n return await window.flutter_inappwebview.callHandler('buildNumber');\n } catch (error) {\n return 0;\n }\n }\n\n async getversion() {\n try {\n return await window.flutter_inappwebview.callHandler('version');\n } catch (error) {\n return \"0.0.0\";\n }\n }\n\n async toTraditional(str) {\n try {\n return await window.flutter_inappwebview.callHandler('toTraditional', str);\n } catch (error) {\n return \"\";\n }\n }\n\n async toSimplified(str) {\n try {\n return await window.flutter_inappwebview.callHandler('toSimplified', str);\n } catch (error) {\n return \"\";\n }\n }\n\n async getDeviceid() {\n try {\n return await window.flutter_inappwebview.callHandler('id');\n } catch (error) {\n return \"\";\n }\n }\n\n async getDevice() {\n try {\n return await window.flutter_inappwebview.callHandler('device');\n } catch (error) {\n return \"\";\n }\n }\n\n async log(str) {\n try {\n return await window.flutter_inappwebview.callHandler('log', str);\n } catch (error) {\n return false;\n }\n }\n\n async text(type, str) {\n try {\n return await window.flutter_inappwebview.callHandler('text', type, str);\n } catch (error) {\n return false;\n }\n }\n\n async showToast(str) {\n try {\n return await window.flutter_inappwebview.callHandler('showToast', str);\n } catch (error) {\n return false;\n }\n }\n\n async getWebViewUA() {\n try {\n return await window.flutter_inappwebview.callHandler('getWebViewUA');\n } catch (error) {\n return \"\";\n }\n }\n\n async openurl(url) {\n try {\n return await window.flutter_inappwebview.callHandler('openurl', url, \"\");\n } catch (error) {\n return false;\n }\n }\n\n async openurlwithMimeType(url, mimeType) {\n try {\n return await window.flutter_inappwebview.callHandler('openurl', url, mimeType);\n } catch (error) {\n return false;\n }\n }\n\n async webview(url, js, html, body, header) {\n try {\n return await window.flutter_inappwebview.callHandler('webview', url, js, html, body, header, \"\", \"\");\n } catch (error) {\n return \"\";\n }\n }\n\n async webViewGetOverrideUrl(url, js, html, body, header, overrideUrlRegex) {\n try {\n return await window.flutter_inappwebview.callHandler('webview', url, js, html, body, header, overrideUrlRegex, \"\");\n } catch (error) {\n return \"\";\n }\n }\n\n async webViewGetSource(url, js, html, body, header, urlregex) {\n try {\n return await window.flutter_inappwebview.callHandler('webview', url, js, html, body, header, \"\", urlregex);\n } catch (error) {\n return \"\";\n }\n }\n\n async startBrowser(url, title, header) {\n try {\n return await window.flutter_inappwebview.callHandler('startBrowser', url, title, header);\n } catch (error) {\n return \"\";\n }\n }\n\n async startBrowserWithShouldOverrideUrlLoading(url, title, header) {\n try {\n return await window.flutter_inappwebview.callHandler('startBrowserWithShouldOverrideUrlLoading', url, title, header);\n } catch (error) {\n return \"\";\n }\n }\n\n async startBrowserDp(url, title) {\n try {\n return await window.flutter_inappwebview.callHandler('startBrowserDp', url, title);\n } catch (error) {\n return \"\";\n }\n }\n\n async back() {\n try {\n return await window.flutter_inappwebview.callHandler('back');\n } catch (error) {\n return false;\n }\n }\n\n async utf8ToGbkUrlEncoded(str) {\n try {\n return await window.flutter_inappwebview.callHandler('utf8ToGbkUrlEncoded', str);\n } catch (error) {\n return \"\";\n }\n }\n\n async getVerificationCode(str, header) {\n try {\n return await window.flutter_inappwebview.callHandler('getVerificationCode', str, header);\n } catch (error) {\n return \"\";\n }\n }\n\n async addbook(book) {\n try {\n return await window.flutter_inappwebview.callHandler('addbook', book);\n } catch (error) {\n return \"\";\n }\n }\n\n async base64encode(str) {\n try {\n return await window.flutter_inappwebview.callHandler('base64encode', str);\n } catch (error) {\n return \"\";\n }\n }\n\n async base64decode(str) {\n try {\n return await window.flutter_inappwebview.callHandler('base64decode', str);\n } catch (error) {\n return \"\";\n }\n }\n }\n\n class Http {\n constructor() { }\n\n async Get(url, headers, followRedirects) {\n try {\n return await window.flutter_inappwebview.callHandler('http', \"get\", url, \"\", JSON.stringify(headers), followRedirects, \"\");\n } catch (error) {\n return null;\n }\n }\n\n async Head(url, headers, followRedirects) {\n try {\n return await window.flutter_inappwebview.callHandler('http', \"head\", url, \"\", JSON.stringify(headers), followRedirects, \"\");\n } catch (error) {\n return null;\n }\n }\n\n async Post(url, headers, body, contenttype, followRedirects) {\n try {\n return await window.flutter_inappwebview.callHandler('http', \"post\", url, body, JSON.stringify(headers), followRedirects, contenttype);\n } catch (error) {\n return null;\n }\n }\n }\n\n class Cache {\n constructor() { }\n async get(key) {\n try {\n return await window.flutter_inappwebview.callHandler('cache.get', key);\n } catch (error) {\n return null;\n }\n }\n\n async set(key, value) {\n try {\n return await window.flutter_inappwebview.callHandler('cache.set', key, value);\n } catch (error) {\n return null;\n }\n }\n\n async remove(key) {\n try {\n return await window.flutter_inappwebview.callHandler('cache.remove', key);\n } catch (error) {\n return null;\n }\n }\n\n async getLoginInfo() {\n return await this.get(\"LoginInfo\");\n }\n\n async putLoginInfo(info) {\n return await this.set(\"LoginInfo\", info);\n }\n\n async getbookVariable(bookurl) {\n return await this.get(bookurl);\n }\n\n async setbookVariable(bookurl, value) {\n return await this.set(bookurl, value);\n }\n }\n\n class Cookie {\n constructor() { }\n\n async get(url) {\n try {\n return await window.flutter_inappwebview.callHandler('cookie.get', url);\n } catch (error) {\n return null;\n }\n }\n\n async remove(url) {\n try {\n return await window.flutter_inappwebview.callHandler('cookie.remove', url);\n } catch (error) {\n return null;\n }\n }\n\n async set(url, value) {\n try {\n return await window.flutter_inappwebview.callHandler('cookie.set', url, value);\n } catch (error) {\n return null;\n }\n }\n\n async setCookie(url, key, value) {\n try {\n return await window.flutter_inappwebview.callHandler('cookie.setcookie', url, key, value);\n } catch (error) {\n return null;\n }\n }\n\n async getCookie(url, value) {\n try {\n return await window.flutter_inappwebview.callHandler('cookie.getCookie', url, value);\n } catch (error) {\n return null;\n }\n }\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 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) {\n tempContainer.parentNode.removeChild(tempContainer);\n }\n } catch (e) { }\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 var flutterBridge = new FlutterJSBridge();\n var http = new Http();\n var cache = new Cache();\n var cookie = new Cookie();\n var baseurl = \"https:\/\/drmh3.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 function fullUrl(url) {\n if (!url) return \"\";\n if (url.indexOf(\"http\") === 0) return url;\n if (url.indexOf(\"\/\/\") === 0) return \"https:\" + url;\n return baseurl + (url.indexOf(\"\/\") === 0 ? \"\" : \"\/\") + url;\n }\n\n function extractCover($el) {\n return $el.attr(\"data-original\") || $el.attr(\"data-src\") || $el.attr(\"src\") || \"\";\n }\n\n function extractCoverFromItem($box) {\n \/\/ 封面在 a.hl-item-thumb 的 data-original 属性上(该站没有img标签)\n var $thumb = $box.find(\".hl-item-thumb\");\n var cover = $thumb.attr(\"data-original\") || $thumb.attr(\"data-src\") || \"\";\n if (!cover) {\n var $img = $box.find(\"img\").first();\n cover = $img.attr(\"data-original\") || $img.attr(\"data-src\") || $img.attr(\"src\") || \"\";\n }\n return cover;\n }\n\n async function search(key, page) {\n try {\n var encoded = encodeURIComponent(key);\n var searchUrl;\n if (page > 1) {\n searchUrl = baseurl + \"\/comics-searching\/\" + encoded + \"\/page\/\" + page;\n } else {\n searchUrl = baseurl + \"\/cata.php?key=\" + encoded;\n }\n\n var get = await http.Get(searchUrl, header, true);\n if (!get || !get.data) {\n flutterBridge.log(\"搜索请求失败\");\n return \"[]\";\n }\n\n var books = [];\n var $html = parseHTMLSafely(removeHTMLTags(get.data));\n\n $html.find(\".hl-list-item, .comic-item, .mh-item, .book-item, li.item\").each(function () {\n var $box = $(this);\n var $thumb = $box.find(\".hl-item-thumb, .comic-cover, .mh-thumb, .book-cover, a:first\");\n var href = $thumb.attr(\"href\") || $box.find(\"a[href*='\/comics-reading\/']\").attr(\"href\") || $box.find(\"a\").first().attr(\"href\");\n var name = $thumb.attr(\"title\") || $box.find(\".hl-item-title, .comic-name, .mh-title, .book-name, .title, h3 a\").first().text().trim();\n if (!href || !name) return;\n if (href.indexOf(\"javascript\") >= 0) return;\n\n var bookUrl = fullUrl(href);\n var coverUrl = extractCoverFromItem($box);\n\n books.push({\n bookUrl: bookUrl,\n name: name,\n author: $box.find(\".hl-item-author, .author, .mh-author, .comic-author\").first().text().trim().replace(\/作者[::]\/, \"\"),\n kind: $box.find(\".hl-item-type, .type, .tag, .genre, .status\").first().text().trim(),\n coverUrl: coverUrl,\n intro: \"\",\n tocUrl: bookUrl,\n wordCount: \"\",\n type: 2,\n latestChapterTitle: $box.find(\".hl-lc-1, .update, .latest-chapter, .mh-update, .chapter, .hl-item-sub\").first().text().trim()\n });\n });\n\n removeHTMLSafely($html[0]);\n return JSON.stringify(books);\n } catch (e) {\n flutterBridge.log(\"搜索失败: \" + e.message);\n return \"[]\";\n }\n }\n\n async function info(bookurl) {\n try {\n var get = await http.Get(bookurl, header, true);\n if (!get || !get.data) {\n flutterBridge.log(\"详情页请求失败\");\n return \"{}\";\n }\n\n var $html = parseHTMLSafely(removeHTMLTags(get.data));\n\n var name = $html.find(\".hl-dc-title, .book-title, h1, .comic-name, .detail-title\").first().text().trim();\n\n var author = $html.find(\"a[href*='\/comics-searching\/'], a[href*='\/author\/'], a[href*='\/search\/']\").first().text().trim();\n\n var kind = $html.find(\".detail-tags-item, .tags-item\").map(function () {\n return $(this).text().trim();\n }).get().join(\",\");\n\n var intro = \"\";\n $html.find(\"li.blurb, .blurb\").each(function () {\n var text = $(this).text().trim();\n if (text.indexOf(\"简介\") >= 0 || text.indexOf(\"介绍\") >= 0) {\n intro = text.replace(\/简介[::]?\/, \"\").replace(\/介绍[::]?\/, \"\").trim();\n }\n });\n if (!intro) {\n intro = $html.find(\"meta[property='og:description']\").attr(\"content\") || \"\";\n }\n\n var coverUrl = \"\";\n var $coverSpan = $html.find(\".hl-dc-pic .hl-item-thumb, .hl-dc-pic span\").first();\n coverUrl = $coverSpan.attr(\"data-original\") || $coverSpan.attr(\"data-src\") || \"\";\n if (!coverUrl) {\n coverUrl = $html.find(\"meta[property='og:image']\").attr(\"content\") || \"\";\n }\n\n var status = $html.find(\".hl-pic-tag .state, .state, .status, .comic-status, .serial\").first().text().trim();\n\n var book = {\n bookUrl: bookurl,\n name: name,\n author: author,\n kind: kind,\n coverUrl: coverUrl,\n intro: intro,\n tocUrl: bookurl,\n wordCount: \"\",\n status: status,\n type: 2,\n latestChapterTitle: \"\"\n };\n\n removeHTMLSafely($html[0]);\n return JSON.stringify(book);\n } catch (e) {\n flutterBridge.log(\"详情页解析失败: \" + e.message);\n return \"{}\";\n }\n }\n\n async function chapter(tocUrl) {\n try {\n var get = await http.Get(tocUrl, header, true);\n if (!get || !get.data) {\n flutterBridge.log(\"章节列表请求失败\");\n return \"[]\";\n }\n\n var chapters = [];\n var $html = parseHTMLSafely(removeHTMLTags(get.data));\n\n $html.find(\".hl-plays-list li a, #hl-plays-list li a, .chapter-list li a, ul li a[href*='\/comics-reading\/']\").each(function (index) {\n var $a = $(this);\n var href = $a.attr(\"href\");\n var name = $a.attr(\"title\") || $a.text().trim();\n\n if (href && name && href.indexOf(\"javascript\") < 0 && name.length > 0) {\n var chapterId = fullUrl(href);\n chapters.push({\n name: name,\n chapterId: chapterId,\n index: index,\n isPay: false,\n isVip: false,\n isVolume: false,\n tag: \"\"\n });\n }\n });\n\n if (chapters.length === 0) {\n $html.find(\"a[href*='\/comics-reading\/']\").each(function (index) {\n var $a = $(this);\n var href = $a.attr(\"href\");\n var name = $a.attr(\"title\") || $a.text().trim();\n if (href && name && name.length > 0 && name.indexOf(\"img\") < 0) {\n chapters.push({\n name: name,\n chapterId: fullUrl(href),\n index: index,\n isPay: false,\n isVip: false,\n isVolume: false,\n tag: \"\"\n });\n }\n });\n }\n\n removeHTMLSafely($html[0]);\n return JSON.stringify(chapters);\n } catch (e) {\n flutterBridge.log(\"章节列表解析失败: \" + e.message);\n return \"[]\";\n }\n }\n\n async function content(url) {\n try {\n var get = await http.Get(url, header, true);\n if (!get || !get.data) {\n flutterBridge.log(\"内容请求失败,尝试webview\");\n return await contentViaWebview(url);\n }\n\n var images = [];\n var seen = {};\n\n var $html = parseHTMLSafely(removeHTMLTags(get.data));\n\n $html.find(\"img[data-original], img[data-src], img[src]\").each(function () {\n var $img = $(this);\n var src = $img.attr(\"data-original\") || $img.attr(\"data-src\") || $img.attr(\"src\");\n if (!src) return;\n\n var cls = $img.attr(\"class\") || \"\";\n if (cls.indexOf(\"logo\") >= 0) return;\n if (cls.indexOf(\"nav\") >= 0) return;\n if (cls.indexOf(\"avatar\") >= 0) return;\n if (cls.indexOf(\"icon\") >= 0) return;\n if (src.indexOf(\"loading\") >= 0) return;\n if (src.indexOf(\"blank\") >= 0) return;\n if (src.indexOf(\"data:image\") === 0) return;\n\n var absSrc = fullUrl(src);\n if (seen[absSrc]) return;\n seen[absSrc] = true;\n\n images.push('<img src=\"' + absSrc + ',' + JSON.stringify({ headers: { \"Referer\": baseurl + \"\/\" } }) + '\" \/>');\n });\n\n removeHTMLSafely($html[0]);\n\n if (images.length === 0) {\n return await contentViaWebview(url);\n }\n\n return images.join(\"\\n\");\n } catch (e) {\n flutterBridge.log(\"内容解析失败: \" + e.message);\n return \"\";\n }\n }\n\n async function contentViaWebview(url) {\n try {\n var js = \"(function(){\" +\n \"var imgs=document.querySelectorAll('img[data-original],img[data-src],img');\" +\n \"var r=[];\" +\n \"for(var i=0;i<imgs.length;i++){\" +\n \"var s=imgs[i].getAttribute('data-original')||imgs[i].getAttribute('data-src')||imgs[i].getAttribute('src');\" +\n \"if(s&&s.indexOf('http')===0&&s.indexOf('loading')<0&&s.indexOf('blank')<0&&s.indexOf('logo')<0){\" +\n \"r.push(s);\" +\n \"}\" +\n \"}\" +\n \"return r.join('SEP');\" +\n \"})()\";\n var html = await flutterBridge.webview(url, js, \"\", \"\", JSON.stringify(header));\n if (!html) return \"\";\n\n if (html.indexOf(\"SEP\") > 0) {\n var urls = html.split(\"SEP\");\n var result = \"\";\n var seen = {};\n for (var i = 0; i < urls.length; i++) {\n var u = urls[i].trim();\n if (u && !seen[u]) {\n seen[u] = true;\n if (result) result += \"\\n\";\n result += '<img src=\"' + u + ',' + JSON.stringify({ headers: { \"Referer\": baseurl + \"\/\" } }) + '\" \/>';\n }\n }\n return result;\n }\n\n var $temp = parseHTMLSafely(html);\n var result = \"\";\n var seen = {};\n $temp.find(\"img\").each(function () {\n var src = $(this).attr(\"data-original\") || $(this).attr(\"data-src\") || $(this).attr(\"src\");\n if (src && src.indexOf(\"http\") === 0 && !seen[src]) {\n seen[src] = true;\n if (result) result += \"\\n\";\n result += '<img src=\"' + src + ',' + JSON.stringify({ headers: { \"Referer\": baseurl + \"\/\" } }) + '\" \/>';\n }\n });\n removeHTMLSafely($temp);\n return result;\n } catch (e) {\n flutterBridge.log(\"webview内容解析失败: \" + e.message);\n return \"\";\n }\n }\n\n async function getfinds() {\n var sort = [\n { title: \"最近更新\", url: \"\/latest-comics\/page\/{{page}}\", type: 0 },\n { title: \"新书上架\", url: \"\/latest-comics\/latest-comics\/page\/{{page}}\", type: 0 },\n { title: \"推荐漫画\", url: \"\/latest-comics\/recommend\/page\/{{page}}\", type: 0 },\n { title: \"日榜\", url: \"\/desirable-comics\/daily\/page\/{{page}}\", type: 0 },\n { title: \"周榜\", url: \"\/desirable-comics\/weekly\/page\/{{page}}\", type: 0 },\n { title: \"月榜\", url: \"\/desirable-comics\/monthly\/page\/{{page}}\", type: 0 },\n { title: \"总榜\", url: \"\/desirable-comics\/all\/page\/{{page}}\", type: 0 },\n { title: \"韩漫精品\", url: \"\/comics-catalog\/韩漫\/ob\/hits\/st\/all\/page\/{{page}}\", type: 0 },\n { title: \"日漫精选\", url: \"\/comics-catalog\/日漫\/ob\/hits\/st\/all\/page\/{{page}}\", type: 0 },\n { title: \"3D漫画\", url: \"\/comics-catalog\/3D漫画\/ob\/hits\/st\/all\/page\/{{page}}\", type: 0 },\n { title: \"真人类\", url: \"\/comics-catalog\/真人\/ob\/hits\/st\/all\/page\/{{page}}\", type: 0 },\n { title: \"完结专区\", url: \"\/comics-catalog\/all\/ob\/hits\/st\/completed\/page\/{{page}}\", type: 0 }\n ];\n return JSON.stringify(sort);\n }\n\n async function find(url, page) {\n try {\n var findUrl = url.replace(\"{{page}}\", page);\n \/\/ 第1页去除\/page\/1后缀\n if (page == 1) {\n findUrl = findUrl.replace(\"\/page\/1\", \"\");\n }\n findUrl = fullUrl(findUrl);\n\n var get = await http.Get(findUrl, header, true);\n if (!get || !get.data) {\n flutterBridge.log(\"发现页请求失败: \" + findUrl);\n return \"[]\";\n }\n\n var books = [];\n var $html = parseHTMLSafely(removeHTMLTags(get.data));\n\n $html.find(\".hl-list-item, .comic-item, .mh-item, .book-item, li.item\").each(function () {\n var $box = $(this);\n var $thumb = $box.find(\".hl-item-thumb, .comic-cover, .mh-thumb, .book-cover, a:first\");\n var href = $thumb.attr(\"href\") || $box.find(\"a[href*='\/comics-reading\/']\").attr(\"href\") || $box.find(\"a\").first().attr(\"href\");\n var name = $thumb.attr(\"title\") || $box.find(\".hl-item-title, .comic-name, .mh-title, .book-name, .title, h3 a\").first().text().trim();\n if (!href || !name) return;\n if (href.indexOf(\"javascript\") >= 0) return;\n\n var bookUrl = fullUrl(href);\n var coverUrl = extractCoverFromItem($box);\n\n books.push({\n bookUrl: bookUrl,\n name: name,\n author: \"\",\n kind: $box.find(\".hl-item-type, .type, .tag, .genre\").first().text().trim(),\n coverUrl: coverUrl,\n intro: \"\",\n tocUrl: bookUrl,\n wordCount: \"\",\n type: 2,\n latestChapterTitle: $box.find(\".hl-lc-1, .update, .latest-chapter, .hl-item-sub\").first().text().trim()\n });\n });\n\n removeHTMLSafely($html[0]);\n return JSON.stringify(books);\n } catch (e) {\n flutterBridge.log(\"发现页解析失败: \" + e.message);\n return \"[]\";\n }\n }\n\n async function getloginurl() {\n return baseurl;\n }\n\n async function login() {\n }\n\n async function pay(bookurl, url) {\n }\n\n async function imagedecrypt(url, image) {\n return image;\n }\n\n async function shouldOverrideUrlLoading(url) {\n return true;\n }\n<\/script>\n\n<\/html>\n",
"login": false,
"lastUpdateTime": "1782291915855"
}