农民影视
https://www.guoshuquan.com/
Simwoodone (12535)06/08 15:25
该用户很懒,什么介绍也没有写!
{
"bookSourceUrl": "https:\/\/www.guoshuquan.com\/",
"bookSourceName": "农民影视",
"enabledExplore": true,
"enabled": true,
"bookSourceGroup": "有声漫画",
"author": "",
"help": true,
"html": "<!DOCTYPE html>\n<html lang=\"zh\">\n<head>\n <meta charset=\"UTF-8\">\n <title>农民影视 - 轻悦时光书源<\/title>\n<\/head>\n<body>\n<\/body>\n\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) {\n this.isReady = true;\n this.CookieJar();\n } else {\n window.addEventListener('flutterInAppWebViewPlatformReady', () => {\n this.isReady = true;\n this.CookieJar();\n });\n }\n }\n async CookieJar() {\n try { await window.flutter_inappwebview.callHandler('CookieJar', isCookieJar); }\n catch (error) { console.error('CookieJar失败:', error); }\n }\n async getbuildNumber() { try { return await window.flutter_inappwebview.callHandler('buildNumber'); } catch (e) { return 0; } }\n async getversion() { try { return await window.flutter_inappwebview.callHandler('version'); } catch (e) { return \"0.0.0\"; } }\n async htmlToText(str) { try { return await window.flutter_inappwebview.callHandler('htmlToText', str); } catch (e) { return \"\"; } }\n async getDeviceid() { try { return await window.flutter_inappwebview.callHandler('id'); } catch (e) { return \"\"; } }\n async getDevice() { try { return await window.flutter_inappwebview.callHandler('device'); } catch (e) { return \"\"; } }\n async log(str) { try { return await window.flutter_inappwebview.callHandler('log', str); } catch (e) { return false; } }\n async showToast(str) { try { return await window.flutter_inappwebview.callHandler('showToast', str); } catch (e) { return false; } }\n async showLongToast(str) { try { return await window.flutter_inappwebview.callHandler('showLongToast', str); } catch (e) { return false; } }\n async getWebViewUA() { try { return await window.flutter_inappwebview.callHandler('getWebViewUA'); } catch (e) { return \"\"; } }\n async openurl(url) { try { return await window.flutter_inappwebview.callHandler('openurl', url, \"\"); } catch (e) { return false; } }\n async startBrowser(url, title, header) { try { return await window.flutter_inappwebview.callHandler('startBrowser', url, title, header); } catch (e) { return \"\"; } }\n async showvideoplay(url, title, key) { try { return await window.flutter_inappwebview.callHandler('showvideoplay', url, title, key); } catch (e) { return \"\"; } }\n async webview(url, js, html, body, header) {\n try { return await window.flutter_inappwebview.callHandler('webview', url, js, html, body, header, \"\", \"\"); }\n catch (e) { return \"\"; }\n }\n async webViewGetSource(url, js, html, body, header, urlregex) {\n try { return await window.flutter_inappwebview.callHandler('webview', url, js, html, body, header, \"\", urlregex); }\n catch (e) { return \"\"; }\n }\n async webViewGetAjax(url, html, body, header, ajaxregex) {\n try { return await window.flutter_inappwebview.callHandler('webviewajax', url, html, body, header, ajaxregex); }\n catch (e) { return \"\"; }\n }\n }\n\n class Http {\n constructor() { this.open = false; this.requestTimestamps = []; this.rateLimit = 5; this.rateLimitWindow = 1000; }\n async checkRateLimit() {\n if (!this.open) return;\n const now = Date.now();\n this.requestTimestamps = this.requestTimestamps.filter(t => now - t < this.rateLimitWindow);\n if (this.requestTimestamps.length >= this.rateLimit) {\n const waitTime = this.rateLimitWindow - (now - this.requestTimestamps[0]);\n await new Promise(r => setTimeout(r, waitTime));\n return this.checkRateLimit();\n }\n this.requestTimestamps.push(now);\n }\n async Get(url, headers, followRedirects) {\n try { await this.checkRateLimit(); return await window.flutter_inappwebview.callHandler('http', \"get\", url, \"\", JSON.stringify(headers), followRedirects, \"\"); }\n catch (e) { return null; }\n }\n async Post(url, headers, body, contenttype, followRedirects) {\n try { await this.checkRateLimit(); return await window.flutter_inappwebview.callHandler('http', \"post\", url, body, JSON.stringify(headers), followRedirects, contenttype); }\n catch (e) { return null; }\n }\n }\n\n class Cache {\n constructor() {}\n async get(key) { try { return await window.flutter_inappwebview.callHandler('cache.get', key); } catch (e) { return null; } }\n async set(key, value) { try { return await window.flutter_inappwebview.callHandler('cache.set', key, value); } catch (e) { return null; } }\n async remove(key) { try { return await window.flutter_inappwebview.callHandler('cache.remove', key); } catch (e) { return null; } }\n async getLoginInfo() { return await this.get(\"LoginInfo\"); }\n async putLoginInfo(info) { return await this.set(\"LoginInfo\", info); }\n }\n\n class Cookie {\n constructor() {}\n async get(url) { try { return await window.flutter_inappwebview.callHandler('cookie.get', url); } catch (e) { return null; } }\n async remove(url) { try { return await window.flutter_inappwebview.callHandler('cookie.remove', url); } catch (e) { return null; } }\n async set(url, value) { try { return await window.flutter_inappwebview.callHandler('cookie.set', url, value); } catch (e) { return null; } }\n async setCookie(url, key, value) { try { return await window.flutter_inappwebview.callHandler('cookie.setcookie', url, key, value); } catch (e) { return null; } }\n async getCookie(url, value) { try { return await window.flutter_inappwebview.callHandler('cookie.getCookie', url, value); } catch (e) { return null; } }\n }\n\n const flutterBridge = new FlutterJSBridge();\n const cache = new Cache();\n const http = new Http();\n const cookie = new Cookie();\n\n const BASE_URL = 'https:\/\/www.guoshuquan.com';\n const UA = 'Mozilla\/5.0 (Linux; Android 13) AppleWebKit\/537.36';\n\n function pick() {\n for (let i = 0; i < arguments.length; i++) {\n const v = arguments[i];\n if (v !== undefined && v !== null && String(v) !== '' && String(v) !== 'null' && String(v) !== 'undefined') return v;\n }\n return '';\n }\n\n function asText(res) {\n if (res === undefined || res === null) return '';\n if (typeof res === 'string') return res;\n if (typeof res.data === 'string') return res.data;\n if (typeof res.body === 'string' && !res.data) return res.body;\n try { return JSON.stringify(res.data !== undefined ? res.data : res); } catch (e) { return ''; }\n }\n\n function safeJson(text, fallback) {\n try { return JSON.parse(text); } catch (e) { return fallback; }\n }\n\n async function fetchHtml(url, ref) {\n var headers = { 'User-Agent': UA };\n if (ref) headers['Referer'] = ref;\n var res = await http.Get(url, headers, true);\n return asText(res);\n }\n\n function encodeBookUrl(detailUrl) {\n return 'gsq:\/\/detail?url=' + encodeURIComponent(detailUrl);\n }\n function decodeBookUrl(bookUrl) {\n var marker = 'url=';\n var idx = String(bookUrl || '').indexOf(marker);\n if (idx < 0) return decodeURIComponent(bookUrl);\n return decodeURIComponent(String(bookUrl).slice(idx + marker.length));\n }\n\n function encodeContentUrl(playUrl) {\n return 'gsq:\/\/play?url=' + encodeURIComponent(playUrl);\n }\n function decodeContentUrl(url) {\n var marker = 'url=';\n var idx = String(url || '').indexOf(marker);\n if (idx < 0) return decodeURIComponent(url);\n return decodeURIComponent(String(url).slice(idx + marker.length));\n }\n\n \/\/ ==================== 搜索 ====================\n async function search(key, page) {\n page = page || 1;\n if (page > 1) return '[]';\n var keyword = String(key || '').trim();\n if (!keyword) return '[]';\n\n var searchUrl = BASE_URL + '\/sousuo.html?keyword=' + encodeURIComponent(keyword);\n var html = await fetchHtml(searchUrl);\n if (!html) return '[]';\n\n var result = [];\n var regex = \/<a[^>]*stui-vodlist__thumb[^>]*href=\"([^\"]+)\"[^>]*title=\"([^\"]+)\"[^>]*data-original=\"([^\"]+)\"\/g;\n var match;\n while ((match = regex.exec(html)) !== null) {\n var detailUrl = match[1];\n var name = match[2];\n var cover = match[3];\n var statusMatch = html.slice(match.index, match.index + 500).match(\/pic-text[^>]*>([^<]+)<\/);\n var status = statusMatch ? statusMatch[1].trim() : '';\n if (!name || !detailUrl) continue;\n result.push({\n bookUrl: encodeBookUrl(detailUrl),\n name: name,\n author: '',\n kind: '',\n coverUrl: cover,\n intro: '',\n tocUrl: encodeBookUrl(detailUrl),\n wordCount: '',\n type: 0,\n latestChapterTitle: status\n });\n }\n return JSON.stringify(result);\n }\n\n \/\/ ==================== 详情 ====================\n async function info(bookurl) {\n var detailUrl = decodeBookUrl(bookurl);\n if (detailUrl.indexOf('http') !== 0) detailUrl = BASE_URL + detailUrl;\n\n var js = \"(function(){var t=document.title||'';t=t.replace(\/[-_].*农民影视.*$\/,'').trim();\" +\n \"var c=document.querySelector('[data-original]');var cover=c?c.getAttribute('data-original'):'';\" +\n \"var d=document.querySelector('meta[name=description]');var desc=d?d.getAttribute('content'):'';\" +\n \"var k=document.querySelector('meta[name=keywords]');var kw=k?k.getAttribute('content'):'';\" +\n \"return JSON.stringify({name:t,coverUrl:cover,intro:desc,kind:kw});\" +\n \"})()\";\n\n try {\n var pageData = await flutterBridge.webview(detailUrl, js, '', '', '{}');\n var info = safeJson(pageData, {});\n return JSON.stringify({\n bookUrl: bookurl,\n name: pick(info.name, '未知'),\n author: '',\n kind: '',\n coverUrl: pick(info.coverUrl, ''),\n intro: pick(info.intro, ''),\n tocUrl: encodeBookUrl(detailUrl),\n wordCount: '',\n type: 0,\n latestChapterTitle: ''\n });\n } catch (e) {\n var html2 = await fetchHtml(detailUrl);\n var tMatch = html2.match(\/<title>([^<]+)<\\\/title>\/);\n var name2 = tMatch ? tMatch[1].replace(\/[-_].*农民影视.*$\/, '').trim() : '未知';\n var cMatch = html2.match(\/data-original=\"([^\"]+)\"\/);\n var cover2 = cMatch ? cMatch[1] : '';\n var dMatch = html2.match(\/<meta name=.description. content=.([^\"]+)\"\/);\n var intro2 = dMatch ? dMatch[1] : '';\n return JSON.stringify({\n bookUrl: bookurl,\n name: name2,\n author: '',\n kind: '',\n coverUrl: cover2,\n intro: intro2,\n tocUrl: encodeBookUrl(detailUrl),\n wordCount: '',\n type: 0,\n latestChapterTitle: ''\n });\n }\n }\n\n \/\/ ==================== 目录 ====================\n async function chapter(tocUrl, bookurl) {\n var detailUrl = decodeBookUrl(tocUrl || bookurl);\n if (detailUrl.indexOf('http') !== 0) detailUrl = BASE_URL + detailUrl;\n\n var js = \"(function(){var eps=[];\" +\n \"var items=document.querySelectorAll('[class*=playlist] a[href]');\" +\n \"for(var i=0;i<items.length;i++){\" +\n \"var a=items[i];var href=a.getAttribute('href');\" +\n \"var text=a.textContent.trim();\" +\n \"if(href&&text)eps.push({name:text,url:href});}\" +\n \"return JSON.stringify(eps);\" +\n \"})()\";\n\n try {\n var epsData = await flutterBridge.webview(detailUrl, js, '', '', '{}');\n var eps = safeJson(epsData, []);\n var result = [];\n for (var i = 0; i < eps.length; i++) {\n result.push({\n name: eps[i].name || ('第' + (i + 1) + '集'),\n chapterId: encodeContentUrl(eps[i].url),\n index: i,\n isPay: false,\n isVip: false,\n isVolume: false,\n tag: ''\n });\n }\n return JSON.stringify(result);\n } catch (e) {\n return '[]';\n }\n }\n\n \/\/ ==================== 正文(播放按钮-点击才播放) ====================\n async function content(url, bookurl) {\n var playUrl = decodeContentUrl(url);\n if (playUrl.indexOf('http') !== 0) playUrl = BASE_URL + playUrl;\n\n var js = \"(function(){\" +\n \"var scripts=document.querySelectorAll('script');\" +\n \"for(var i=0;i<scripts.length;i++){\" +\n \"var t=scripts[i].textContent||'';\" +\n \"var m=t.match(\/thisUrl\\\\s*=\\\\s*\\\"([^\\\"]+?)\\\"\/);\" +\n \"if(m)return m[1];\" +\n \"}\" +\n \"return '';\" +\n \"})()\";\n\n try {\n var videoUrl = await flutterBridge.webview(playUrl, js, '', '', '{}');\n videoUrl = (videoUrl || '').replace(\/\\\\\\\/\/g, '\/').trim();\n \n if (videoUrl) {\n return '<img src=\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgMjMgMjgiPjxkZWZzPjxmaWx0ZXIgaWQ9InMiPjxmZURyb3BTaGFkb3cgZHg9IjAiIGR5PSIwLjYiIHN0ZERldmlhdGlvbj0iMC43IiBmbG9vZC1jb2xvcj0iIzAwMCIgZmxvb2Qtb3BhY2l0eT0iMC4zNSIvPjwvZmlsdGVyPjwvZGVmcz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0LjUsNCkiPjxwYXRoIGQ9Ik0wIDBoMTR2MTRIMHoiIGZpbGw9Im5vbmUiLz48ZyBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjMjg1OWM1IiBkPSJNNC41IDguODgyVjUuMTE4YTEgMSAwIDAgMSAxLjQ0Ny0uODk0bDMuNzY0IDEuODgyYTEgMSAwIDAgMSAwIDEuNzg4TDUuOTQ3IDkuNzc2QTEgMSAwIDAgMSA0LjUgOC44ODIiLz48cGF0aCBmaWxsPSIjOGZiZmZhIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04LjA5LjA4NGEuNzUuNzUgMCAwIDAtLjIzMiAxLjQ4MkE1LjUwMiA1LjUwMiAwIDAgMSA3IDEyLjVhNS41IDUuNSAwIDAgMS01LjExNi0zLjQ3NWEuNzUuNzUgMCAwIDAtMS4zOTQuNTUyQTcuMDAyIDcuMDAyIDAgMCAwIDE0IDdBNyA3IDAgMCAwIDguMDkuMDg0bS0yLjQ2NiAxLjQ5QS43NS43NSAwIDAgMCA1LjI1MS4xMjNhNyA3IDAgMCAwLS45MzguMzE0YS43NS43NSAwIDAgMCAuNTc2IDEuMzg1cS4zNTYtLjE0OC43MzUtLjI0Nk0zLjE3IDIuOTU1YS43NS43NSAwIDAgMC0xLjA0NC0xLjA3NkE3IDcgMCAwIDAgLjkxNyAzLjQzNWEuNzUuNzUgMCAxIDAgMS4zMDMuNzQ0Yy4yNTgtLjQ1Mi41NzgtLjg2NC45NS0xLjIyNE0xLjU1NCA2LjEyN2EuNzUuNzUgMCAxIDAtMS40ODUtLjIxQTcgNyAwIDAgMCAwIDYuOTAzYS43NS43NSAwIDEgMCAxLjUgMHEwLS4zOTYuMDU0LS43NzYiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvZz48L2c+PHRleHQgeD0iMTEuNSIgeT0iMjUuNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxLjMiIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxQaW5nRmFuZyBTQyxNaWNyb3NvZnQgWWFIZWksc2Fucy1zZXJpZiIgZmlsbD0iIzI4NTljNSIgZm9udC13ZWlnaHQ9ImJvbGQiIGZpbHRlcj0idXJsKCNzKSI+54K55Ye75pKt5pS+PC90ZXh0Pjwvc3ZnPg==,{"js":"flutterBridge.showvideoplay(\\''+videoUrl+'\\',\\'农民影视\\',\\''+videoUrl+'\\')"}\"\/>';\n }\n return '未找到视频地址\\n' + playUrl;\n } catch (e) {\n return '加载失败: ' + e.message;\n }\n }\n\n async function getfinds() {\n var movies = [\n { t: '喜剧片', id: 3863 },{ t: '爱情片', id: 3864 },{ t: '动作片', id: 3865 },\n { t: '科幻片', id: 3866 },{ t: '恐怖片', id: 3867 },{ t: '战争片', id: 3868 },\n { t: '剧情片', id: 3869 },{ t: '动画片', id: 3870 },{ t: '纪录片', id: 3871 }\n ];\n var tvs = [\n { t: '大陆剧', id: 3873 },{ t: '港台剧', id: 3874 },{ t: '韩国剧', id: 3875 },\n { t: '日本剧', id: 3876 },{ t: '欧美剧', id: 3877 },{ t: '泰国剧', id: 3878 }\n ];\n var varieties = [\n { t: '国产综艺', id: 3883 },{ t: '港台综艺', id: 3884 },\n { t: '日韩综艺', id: 3885 },{ t: '欧美综艺', id: 3886 }\n ];\n var animes = [\n { t: '国产动漫', id: 3893 },{ t: '港台动漫', id: 3894 },\n { t: '日韩动漫', id: 3895 },{ t: '欧美动漫', id: 3896 }\n ];\n\n var finds = [];\n\n function addSection(title, items) {\n finds.push({ title: title, url: '', width: 3 });\n for (var i = 0; i < items.length; i++) {\n finds.push({\n title: items[i].t,\n url: BASE_URL + '\/sortlist\/' + items[i].id + '\/last-{{page}}.html',\n type: 0, width: 0\n });\n }\n }\n\n addSection('电影', movies);\n addSection('电视剧', tvs);\n addSection('综艺', varieties);\n addSection('动漫', animes);\n finds.push({ title: '短剧', url: '', width: 3 });\n finds.push({ title: '最新短剧', url: BASE_URL + '\/sortlist\/3857\/last-{{page}}.html', type: 0, width: 0 });\n\n return JSON.stringify(finds);\n }\n\n async function find(url, page) {\n page = page || 1;\n var realUrl = String(url || '').replace(\/\\{\\{page\\}\\}\/g, String(page));\n if (!realUrl || realUrl.indexOf('http') !== 0) return '[]';\n\n var html = await fetchHtml(realUrl);\n if (!html) return '[]';\n\n var result = [];\n var regex = \/<a[^>]*stui-vodlist__thumb[^>]*href=\"([^\"]+)\"[^>]*title=\"([^\"]+)\"[^>]*data-original=\"([^\"]+)\"\/g;\n var match;\n while ((match = regex.exec(html)) !== null) {\n var detailUrl = match[1];\n var name = match[2];\n var cover = match[3];\n var statusMatch = html.slice(match.index, match.index + 500).match(\/pic-text[^>]*>([^<]+)<\/);\n var status = statusMatch ? statusMatch[1].trim() : '';\n if (!name || !detailUrl) continue;\n result.push({\n bookUrl: encodeBookUrl(detailUrl),\n name: name,\n author: '',\n kind: '',\n coverUrl: cover,\n intro: '',\n tocUrl: encodeBookUrl(detailUrl),\n wordCount: '',\n type: 0,\n latestChapterTitle: status\n });\n }\n return JSON.stringify(result);\n }\n\n async function getloginurl() { return '[]'; }\n async function login() {}\n async function pay(bookurl, url) {}\n async function imagedecrypt(url, image) { return []; }\n async function shouldOverrideUrlLoading(url) { return true; }\n async function gethelp() {\n return '农民影视 v1.4 | 点击绿色按钮播放 | 预加载不触发播放';\n }\n<\/script>\n<\/html>\n",
"login": false,
"lastUpdateTime": "1780903534416"
}