[{"bookSourceUrl":"https:\/\/www.xbiquge.la\/","bookSourceName":"香书小说-笔趣阁","enabledExplore":true,"enabled":true,"bookSourceGroup":"","author":"","help":false,"html":"<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>香书小说-笔趣阁<\/title>\n<\/head>\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        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        async CookieJar() {\n            try { await window.flutter_inappwebview.callHandler('CookieJar', isCookieJar); } catch (error) { console.error('汇报完成准备失败:', error); }\n        }\n        async log(str) {\n            try { return await window.flutter_inappwebview.callHandler('log', str); } catch (error) { return false; }\n        }\n        async text(type, str) {\n            try { return await window.flutter_inappwebview.callHandler('text', type, str); } catch (error) { return false; }\n        }\n        async webview(url, js, html, body, header) {\n            try { return await window.flutter_inappwebview.callHandler('webview', url, js, html, body, header, \"\", \"\"); } catch (error) { return \"\"; }\n        }\n    }\n\n    class Http {\n        constructor() {}\n        async Get(url, headers, followRedirects) {\n            try { return await window.flutter_inappwebview.callHandler('http', 'get', url, '', headers, followRedirects, ''); } catch (error) { return null; }\n        }\n        async Post(url, headers, body, contentType, followRedirects) {\n            try { return await window.flutter_inappwebview.callHandler('http', 'post', url, body, headers, followRedirects, contentType); } catch (error) { return null; }\n        }\n    }\n\n    class Cache {\n        constructor() {}\n        async get(key) {\n            try { return await window.flutter_inappwebview.callHandler('cache.get', key); } catch (error) { return null; }\n        }\n        async set(key, value) {\n            try { return await window.flutter_inappwebview.callHandler('cache.set', key, value); } catch (error) { return null; }\n        }\n        async remove(key) {\n            try { return await window.flutter_inappwebview.callHandler('cache.remove', key); } catch (error) { return null; }\n        }\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) {\n            try { return await window.flutter_inappwebview.callHandler('cookie.get', url); } catch (error) { return null; }\n        }\n        async remove(url) {\n            try { return await window.flutter_inappwebview.callHandler('cookie.remove', url); } catch (error) { return null; }\n        }\n        async set(url, value) {\n            try { return await window.flutter_inappwebview.callHandler('cookie.set', url, value); } catch (error) { return null; }\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<\/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.xbiquge.la\";\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    async function search(key, page) {\n        var mheader = JSON.stringify(header);\n        var u = baseurl + \"\/modules\/article\/waps.php?searchkey=\" + encodeURIComponent(key);\n        var post = await http.Get(u, mheader, true);\n        if (!post || !post.data) { return \"[]\"; }\n        \/\/ flutterBridge.text(0, post.data);\n        var html = removeHTMLTags(post.data);\n        var $tempContainer = parseHTMLSafely(html);\n        var books = [];\n        $tempContainer.find(\"table.grid tr\").each(function() {\n            var $tds = $(this).find(\"td\");\n            if ($tds.length < 3) { return; }\n            var $nameTd = $tds.eq(0);\n            var $link = $nameTd.find(\"a\");\n            if ($link.length === 0) { return; }\n            var bookUrl = $link.attr(\"href\");\n            var name = $link.text().trim();\n            if (!name || name.length < 1) { return; }\n            if (bookUrl && bookUrl.indexOf(\"http\") < 0) {\n                bookUrl = baseurl + bookUrl;\n            }\n            var author = $tds.eq(2).text().trim();\n            var latestChapter = $tds.eq(1).find(\"a\").text().trim();\n            if (name.length < 1 || name.indexOf(\"搜索\") >= 0) { return; }\n            books.push({\n                bookUrl: bookUrl,\n                name: name,\n                author: author,\n                coverUrl: \"\",\n                intro: \"\",\n                kind: \"\",\n                wordCount: \"\",\n                latestChapterTitle: latestChapter,\n                tocUrl: bookUrl,\n                type: 0\n            });\n        });\n        removeHTMLSafely($tempContainer);\n        return JSON.stringify(books);\n    }\n\n    async function info(bookurl) {\n        var mheader = JSON.stringify(header);\n        var post = await http.Get(bookurl, mheader, true);\n        if (!post || !post.data) {\n            return JSON.stringify({ bookUrl: bookurl, name: \"\", author: \"\", coverUrl: \"\", intro: \"\", kind: \"\", status: \"\", wordCount: \"\", tocUrl: bookurl, type: 0 });\n        }\n        var html = removeHTMLTags(post.data);\n        var $tempContainer = parseHTMLSafely(html);\n        var name = $tempContainer.find(\"#info h1\").text().trim();\n        var author = \"\";\n        var authorText = $tempContainer.find(\"#info p\").eq(0).text();\n        var authorMatch = authorText.match(\/作者[：:]\\s*(.+)\/);\n        if (authorMatch) { author = authorMatch[1].trim(); }\n        var coverUrl = $tempContainer.find(\"#sidebar #fmimg img\").attr(\"src\") || \"\";\n        if (coverUrl && coverUrl.indexOf(\"http\") < 0) { coverUrl = baseurl + coverUrl; }\n        var intro = $tempContainer.find(\"#intro\").text().trim().replace(\/\\s+\/g, \" \");\n        intro = intro.replace(\/最新网址.*$\/, \"\").replace(\/手机阅读.*$\/, \"\").replace(\/请收藏本站.*$\/, \"\").trim();\n        var kind = \"\";\n        var ogCategory = $tempContainer.find(\"meta[property='og:novel:category']\").attr(\"content\");\n        if (ogCategory) { kind = ogCategory.trim(); }\n        var status = \"\";\n        var updateText = $tempContainer.find(\"#info p\").eq(2).text();\n        if (updateText.indexOf(\"最新\") >= 0) { status = \"连载中\"; }\n        var tocUrl = bookurl;\n        removeHTMLSafely($tempContainer);\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: \"\",\n            tocUrl: tocUrl,\n            type: 0\n        });\n    }\n\n    async function chapter(tocUrl) {\n        var mheader = JSON.stringify(header);\n        var post = await http.Get(tocUrl, mheader, true);\n        if (!post || !post.data) { return \"[]\"; }\n        var html = removeHTMLTags(post.data);\n        var $tempContainer = parseHTMLSafely(html);\n        var chapters = [];\n        var index = 0;\n        $tempContainer.find(\"#list dl dd a\").each(function() {\n            var $a = $(this);\n            var href = $a.attr(\"href\");\n            var name = $a.text().trim();\n            if (!href || name.length < 1) { return; }\n            if (href.indexOf(\"http\") < 0) {\n                href = baseurl + href;\n            }\n            index++;\n            chapters.push({\n                name: name,\n                chapterId: href,\n                index: index,\n                isPay: false,\n                isVip: false,\n                isVolume: false,\n                tag: \"\"\n            });\n        });\n        removeHTMLSafely($tempContainer);\n        return JSON.stringify(chapters);\n    }\n\n    async function content(url) {\n        var mheader = JSON.stringify(header);\n        var post = await http.Get(url, mheader, true);\n        if (!post || !post.data) { return \"\"; }\n        var html = removeHTMLTags(post.data);\n        var $tempContainer = parseHTMLSafely(html);\n        $tempContainer.find(\"#center_tip\").remove();\n        $tempContainer.find(\"#content_tip\").remove();\n        $tempContainer.find(\"script\").remove();\n        $tempContainer.find(\"style\").remove();\n        var $contentDiv = $tempContainer.find(\"#content\");\n        $contentDiv.find(\"p\").each(function() {\n            var text = $(this).text();\n            if (text.indexOf(\"给个好评\") >= 0 || text.indexOf(\"wap.xbiqugu.la\") >= 0 || text.indexOf(\"手机站全新改版\") >= 0 || text.indexOf(\"koubei.baidu.com\") >= 0) {\n                $(this).remove();\n            }\n        });\n        $contentDiv.find(\"a\").each(function() {\n            var href = $(this).attr(\"href\") || \"\";\n            if (href.indexOf(\"koubei.baidu.com\") >= 0 || href.indexOf(\"wap.xbiqugu.la\") >= 0) {\n                $(this).remove();\n            }\n        });\n        var content = $contentDiv.text().trim();\n        content = content.replace(\/\\s+\/g, \"\\n\");\n        var adKeywords = [\"最新网址\", \"手机阅读\", \"请收藏本站\", \"本章未完\", \"点击继续\", \"温馨提示\", \"txt下载\", \"电子书下载\", \"www.xbiqugu.la\", \"笔趣阁\", \"给个好评\", \"分数越高更新越快\", \"wap.xbiqugu.la\", \"无广告清新阅读\"];\n        var lines = content.split(\"\\n\");\n        var filtered = [];\n        for (var i = 0; i < lines.length; i++) {\n            var line = lines[i].trim();\n            if (line.length < 1) { continue; }\n            var isAd = false;\n            for (var j = 0; j < adKeywords.length; j++) {\n                if (line.indexOf(adKeywords[j]) >= 0) { isAd = true; break; }\n            }\n            if (!isAd) { filtered.push(line); }\n        }\n        content = filtered.join(\"\\n\\n\");\n        removeHTMLSafely($tempContainer);\n        return content;\n    }\n\n    async function getfinds() {\n        var result = [];\n        var push = function(title, url, type) { result.push({ title: title, url: url, type: type || 0 }); };\n        push(\"玄幻小说\", \"\/fenlei\/1_{{page}}.html\", 0);\n        push(\"修真小说\", \"\/fenlei\/2_{{page}}.html\", 0);\n        push(\"都市小说\", \"\/fenlei\/3_{{page}}.html\", 0);\n        push(\"穿越小说\", \"\/fenlei\/4_{{page}}.html\", 0);\n        push(\"网游小说\", \"\/fenlei\/5_{{page}}.html\", 0);\n        push(\"科幻小说\", \"\/fenlei\/6_{{page}}.html\", 0);\n        return JSON.stringify(result);\n    }\n\n    async function find(url, page) {\n        var u = url;\n        if (u.indexOf(\"{{page}}\") >= 0) {\n            u = u.replace(\"{{page}}\", page);\n            if (page == 1) {\n                u = u.replace(\/\\\/fenlei\\\/\\d+_1\\.html\/, \"\/xuanhuanxiaoshuo\/\");\n            }\n        }\n        if (u.indexOf(\"http\") < 0) { u = baseurl + u; }\n        var mheader = JSON.stringify(header);\n        var post = await http.Get(u, mheader, true);\n        if (!post || !post.data) { return \"[]\"; }\n        var html = removeHTMLTags(post.data);\n        var $tempContainer = parseHTMLSafely(html);\n        var books = [];\n        $tempContainer.find(\"#newscontent .l ul li\").each(function() {\n            var $li = $(this);\n            var $nameLink = $li.find(\"span.s2 a\");\n            var bookUrl = $nameLink.attr(\"href\") || \"\";\n            if (bookUrl && bookUrl.indexOf(\"http\") < 0) { bookUrl = baseurl + bookUrl; }\n            var name = $nameLink.text().trim();\n            var author = $li.find(\"span.s5\").text().trim();\n            var latestChapter = $li.find(\"span.s3 a\").text().trim();\n            if (!name || name.length < 1) { return; }\n            var idMatch = bookUrl.match(\/\\\/(\\d+)\\\/(\\d+)\\\/\/);\n            var coverUrl = idMatch ? baseurl + \"\/files\/article\/image\/\" + idMatch[1] + \"\/\" + idMatch[2] + \"\/\" + idMatch[2] + \"s.jpg\" : \"\";\n            books.push({\n                bookUrl: bookUrl,\n                name: name,\n                author: author,\n                coverUrl: coverUrl,\n                intro: \"\",\n                kind: \"\",\n                wordCount: \"\",\n                latestChapterTitle: latestChapter,\n                tocUrl: bookUrl,\n                type: 0\n            });\n        });\n        removeHTMLSafely($tempContainer);\n        return JSON.stringify(books);\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    }\n\n    async function shouldOverrideUrlLoading(url) {\n        return true;\n    }\n<\/script>\n<\/html>","login":false,"lastUpdateTime":"1782360054979"}]