🎨拷贝漫画
https://www.copy3000.com/1
dev-xx (13787)06/23 12:33
该用户很懒,什么介绍也没有写!
{
"bookSourceUrl": "https:\/\/www.copy3000.com\/1",
"bookSourceName": "🎨拷贝漫画",
"enabledExplore": true,
"enabled": false,
"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 src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/crypto-js\/4.1.1\/crypto-js.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 console.log('JSBridge初始化完成');\n this.CookieJar();\n });\n }\n }\n\n async CookieJar() {\n try {\n await window.flutter_inappwebview.callHandler('CookieJar', isCookieJar);\n } catch (error) {\n console.error('汇报完成准备失败:', error);\n }\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\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\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(bookUrl) {\n try {\n return await window.flutter_inappwebview.callHandler('addbook',bookUrl);\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\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 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) {\n tempContainer.parentNode.removeChild(tempContainer);\n }\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<\/script>\n\n<script>\n const flutterBridge = new FlutterJSBridge();\n const cache = new Cache();\n const http = new Http();\n const cookie = new Cookie();\n var baseurl = \"https:\/\/www.copy3000.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 parseBookFromSearchItem(item) {\n return {\n bookUrl: baseurl + \"\/comic\/\" + item.path_word,\n name: item.name,\n author: item.author && item.author.length > 0 ? item.author[0].name : \"\",\n coverUrl: item.cover,\n intro: \"\",\n wordCount: \"\",\n kind: \"\",\n type: 2,\n latestChapterTitle: \"\"\n };\n }\n\n async function search(key, page) {\n var offset = (page - 1) * 12;\n var u = baseurl + \"\/api\/kb\/web\/searchci\/comics?offset=\" + offset + \"&platform=2&limit=12&q=\" + encodeURIComponent(key) + \"&q_type=\";\n var resp = await http.Get(u, header, true);\n if (!resp || !resp.data) { flutterBridge.showToast(\"搜索失败\"); return \"[]\"; }\n flutterBridge.text(0, resp.data);\n var jsonData;\n try {\n jsonData = JSON.parse(resp.data);\n } catch (e) {\n flutterBridge.log(\"JSON解析失败:\" + e.message);\n return \"[]\";\n }\n if (jsonData.code !== 200 || !jsonData.results || !jsonData.results.list) {\n return \"[]\";\n }\n var list = jsonData.results.list;\n var result = [];\n for (var i = 0; i < list.length; i++) {\n result.push(parseBookFromSearchItem(list[i]));\n }\n if (result.length === 0 && page > 1) return \"[]\";\n return JSON.stringify(result);\n }\n\n async function info(bookurl) {\n var resp = await http.Get(bookurl, header, true);\n if (!resp || !resp.data) { flutterBridge.showToast(\"获取详情失败\"); return JSON.stringify({}); }\n flutterBridge.text(1, resp.data);\n var $tempContainer = parseHTMLSafely(removeHTMLTags(resp.data));\n\n var name = $tempContainer.find(\".comicParticulars-title-right h6\").attr(\"title\") || $tempContainer.find(\".comicParticulars-title-right h6\").text().trim();\n if (!name) name = $('meta[property=\"og:title\"]').attr(\"content\") || \"\";\n\n var author = \"\";\n var $authorLinks = $tempContainer.find(\".comicParticulars-title-right ul li\").eq(2).find(\"a\");\n $authorLinks.each(function() {\n var t = $(this).text().trim();\n if (t) {\n if (author) author += \"\/\" + t;\n else author = t;\n }\n });\n\n var coverUrl = $tempContainer.find(\".comicParticulars-left-img img.lazyload\").attr(\"data-src\")\n || $tempContainer.find(\".comicParticulars-left-img img\").attr(\"src\") || \"\";\n\n var kind = \"\";\n $tempContainer.find(\".comicParticulars-tag a\").each(function() {\n var t = $(this).text().trim().replace(\/^#\/, \"\");\n if (t) {\n if (kind) kind += \"\/\" + t;\n else kind = t;\n }\n });\n\n var status = \"\";\n $tempContainer.find(\".comicParticulars-title-right ul li\").each(function() {\n var txt = $(this).text().trim();\n if (txt.indexOf(\"狀態\") >= 0) {\n status = txt.replace(\/狀態[::]\\s*\/, \"\").trim();\n }\n });\n\n var intro = $tempContainer.find(\".intro\").text().trim();\n if (!intro) intro = $('meta[name=\"description\"]').attr(\"content\") || \"\";\n\n var tocUrl = bookurl;\n var $startBtn = $tempContainer.find(\"a.comicParticulars-botton[href*='\/chapter\/']\").first();\n if ($startBtn.length > 0) {\n tocUrl = $startBtn.attr(\"href\");\n if (tocUrl.indexOf(\"http\") !== 0) {\n tocUrl = baseurl + tocUrl;\n }\n }\n\n removeHTMLSafely($tempContainer);\n\n var book = {\n bookUrl: bookurl,\n name: name,\n author: author,\n kind: kind,\n coverUrl: coverUrl,\n intro: intro,\n tocUrl: tocUrl,\n wordCount: \"\",\n type: 2,\n status: status,\n latestChapterTitle: \"\"\n };\n return JSON.stringify(book);\n }\n\n async function chapter(tocUrl) {\n var list = [];\n var chIndex = 0;\n var pathMatch = tocUrl.match(\/comic\\\/([^\\\/]+)\/);\n var pathWord = pathMatch ? pathMatch[1] : \"\";\n if (!pathWord) {\n var pathMatch2 = tocUrl.match(\/\\\/([^\\\/]+?)(?:\\\/chapter|\\?|$)\/);\n if (pathMatch2) pathWord = pathMatch2[1];\n }\n if (!pathWord) {\n flutterBridge.showToast(\"无法提取漫画ID\");\n return \"[]\";\n }\n\n var detailUrl = baseurl + \"\/comic\/\" + pathWord;\n var jsCode = \"Array.from(document.querySelectorAll('a[href*=\\\"\/comic\/\" + pathWord + \"\/chapter\/\\\"]')).map(function(a){return a.href + '|||' + a.textContent.trim();}).join(';;;')\";\n var html = await flutterBridge.webview(detailUrl, jsCode, \"\", \"\", JSON.stringify(header));\n if (!html) {\n var detailResp = await http.Get(detailUrl, header, true);\n if (detailResp && detailResp.data) {\n var hrefRegex = new RegExp('href=\"([^\"]*' + pathWord + '\/chapter\/[^\"]+)\"[^>]*>([^<]+)', 'g');\n var m;\n var seen = {};\n while ((m = hrefRegex.exec(detailResp.data)) !== null) {\n var href = m[1];\n var name = m[2].trim();\n if (!name || !href || href.indexOf(\"javascript\") >= 0) continue;\n if (name.length < 1) continue;\n if (seen[href]) continue;\n seen[href] = true;\n var url = href.indexOf(\"http\") === 0 ? href : baseurl + href;\n list.push({\n name: name,\n chapterId: url,\n index: chIndex++,\n isPay: false,\n isVip: false,\n isVolume: false\n });\n }\n }\n if (list.length === 0) {\n var currentUrl = tocUrl;\n var seenUrls = {};\n var maxWalk = 3000;\n var walkCount = 0;\n while (currentUrl && walkCount < maxWalk) {\n if (seenUrls[currentUrl]) break;\n seenUrls[currentUrl] = true;\n var resp = await http.Get(currentUrl, header, true);\n if (!resp || !resp.data) break;\n walkCount++;\n var chapterName = \"\";\n var nameMatch = resp.data.match(\/<h4[^>]*class=\"header\"[^>]*>([^<]+)<\\\/h4>\/);\n if (nameMatch) {\n chapterName = nameMatch[1].trim();\n var nameParts = chapterName.split(\"\/\");\n if (nameParts.length > 1) chapterName = nameParts[nameParts.length - 1].trim();\n }\n if (!chapterName) {\n var titleMatch = resp.data.match(\/<title>([^<]+)<\\\/title>\/);\n if (titleMatch) {\n chapterName = titleMatch[1].trim();\n var dashIdx = chapterName.lastIndexOf(\" - \");\n if (dashIdx > 0) chapterName = chapterName.substring(0, dashIdx).trim();\n }\n }\n if (!chapterName) chapterName = \"第\" + (walkCount) + \"话\";\n list.push({\n name: chapterName,\n chapterId: currentUrl,\n index: chIndex++,\n isPay: false,\n isVip: false,\n isVolume: false\n });\n var nextMatch = resp.data.match(\/class=\"[^\"]*comicContent-next[^\"]*\"[^>]*>[\\s\\S]*?<a[^>]*href=\"([^\"]+)\"[^>]*>\/);\n if (!nextMatch) {\n nextMatch = resp.data.match(\/下一[話话][\\s\\S]*?href=\"([^\"]+)\"\/);\n }\n if (nextMatch) {\n var nextUrl = nextMatch[1];\n if (nextUrl.indexOf(\"http\") !== 0) nextUrl = baseurl + nextUrl;\n if (nextUrl === currentUrl) break;\n currentUrl = nextUrl;\n } else {\n break;\n }\n }\n }\n } else {\n var parts = html.split(\";;;\");\n for (var i = 0; i < parts.length; i++) {\n var p = parts[i];\n var sepIdx = p.indexOf(\"|||\");\n if (sepIdx < 0) continue;\n var href = p.substring(0, sepIdx);\n var name = p.substring(sepIdx + 3).trim();\n if (!name || !href || href.indexOf(\"javascript\") >= 0) continue;\n if (name.length < 1) continue;\n var url = href.indexOf(\"http\") === 0 ? href : baseurl + href;\n list.push({\n name: name,\n chapterId: url,\n index: chIndex++,\n isPay: false,\n isVip: false,\n isVolume: false\n });\n }\n }\n\n if (list.length === 0) {\n flutterBridge.showToast(\"未获取到章节\");\n return \"[]\";\n }\n\n return JSON.stringify(list);\n }\n\n async function content(url) {\n var resp = await http.Get(url, header, true);\n if (!resp || !resp.data) { flutterBridge.showToast(\"获取内容失败\"); return \"\"; }\n flutterBridge.text(3, resp.data);\n\n var html = resp.data;\n var contentKeyMatch = html.match(\/var\\s+contentKey\\s*=\\s*'([^']+)'\/);\n var pwdMatch = html.match(\/var\\s+(?:cct|ccz)\\s*=\\s*'([^']+)'\/);\n if (!contentKeyMatch || !pwdMatch) {\n flutterBridge.showToast(\"未找到加密数据\");\n return \"\";\n }\n\n var contentKey = contentKeyMatch[1];\n var pwd = pwdMatch[1];\n\n if (typeof CryptoJS === \"undefined\") {\n try {\n var script = document.createElement('script');\n script.src = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/crypto-js\/4.1.1\/crypto-js.min.js';\n document.head.appendChild(script);\n await new Promise(function(resolve) { script.onload = resolve; });\n } catch (e) {\n flutterBridge.log(\"CryptoJS加载失败:\" + e.message);\n }\n }\n if (typeof CryptoJS === \"undefined\") {\n flutterBridge.showToast(\"解密库加载失败\");\n return \"\";\n }\n\n try {\n var keyHex = CryptoJS.enc.Utf8.parse(pwd);\n var ivHex = CryptoJS.enc.Utf8.parse(contentKey.substring(0, 16));\n var hexData = contentKey.substring(16);\n var wordArray = CryptoJS.enc.Hex.parse(hexData);\n var base64Str = CryptoJS.enc.Base64.stringify(wordArray);\n var decrypted = CryptoJS.AES.decrypt(base64Str, keyHex, {\n iv: ivHex,\n mode: CryptoJS.mode.CBC,\n padding: CryptoJS.pad.Pkcs7\n });\n var decryptedStr = decrypted.toString(CryptoJS.enc.Utf8);\n if (!decryptedStr) {\n flutterBridge.showToast(\"解密结果为空\");\n return \"\";\n }\n var imageData = JSON.parse(decryptedStr);\n var imgs = [];\n if (Array.isArray(imageData)) {\n for (var i = 0; i < imageData.length; i++) {\n var item = imageData[i];\n var imgUrl = typeof item === \"string\" ? item : (item.url || item.src || \"\");\n if (imgUrl && imgUrl.indexOf(\"http\") === 0) {\n imgs.push('<img src=\"' + imgUrl + '\" \/>');\n }\n }\n } else if (typeof imageData === \"object\") {\n for (var key in imageData) {\n var imgUrl = imageData[key];\n if (typeof imgUrl === \"string\" && imgUrl.indexOf(\"http\") === 0) {\n imgs.push('<img src=\"' + imgUrl + '\" \/>');\n }\n }\n }\n if (imgs.length > 0) {\n return imgs.join(\"\");\n }\n flutterBridge.showToast(\"未解析到图片URL\");\n return \"\";\n } catch (e) {\n flutterBridge.log(\"内容解密失败:\" + e.message);\n flutterBridge.showToast(\"内容解密失败\");\n return \"\";\n }\n }\n\n async function getfinds() {\n var result = [];\n var push = function(title, url, type) {\n result.push({ title: title, url: url, type: type || 0 });\n };\n push(\"拷贝漫画\", \"\", 0);\n push(\"全部\", \"\/comics?ordering=-datetime_updated&page={{page}}\", 0);\n push(\"爱情\", \"\/comics?theme=aiqing&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"欢乐向\", \"\/comics?theme=huanlexiang&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"冒险\", \"\/comics?theme=maoxian&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"奇幻\", \"\/comics?theme=qihuan&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"百合\", \"\/comics?theme=baihe&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"校园\", \"\/comics?theme=xiaoyuan&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"科幻\", \"\/comics?theme=kehuan&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"东方\", \"\/comics?theme=dongfang&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"耽美\", \"\/comics?theme=danmei&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"生活\", \"\/comics?theme=shenghuo&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"格斗\", \"\/comics?theme=gedou&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"轻小说\", \"\/comics?theme=qingxiaoshuo&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"悬疑\", \"\/comics?theme=xuanyi&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"萌系\", \"\/comics?theme=mengxi&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"神鬼\", \"\/comics?theme=shengui&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"职场\", \"\/comics?theme=zhichang&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"治愈\", \"\/comics?theme=zhiyu&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"节操\", \"\/comics?theme=jiecao&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"四格\", \"\/comics?theme=sige&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"搞笑\", \"\/comics?theme=gaoxiao&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"后宫\", \"\/comics?theme=hougong&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"热血\", \"\/comics?theme=rexue&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"侦探\", \"\/comics?theme=zhentan&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"惊悚\", \"\/comics?theme=jingsong&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"异世界\", \"\/comics?theme=yishijie&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"历史\", \"\/comics?theme=lishi&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"都市\", \"\/comics?theme=dushi&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"穿越\", \"\/comics?theme=chuanyue&ordering=-datetime_updated&page={{page}}\", 0);\n push(\"恐怖\", \"\/comics?theme=kongbu&ordering=-datetime_updated&page={{page}}\", 0);\n return JSON.stringify(result);\n }\n\n async function find(url, page) {\n if (url.indexOf(\"{{page}}\") >= 0) {\n var pageUrl = url.replace(\"{{page}}\", page);\n } else {\n pageUrl = url;\n }\n if (!pageUrl.startsWith(\"http\")) {\n pageUrl = baseurl + pageUrl;\n }\n var resp = await http.Get(pageUrl, header, true);\n if (!resp || !resp.data) return \"[]\";\n\n var html = resp.data;\n\n var listMatch = html.match(\/list\\s*=\\s*\"([^\"]+)\"\/);\n if (listMatch) {\n try {\n var listStr = listMatch[1].replace(\/'\/g, \"'\").replace(\/"\/g, '\"').replace(\/>\/g, '>').replace(\/<\/g, '<').replace(\/&\/g, '&');\n var items = eval(listStr);\n var result = [];\n if (Array.isArray(items)) {\n for (var i = 0; i < items.length; i++) {\n var item = items[i];\n result.push({\n bookUrl: baseurl + \"\/comic\/\" + item.path_word,\n name: item.name,\n author: item.author && item.author.length > 0 ? item.author[0].name : \"\",\n coverUrl: item.cover,\n intro: \"\",\n wordCount: \"\",\n kind: \"\",\n type: 2,\n latestChapterTitle: \"\"\n });\n }\n return JSON.stringify(result);\n }\n } catch (e) {\n flutterBridge.log(\"解析列表数据失败:\" + e.message);\n }\n }\n\n var totalMatch = html.match(\/total\\s*=\\s*\"(\\d+)\"\/);\n if (page > 1 && !totalMatch) return \"[]\";\n\n var $tempContainer = parseHTMLSafely(removeHTMLTags(html));\n var items = [];\n $tempContainer.find(\".exemptComic_Item, .col-auto\").each(function() {\n var $item = $(this);\n var $a = $item.find(\"a[href*='\/comic\/']\").first();\n var bookUrl = $a.attr(\"href\");\n if (!bookUrl || bookUrl.indexOf(\"javascript\") >= 0) return;\n if (bookUrl.indexOf(\"http\") !== 0) bookUrl = baseurl + bookUrl;\n var $img = $item.find(\"img\");\n var coverUrl = $img.attr(\"data-src\") || $img.attr(\"data-original\") || $img.attr(\"src\") || \"\";\n if (coverUrl.indexOf(\"loading\") >= 0) coverUrl = \"\";\n var name = $item.find(\".twoLines\").first().text().trim();\n if (!name) {\n name = $a.attr(\"title\") || $a.text().trim();\n }\n if (!name || name.length < 1) return;\n var author = \"\";\n var $authorSpan = $item.find(\".exemptComicItem-txt-span\").first();\n if ($authorSpan.length > 0) {\n author = $authorSpan.text().trim().replace(\"作者:\", \"\").replace(\"作者:\", \"\");\n }\n items.push({\n bookUrl: bookUrl,\n name: name,\n author: author,\n coverUrl: coverUrl,\n intro: \"\",\n wordCount: \"\",\n kind: \"\",\n type: 2,\n latestChapterTitle: \"\"\n });\n });\n\n removeHTMLSafely($tempContainer);\n\n if (items.length === 0) {\n if (page > 1) return \"[]\";\n return \"[]\";\n }\n\n return JSON.stringify(items);\n }\n\n async function getloginurl(){\n return baseurl;\n }\n\n async function login(){\n\n }\n\n async function pay(bookurl,url){\n\n }\n\n async function imagedecrypt(url,image){\n try {\n var ccz = await cache.get(\"2026copy_ccz\") || \"op0zzpvv.nmn.00p\";\n var keyHex = CryptoJS.enc.Utf8.parse(ccz);\n var ivHex = CryptoJS.enc.Utf8.parse(ccz);\n var decrypted = CryptoJS.AES.decrypt(image, keyHex, {\n iv: ivHex,\n mode: CryptoJS.mode.CBC,\n padding: CryptoJS.pad.Pkcs7\n });\n var words = decrypted.words;\n var byteList = [];\n for (var i = 0; i < decrypted.sigBytes; i++) {\n byteList.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n return byteList;\n } catch (e) {\n flutterBridge.log(\"imagedecrypt失败:\" + e.message);\n return null;\n }\n }\n\n async function shouldOverrideUrlLoading(url){\n return true;\n }\n<\/script>\n\n<\/html>\n",
"login": false,
"lastUpdateTime": "1782189216501"
}