轻小说文库(需要登录!!)
https://www.wenku8.net
dev-xx (13787)06/16 12:11
需要登录!!!在书源管理里面登录
{
"bookSourceUrl": "https:\/\/www.wenku8.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>wenku8.net - 轻小说文库<\/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(); }\n else {\n window.addEventListener('flutterInAppWebViewPlatformReady', () => {\n this.isReady = true; this.CookieJar();\n });\n }\n }\n async CookieJar() { try { await window.flutter_inappwebview.callHandler('CookieJar', isCookieJar); } catch (error) {} }\n async getbuildNumber() { try { return await window.flutter_inappwebview.callHandler('buildNumber'); } catch (error) { return 0; } }\n async getversion() { try { return await window.flutter_inappwebview.callHandler('version'); } catch (error) { return \"0.0.0\"; } }\n async toTraditional(str) { try { return await window.flutter_inappwebview.callHandler('toTraditional',str); } catch (error) { return \"\"; } }\n async toSimplified(str) { try { return await window.flutter_inappwebview.callHandler('toSimplified',str); } catch (error) { return \"\"; } }\n async getDeviceid() { try { return await window.flutter_inappwebview.callHandler('id'); } catch (error) { return \"\"; } }\n async getDevice() { try { return await window.flutter_inappwebview.callHandler('device'); } catch (error) { return \"\"; } }\n async log(str) { try { return await window.flutter_inappwebview.callHandler('log',str); } catch (error) { return false; } }\n async text(type,str) { try { return await window.flutter_inappwebview.callHandler('text',type,str); } catch (error) { return false; } }\n async showToast(str) { try { return await window.flutter_inappwebview.callHandler('showToast',str); } catch (error) { return false; } }\n async getWebViewUA() { try { return await window.flutter_inappwebview.callHandler('getWebViewUA'); } catch (error) { return \"\"; } }\n async openurl(url) { try { return await window.flutter_inappwebview.callHandler('openurl',url,\"\"); } catch (error) { return false; } }\n async openurlwithMimeType(url,mimeType) { try { return await window.flutter_inappwebview.callHandler('openurl',url,mimeType); } catch (error) { return false; } }\n async webview(url,js,html,body,header) { try { return await window.flutter_inappwebview.callHandler('webview',url,js,html,body,header,\"\",\"\"); } catch (error) { return \"\"; } }\n async webViewGetOverrideUrl(url,js,html,body,header,overrideUrlRegex) { try { return await window.flutter_inappwebview.callHandler('webview',url,js,html,body,header,overrideUrlRegex,\"\"); } catch (error) { return \"\"; } }\n async webViewGetSource(url,js,html,body,header,urlregex) { try { return await window.flutter_inappwebview.callHandler('webview',url,js,html,body,header,\"\",urlregex); } catch (error) { return \"\"; } }\n async startBrowser(url,title,header) { try { return await window.flutter_inappwebview.callHandler('startBrowser',url,title,header); } catch (error) { return \"\"; } }\n async startBrowserWithShouldOverrideUrlLoading(url,title,header) { try { return await window.flutter_inappwebview.callHandler('startBrowserWithShouldOverrideUrlLoading',url,title,header); } catch (error) { return \"\"; } }\n async startBrowserDp(url,title) { try { return await window.flutter_inappwebview.callHandler('startBrowserDp',url,title); } catch (error) { return \"\"; } }\n async back() { try { return await window.flutter_inappwebview.callHandler('back'); } catch (error) { return false; } }\n async utf8ToGbkUrlEncoded(str) { try { return await window.flutter_inappwebview.callHandler('utf8ToGbkUrlEncoded',str); } catch (error) { return \"\"; } }\n async getVerificationCode(str,header) { try { return await window.flutter_inappwebview.callHandler('getVerificationCode',str,header); } catch (error) { return \"\"; } }\n async addbook(bookUrl) { try { return await window.flutter_inappwebview.callHandler('addbook',bookUrl); } catch (error) { return \"\"; } }\n async base64encode(str) { try { return await window.flutter_inappwebview.callHandler('base64encode',str); } catch (error) { return \"\"; } }\n async base64decode(str) { try { return await window.flutter_inappwebview.callHandler('base64decode',str); } catch (error) { return \"\"; } }\n }\n\n class Http {\n constructor() {}\n async Get(url, headers, followRedirects) { try { return await window.flutter_inappwebview.callHandler('http', 'get', url, '', headers, followRedirects, ''); } catch (error) { return null; } }\n async Post(url, headers, body, contentType, followRedirects) { try { return await window.flutter_inappwebview.callHandler('http', 'post', url, body, headers, followRedirects, contentType); } catch (error) { return null; } }\n }\n\n class Cache {\n constructor() {}\n async get(key) { try { return await window.flutter_inappwebview.callHandler('cache.get',key); } catch (error) { return null; } }\n async set(key,value) { try { return await window.flutter_inappwebview.callHandler('cache.set',key,value); } catch (error) { return null; } }\n async remove(key) { try { return await window.flutter_inappwebview.callHandler('cache.remove',key); } catch (error) { return null; } }\n async getLoginInfo(){ return await this.get(\"LoginInfo\") }\n async putLoginInfo(info){ return await this.set(\"LoginInfo\",info) }\n async getbookVariable(bookurl){ return await this.get(bookurl) }\n async setbookVariable(bookurl,value){ return await this.set(bookurl,value) }\n }\n\n class Cookie {\n constructor() {}\n async get(url) { try { return await window.flutter_inappwebview.callHandler('cookie.get',url); } catch (error) { return null; } }\n async remove(url) { try { return await window.flutter_inappwebview.callHandler('cookie.remove',url); } catch (error) { return null; } }\n async set(url,value) { try { return await window.flutter_inappwebview.callHandler('cookie.set',url,value); } catch (error) { return null; } }\n async setCookie(url,key,value) { try { return await window.flutter_inappwebview.callHandler('cookie.setcookie',url,key,value); } catch (error) { return null; } }\n async getCookie(url,value) { try { return await window.flutter_inappwebview.callHandler('cookie.getCookie',url,value); } catch (error) { return null; } }\n }\n\n function parseHTMLSafely(htmlStr) {\n try { var tempDiv = document.createElement('div'); tempDiv.innerHTML = htmlStr; return $(tempDiv); } catch (e) { flutterBridge.log(\"HTML解析错误:\"+e.message); return $('<div>'); }\n }\n\n function removeHTMLSafely(tempContainer) {\n try { if (tempContainer[0]) tempContainer = tempContainer[0]; tempContainer.innerHTML = ''; if (tempContainer.parentNode) tempContainer.parentNode.removeChild(tempContainer); } catch (e) { flutterBridge.log(\"HTML移除失败:\"+e.message); }\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<\/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.wenku8.net\";\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 absUrl(u, base) {\n if (!u) return \"\";\n if (u.startsWith(\"http\")) return u;\n if (u.startsWith(\"\/\/\")) return \"https:\" + u;\n if (u.startsWith(\"\/\")) return baseurl + u;\n if (base) {\n var idx = base.lastIndexOf(\"\/\");\n if (idx >= 0) return base.substring(0, idx + 1) + u;\n }\n return baseurl + u;\n }\n\n async function ensureCookies() {\n var ck = await cookie.get(baseurl);\n if (!ck || ck.length < 10) {\n await flutterBridge.webview(baseurl + \"\/\", \"\", \"\", \"\", JSON.stringify(header));\n }\n }\n\n async function fetchPage(url) {\n var mheader = JSON.stringify(header);\n var get = await http.Get(url, mheader, true);\n if (!get || !get.data) return null;\n return get.data;\n }\n\n async function search(key, page) {\n try {\n await ensureCookies();\n var encoded = await flutterBridge.utf8ToGbkUrlEncoded(key);\n if (!encoded) encoded = encodeURIComponent(key);\n var u = baseurl + \"\/modules\/article\/search.php?searchkey=\" + encoded + \"&searchtype=articlename\";\n if (page > 1) u += \"&page=\" + page;\n var html = await fetchPage(u);\n if (!html) return \"[]\";\n flutterBridge.text(0, html);\n\n var $c = parseHTMLSafely(removeHTMLTags(html));\n var books = [];\n\n $c.find(\"table.grid td > div[style*='width:373px']\").each(function() {\n try {\n var $el = $(this);\n var $coverDiv = $el.find(\"> div[style*='width:95px']\");\n var $infoDiv = $el.find(\"> div[style*='margin-top']\");\n if ($coverDiv.length === 0 || $infoDiv.length === 0) return;\n var $a = $coverDiv.find(\"a\").first();\n var bookUrl = absUrl($a.attr(\"href\"));\n var name = $infoDiv.find(\"b a\").text().trim();\n var coverUrl = absUrl($coverDiv.find(\"img\").attr(\"src\"));\n var infoPs = $infoDiv.find(\"p\");\n var $p0 = $(infoPs[0]);\n var $p1 = $(infoPs[1]);\n var authorText = $p0.text().trim();\n var author = authorText.replace(\/^作者\\s*[::]\\s*\/, \"\").split(\"\/\")[0].trim();\n var kindText = $p0.text().trim();\n var kind = \"\";\n var kindMatch = kindText.match(\/分类\\s*[::]\\s*(.+)$\/);\n if (kindMatch) kind = kindMatch[1].trim();\n var statusText = $p1.text().trim();\n var wordCount = \"\";\n var status = \"\";\n var wcMatch = statusText.match(\/字数\\s*[::]\\s*([^\\\/]+)\/);\n if (wcMatch) wordCount = wcMatch[1].trim();\n if (statusText.indexOf(\"已完结\") >= 0) status = \"已完结\";\n else if (statusText.indexOf(\"连载\") >= 0) status = \"连载中\";\n var intro = \"\";\n if (infoPs.length >= 4) {\n intro = $(infoPs[3]).text().trim().replace(\/^简介\\s*[::]\\s*\/, \"\");\n }\n if (!bookUrl || !name) return;\n books.push({\n \"bookUrl\": bookUrl,\n \"name\": name,\n \"author\": author,\n \"kind\": kind,\n \"coverUrl\": coverUrl,\n \"intro\": intro,\n \"tocUrl\": bookUrl,\n \"wordCount\": wordCount,\n \"type\": 0,\n \"latestChapterTitle\": \"\"\n });\n } catch (e) { flutterBridge.log(\"search item error:\" + e.message); }\n });\n\n removeHTMLSafely($c);\n flutterBridge.log(\"搜索结果数:\" + books.length);\n return JSON.stringify(books);\n } catch (e) {\n flutterBridge.log(\"search error:\" + e.message);\n return \"[]\";\n }\n }\n\n async function info(bookurl) {\n try {\n var u = absUrl(bookurl);\n var html = await fetchPage(u);\n if (!html) return JSON.stringify({ \"bookUrl\": bookurl });\n flutterBridge.text(1, html);\n\n var $c = parseHTMLSafely(removeHTMLTags(html));\n\n var name = $c.find(\"span[style*='font-size:16px'] b\").text().trim() || \"\";\n\n var author = \"\";\n var kind = \"\";\n var status = \"\";\n var wordCount = \"\";\n $c.find(\"#content table tr td\").each(function() {\n var text = $(this).text().trim();\n var m;\n if (text.indexOf(\"小说作者\") >= 0) {\n m = text.match(\/小说作者[::]\\s*(.+)\/);\n if (m) author = m[1].trim();\n }\n if (text.indexOf(\"文库分类\") >= 0) {\n m = text.match(\/文库分类[::]\\s*(.+)\/);\n if (m) kind = m[1].trim();\n }\n if (text.indexOf(\"文章状态\") >= 0) {\n m = text.match(\/文章状态[::]\\s*(.+)\/);\n if (m) status = m[1].trim();\n }\n if (text.indexOf(\"全文长度\") >= 0) {\n m = text.match(\/全文长度[::]\\s*(.+)\/);\n if (m) wordCount = m[1].trim();\n }\n });\n\n var coverUrl = $c.find(\"#content img[src*='img.wenku8.com']\").first().attr(\"src\")\n || $c.find(\"#content img[src*='wenku8']\").first().attr(\"src\")\n || $c.find(\"td[align='center'] img\").first().attr(\"src\") || \"\";\n coverUrl = absUrl(coverUrl);\n\n var intro = \"\";\n $c.find(\"td[valign='top']\").each(function() {\n var html = $(this).html();\n var m = html.match(\/内容简介[::]<\\\/span><br[^>]*>\\s*<span[^>]*>([\\s\\S]*?)<\\\/span>\/i);\n if (m) {\n intro = m[1].replace(\/<br\\s*\\\/?>\/gi, \"\\r\\n\").replace(\/ \/g, \" \").replace(\/<[^>]+>\/g, \"\").trim();\n }\n });\n\n var latestChapterTitle = \"\";\n var latestChapterUrl = \"\";\n $c.find(\"span.hottext:contains('最近章节')\").each(function() {\n var $td = $(this).closest(\"td\");\n var $a = $td.find(\"a[href*='\/novel\/']\").first();\n if ($a.length > 0) {\n latestChapterTitle = $a.text().trim();\n latestChapterUrl = absUrl($a.attr(\"href\"));\n }\n });\n\n var tocUrl = \"\";\n var $tocA = $c.find(\"a[href*='index.htm']\").first();\n if ($tocA.length > 0) {\n tocUrl = absUrl($tocA.attr(\"href\"));\n }\n if (!tocUrl) {\n var bid = bookurl.match(\/book\\\/(\\d+)\\.htm\/);\n if (bid) {\n var id = bid[1];\n var prefix = id.substring(0, 1);\n tocUrl = baseurl + \"\/novel\/\" + prefix + \"\/\" + id + \"\/index.htm\";\n } else {\n tocUrl = u;\n }\n }\n\n removeHTMLSafely($c);\n return JSON.stringify({\n \"bookUrl\": bookurl,\n \"name\": name,\n \"author\": author,\n \"coverUrl\": coverUrl,\n \"intro\": intro,\n \"kind\": kind,\n \"status\": status,\n \"wordCount\": wordCount,\n \"tocUrl\": tocUrl,\n \"type\": 0,\n \"latestChapterTitle\": latestChapterTitle\n });\n } catch (e) {\n flutterBridge.log(\"info error:\" + e.message);\n return JSON.stringify({ \"bookUrl\": bookurl });\n }\n }\n\n async function chapter(tocUrl) {\n try {\n var u = absUrl(tocUrl);\n if (u.indexOf(\"index.htm\") < 0 && u.indexOf(\"\/novel\/\") < 0) {\n var bid = u.match(\/book\\\/(\\d+)\\.htm\/);\n if (bid) {\n var id = bid[1];\n var prefix = id.substring(0, 1);\n u = baseurl + \"\/novel\/\" + prefix + \"\/\" + id + \"\/index.htm\";\n }\n }\n var html = await fetchPage(u);\n if (!html) return \"[]\";\n flutterBridge.text(2, html);\n\n var $c = parseHTMLSafely(removeHTMLTags(html));\n var chapters = [];\n var idx = 0;\n\n $c.find(\"table.css a[href*='.htm']\").each(function() {\n try {\n var $a = $(this);\n var cUrl = absUrl($a.attr(\"href\"), u);\n var name = $a.text().trim();\n if (!cUrl || !name || name.length < 1) return;\n if (cUrl.indexOf(\"index.htm\") >= 0) return;\n if (name.indexOf(\"下一页\") >= 0 || name.indexOf(\"上一页\") >= 0) return;\n chapters.push({\n \"name\": name,\n \"chapterId\": cUrl,\n \"index\": idx,\n \"isPay\": false,\n \"isVip\": false,\n \"isVolume\": false,\n \"tag\": \"\"\n });\n idx++;\n } catch (e) { flutterBridge.log(\"chapter item error:\" + e.message); }\n });\n\n removeHTMLSafely($c);\n flutterBridge.log(\"章节数:\" + chapters.length);\n return JSON.stringify(chapters);\n } catch (e) {\n flutterBridge.log(\"chapter error:\" + e.message);\n return \"[]\";\n }\n }\n\n async function content(url) {\n try {\n var u = absUrl(url);\n var mheader = JSON.stringify(header);\n var get = await http.Get(u, mheader, true);\n var html = (get && get.data) ? get.data : \"\";\n if (!html) {\n var wv = await flutterBridge.webview(u, 'document.getElementById(\"content\").innerHTML', \"\", \"\", mheader);\n if (wv) html = \"<div id=\\\"content\\\">\" + wv + \"<\/div>\";\n }\n if (!html) { flutterBridge.showToast(\"content failed\"); return \"\"; }\n flutterBridge.text(3, html);\n\n var $c = parseHTMLSafely(removeHTMLTags(html));\n var contentText = \"\";\n\n var $contentDiv = $c.find(\"#content\").first();\n if ($contentDiv.length > 0) {\n $contentDiv.find(\"#center_tip, #contentdp, .ad, .ads, script, style, iframe, ul\").remove();\n contentText = $contentDiv.html().replace(\/<br\\s*\\\/?>\/gi, \"\\r\\n\").replace(\/ \/g, \" \").replace(\/<[^>]+>\/g, \"\").trim();\n }\n\n var lines = contentText.split(\/\\r?\\n\/);\n var filtered = [];\n var filters = [\"最新网址\", \"手机阅读\", \"请收藏本站\", \"本章未完\", \"点击继续\", \"温馨提示\", \"txt下载\", \"电子书下载\", \"手机访问\", \"站内公告\", \"轻小说文库\", \"轻之国度\", \"录入\"];\n for (var li = 0; li < lines.length; li++) {\n var line = lines[li].trim();\n if (!line) continue;\n var skip = false;\n for (var fi = 0; fi < filters.length; fi++) {\n if (line.indexOf(filters[fi]) >= 0) { skip = true; break; }\n }\n if (!skip) filtered.push(line);\n }\n contentText = filtered.join(\"\\r\\n\").replace(\/\\r\\n{3,}\/g, \"\\r\\n\\r\\n\").trim();\n\n removeHTMLSafely($c);\n if (contentText.length < 50) { flutterBridge.showToast(\"content too short\"); return \"\"; }\n flutterBridge.log(\"正文字数:\" + contentText.length);\n return contentText;\n } catch (e) {\n flutterBridge.log(\"content error:\" + e.message);\n return \"\";\n }\n }\n\n async function getfinds() {\n var result = [];\n var push = (title, url, type) => result.push({ title: title, url: url, type: type || 0 });\n push(\"发现\", \"\", 0);\n push(\"轻小说列表\", \"\/modules\/article\/articlelist.php?page={{page}}\", 0);\n push(\"完结全本\", \"\/modules\/article\/articlelist.php?fullflag=1&page={{page}}\", 0);\n push(\"热门轻小说\", \"\/modules\/article\/toplist.php?sort=allvisit&page={{page}}\", 0);\n push(\"新书一览\", \"\/modules\/article\/toplist.php?sort=postdate&page={{page}}\", 0);\n push(\"今日更新\", \"\/modules\/article\/toplist.php?sort=lastupdate&page={{page}}\", 0);\n push(\"总推荐榜\", \"\/modules\/article\/toplist.php?sort=allvote&page={{page}}\", 0);\n push(\"动画化作品\", \"\/modules\/article\/toplist.php?sort=anime&page={{page}}\", 0);\n push(\"热度排名\", \"\/top.php?page={{page}}\", 0);\n return JSON.stringify(result);\n }\n\n async function find(url, page) {\n try {\n await ensureCookies();\n var u = url.replace(\"{{page}}\", page);\n if (!u.startsWith(\"http\")) u = baseurl + u;\n var html = await fetchPage(u);\n if (!html) return \"[]\";\n flutterBridge.text(0, html);\n\n var $c = parseHTMLSafely(removeHTMLTags(html));\n var books = [];\n\n $c.find(\"table.grid td > div[style*='width:373px']\").each(function() {\n try {\n var $el = $(this);\n var $coverDiv = $el.find(\"> div[style*='width:95px']\");\n var $infoDiv = $el.find(\"> div[style*='margin-top']\");\n if ($coverDiv.length === 0 || $infoDiv.length === 0) return;\n var $a = $coverDiv.find(\"a\").first();\n var bookUrl = absUrl($a.attr(\"href\"));\n var name = $infoDiv.find(\"b a\").text().trim();\n var coverUrl = absUrl($coverDiv.find(\"img\").attr(\"src\"));\n var infoPs = $infoDiv.find(\"p\");\n var $p0 = $(infoPs[0]);\n var authorText = $p0.text().trim();\n var author = authorText.replace(\/^作者\\s*[::]\\s*\/, \"\").split(\"\/\")[0].trim();\n var kind = \"\";\n var kindMatch = authorText.match(\/分类\\s*[::]\\s*(.+)$\/);\n if (kindMatch) kind = kindMatch[1].trim();\n if (!bookUrl || !name) return;\n books.push({\n \"bookUrl\": bookUrl,\n \"name\": name,\n \"author\": author,\n \"kind\": kind,\n \"coverUrl\": coverUrl,\n \"intro\": \"\",\n \"tocUrl\": bookUrl,\n \"wordCount\": \"\",\n \"type\": 0,\n \"latestChapterTitle\": \"\"\n });\n } catch (e) { flutterBridge.log(\"find item error:\" + e.message); }\n });\n\n removeHTMLSafely($c);\n return JSON.stringify(books);\n } catch (e) {\n flutterBridge.log(\"find error:\" + e.message);\n return \"[]\";\n }\n }\n\n async function getloginurl(){ return baseurl + \"\/login.php?jumpurl=\" + encodeURIComponent(baseurl + \"\/index.php\"); }\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\n<\/html>\n",
"login": true,
"lastUpdateTime": "1781583093150"
}