轻小说文库(需要登录!!)

https://www.wenku8.net

dev-xx (13787)06/16 12:11

需要登录!!!在书源管理里面登录
二维码导入(APP尚未完成该功能)
{
    "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(\/&nbsp;\/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(\/&nbsp;\/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"
}
广告