🥕茶马小说
https://www.chamabooks.net
autobcb_admin (12020)2小时前
我是萝卜制作
{
"bookSourceUrl": "https:\/\/www.chamabooks.net",
"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() {\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 console.error('CookieJar 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 async voice() {\n try {\n return await window.flutter_inappwebview.callHandler('voice');\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 webViewGetAjax(url, html, body, header, ajaxregex) {\n try {\n return await window.flutter_inappwebview.callHandler('webviewajax', url, html, body, header, ajaxregex);\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(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 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\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 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 let result = htmlString.replace(\/<script\\b[^<]*(?:(?!<\\\/script>)<[^<]*)*<\\\/script>\/gi, '');\n result = result.replace(\/<style\\b[^<]*(?:(?!<\\\/style>)<[^<]*)*<\\\/style>\/gi, '');\n return result;\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 const DOMAIN = \"https:\/\/www.chamabooks.net\";\n\n async function search(key, page) {\n if(page > 1){\n return \"[]\";\n }\n const url = `${DOMAIN}\/main?s=${encodeURIComponent(key)}`;\n const headers = {\n \"User-Agent\": await flutterBridge.getWebViewUA() || \"Mozilla\/5.0\",\n \"Referer\": DOMAIN\n };\n const res = await http.Get(url, headers, true);\n if (!res || !res.data) return \"[]\";\n\n let $html = parseHTMLSafely(res.data);\n let list = [];\n\n $html.find(\".novel-item\").each(function () {\n let $b = $(this);\n let href = $b.find(\".novel-subject a\").attr(\"href\");\n let name = $b.find(\".novel-subject a\").text().trim();\n let author = $b.find(\".misc-value a\").text().trim();\n let category = $b.find(\".category\").text().trim();\n\n \n let intro = \"\";\n $b.find(\".novel-desc p\").each(function () {\n let p = $(this).text().trim();\n if (p) intro += p + \"\\n\\n\";\n });\n\n list.push({\n bookUrl: href ? (href.startsWith(\"http\") ? href : DOMAIN + href) : \"\",\n name: name,\n author: author,\n kind: category,\n coverUrl: \"\",\n intro: intro,\n tocUrl: href ? (href.startsWith(\"http\") ? href : DOMAIN + href) : \"\",\n type: 0\n });\n });\n\n removeHTMLSafely($html[0]);\n return JSON.stringify(list);\n}\n\n async function info(bookurl) {\n const url = bookurl.startsWith(\"http\") ? bookurl : `${DOMAIN}${bookurl}`;\n const headers = {\n \"User-Agent\": await flutterBridge.getWebViewUA() || \"Mozilla\/5.0\",\n \"Referer\": DOMAIN\n };\n const res = await http.Get(url, headers, true);\n if (!res || !res.data) return JSON.stringify({});\n\n let $html = parseHTMLSafely(res.data);\n\n \n let intro = \"\";\n $html.find(\".novel-summary-content p\").each(function () {\n let p = $(this).text().trim();\n if (p) intro += p + \"\\n\\n\";\n });\n\n const bookInfo = {\n bookUrl: bookurl,\n name: $html.find(\"#novel-header h1\").text().replace(\/作者:.*\/, \"\").trim().replace(\/《|》\/g, \"\"),\n author: $html.find(\"#novel-header a\").text().replace(\"作者:\", \"\").trim(),\n kind: $html.find(\".category\").text().trim(),\n wordCount: $html.find(\".misc-value:contains('万')\").first().text().trim(),\n chapterCount: $html.find(\".misc-value\").eq(1).text().trim(),\n intro: intro,\n coverUrl: \"\",\n tocUrl: bookurl,\n latestChapterTitle: \"\"\n };\n\n removeHTMLSafely($html[0]);\n return JSON.stringify(bookInfo);\n}\r\n\n async function chapter(tocUrl) {\n const url = tocUrl.startsWith(\"http\") ? tocUrl : `${DOMAIN}${tocUrl}`;\n const headers = {\n \"User-Agent\": await flutterBridge.getWebViewUA() || \"Mozilla\/5.0\",\n \"Referer\": DOMAIN\n };\n const res = await http.Get(url, headers, true);\n if (!res || !res.data) return \"[]\";\n\n let $html = parseHTMLSafely(res.data);\n let list = [];\n let index = 0;\n\n $html.find(\".pg-sel option\").each(function () {\n let $opt = $(this);\n let chapterUrl = $opt.attr(\"value\");\n let chapterName = $opt.text().trim();\n\n list.push({\n bookUrl: tocUrl,\n chapterId: chapterUrl,\n name: chapterName,\n index: index++\n });\n });\n\n removeHTMLSafely($html[0]);\n return JSON.stringify(list);\n}\n\n async function content(url) {\n const purl = url.startsWith(\"http\") ? url : `${DOMAIN}${url}`;\n const headers = {\n \"User-Agent\": await flutterBridge.getWebViewUA() || \"Mozilla\/5.0\",\n \"Referer\": purl.replace(\/\\\/[^\\\/]+$\/, \"\/\")\n };\n const res = await http.Get(purl, headers, true);\n if (!res || !res.data) return \"获取正文失败\";\n\n let $html = parseHTMLSafely(res.data);\n\n let txt = \"\";\n $html.find(\"#novel-content p\").each(function () {\n let p = $(this).text().trim();\n if (p) txt += p + \"\\n\\n\";\n });\n\n removeHTMLSafely($html[0]);\n return txt;\n}\n async function getfinds() {\n var result = [];\n\n var doc = parseHTMLSafely((await http.Get(DOMAIN, {}, true)).data);\n var tagList = doc.find(\"#category-menu ul li a\");\n\n for (var i = 0; i < tagList.length-1; i++) {\n var a = tagList.eq(i);\n var title = a.text().replace(\/\\s+\/g, \"\");\n var href = a.attr(\"href\");\n\n var url = DOMAIN + href + (href.includes(\"?\") ? \"&\" : \"?\") + \"page={{page}}\";\n\n result.push({\n title: title,\n url: url\n });\n }\n\n removeHTMLSafely(doc[0]);\n return JSON.stringify(result);\n}\n async function find(url, page) {\n var result = [];\n\n var targetUrl = url.replace(\/page=\\{\\{page\\}\\}\/, \"p=\" + page);\r\n var doc = parseHTMLSafely((await http.Get(targetUrl, {}, true)).data);\n\n var items = doc.find(\".novel-item\");\n\n for (var i = 0; i < items.length; i++) {\n var item = items.eq(i);\n\n var href = item.find(\".novel-subject a\").attr(\"href\");\n var name = item.find(\".novel-subject a\").text().trim();\n var author = item.find(\".misc-value a\").text().trim();\n var category = item.find(\".category\").text().trim();\n\n var intro = \"\";\n item.find(\".novel-desc p\").each(function () {\n var p = $(this).text().trim();\n if (p) intro += p + \"\\n\\n\";\n });\n\n var bookUrl = href.startsWith(\"http\") ? href : DOMAIN + href;\n\n result.push({\n bookUrl: bookUrl,\n name: name,\n author: author,\n kind: category,\n coverUrl: \"\",\n intro: intro,\n tocUrl: bookUrl,\n type: 0\n });\n }\n\n removeHTMLSafely(doc[0]);\n return JSON.stringify(result);\n}\n async function getloginurl() {\n return JSON.stringify([]);\n }\n\n async function login() {\n return;\n }\n\n async function pay(bookurl, url) {\n return;\n }\n\n async function imagedecrypt(url, image) {\n return [];\n }\n\n async function shouldOverrideUrlLoading(url) {\n return true;\n }\n\n async function gethelp() {\n return \"茶马小说网书源\";\n }\n<\/script>\n<\/html>",
"login": false,
"lastUpdateTime": "1767342690223"
}