香书小说-笔趣阁
https://www.xbiquge.la/
dev-xx (13787)06/25 12:00
该用户很懒,什么介绍也没有写!
{
"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"
}