From fe27ceafd6957a63598948cd967a55d6e3b9163a Mon Sep 17 00:00:00 2001 From: Taois Date: Sun, 18 Jan 2026 17:28:42 +0800 Subject: [PATCH 01/57] =?UTF-8?q?feat:=20=E5=B0=9D=E8=AF=95=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=BA=95=E5=B1=82=E6=8B=A6=E6=88=AA=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=A4=B4=E7=9A=84ua=E6=89=8B=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs_drpy/fetchAxios.js | 58 +++++++++++++++++++++++++- spider/js/_debug.js | 85 +++++++++++++++++++++++++++++++++++++++ spider/js/_lib.request.js | 28 +++++++++++-- utils/createAxiosAgent.js | 21 ++++++++-- 4 files changed, 184 insertions(+), 8 deletions(-) create mode 100644 spider/js/_debug.js diff --git a/libs_drpy/fetchAxios.js b/libs_drpy/fetchAxios.js index 789fe5c2..4e90ffa8 100644 --- a/libs_drpy/fetchAxios.js +++ b/libs_drpy/fetchAxios.js @@ -4,6 +4,50 @@ */ import FormData from 'form-data'; import https from "https"; +import diagnosticsChannel from 'diagnostics_channel'; + +let undiciStripUASubscribed = false; + +function ensureUndiciStripUASubscription() { + if (undiciStripUASubscribed) { + return; + } + undiciStripUASubscribed = true; + + diagnosticsChannel.channel('undici:request:create').subscribe(({request}) => { + if (!request || !Array.isArray(request.headers)) { + return; + } + const headers = request.headers; + + let shouldStrip = false; + for (let i = 0; i < headers.length; i += 2) { + const k = headers[i]; + if (typeof k === 'string' && k.toLowerCase() === 'x-remove-user-agent') { + shouldStrip = true; + break; + } + } + if (!shouldStrip) { + return; + } + + for (let i = 0; i < headers.length; i += 2) { + const k = headers[i]; + if (typeof k === 'string' && k.toLowerCase() === 'x-remove-user-agent') { + headers.splice(i, 2); + i -= 2; + } + } + for (let i = 0; i < headers.length; i += 2) { + const k = headers[i]; + if (typeof k === 'string' && k.toLowerCase() === 'user-agent') { + headers.splice(i, 2); + i -= 2; + } + } + }); +} /** * FetchAxios类 - HTTP客户端实现 @@ -71,6 +115,18 @@ class FetchAxios { finalConfig = await interceptor(finalConfig) || finalConfig; } + if (finalConfig.headers) { + const headerKeys = Object.keys(finalConfig.headers); + for (const key of headerKeys) { + if (key.toLowerCase() === 'user-agent' && finalConfig.headers[key] === 'RemoveUserAgent') { + delete finalConfig.headers[key]; + finalConfig.headers['x-remove-user-agent'] = '1'; + ensureUndiciStripUASubscription(); + break; + } + } + } + // 拼接查询参数 if (finalConfig.params) { const query = new URLSearchParams(finalConfig.params).toString(); @@ -300,4 +356,4 @@ export function createHttpsInstance() { responseType: 'arraybuffer', httpsAgent: httpsAgent }); -} \ No newline at end of file +} diff --git a/spider/js/_debug.js b/spider/js/_debug.js new file mode 100644 index 00000000..d32b3df1 --- /dev/null +++ b/spider/js/_debug.js @@ -0,0 +1,85 @@ +// _debug.js +// 测试方法: http://localhost:5757/api/_debug?pwd=dzyyds +var rule = { + title: '_debug', + description: '这是描述', + 类型: '测试', + searchUrl: '', + class_parse: async () => { + log(`[${rule.title}] --class_parse--`); + return [ + {type_id: '1', type_name: '电影'}, + {type_id: '2', type_name: '电视剧'}, + {type_id: '3', type_name: '综艺'}, + {type_id: '4', type_name: '动漫'}, + ] + }, + 预处理: async () => { + log(`[${rule.title}] --预处理--`); + rule.title = '_debug'; + }, + 推荐: async () => { + // return '这是推荐:' + rule.title; + let d = []; + let html = '{}'; + html = await request('https://httpbin.org/headers', { + headers: { + 'Accept': '*/*', + 'User-Agent': '' + } + }); + // log(html); + d.push({ + title: 'request结果1-传空UA', + content: html.parseX.headers, + }); + + html = await request('https://httpbin.org/headers', { + headers: { + 'Accept': '*/*', + 'User-Agent': 'RemoveUserAgent', + } + }); + // log(html); + d.push({ + title: 'request结果2-不传UA', + content: html.parseX.headers, + }); + + html = (await req('https://httpbin.org/headers', { + headers: { + 'Accept': '*/*', + 'User-Agent': 'RemoveUserAgent', + } + })).content; + d.push({ + title: 'req结果-不传UA', + content: html.parseX.headers, + }); + + html = (await req('https://conn.origjoy.com/auth/init?appid=d4eeacc6cec3434fbc8c41608a3056a0&mac=0afa691314fd_a12d4a7c9n12&sn=a12d4a7c9n12&time=1768728113&ver=2.0&vn=4.1.3.03281430&sign=6a1ee16242b93a3ae6492bc55992b691', + { + headers: { + 'Accept': '*/*', + 'User-Agent': 'RemoveUserAgent', + } + })).content; + d.push({ + title: 'req结果-60wmv', + content: html, + }); + return d; + }, + 一级: async () => { + return '这是一级:' + rule.title + }, + 二级: async () => { + return '这是二级:' + rule.title + }, + 搜索: async () => { + return ['这是搜索:' + rule.title] + }, + lazy: async () => { + return '这是播放:' + rule.title + }, +}; \ No newline at end of file diff --git a/spider/js/_lib.request.js b/spider/js/_lib.request.js index 8e9f85be..2df7a794 100644 --- a/spider/js/_lib.request.js +++ b/spider/js/_lib.request.js @@ -1,5 +1,19 @@ const iconv = require('iconv-lite'); +function sanitizeUserAgent(headers) { + if (!headers) { + return headers; + } + const keys = Object.keys(headers); + for (const key of keys) { + if (key.toLowerCase() === 'user-agent' && headers[key] === 'RemoveUserAgent') { + delete headers[key]; + break; + } + } + return headers; +} + async function requestHtml(url, options) { try { let html = (await req(url, options)).content; @@ -30,15 +44,20 @@ async function getPublicIp() { async function getHtml(config) { try { - return await axios.request(typeof config === "string" ? config : { + if (typeof config === "string") { + return await axios.request(config) + } + const cfg = { url: config.url, method: config.method || 'GET', headers: config.headers || { 'User-Agent': PC_UA }, data: config.data || '', - responseType: config.responseType || '',//'arraybuffer' - }) + responseType: config.responseType || '' + }; + cfg.headers = sanitizeUserAgent(cfg.headers); + return await axios.request(cfg) } catch (e) { return e.response } @@ -54,6 +73,7 @@ async function req_(reqUrl, mt, headers, data) { }, data: data || '', }; + config.headers = sanitizeUserAgent(config.headers); let res = await axios.request(config); return res.data; } @@ -68,6 +88,7 @@ async function req_encoding(reqUrl, mt, headers, encoding, data) { data: data || '', responseType: 'arraybuffer' }; + config.headers = sanitizeUserAgent(config.headers); let res = await axios.request(config); if (encoding) { res.data = iconv.decode(res.data, encoding); @@ -88,6 +109,7 @@ async function req_proxy(reqUrl, mt, headers, data) { port: "7890" } }; + config.headers = sanitizeUserAgent(config.headers); if (data) { config.data = data; } diff --git a/utils/createAxiosAgent.js b/utils/createAxiosAgent.js index 4c8f5599..ceb8bfdd 100644 --- a/utils/createAxiosAgent.js +++ b/utils/createAxiosAgent.js @@ -39,14 +39,27 @@ export function createAxiosInstance(options = {}) { const httpsAgent = new https.Agent(httpsAgentOptions); - // 配置 axios 使用代理 const _axios = axios.create({ - httpAgent, // 用于 HTTP 请求的代理 - httpsAgent, // 用于 HTTPS 请求的代理 + httpAgent, + httpsAgent, + }); + + _axios.interceptors.request.use(config => { + if (config && config.headers) { + const headers = config.headers; + const keys = Object.keys(headers); + for (const key of keys) { + if (key.toLowerCase() === 'user-agent' && headers[key] === 'RemoveUserAgent') { + delete headers[key]; + break; + } + } + } + return config; }); return _axios; } // 默认导出 -export default createAxiosInstance; \ No newline at end of file +export default createAxiosInstance; From de056c2092d25e38e80453b4349dbc9c2c6224f3 Mon Sep 17 00:00:00 2001 From: Taois Date: Sun, 18 Jan 2026 17:40:54 +0800 Subject: [PATCH 02/57] =?UTF-8?q?feat:=20=E9=81=BF=E5=85=8D=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=92=8C=E6=89=93=E5=8C=85=E4=B8=80=E4=BA=9B=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + package.js | 2 +- package.py | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 28c6287f..7bbca429 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,4 @@ dist /apps/salary/ /jx/_30wmv.js .DS_Store +/spider/catvod/mtv60w[差].js diff --git a/package.js b/package.js index 1e52492e..6489562d 100644 --- a/package.js +++ b/package.js @@ -7,7 +7,7 @@ import url from 'url'; const EXCLUDE_DIRS = ['.git', '.idea', 'soft', 'examples', 'apps/cat', 'plugins/pvideo', 'plugins/req-proxy', 'plugins/pup-sniffer', 'plugins/mediaProxy', 'pyTools', 'drop_code', 'jstest', 'local', 'logs', '对话1.txt', 'vod_cache', 'data/mv']; // 要排除的文件列表 -const EXCLUDE_FILES = ['config/env.json', '.env', '.claude', 'clipboard.txt', 'clipboard.txt.bak', '.plugins.js', 'yarn.lock', 't4_daemon.pid', 'spider/js/UC分享.js', 'spider/js/百忙无果[官].js', 'json/UC分享.json', 'jx/_30wmv.js', 'jx/奇奇.js', 'jx/芒果关姐.js', 'data/settings/link_data.json', 'index.json', 'custom.json']; +const EXCLUDE_FILES = ['config/env.json', '.env', '.claude', 'clipboard.txt', 'clipboard.txt.bak', '.plugins.js', 'yarn.lock', 't4_daemon.pid', 'spider/js/UC分享.js', 'spider/js/百忙无果[官].js', 'spider/catvod/mtv60w[差].js', 'json/UC分享.json', 'jx/_30wmv.js', 'jx/奇奇.js', 'jx/芒果关姐.js', 'data/settings/link_data.json', 'index.json', 'custom.json']; // 获取脚本所在目录 const getScriptDir = () => dirname(resolve(url.fileURLToPath(import.meta.url))); diff --git a/package.py b/package.py index 827deca9..d34e7011 100644 --- a/package.py +++ b/package.py @@ -16,6 +16,7 @@ EXCLUDE_FILES = ['config/env.json', '.env', '.claude', 'clipboard.txt', 'clipboard.txt.bak', '.plugins.js', 'yarn.lock', 't4_daemon.pid', 'spider/js/UC分享.js', 'spider/js/百忙无果[官].js', + 'spider/catvod/mtv60w[差].js', 'json/UC分享.json', 'jx/_30wmv.js', 'jx/奇奇.js', 'jx/芒果关姐.js', 'data/settings/link_data.json', 'index.json', 'custom.json'] From 6d5f80ec520c59948ea4d30547ba76a0472ab8d1 Mon Sep 17 00:00:00 2001 From: Taois Date: Tue, 20 Jan 2026 19:26:01 +0800 Subject: [PATCH 03/57] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DhostName?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=94=99=E8=AF=AF=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E5=85=B3=E5=A7=90=E5=9C=B0=E5=9D=80=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/file.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/utils/file.js b/utils/file.js index 07da6728..964b1dff 100644 --- a/utils/file.js +++ b/utils/file.js @@ -148,10 +148,21 @@ export function getParsesDict(host) { const jx_conf_text = readFileSync(jx_conf, 'utf-8'); let jx_conf_content = jx_conf_text.trim(); - // 准备模板变量字典 + let hostName = host; + try { + if (typeof host === 'string' && host) { + const u = new URL(host.includes('://') ? host : `http://${host}`); + hostName = u.hostname || host; + } + } catch (e) { + const withoutProto = String(host || '').replace(/^[a-zA-Z]+:\/\//, ''); + const withoutPath = withoutProto.split('/')[0]; + hostName = withoutPath.includes(':') ? withoutPath.split(':')[0] : withoutPath; + } + let var_dict = { host, - hostName: host.split(':').length > 1 ? host.slice(0, host.lastIndexOf(":")) : host + hostName }; // 使用Jinja模板引擎渲染配置内容 @@ -213,4 +224,4 @@ export function executeParse(name, host, url) { } globalThis.pathLib = pathLib; -globalThis.executeParse = executeParse; \ No newline at end of file +globalThis.executeParse = executeParse; From 968386782ad3ad0aefb79889aa14c803d28009e0 Mon Sep 17 00:00:00 2001 From: Taois Date: Tue, 20 Jan 2026 19:40:18 +0800 Subject: [PATCH 04/57] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DhostName?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=94=99=E8=AF=AF=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E5=85=B3=E5=A7=90=E5=9C=B0=E5=9D=80=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/file.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/utils/file.js b/utils/file.js index 964b1dff..420e67a5 100644 --- a/utils/file.js +++ b/utils/file.js @@ -150,14 +150,15 @@ export function getParsesDict(host) { let hostName = host; try { - if (typeof host === 'string' && host) { - const u = new URL(host.includes('://') ? host : `http://${host}`); - hostName = u.hostname || host; - } + const raw = String(host || ''); + const hasScheme = raw.includes('://'); + const u = new URL(hasScheme ? raw : `http://${raw}`); + const hostname = u.hostname || raw; + const safeHostname = hostname.includes(':') ? `[${hostname}]` : hostname; + hostName = hasScheme ? `${u.protocol}//${safeHostname}` : safeHostname; } catch (e) { - const withoutProto = String(host || '').replace(/^[a-zA-Z]+:\/\//, ''); - const withoutPath = withoutProto.split('/')[0]; - hostName = withoutPath.includes(':') ? withoutPath.split(':')[0] : withoutPath; + const raw = String(host || '').replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//, '').split('/')[0]; + hostName = raw.startsWith('[') ? raw.split(']')[0] + ']' : raw.split(':')[0]; } let var_dict = { From 4a0664f8d9303d9c049dc7fa93afa136f12ace61 Mon Sep 17 00:00:00 2001 From: Taois Date: Tue, 20 Jan 2026 21:14:07 +0800 Subject: [PATCH 05/57] =?UTF-8?q?feat:=E6=9B=B4=E6=96=B0=E4=B8=80=E6=B3=A2?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/parses.conf | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/config/parses.conf b/config/parses.conf index f150792d..95a61601 100644 --- a/config/parses.conf +++ b/config/parses.conf @@ -3,13 +3,14 @@ # 名称,链接,类型,ua,flag (ua不填默认 Mozilla/5.0) 可以手动填 Dart/2.14 (dart:io) # JSON解析排前面 -J1,https://zy.qiaoji8.com/gouzi.php?url=,1 -J2,https://jxjson.icu/neibu.php?url=,1 +J1,https://kalbim.xatut.top/kalbim2025/781718/play/video_player.php?url=,1 +J2,http://sspa8.top:8100/api/?key=1060089351&url=,1 # J3,http://pan.qiaoji8.com/tvbox/neibu.php?url=,1 # J4,http://yunhai.qijiyun.vip/home/api?type=ys&uid=177259&key=dijnouxKNOQSTUWXY5&url=,1 J芒果4k,http://mg.itufm.top/mg.php?url=,1 -HGvip,http://1.94.221.189:88/algorithm.php?url=,1 # J皮皮虾,http://45.207.215.101:5423/index.php?url=,1 +J腾讯关姐,{{hostName}}:5759/tencent.php/?url=,1 +# 295关姐,{{hostName}}:5759/295yun.php?url=,1 # WEB解析放后面 W花旗,https://www.huaqi.live/?url= @@ -18,15 +19,18 @@ W盘古,https://www.playm3u8.cn/jiexi.php?url= # W虾米,https://jx.xmflv.com/?url= # W无双,http://103.117.123.193:1980/players/?url= W1,https://jx.xymp4.cc/?url= -# W2,https://cdn.zyc888.top/?url= -# W3,https://yparse.ik9.cc/index.php?url= -# W4,https://jx.yparse.com/index.php?url= -# W5,https://jx.2s0.cn/player/?url= -# W6,https://jx.quankan.app/?url= +#W2,https://im1907.top/?jx= +W3,https://yparse.ik9.cc/index.php?url= +W4,https://jiexi.site/?url= +W5,https://jx.m3u8.tv/jiexi/?url= +W7,https://www.pangujiexi.com/jiexi/?url= +W8,https://www.pouyun.com/?url= +W9,https://jx.xmflv.com/?url= +Wa,https://jx.xmflv.cc/?url= +Wb,https://jx.yparse.com/index.php?url= +Wc,https://www.8090g.cn/?url= # W7,https://jx.aidouer.net/?url= # W8,https://www.8090g.cn/?url= # W9,https://jx.yangtu.top?url= # W10,https://jx.m3u8.tv/jiexi/?url= -W11,https://www.ckplayer.vip/jiexi/?url= -腾讯关姐,{{hostName}}:5759/tencent.php/?url=,1 -295关姐,{{hostName}}:5759/295yun.php?url=,1 +Wz,https://www.ckplayer.vip/jiexi/?url= From fe12e248712c5e0f6100a9e2b44aefb59e8c7c3e Mon Sep 17 00:00:00 2001 From: Taois Date: Tue, 20 Jan 2026 22:39:26 +0800 Subject: [PATCH 06/57] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9E=E5=8F=A6=E7=B1=BB?= =?UTF-8?q?=E5=86=99=E6=B3=95=E7=9A=84cat=E6=BA=90=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/catvod.js | 10 +- libs_drpy/drpyInject.js | 50 ++- ...\345\223\251\345\223\251[\345\256\230].js" | 323 ++++++++++++++ ...\345\244\256\345\244\256[\345\256\230].js" | 290 +++++++++++++ ...\345\245\207\345\245\207[\345\256\230].js" | 403 ++++++++++++++++++ ...\346\236\234\346\236\234[\345\256\230].js" | 365 ++++++++++++++++ ...\351\205\267\351\205\267[\345\256\230].js" | 356 ++++++++++++++++ 7 files changed, 1792 insertions(+), 5 deletions(-) create mode 100644 "spider/catvod/\345\223\251\345\223\251[\345\256\230].js" create mode 100644 "spider/catvod/\345\244\256\345\244\256[\345\256\230].js" create mode 100644 "spider/catvod/\345\245\207\345\245\207[\345\256\230].js" create mode 100644 "spider/catvod/\346\236\234\346\236\234[\345\256\230].js" create mode 100644 "spider/catvod/\351\205\267\351\205\267[\345\256\230].js" diff --git a/libs/catvod.js b/libs/catvod.js index efb465cf..e9228e3c 100644 --- a/libs/catvod.js +++ b/libs/catvod.js @@ -184,10 +184,16 @@ const category = async function (filePath, env, tid, pg = 1, filter = 1, extend const detail = async function (filePath, env, ids) { const moduleObject = await init(filePath, env); const vod_id = Array.isArray(ids) ? ids[0] : ids; - return json2Object(await moduleObject.detail(vod_id)); + let detailResult = '{}'; + // console.log('type of detailContent:', typeof moduleObject.detailContent); + if (moduleObject.detailContent) { // tvbox形式猫源二级参数传ids列表 + detailResult = await moduleObject.detailContent(ids); + } else { // ds/cat传非id + detailResult = await moduleObject.detail(vod_id); + } + return json2Object(detailResult); } - const search = async function (filePath, env, wd, quick = 0, pg = 1) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.search(wd, quick, pg)); diff --git a/libs_drpy/drpyInject.js b/libs_drpy/drpyInject.js index 75d25c8c..b473ec13 100644 --- a/libs_drpy/drpyInject.js +++ b/libs_drpy/drpyInject.js @@ -163,10 +163,10 @@ async function request(url, opt = {}) { let effectivePostType = postType; if (!effectivePostType) { // 查找不区分大小写的 Content-Type 头 - const contentTypeKey = Object.keys(headers).find(key => + const contentTypeKey = Object.keys(headers).find(key => key.toLowerCase() === 'content-type' ); - + if (contentTypeKey && headers[contentTypeKey]) { const contentType = headers[contentTypeKey].toLowerCase(); if (contentType.includes('application/x-www-form-urlencoded')) { @@ -176,7 +176,7 @@ async function request(url, opt = {}) { } } } - + // 根据有效的 postType 处理数据 if (effectivePostType === 'form' && data != null && typeof data === 'object') { data = qs.stringify(data, {encode: false}); @@ -724,4 +724,48 @@ globalThis.jsonToCookie = jsonToCookie; globalThis.cookieToJson = cookieToJson; globalThis.keysToLowerCase = keysToLowerCase; +class BaseSpider { + constructor() { + this.home = this.homeContent; + this.category = this.categoryContent; + // this.detail = this.detailContent; + this.search = this.searchContent; + this.play = this.playerContent; + this.homeVod = this.homeVideoContent; + this.proxy = this.localProxy; + } + + async fetch(url, options) { + const content = (await req(url, options)).content; + return {data: content.parseX}; + } + + async homeContent() { + } + + async categoryContent() { + } + + async detailContent() { + } + + async searchContent() { + } + + async playerContent() { + } + + async homeVideoContent() { + } + + async localProxy() { + + } + + async action() { + + } +} + +globalThis.BaseSpider = BaseSpider; export default {}; diff --git "a/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" "b/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" new file mode 100644 index 00000000..df164c9c --- /dev/null +++ "b/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" @@ -0,0 +1,323 @@ +/** + * 哔哩哔哩 - 猫影视JS爬虫格式 + * 调用壳子超级解析功能 + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: 'B站', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://www.bilibili.com'; + this.headers = { + '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', + 'Referer': 'https://www.bilibili.com', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8' + }; + + // B站Cookie(需要登录才能获取高清画质) + this.cookie = ""; + this.isLoggedIn = () => { + return this.cookie && this.cookie.includes("SESSDATA="); + }; + } + + init(extend = '') { + return ''; + } + + getName() { + return '哔哩哔哩'; + } + + isVideoFormat(url) { + return true; + } + + manualVideoCheck() { + return false; + } + + destroy() { + // 清理资源 + } + + homeContent(filter) { + const classes = [ + {type_id: '1', type_name: '番剧'}, + {type_id: '4', type_name: '国创'}, + {type_id: '2', type_name: '电影'}, + {type_id: '5', type_name: '电视剧'}, + {type_id: '3', type_name: '纪录片'}, + {type_id: '7', type_name: '综艺'} + ]; + + return { + class: classes + }; + } + + homeVideoContent() { + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + const page = parseInt(pg) || 1; + let url = ''; + + if (['1', '4'].includes(tid)) { + url = `https://api.bilibili.com/pgc/web/rank/list?season_type=${tid}&pagesize=20&page=${page}&day=3`; + } else { + url = `https://api.bilibili.com/pgc/season/rank/web/list?season_type=${tid}&pagesize=20&page=${page}&day=3`; + } + + const headers = {...this.headers}; + if (this.cookie) { + headers.Cookie = this.cookie; + } + + const response = await this.fetch(url, {}, headers); + const data = response.data || {}; + + const videos = []; + if (data.code === 0) { + const vodList = data.result ? data.result.list : (data.data ? data.data.list : []); + + for (const vod of vodList) { + const title = vod.title ? vod.title.trim() : ''; + if (title.includes('预告')) { + continue; + } + + const remark = vod.new_ep ? vod.new_ep.index_show : vod.index_show; + + // 处理封面图片 + let cover = vod.cover || ''; + if (cover && cover.startsWith('//')) { + cover = 'https:' + cover; + } + + videos.push({ + vod_id: vod.season_id ? vod.season_id.toString() : '', + vod_name: title, + vod_pic: cover, + vod_remarks: remark || '' + }); + } + } + + return { + list: videos, + page: page, + pagecount: videos.length === 20 ? page + 1 : page, + limit: 20, + total: 9999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + formatCount(num) { + if (num > 1e8) return (num / 1e8).toFixed(2) + '亿'; + if (num > 1e4) return (num / 1e4).toFixed(2) + '万'; + return num.toString(); + } + + async detailContent(ids) { + try { + const seasonId = ids[0]; + + const headers = {...this.headers}; + if (this.cookie) { + headers.Cookie = this.cookie; + } + + const url = `https://api.bilibili.com/pgc/view/web/season?season_id=${seasonId}`; + const response = await this.fetch(url, {}, headers); + const data = response.data || {}; + + if (data.code !== 0) { + return {list: []}; + } + + const res = data.result; + const stat = res.stat || {}; + + // 处理封面图片 + let cover = res.cover || ''; + if (cover && cover.startsWith('//')) { + cover = 'https:' + cover; + } + + const vod = { + vod_id: res.season_id ? res.season_id.toString() : '', + vod_name: res.title || '', + vod_pic: cover, + type_name: res.share_sub_title || res.type_name || '', + vod_year: res.publish && res.publish.pub_time ? res.publish.pub_time.substr(0, 4) : '', + vod_area: res.areas && res.areas.length > 0 ? res.areas[0].name : '', + vod_actor: `点赞:${this.formatCount(stat.likes || 0)} 投币:${this.formatCount(stat.coins || 0)}`, + vod_content: res.evaluate || res.new_ep?.desc || '', + vod_director: res.rating ? `评分:${res.rating.score}` : '暂无评分', + vod_play_from: '哔哩哔哩', + vod_play_url: '' + }; + + // 过滤预告片,构建播放列表 + const episodes = (res.episodes || []).filter(ep => !ep.title.includes('预告')); + const playUrls = []; + + for (const ep of episodes) { + const title = `${ep.title.replace(/#/g, '-')} ${ep.long_title || ''}`; + const playId = `${res.season_id}_${ep.id}_${ep.cid}`; + playUrls.push(`${title}$${playId}`); + } + + vod.vod_play_url = playUrls.join('#'); + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = '1') { + try { + const page = parseInt(pg) || 1; + const encodedKeyword = encodeURIComponent(key); + const searchTypes = ['media_bangumi', 'media_ft']; + + const headers = {...this.headers}; + if (this.cookie) { + headers.Cookie = this.cookie; + } + + const allVideos = []; + + for (const type of searchTypes) { + try { + const url = `https://api.bilibili.com/x/web-interface/search/type?search_type=${type}&keyword=${encodedKeyword}&page=${page}`; + const response = await this.fetch(url, {}, headers); + const data = response.data || {}; + + if (data.code === 0 && data.data && data.data.result) { + for (const vod of data.data.result) { + const title = vod.title ? vod.title.replace(/<[^>]+>/g, '') : ''; + if (title.includes('预告')) { + continue; + } + + // 处理封面图片 + let cover = vod.cover || ''; + if (cover && cover.startsWith('//')) { + cover = 'https:' + cover; + } + + allVideos.push({ + vod_id: vod.season_id ? vod.season_id.toString() : '', + vod_name: title, + vod_pic: cover, + vod_remarks: vod.index_show || '' + }); + } + } + } catch (searchError) { + console.error(`搜索类型 ${type} 失败: ${searchError.message}`); + } + } + + return { + list: allVideos, + page: page, + pagecount: allVideos.length > 0 ? page + 1 : page, + limit: 20, + total: allVideos.length + }; + + } catch (error) { + console.error(`searchContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async playerContent(flag, id, vipFlags) { + try { + // 哔哩哔哩有自己的解析逻辑,直接返回播放链接 + // 格式:seasonId_epId_cid + const parts = id.split('_'); + if (parts.length < 3) { + throw new Error('无效的播放ID格式'); + } + + const seasonId = parts[0]; + const epId = parts[1]; + const cid = parts[2]; + + // 构建播放链接(原版B站链接) + const playUrl = `https://www.bilibili.com/bangumi/play/ep${epId}`; + + // 调用壳子超级解析 + const playData = { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '哔哩哔哩', + url: playUrl, + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://www.bilibili.com', + 'Origin': 'https://www.bilibili.com', + 'Cookie': this.cookie || '' + }) + }; + + return playData; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + // 即使出错也返回超级解析参数 + return { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '哔哩哔哩', + url: id.includes('_') ? `https://www.bilibili.com/bangumi/play/ep${id.split('_')[1]}` : id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } +} + + +export default new Spider(); \ No newline at end of file diff --git "a/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" "b/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" new file mode 100644 index 00000000..895aea15 --- /dev/null +++ "b/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" @@ -0,0 +1,290 @@ +/** + * 央视大全 - 猫影视/TVBox JS爬虫格式 + * 继承BaseSpider类 + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '央视大全', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://api.cntv.cn'; + this.siteName = '央视大全'; + this.sessionStore = {}; + this.videoCache = {}; + + this.headers = { + "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", + "Referer": "https://tv.cctv.com", + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8" + }; + } + + init(extend = "") { + return ""; + } + + getName() { + return this.siteName; + } + + isVideoFormat(url) { + return url.includes('.m3u8') || url.includes('.mp4'); + } + + manualVideoCheck() { + return false; + } + + destroy() { + this.sessionStore = {}; + this.videoCache = {}; + } + + homeContent(filter) { + const categories = [ + {type_id: "栏目大全", type_name: "栏目大全"}, + {type_id: "特别节目", type_name: "特别节目"}, + {type_id: "纪录片", type_name: "纪录片"}, + {type_id: "电视剧", type_name: "电视剧"}, + {type_id: "动画片", type_name: "动画片"} + ]; + + return {class: categories}; + } + + async homeVideoContent() { + // 央视首页推荐 + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + const page = parseInt(pg) || 1; + const videos = []; + + const channelMap = { + "特别节目": "CHAL1460955953877151", + "纪录片": "CHAL1460955924871139", + "电视剧": "CHAL1460955853485115", + "动画片": "CHAL1460955899450127", + }; + + let filterObj = {}; + if (extend && typeof extend === 'object') { + filterObj = extend; + } + + if (tid === '栏目大全') { + const url = `${this.host}/lanmu/columnSearch?&fl=&fc=&cid=&p=${page}&n=20&serviceId=tvcctv&t=json`; + const response = await this.fetch(url, {}, this.headers); + const data = response.data; + + if (data && data.response && data.response.docs) { + const docs = data.response.docs; + docs.forEach(it => { + videos.push({ + vod_id: `${it.lastVIDE.videoSharedCode}|${it.column_firstclass}|${it.column_name}|${it.channel_name}|${it.column_brief}|${it.column_logo}|${it.lastVIDE.videoTitle}|栏目大全`, + vod_name: it.column_name, + vod_pic: it.column_logo, + vod_remarks: it.channel_name, + vod_content: '' + }); + }); + } + } else { + // 处理筛选参数 + let fl_url = `&channelid=${channelMap[tid] || ''}&fc=${encodeURIComponent(tid)}`; + if (filterObj.channel) fl_url += `&channel=${encodeURIComponent(filterObj.channel)}`; + if (filterObj.sc) fl_url += `&sc=${encodeURIComponent(filterObj.sc)}`; + if (filterObj.year) fl_url += `&year=${filterObj.year}`; + + const url = `${this.host}/list/getVideoAlbumList?${fl_url}&area=&letter=&n=24&serviceId=tvcctv&t=json&p=${page}`; + const response = await this.fetch(url, {}, this.headers); + const data = response.data; + + if (data && data.data && data.data.list) { + const dataList = data.data.list; + dataList.forEach(it => { + videos.push({ + vod_id: `${it.id}|${it.sc}|${it.title}|${it.channel}|${it.brief}|${it.image}|${it.count}|${tid}`, + vod_name: it.title, + vod_pic: it.image, + vod_remarks: `${it.sc}${it.year ? '·' + it.year : ''}`, + vod_content: it.brief || '' + }); + }); + } + } + + return { + list: videos, + page: page, + pagecount: 9999, + limit: 20, + total: 999999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async detailContent(ids) { + try { + const id = ids[0]; + if (!id) return {list: []}; + + // 检查缓存 + const cacheKey = `detail_${id}`; + if (this.videoCache[cacheKey]) { + return {list: [this.videoCache[cacheKey]]}; + } + + const info = id.split("|"); + // ID 结构: 0:id, 1:sc, 2:title, 3:channel, 4:brief, 5:image, 6:count/remark, 7:cate + + const cate = info[7]; + const ctid = info[0]; + const modeMap = { + "特别节目": "0", + "纪录片": "0", + "电视剧": "0", + "动画片": "1" + }; + + // 获取选集列表 + let playUrls = []; + const mode = modeMap[cate] || '0'; + const albumUrl = `${this.host}/NewVideo/getVideoListByAlbumIdNew?id=${ctid}&serviceId=tvcctv&p=1&n=100&mode=${mode}&pub=1`; + + const response = await this.fetch(albumUrl, {}, this.headers); + const data = response.data; + + if (data.errcode === '1001') { + // 需要获取真实的ctid + const videoInfoUrl = `${this.host}/video/videoinfoByGuid?guid=${ctid}&serviceId=tvcctv`; + const vInfoRes = await this.fetch(videoInfoUrl, {}, this.headers); + const vInfoData = vInfoRes.data; + const realCtid = vInfoData.ctid; + + const columnUrl = `${this.host}/NewVideo/getVideoListByColumn?id=${realCtid}&d=&p=1&n=100&sort=desc&mode=0&serviceId=tvcctv&t=json`; + const colRes = await this.fetch(columnUrl, {}, this.headers); + const colData = colRes.data; + playUrls = colData.data?.list || []; + } else { + playUrls = data.data?.list || []; + } + + // 构建播放列表 + const playList = []; + if (playUrls.length > 0) { + for (const item of playUrls) { + const title = item.title || `第${item.index || '?'}集`; + const cleanTitle = title.replace(/\$/g, ''); + const guid = item.guid || ''; + playList.push(`${cleanTitle}$${guid}`); + } + } + + const vod = { + vod_id: id, + vod_name: info[2] || '', + vod_pic: info[5] || '', + type_name: info[1] || '', + vod_year: '', + vod_area: '', + vod_remarks: info[6] ? `共${info[6]}集` : '', + vod_actor: '', + vod_director: '', + vod_content: info[4] || '', + vod_play_from: playList.length > 0 ? '央视频' : '', + vod_play_url: playList.length > 0 ? playList.join('#') : '' + }; + + // 缓存结果 + this.videoCache[cacheKey] = vod; + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = "1") { + // CCTV搜索接口较复杂,这里返回空结果 + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + + async playerContent(flag, id, vipFlags) { + try { + // 央视视频采用直接播放的方式 + // 根据GUID拼接m3u8地址 + let playUrl = `https://cntv.playdreamer.cn/proxy/asp/hls/2000/0303000a/3/default/${id}/2000.m3u8`; + + // 也可以尝试其他格式 + // playUrl = `https://hls.cntv.myalicdn.com/asp/hls/2000/0303000a/3/default/${id}/2000.m3u8`; + + return { + parse: 0, // 0表示直接播放,不需要解析 + jx: 0, // 0表示不解析 + url: playUrl, + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://tv.cctv.com', + 'Origin': 'https://tv.cctv.com' + }) + }; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + return { + parse: 0, + jx: 0, + url: id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } + + // 辅助方法:安全获取对象属性 + getSafe(obj, path, defaultValue = '') { + if (!obj || typeof obj !== 'object') return defaultValue; + try { + return path.split('.').reduce((o, key) => { + if (o == null) return defaultValue; + return o[key]; + }, obj) ?? defaultValue; + } catch { + return defaultValue; + } + } +} + +export default new Spider(); \ No newline at end of file diff --git "a/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" "b/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" new file mode 100644 index 00000000..956ed6b1 --- /dev/null +++ "b/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" @@ -0,0 +1,403 @@ +/** + * 爱奇艺视频 - 猫影视/TVBox JS爬虫格式 + * 调用壳子超级解析功能(壳子会自动读取json配置) + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '爱奇艺视频', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://www.iqiyi.com'; + this.sessionStore = {}; + + this.headers = { + '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', + 'Referer': 'https://www.iqiyi.com', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive' + }; + + // 分类配置 + this.classes = [ + {type_id: '1', type_name: '电影'}, + {type_id: '2', type_name: '电视剧'}, + {type_id: '6', type_name: '综艺'}, + {type_id: '4', type_name: '动漫'}, + {type_id: '3', type_name: '纪录片'}, + {type_id: '5', type_name: '音乐'}, + {type_id: '16', type_name: '网络电影'} + ]; + + // 筛选配置 + this.filters = { + '1': [{ + key: 'year', + name: '年代', + value: [{n: '全部', v: ''}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, {n: '2023', v: '2023'}] + }], + '2': [{ + key: 'year', + name: '年代', + value: [{n: '全部', v: ''}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, {n: '2023', v: '2023'}] + }] + }; + } + + init(extend = '') { + return ''; + } + + getName() { + return '爱奇艺视频'; + } + + isVideoFormat(url) { + return true; + } + + manualVideoCheck() { + return false; + } + + destroy() { + // 清理资源 + } + + homeContent(filter) { + const result = { + class: this.classes, + filters: this.filters + }; + + return result; + } + + homeVideoContent() { + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + let channelId = tid; + let dataType = 1; + let extraParams = ""; + const page = parseInt(pg) || 1; + + if (tid === "16") { + channelId = "1"; + extraParams = "&three_category_id=27401"; + } else if (tid === "5") { + dataType = 2; + } + + // 处理筛选条件 + if (extend) { + let extendObj = {}; + if (typeof extend === 'string') { + try { + extendObj = JSON.parse(extend); + } catch (e) { + // 如果不是JSON,尝试解析为key=value格式 + extend.split('&').forEach(item => { + const [key, value] = item.split('='); + if (key && value) { + extendObj[key] = value; + } + }); + } + } else if (typeof extend === 'object') { + extendObj = extend; + } + + if (extendObj.year) { + extraParams += `&market_release_date_level=${extendObj.year}`; + } + } + + const url = `https://pcw-api.iqiyi.com/search/recommend/list?channel_id=${channelId}&data_type=${dataType}&page_id=${page}&ret_num=20${extraParams}`; + + const response = await this.fetch(url, {}, this.headers); + const jsonData = response.data; + + const videos = []; + if (jsonData.data && jsonData.data.list) { + for (const item of jsonData.data.list) { + const vid = `${item.channelId}$${item.albumId}`; + let remarks = ""; + + if (item.channelId === 1) { + remarks = item.score ? `${item.score}分` : ""; + } else if (item.channelId === 2 || item.channelId === 4) { + if (item.latestOrder && item.videoCount) { + remarks = item.latestOrder === item.videoCount ? + `${item.latestOrder}集全` : + `更新至${item.latestOrder}集`; + } else { + remarks = item.focus || ""; + } + } else { + remarks = item.period || item.focus || ""; + } + + videos.push({ + vod_id: vid, + vod_name: item.name, + vod_pic: item.imageUrl ? item.imageUrl.replace(".jpg", "_390_520.jpg") : "", + vod_remarks: remarks + }); + } + } + + return { + list: videos, + page: page, + pagecount: 9999, + limit: 20, + total: 999999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async getPlaylists(channelId, albumId, data) { + let playlists = []; + const cid = parseInt(channelId || data.channelId || 0); + + try { + if (cid === 1 || cid === 5) { + // 电影或音乐 + if (data.playUrl) { + playlists.push({title: data.name || '正片', url: data.playUrl}); + } + } else if (cid === 6 && data.period) { + // 综艺 + let qs = data.period.toString().split("-")[0]; + let listUrl = `https://pcw-api.iqiyi.com/album/source/svlistinfo?cid=6&sourceid=${albumId}&timelist=${qs}`; + try { + const listResp = await this.fetch(listUrl, {}, this.headers); + const listJson = listResp.data; + if (listJson.data && listJson.data[qs]) { + listJson.data[qs].forEach(it => { + playlists.push({ + title: it.shortTitle || it.period || it.focus || `期${it.order}`, + url: it.playUrl + }); + }); + } + } catch (e) { + console.error(`综艺列表获取失败: ${e.message}`); + } + } else { + // 电视剧、动漫等 + let listUrl = `https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid=${albumId}&size=100&page=1`; + try { + const listResp = await this.fetch(listUrl, {}, this.headers); + const listJson = listResp.data; + + if (listJson.data && listJson.data.epsodelist) { + playlists = listJson.data.epsodelist.map(item => ({ + title: item.shortTitle || item.title || + (item.order ? `第${item.order}集` : `集${item.timelist}`), + url: item.playUrl || item.url || '' + })); + + // 处理分页 + const total = listJson.data.total; + if (total > 100) { + const totalPages = Math.ceil(total / 100); + for (let i = 2; i <= totalPages; i++) { + let nextUrl = `https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid=${albumId}&size=100&page=${i}`; + try { + const nextResp = await this.fetch(nextUrl, {}, this.headers); + const nextJson = nextResp.data; + if (nextJson.data && nextJson.data.epsodelist) { + playlists = playlists.concat(nextJson.data.epsodelist.map(item => ({ + title: item.shortTitle || item.title || + (item.order ? `第${item.order}集` : `集${item.timelist}`), + url: item.playUrl || item.url || '' + }))); + } + } catch (e) { + break; + } + } + } + } + } catch (e) { + console.error(`剧集列表获取失败: ${e.message}`); + } + } + } catch (error) { + console.error(`getPlaylists error: ${error.message}`); + } + + return playlists; + } + + async detailContent(ids) { + try { + const id = ids[0]; + let channelId = ""; + let albumId = id; + + if (id.includes('$')) { + const parts = id.split('$'); + channelId = parts[0]; + albumId = parts[1]; + } + + // 获取视频基本信息 + const infoUrl = `https://pcw-api.iqiyi.com/video/video/videoinfowithuser/${albumId}?agent_type=1&authcookie=&subkey=${albumId}&subscribe=1`; + const infoResp = await this.fetch(infoUrl, {}, this.headers); + const infoJson = infoResp.data; + const data = infoJson.data || {}; + + // 获取播放列表 + const playlists = await this.getPlaylists(channelId, albumId, data); + + // 构建播放地址 + const playUrls = []; + if (playlists.length > 0) { + for (const item of playlists) { + if (item.url) { + playUrls.push(`${item.title}$${item.url}`); + } + } + } + + const vod = { + vod_id: id, + vod_name: data.name || '未知标题', + type_name: data.categories ? data.categories.map(it => it.name).join(',') : '', + vod_year: data.formatPeriod || '', + vod_area: data.areas ? data.areas.map(it => it.name).join(',') : '', + vod_remarks: data.latestOrder ? + `更新至${data.latestOrder}集` : + (data.period || playlists.length > 0 ? `${playlists.length}集` : ''), + vod_actor: data.people && data.people.main_charactor ? + data.people.main_charactor.map(it => it.name).join(',') : '', + vod_director: data.people && data.people.director ? + data.people.director.map(it => it.name).join(',') : '', + vod_content: data.description || '暂无简介', + vod_pic: data.imageUrl ? data.imageUrl.replace(".jpg", "_480_270.jpg") : '', + vod_play_from: playUrls.length > 0 ? '爱奇艺视频' : '', + vod_play_url: playUrls.length > 0 ? playUrls.join('#') : '' + }; + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = '1') { + try { + const page = parseInt(pg) || 1; + const url = `https://search.video.iqiyi.com/o?if=html5&key=${encodeURIComponent(key)}&pageNum=${page}&pos=1&pageSize=20&site=iqiyi`; + + const response = await this.fetch(url, {}, this.headers); + const jsonData = response.data; + + const videos = []; + + if (jsonData.data && jsonData.data.docinfos) { + for (const item of jsonData.data.docinfos) { + if (item.albumDocInfo) { + const doc = item.albumDocInfo; + const channelId = doc.channel ? doc.channel.split(',')[0] : '0'; + videos.push({ + vod_id: `${channelId}$${doc.albumId}`, + vod_name: doc.albumTitle || '', + vod_pic: doc.albumVImage || '', + vod_remarks: doc.tvFocus || doc.year || '' + }); + } + } + } + + return { + list: videos, + page: page, + pagecount: 10, + limit: 20, + total: videos.length + }; + + } catch (error) { + console.error(`searchContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async playerContent(flag, id, vipFlags) { + try { + // 解析播放地址 + let playUrl = id; + if (id.includes('$')) { + playUrl = id.split('$')[1]; + } + + // 关键:调用壳子超级解析 + const playData = { + parse: 1, // 必须为1,表示需要解析 + jx: 1, // 必须为1,启用解析 + play_parse: true, // 启用播放解析 + parse_type: '壳子超级解析', + parse_source: '爱奇艺视频', + url: playUrl, // 原始爱奇艺链接 + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://www.iqiyi.com', + 'Origin': 'https://www.iqiyi.com' + }) + }; + + return playData; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + // 即使出错也返回超级解析参数,让壳子处理 + return { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '爱奇艺视频', + url: id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } +} + +export default new Spider(); \ No newline at end of file diff --git "a/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" "b/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" new file mode 100644 index 00000000..33f6e159 --- /dev/null +++ "b/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" @@ -0,0 +1,365 @@ +/** + * 芒果TV - 猫影视JS爬虫格式(第二个版本) + * 调用壳子超级解析功能 + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '芒果TV', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://www.mgtv.com'; + this.headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', + 'Referer': 'https://www.mgtv.com/', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive' + }; + } + + init(extend = '') { + return ''; + } + + getName() { + return '芒果TV2'; + } + + isVideoFormat(url) { + return true; + } + + manualVideoCheck() { + return false; + } + + destroy() { + // 清理资源 + } + + homeContent(filter) { + const classes = [ + {type_id: '3', type_name: '电影'}, + {type_id: '2', type_name: '电视剧'}, + {type_id: '1', type_name: '综艺'}, + {type_id: '50', type_name: '动漫'}, + {type_id: '51', type_name: '纪录片'}, + {type_id: '115', type_name: '教育'}, + {type_id: '10', type_name: '少儿'} + ]; + + const filters = { + '3': [ + { + key: 'year', name: '年份', value: [ + {n: '全部', v: 'all'}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, + {n: '2023', v: '2023'}, {n: '2022', v: '2022'}, {n: '2021', v: '2021'}, + {n: '2020', v: '2020'}, {n: '2019', v: '2019'}, {n: '2010-2019', v: '2010-2019'}, + {n: '2000-2009', v: '2000-2009'} + ] + }, + { + key: 'sort', name: '排序', value: [ + {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'} + ] + } + ], + '2': [ + { + key: 'year', name: '年份', value: [ + {n: '全部', v: 'all'}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, + {n: '2023', v: '2023'}, {n: '2022', v: '2022'}, {n: '2021', v: '2021'}, + {n: '2020', v: '2020'} + ] + }, + { + key: 'sort', name: '排序', value: [ + {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'} + ] + } + ], + '1': [ + { + key: 'sort', name: '排序', value: [ + {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'} + ] + } + ], + '50': [ + { + key: 'sort', name: '排序', value: [ + {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'} + ] + } + ] + }; + + return { + class: classes, + filters: filters + }; + } + + homeVideoContent() { + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + const page = parseInt(pg) || 1; + const baseUrl = 'https://pianku.api.mgtv.com/rider/list/pcweb/v3'; + + // 构建查询参数 + const params = { + platform: 'pcweb', + channelId: tid, + pn: page, + pc: '20', + hudong: '1', + _support: '10000000', + kind: 'a1', + area: 'a1' + }; + + // 处理筛选条件 + if (extend) { + if (extend.year && extend.year !== 'all') { + params.year = extend.year; + } + if (extend.sort) { + params.sort = extend.sort; + } + if (extend.chargeInfo) { + params.chargeInfo = extend.chargeInfo; + } + } + + const queryString = new URLSearchParams(params).toString(); + const url = `${baseUrl}?${queryString}`; + + const response = await this.fetch(url, {}, this.headers); + const json = response.data || {}; + + const videos = []; + if (json.data?.hitDocs && Array.isArray(json.data.hitDocs)) { + for (const item of json.data.hitDocs) { + videos.push({ + vod_id: item.playPartId || '', + vod_name: item.title || '', + vod_pic: item.img || '', + vod_remarks: item.updateInfo || item.rightCorner?.text || '' + }); + } + } + + return { + list: videos, + page: page, + pagecount: json.data?.totalPage || 999, + limit: 20, + total: json.data?.totalHit || 9999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async detailContent(ids) { + try { + const videoId = ids[0]; + + // 获取视频基本信息 + const infoUrl = `https://pcweb.api.mgtv.com/video/info?video_id=${videoId}`; + const infoResponse = await this.fetch(infoUrl, {}, this.headers); + const infoData = infoResponse.data?.data?.info || {}; + + const vod = { + vod_id: videoId, + vod_name: infoData.title || '', + type_name: infoData.root_kind || '', + vod_actor: '', + vod_year: infoData.release_time || '', + vod_content: infoData.desc || '', + vod_remarks: infoData.time || '', + vod_pic: infoData.img || '', + vod_play_from: '芒果TV', + vod_play_url: '' + }; + + // 分页获取所有剧集 + const pageSize = 50; + let allEpisodes = []; + + try { + // 获取第一页,同时获取总页数 + const firstPageUrl = `https://pcweb.api.mgtv.com/episode/list?video_id=${videoId}&page=1&size=${pageSize}`; + const firstResponse = await this.fetch(firstPageUrl, {}, this.headers); + const firstData = firstResponse.data?.data || {}; + + if (firstData.list && Array.isArray(firstData.list)) { + allEpisodes = allEpisodes.concat(firstData.list); + const totalPages = firstData.total_page || 1; + + // 如果有多页,获取剩余页面 + if (totalPages > 1) { + const pagePromises = []; + for (let i = 2; i <= totalPages; i++) { + const pageUrl = `https://pcweb.api.mgtv.com/episode/list?video_id=${videoId}&page=${i}&size=${pageSize}`; + pagePromises.push(this.fetch(pageUrl, {}, this.headers)); + } + + const responses = await Promise.all(pagePromises); + for (const response of responses) { + const data = response.data?.data || {}; + if (data.list && Array.isArray(data.list)) { + allEpisodes = allEpisodes.concat(data.list); + } + } + } + } + } catch (episodeError) { + console.error(`获取剧集列表失败: ${episodeError.message}`); + } + + // 构建播放列表 + const playUrls = []; + if (allEpisodes.length > 0) { + // 过滤可播放的剧集(isIntact = 1) + const validEpisodes = allEpisodes.filter(item => + item.isIntact === "1" || item.isIntact === 1 + ); + + // 按集数排序 + validEpisodes.sort((a, b) => { + const orderA = parseInt(a.order) || 0; + const orderB = parseInt(b.order) || 0; + return orderA - orderB; + }); + + // 构建播放链接 + for (const item of validEpisodes) { + const name = item.t4 || item.t3 || item.title || `第${item.order || '?'}集`; + const playLink = item.url ? `https://www.mgtv.com${item.url}` : ''; + + if (playLink) { + playUrls.push(`${name}$${playLink}`); + } + } + } + + vod.vod_play_url = playUrls.join('#'); + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = '1') { + try { + const page = parseInt(pg) || 1; + const searchUrl = `https://mobileso.bz.mgtv.com/msite/search/v2?q=${encodeURIComponent(key)}&pn=${page}&pc=20`; + + const response = await this.fetch(searchUrl, {}, this.headers); + const json = response.data?.data || {}; + + const videos = []; + + if (json.contents && Array.isArray(json.contents)) { + for (const group of json.contents) { + if (group.type === 'media' && group.data && Array.isArray(group.data)) { + for (const item of group.data) { + if (item.source === 'imgo') { + // 提取视频ID + const match = item.url.match(/\/(\d+)\.html/); + if (match) { + videos.push({ + vod_id: match[1], + vod_name: item.title ? item.title.replace(/|<\/B>/g, '') : '', + vod_pic: item.img || '', + vod_remarks: item.desc ? item.desc.join(' ') : '' + }); + } + } + } + } + } + } + + return { + list: videos, + page: page, + pagecount: 10, + limit: 20, + total: videos.length + }; + + } catch (error) { + console.error(`searchContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async playerContent(flag, id, vipFlags) { + try { + // 调用壳子超级解析 + const playData = { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '芒果TV2', + url: id, + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://www.mgtv.com', + 'Origin': 'https://www.mgtv.com' + }) + }; + + return playData; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + return { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '芒果TV2', + url: id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } +} + +export default new Spider(); \ No newline at end of file diff --git "a/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" "b/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" new file mode 100644 index 00000000..ffdb7289 --- /dev/null +++ "b/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" @@ -0,0 +1,356 @@ +/** + * 优酷视频 - 猫影视/TVBox JS爬虫格式 + * 调用壳子超级解析功能(壳子会自动读取json配置) + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '优酷视频', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://www.youku.com'; + this.sessionStore = {}; + + this.headers = { + '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', + 'Referer': 'https://www.youku.com', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive' + }; + } + + init(extend = '') { + return ''; + } + + getName() { + return '优酷视频'; + } + + isVideoFormat(url) { + return true; + } + + manualVideoCheck() { + return false; + } + + destroy() { + // 清理资源 + } + + homeContent(filter) { + const categories = '电视剧&电影&综艺&动漫&少儿&纪录片&文化&亲子&教育&搞笑&生活&体育&音乐&游戏'.split('&'); + + const result = { + class: categories.map(name => ({ + type_id: name, + type_name: name + })) + }; + + return result; + } + + homeVideoContent() { + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + const page = parseInt(pg) || 1; + let filterObj = {}; + + if (extend && typeof extend === 'object') { + filterObj = extend; + } + + filterObj.type = tid; + const paramsStr = JSON.stringify(filterObj); + + let url = `https://www.youku.com/category/data?optionRefresh=1&pageNo=${page}¶ms=${encodeURIComponent(paramsStr)}`; + + // 处理session + if (page > 1 && this.sessionStore[tid]) { + url = url.replace("optionRefresh=1", `session=${encodeURIComponent(this.sessionStore[tid])}`); + } + + const response = await this.fetch(url, {}, this.headers); + const resData = response.data; + + if (resData.data && resData.data.filterData && resData.data.filterData.session) { + this.sessionStore[tid] = JSON.stringify(resData.data.filterData.session); + } + + const videos = []; + if (resData.data && resData.data.filterData && Array.isArray(resData.data.filterData.listData)) { + const lists = resData.data.filterData.listData; + for (const it of lists) { + let vid = ""; + if (it.videoLink && it.videoLink.includes("id_")) { + vid = it.videoLink.split("id_")[1].split(".html")[0]; + } else { + vid = "msearch:" + it.title; + } + + videos.push({ + vod_id: vid, + vod_name: it.title || '', + vod_pic: it.img || '', + vod_remarks: it.summary || '', + vod_content: it.subTitle || '' + }); + } + } + + return { + list: videos, + page: page, + pagecount: 9999, + limit: 20, + total: 999999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + safeFixYoukuInitialData(rawStr) { + if (!rawStr) return '{}'; + let s = rawStr + .replace(/^[\s\S]*?window\.__INITIAL_DATA__\s*[=:]\s*/, '') + .replace(/;[\s\S]*$/, '') + .replace(/\.{3,}[\s\S]*$/, '') + .replace(/,\s*$/, '') + .trim(); + + if (!s || s.length < 2 || !/^\{/.test(s)) { + return '{}'; + } + + let open = 0, close = 0; + for (let char of s) { + if (char === '{') open++; + if (char === '}') close++; + } + + if (open > close) { + s += '}'.repeat(open - close); + } + if (!s.startsWith('{')) { + s = '{' + s; + } + if (!s.endsWith('}')) { + s += '}'; + } + + return s; + } + + getSafe(obj, path, defaultValue = '') { + if (!obj || typeof obj !== 'object') return defaultValue; + try { + return path.split('.').reduce((o, key) => { + if (o == null) return defaultValue; + return o[key]; + }, obj) ?? defaultValue; + } catch { + return defaultValue; + } + } + + async detailContent(ids) { + try { + const id = ids[0]; + + // 获取剧集列表 + const apiUrl = `https://search.youku.com/api/search?appScene=show_episode&showIds=${id}`; + const apiResponse = await this.fetch(apiUrl, {}, this.headers); + const jsonData = apiResponse.data; + const videoLists = jsonData.serisesList || []; + + // 构建播放列表 + const playUrls = []; + if (videoLists.length > 0) { + for (const item of videoLists) { + const title = item.showVideoStage?.replace("期", "集") || + item.displayName || + item.title || + `第${item.index || '?'}集`; + const url = `https://v.youku.com/v_show/id_${item.videoId}.html`; + playUrls.push(`${title}$${url}`); + } + } + + // 获取详情信息 + let detailInfo = { + title: '', + cover: '', + category: '', + remarks: '', + desc: '' + }; + + try { + const detailUrl = `https://v.youku.com/v_show/id_${id}.html`; + const htmlResponse = await this.fetch(detailUrl, { + headers: { + ...this.headers, + 'Referer': 'https://v.youku.com/' + } + }); + const html = htmlResponse.data; + + // 检查是否触发人机验证 + if (html.includes("人机验证") || html.includes("captcha") || html.includes("verify")) { + detailInfo.desc = "触发优酷人机验证,建议在浏览器中访问优酷官网解除限制后再重试"; + } else if (html.includes("window.__INITIAL_DATA__ =")) { + let dataStr = html.split("window.__INITIAL_DATA__ =")[1]?.split(";")?.[0]?.trim() || '{}'; + dataStr = this.safeFixYoukuInitialData(dataStr); + + try { + const detailJson = JSON.parse(dataStr); + const item = this.getSafe(detailJson, 'moduleList.0.components.0.itemList.0', {}); + const extra = this.getSafe(detailJson, 'pageMap.extra', {}); + + detailInfo.title = item.introTitle || extra.showName || videoLists[0]?.title || ''; + detailInfo.cover = item.showImgV || extra.showImgV || extra.showImg || ''; + detailInfo.category = item.showGenre || extra.videoCategory || ''; + detailInfo.remarks = item.introSubTitle || extra.showSubtitle || item.mark?.text || ''; + } catch (parseErr) { + console.error(`JSON解析失败: ${parseErr.message}`); + } + } else { + detailInfo.title = videoLists[0]?.title?.split(" ")[0] || ''; + } + } catch (detailError) { + console.error(`获取详情失败: ${detailError.message}`); + } + + const vod = { + vod_id: id, + vod_name: detailInfo.title || videoLists[0]?.title || '未知标题', + type_name: detailInfo.category || '', + vod_year: '', + vod_remarks: detailInfo.remarks || '', + vod_content: detailInfo.desc || (detailInfo.remarks ? `简介: ${detailInfo.remarks}` : '暂无简介'), + vod_play_from: playUrls.length > 0 ? '优酷视频' : '', + vod_play_url: playUrls.length > 0 ? playUrls.join('#') : '' + }; + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = '1') { + try { + const page = parseInt(pg) || 1; + const url = `https://search.youku.com/api/search?pg=${page}&keyword=${encodeURIComponent(key)}`; + + const response = await this.fetch(url, {}, this.headers); + const data = response.data; + + const videos = []; + + if (data && Array.isArray(data.pageComponentList)) { + for (const item of data.pageComponentList) { + if (item.commonData) { + const common = item.commonData; + let vid = common.showId || ''; + + if (!vid && common.titleDTO && common.titleDTO.displayName) { + vid = `msearch:${common.titleDTO.displayName}`; + } + + videos.push({ + vod_id: vid, + vod_name: common.titleDTO?.displayName || '', + vod_pic: common.posterDTO?.vThumbUrl || '', + vod_remarks: common.stripeBottom || '', + vod_content: common.updateNotice || '' + }); + } + } + } + + return { + list: videos, + page: page, + pagecount: 9999, + limit: 20, + total: 999999 + }; + + } catch (error) { + console.error(`searchContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async playerContent(flag, id, vipFlags) { + try { + // 关键:调用壳子超级解析 + // 壳子会自动读取json配置中的解析规则 + const playData = { + parse: 1, // 必须为1,表示需要解析 + jx: 1, // 必须为1,启用解析 + play_parse: true, // 启用播放解析 + parse_type: '壳子超级解析', + parse_source: '优酷视频', + url: id, // 原始优酷链接 + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://www.youku.com', + 'Origin': 'https://www.youku.com' + }) + }; + + return playData; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + // 即使出错也返回超级解析参数,让壳子处理 + return { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '优酷视频', + url: id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } +} + +export default new Spider(); \ No newline at end of file From a9be6aa0c219931204278116b766a8bcf33f03fe Mon Sep 17 00:00:00 2001 From: Taois Date: Tue, 20 Jan 2026 22:57:54 +0800 Subject: [PATCH 07/57] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9E=E5=8F=A6=E7=B1=BB?= =?UTF-8?q?=E5=86=99=E6=B3=95=E7=9A=84cat=E6=BA=90=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs_drpy/drpyInject.js | 13 ++++++++++++- .../\345\223\251\345\223\251[\345\256\230].js" | 2 +- .../\345\244\256\345\244\256[\345\256\230].js" | 2 +- .../\345\245\207\345\245\207[\345\256\230].js" | 2 +- .../\346\236\234\346\236\234[\345\256\230].js" | 2 +- .../\351\205\267\351\205\267[\345\256\230].js" | 2 +- 6 files changed, 17 insertions(+), 6 deletions(-) diff --git a/libs_drpy/drpyInject.js b/libs_drpy/drpyInject.js index b473ec13..27122610 100644 --- a/libs_drpy/drpyInject.js +++ b/libs_drpy/drpyInject.js @@ -733,11 +733,22 @@ class BaseSpider { this.play = this.playerContent; this.homeVod = this.homeVideoContent; this.proxy = this.localProxy; + // this.fetch = request; } async fetch(url, options) { const content = (await req(url, options)).content; - return {data: content.parseX}; + return { + content, + get data() { // data尝试返回object + try { + // console.log('get data:', this.content); + return this.content.parseX; + } catch (e) { + return {}; + } + } + }; } async homeContent() { diff --git "a/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" "b/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" index df164c9c..91cecaa6 100644 --- "a/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" +++ "b/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" @@ -5,7 +5,7 @@ searchable: 1, filterable: 1, quickSearch: 1, - title: 'B站', + title: '哩哩[官]', lang: 'cat' }) */ diff --git "a/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" "b/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" index 895aea15..478e4b10 100644 --- "a/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" +++ "b/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" @@ -5,7 +5,7 @@ searchable: 1, filterable: 1, quickSearch: 1, - title: '央视大全', + title: '央央[官]', lang: 'cat' }) */ diff --git "a/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" "b/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" index 956ed6b1..89ce8472 100644 --- "a/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" +++ "b/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" @@ -5,7 +5,7 @@ searchable: 1, filterable: 1, quickSearch: 1, - title: '爱奇艺视频', + title: '奇奇[官]', lang: 'cat' }) */ diff --git "a/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" "b/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" index 33f6e159..ea5846fc 100644 --- "a/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" +++ "b/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" @@ -5,7 +5,7 @@ searchable: 1, filterable: 1, quickSearch: 1, - title: '芒果TV', + title: '果果[官]', lang: 'cat' }) */ diff --git "a/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" "b/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" index ffdb7289..754e204f 100644 --- "a/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" +++ "b/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" @@ -5,7 +5,7 @@ searchable: 1, filterable: 1, quickSearch: 1, - title: '优酷视频', + title: '酷酷[官]', lang: 'cat' }) */ From f5b6905c43fa67744347e0ee21966a167d60c42a Mon Sep 17 00:00:00 2001 From: Taois Date: Tue, 20 Jan 2026 23:07:11 +0800 Subject: [PATCH 08/57] =?UTF-8?q?add:=20=E5=A2=9E=E5=8A=A0php=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "spider/php/B\347\253\231.php" | 326 +++++++++++++++++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 "spider/php/B\347\253\231.php" diff --git "a/spider/php/B\347\253\231.php" "b/spider/php/B\347\253\231.php" new file mode 100644 index 00000000..902093e0 --- /dev/null +++ "b/spider/php/B\347\253\231.php" @@ -0,0 +1,326 @@ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36", + "Referer" => "https://www.bilibili.com" + ]; + + public function __construct() { + $this->extendDict = $this->getExtendDict(); + $this->cookie = $this->getCookie(); + } + + private function getExtendDict() { + return [ + 'cookie' => $this->getConfigCookie(), + 'thread' => '0' + ]; + } + + private function getConfigCookie() { + // 配置您的B站Cookie + return 'buvid3=xxxx; SESSDATA=xxxx;'; + } + + private function getCookie() { + $cookie = $this->extendDict['cookie'] ?? ''; + if (empty($cookie)) return []; + + $cookies = []; + $pairs = explode(';', $cookie); + foreach ($pairs as $pair) { + $pair = trim($pair); + if (strpos($pair, '=') !== false) { + list($name, $value) = explode('=', $pair, 2); + $cookies[trim($name)] = trim($value); + } + } + return $cookies; + } + + private function httpRequest($url, $params = []) { + $ch = curl_init(); + + if (!empty($params)) { + $url .= '?' . http_build_query($params); + } + + $headers = []; + foreach ($this->header as $key => $value) { + $headers[] = $key . ': ' . $value; + } + + curl_setopt_array($ch, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 10, + CURLOPT_HTTPHEADER => $headers, + CURLOPT_COOKIE => $this->buildCookieString(), + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_FOLLOWLOCATION => true + ]); + + $response = curl_exec($ch); + curl_close($ch); + + return json_decode($response, true) ?: []; + } + + private function buildCookieString() { + $pairs = []; + foreach ($this->cookie as $name => $value) { + $pairs[] = $name . '=' . $value; + } + return implode('; ', $pairs); + } + + // homeContent - 首页分类 + public function homeContent() { + $classes = [ + ["type_id" => "沙雕仙逆", "type_name" => "傻屌仙逆"], + ["type_id" => "沙雕动画", "type_name" => "沙雕动画"], + ["type_id" => "纪录片超清", "type_name" => "纪录片"], + ["type_id" => "演唱会超清", "type_name" => "演唱会"], + ["type_id" => "音乐超清", "type_name" => "流行音乐"], + ["type_id" => "美食超清", "type_name" => "美食"], + ["type_id" => "食谱", "type_name" => "食谱"], + ["type_id" => "体育超清", "type_name" => "体育"], + ["type_id" => "球星", "type_name" => "球星"], + ["type_id" => "中小学教育", "type_name" => "教育"], + ["type_id" => "幼儿教育", "type_name" => "幼儿教育"], + ["type_id" => "旅游", "type_name" => "旅游"], + ["type_id" => "风景4K", "type_name" => "风景"], + ["type_id" => "说案", "type_name" => "说案"], + ["type_id" => "知名UP主", "type_name" => "知名UP主"], + ["type_id" => "探索发现超清", "type_name" => "探索发现"], + ["type_id" => "鬼畜", "type_name" => "鬼畜"], + ["type_id" => "搞笑超清", "type_name" => "搞笑"], + ["type_id" => "儿童超清", "type_name" => "儿童"], + ["type_id" => "动物世界超清", "type_name" => "动物世界"], + ["type_id" => "相声小品超清", "type_name" => "相声小品"], + ["type_id" => "戏曲", "type_name" => "戏曲"], + ["type_id" => "解说", "type_name" => "解说"], + ["type_id" => "演讲", "type_name" => "演讲"], + ["type_id" => "小姐姐超清", "type_name" => "小姐姐"], + ["type_id" => "荒野求生超清", "type_name" => "荒野求生"], + ["type_id" => "健身", "type_name" => "健身"], + ["type_id" => "帕梅拉", "type_name" => "帕梅拉"], + ["type_id" => "太极拳", "type_name" => "太极拳"], + ["type_id" => "广场舞", "type_name" => "广场舞"], + ["type_id" => "舞蹈", "type_name" => "舞蹈"], + ["type_id" => "音乐", "type_name" => "音乐"], + ["type_id" => "歌曲", "type_name" => "歌曲"], + ["type_id" => "MV4K", "type_name" => "MV"], + ["type_id" => "舞曲超清", "type_name" => "舞曲"], + ["type_id" => "4K", "type_name" => "4K"], + ["type_id" => "电影", "type_name" => "电影"], + ["type_id" => "电视剧", "type_name" => "电视剧"], + ["type_id" => "白噪音超清", "type_name" => "白噪音"], + ["type_id" => "考公考证", "type_name" => "考公考证"], + ["type_id" => "平面设计教学", "type_name" => "平面设计教学"], + ["type_id" => "软件教程", "type_name" => "软件教程"], + ["type_id" => "Windows", "type_name" => "Windows"] + ]; + + return ['class' => $classes]; + } + + // homeVideoContent - 首页推荐视频 + public function homeVideoContent() { + $url = 'https://api.bilibili.com/x/web-interface/popular'; + $data = $this->httpRequest($url, ['ps' => 20, 'pn' => 1]); + + $videos = []; + if (isset($data['data']['list'])) { + foreach ($data['data']['list'] as $item) { + $videos[] = [ + 'vod_id' => $item['aid'], + 'vod_name' => strip_tags($item['title']), + 'vod_pic' => $item['pic'], + 'vod_remarks' => $this->formatDuration($item['duration']) + ]; + } + } + + return ['list' => $videos]; + } + + // categoryContent - 分类内容(使用搜索API) + public function categoryContent($tid, $page, $filters = []) { + $page = max(1, intval($page)); + + $url = 'https://api.bilibili.com/x/web-interface/search/type'; + $params = [ + 'search_type' => 'video', + 'keyword' => $tid, + 'page' => $page + ]; + + $data = $this->httpRequest($url, $params); + + $videos = []; + if (isset($data['data']['result'])) { + foreach ($data['data']['result'] as $item) { + if ($item['type'] !== 'video') continue; + + $videos[] = [ + 'vod_id' => $item['aid'], + 'vod_name' => strip_tags($item['title']), + 'vod_pic' => 'https:' . $item['pic'], + 'vod_remarks' => $this->formatSearchDuration($item['duration']) + ]; + } + } + + $pageCount = $data['data']['numPages'] ?? 1; + $total = $data['data']['numResults'] ?? count($videos); + + return [ + 'list' => $videos, + 'page' => $page, + 'pagecount' => $pageCount, + 'limit' => 20, + 'total' => $total + ]; + } + + // detailContent - 视频详情 + public function detailContent($vid) { + $url = 'https://api.bilibili.com/x/web-interface/view'; + $data = $this->httpRequest($url, ['aid' => $vid]); + + if (!isset($data['data'])) { + return ['list' => []]; + } + + $video = $data['data']; + + // 构建播放列表 + $playUrl = ''; + foreach ($video['pages'] as $index => $page) { + $part = $page['part'] ?: '第' . ($index + 1) . '集'; + $duration = $this->formatDuration($page['duration']); + $playUrl .= "{$part}\${$vid}_{$page['cid']}#"; + } + + $vod = [ + "vod_id" => $vid, + "vod_name" => strip_tags($video['title']), + "vod_pic" => $video['pic'], + "vod_content" => $video['desc'], + "vod_play_from" => "B站视频", + "vod_play_url" => rtrim($playUrl, '#') + ]; + + return ['list' => [$vod]]; + } + + // playContent - 播放地址(高清优化) + public function playContent($vid) { + if (strpos($vid, '_') !== false) { + list($avid, $cid) = explode('_', $vid); + } else { + return $this->errorResponse('无效的视频ID格式'); + } + + // 使用高质量参数 + $url = 'https://api.bilibili.com/x/player/playurl'; + $params = [ + 'avid' => $avid, + 'cid' => $cid, + 'qn' => 112, // 原画质量 + 'fnval' => 0, + ]; + + $data = $this->httpRequest($url, $params); + + if (!isset($data['data']) || $data['code'] !== 0) { + return $this->errorResponse('获取播放地址失败'); + } + + // 直接返回第一个播放地址 + if (isset($data['data']['durl'][0]['url'])) { + $playUrl = $data['data']['durl'][0]['url']; + + $headers = $this->header; + $headers['Referer'] = 'https://www.bilibili.com/video/av' . $avid; + $headers['Origin'] = 'https://www.bilibili.com'; + + return [ + 'parse' => 0, + 'url' => $playUrl, + 'header' => $headers, + 'danmaku' => "https://api.bilibili.com/x/v1/dm/list.so?oid={$cid}" + ]; + } + + return $this->errorResponse('无法获取播放地址'); + } + + // 工具函数 + private function formatDuration($seconds) { + if ($seconds <= 0) return '00:00'; + $minutes = floor($seconds / 60); + $secs = $seconds % 60; + return sprintf('%02d:%02d', $minutes, $secs); + } + + private function formatSearchDuration($duration) { + $parts = explode(':', $duration); + if (count($parts) === 2) { + return $duration; + } + return '00:00'; + } + + private function errorResponse($message) { + return [ + 'parse' => 0, + 'url' => '', + 'error' => $message + ]; + } +} + +// 主处理逻辑 +$ac = $_GET['ac'] ?? 'detail'; +$t = $_GET['t'] ?? ''; +$pg = $_GET['pg'] ?? '1'; +$f = $_GET['f'] ?? ''; +$ids = $_GET['ids'] ?? ''; +$id = $_GET['id'] ?? ''; + +$spider = new BiliBiliSpider(); + +try { + switch ($ac) { + case 'detail': + if (!empty($ids)) { + echo json_encode($spider->detailContent($ids)); + } elseif (!empty($t)) { + $filters = !empty($f) ? json_decode($f, true) : []; + echo json_encode($spider->categoryContent($t, $pg, $filters)); + } else { + $result = $spider->homeContent(); + $videoResult = $spider->homeVideoContent(); + $result['list'] = $videoResult['list']; + echo json_encode($result); + } + break; + + case 'play': + echo json_encode($spider->playContent($id)); + break; + + default: + echo json_encode(['error' => '未知操作: ' . $ac]); + } +} catch (Exception $e) { + echo json_encode(['error' => $e->getMessage()]); +} +?> From bcd8939bfba1b44dee3299713e155d415e8bfe1e Mon Sep 17 00:00:00 2001 From: Taois Date: Tue, 20 Jan 2026 23:32:16 +0800 Subject: [PATCH 09/57] =?UTF-8?q?add:=20=E5=A2=9E=E5=8A=A0php=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spider/php/config.php | 46 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 spider/php/config.php diff --git a/spider/php/config.php b/spider/php/config.php new file mode 100644 index 00000000..d8327c65 --- /dev/null +++ b/spider/php/config.php @@ -0,0 +1,46 @@ + "php_" . $filename, + "name" => $filename . "(PHP)", + "type" => 4, + "api" => "http://127.0.0.1:9980/" . $filename . ".php", + "searchable" => 1, + "quickSearch" => 1, + "changeable" => 0 + ]; +} + +// 输出 JSON +echo json_encode( + ["sites" => $sites], + JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT +); From 6d69335db1cec97a306827a889452c49a1238c88 Mon Sep 17 00:00:00 2001 From: Taois Date: Tue, 20 Jan 2026 23:41:27 +0800 Subject: [PATCH 10/57] =?UTF-8?q?add:=20=E5=A2=9E=E5=8A=A0php=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spider/php/config.php | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/spider/php/config.php b/spider/php/config.php index d8327c65..052cfc2a 100644 --- a/spider/php/config.php +++ b/spider/php/config.php @@ -1,31 +1,24 @@ $sites], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT From d39a76e6f936c013ed2330145080408b3fbaa996 Mon Sep 17 00:00:00 2001 From: Taois Date: Wed, 21 Jan 2026 10:12:51 +0800 Subject: [PATCH 11/57] =?UTF-8?q?docs:=E5=A2=9E=E5=8A=A0=E8=B6=85=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + public/index.html | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 3cbdcc29..f8488af2 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ nodejs作为服务端的drpy实现。全面升级异步写法 * [猫源调试教程](/docs/catDebug.md) * [接口压测教程](/docs/httpTest.md) * [AI编程工具 trae](https://www.trae.ai/account-setting#subscription) | 邮编ZIP输入: 518000 +* [推荐使用AI模型-GLM4.7](https://www.bigmodel.cn/glm-coding?ic=DRV3C8M5NX) | [GLM配置文档](https://docs.bigmodel.cn/cn/coding-plan/tool/trae) * [免费AI-360纳米](https://bot.n.cn/)|[免费AI-当贝AI](https://ai.dangbei.com/chat)|[国外聚合全模型](https://lmarena.ai/) * [本站防止爬虫协议](/robots.txt) * [油猴脚本-反切屏检测](/public/monkey/check_screen_leave.user.js) diff --git a/public/index.html b/public/index.html index 83d6552e..41ed026e 100644 --- a/public/index.html +++ b/public/index.html @@ -25,6 +25,7 @@

常用超链接

  • 猫源调试教程
  • 接口压测教程
  • AI编程工具 trae | 邮编ZIP输入: 518000
  • +
  • 推荐使用AI模型-GLM4.7 | GLM配置文档
  • 免费AI-360纳米|免费AI-当贝AI|国外聚合全模型
  • 本站防止爬虫协议
  • 油猴脚本-反切屏检测
  • From 6e6d6041fe3c6a8f6e4d9417ae6d90be05e97827 Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Wed, 21 Jan 2026 14:44:28 +0800 Subject: [PATCH 12/57] =?UTF-8?q?Update=20=E6=A2=A8=E5=9B=AD=E8=A1=8C[?= =?UTF-8?q?=E6=88=8F].js=20and=20add=20new=20js=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\234\250\345\205\256[\344\274\230].js" | 14 +- ...\345\233\255\350\241\214[\346\210\217].js" | 261 ++++++++++++++++++ ...\351\237\263\344\271\220[\345\220\254].js" | 14 + ...\351\237\263\344\271\220[\345\220\254].js" | 49 +--- 4 files changed, 289 insertions(+), 49 deletions(-) rename "spider/js_bad/\346\234\250\345\205\256[\344\274\230].js" => "spider/js/\346\234\250\345\205\256[\344\274\230].js" (88%) create mode 100644 "spider/js/\346\242\250\345\233\255\350\241\214[\346\210\217].js" create mode 100644 "spider/js/\347\210\261\347\216\251\351\237\263\344\271\220[\345\220\254].js" diff --git "a/spider/js_bad/\346\234\250\345\205\256[\344\274\230].js" "b/spider/js/\346\234\250\345\205\256[\344\274\230].js" similarity index 88% rename from "spider/js_bad/\346\234\250\345\205\256[\344\274\230].js" rename to "spider/js/\346\234\250\345\205\256[\344\274\230].js" index 918c35da..59cac191 100644 --- "a/spider/js_bad/\346\234\250\345\205\256[\344\274\230].js" +++ "b/spider/js/\346\234\250\345\205\256[\344\274\230].js" @@ -20,7 +20,19 @@ var rule = { quickSearch: 1, filterable: 0, headers: { - 'User-Agent': MOBILE_UA + 'User-Agent': MOBILE_UA, + 'Accept': 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9', + 'cache-control': 'no-cache', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'sec-ch-ua': '"Google Chrome";v="143", "Chromium";v="143", "Not A(Brand";v="24"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'x-platform': 'web' }, play_parse: true, search_match: true, diff --git "a/spider/js/\346\242\250\345\233\255\350\241\214[\346\210\217].js" "b/spider/js/\346\242\250\345\233\255\350\241\214[\346\210\217].js" new file mode 100644 index 00000000..22af9d45 --- /dev/null +++ "b/spider/js/\346\242\250\345\233\255\350\241\214[\346\210\217].js" @@ -0,0 +1,261 @@ +/* +@header({ + searchable: 1, + filterable: 1, + quickSearch: 0, + title: '梨园行戏曲', + author: 'EylinSir', + '类型': '影视', + logo: 'https://img.znds.com//uploads/new/221222/9-2212221050561N.png', + lang: 'ds' +}) +*/ + +var rule = { + 类型: '影视', + author: 'EylinSir', + title: '梨园行戏曲', + desc: '梨园行戏曲源', + host: 'https://fly.daoran.tv', + homeUrl: 'https://fly.daoran.tv', + url: '/API_ROP/search/album/screen', + searchUrl: '/API_ROP/search/album/list?keyword=**', + logo: 'https://img.znds.com//uploads/new/221222/9-2212221050561N.png', + searchable: 1, + quickSearch: 0, + filterable: 1, + timeout: 10000, + play_parse: true, + headers: { + 'md5': 'SkvyrWqK9QHTdCT12Rhxunjx+WwMTe9y4KwgeASFDhbYabRSPskR0Q==', + 'Content-Type': 'application/json; charset=UTF-8', + 'User-Agent': 'okhttp/3.12.10', + 'Host': 'fly.daoran.tv', + 'Connection': 'Keep-Alive' + }, + + request: async function (url, obj) { + obj = obj || {}; + let response = await _fetch(url, { + method: obj.method || 'POST', + headers: obj.headers || this.headers, + body: obj.data ? JSON.stringify(obj.data) : undefined + }); + return response.text(); + }, + + _format_img: function (img) { + if (!img) { + return ''; + } + if (!img.startsWith('http')) { + return `https://ottphoto.daoran.tv/HD/${img}`; + } + return img; + }, + + 预处理: async function () {}, + + class_parse: async function () { + let cate_list = [ + {"n": "全部", "v": ""}, + {"n": "黄梅戏", "v": "hmx"}, {"n": "京剧", "v": "jingju"}, {"n": "曲剧", "v": "quju"}, + {"n": "秦腔", "v": "qinq"}, {"n": "潮剧", "v": "chaoju"}, {"n": "沪剧", "v": "huju"}, + {"n": "昆曲", "v": "kunqu"}, {"n": "淮剧", "v": "huaiju"}, {"n": "婺剧", "v": "wuju"}, + {"n": "河南大鼓书", "v": "hndgs"}, {"n": "滇剧", "v": "dianju"}, {"n": "老年大学", "v": "WK"}, + {"n": "绍剧", "v": "shaojv"}, {"n": "曲艺晚会", "v": "else"}, {"n": "皮影戏", "v": "pyx"}, + {"n": "四平调", "v": "spd"}, {"n": "吕剧", "v": "lvjv"}, {"n": "柳琴戏", "v": "liuqx"}, + {"n": "莆仙戏", "v": "pxx"}, {"n": "宛梆", "v": "wb"}, {"n": "锡剧", "v": "xiju"}, + {"n": "大平调", "v": "dpd"}, {"n": "话剧", "v": "huaju"}, {"n": "西秦戏", "v": "xqx"}, + {"n": "川剧", "v": "chuanju"}, {"n": "赣剧", "v": "tagId"}, {"n": "太康道情", "v": "tkdq"}, + {"n": "闽剧", "v": "minju"}, {"n": "梅花大鼓", "v": "mhdg"}, {"n": "吉剧", "v": "jiju"}, + {"n": "白字戏", "v": "bzx"}, {"n": "豫剧", "v": "yuju"}, {"n": "越剧", "v": "yueju"}, + {"n": "评剧", "v": "pingju"}, {"n": "坠子", "v": "hnzz"}, {"n": "河北梆子", "v": "hbbz"}, + {"n": "粤剧", "v": "gddx"}, {"n": "二夹弦", "v": "ejx"}, {"n": "河南琴书", "v": "hnqs"}, + {"n": "戏曲", "v": "xq"}, {"n": "二人台", "v": "ERT"}, {"n": "越调", "v": "yued"}, + {"n": "乐腔", "v": "lq"}, {"n": "扬剧", "v": "yangju"}, {"n": "京韵大鼓", "v": "jydg"}, + {"n": "彩调", "v": "caidiao"}, {"n": "琼剧", "v": "qiongju"}, {"n": "蒲剧", "v": "pujv"}, + {"n": "西河大鼓", "v": "xhdg"}, {"n": "湘剧", "v": "xj"}, {"n": "麦田乡韾", "v": "mtxy"}, + {"n": "评书", "v": "pingshu"}, {"n": "庐剧", "v": "luju"}, {"n": "单弦", "v": "danxian"}, + {"n": "花鼓戏", "v": "huagx"}, {"n": "相声", "v": "xiang"}, {"n": "四股弦", "v": "sgx"}, + {"n": "保定老调", "v": "bdld"}, {"n": "晋剧", "v": "jinju"}, {"n": "其他", "v": "other"}, + {"n": "正字戏", "v": "zzx"}, {"n": "楚剧", "v": "chuju"} + ]; + + return { + class: [{ 'type_name': '戏曲片库', 'type_id': 'all' }], + filters: { + "all": [ + {"key": "sect", "name": "曲种", "value": cate_list}, + {"key": "area", "name": "资费", "value": [{"n": "全部", "v": "0"}, {"n": "免费", "v": "1"}, {"n": "VIP", "v": "2"}]}, + {"key": "sort", "name": "排序", "value": [{"n": "最热", "v": "hot"}, {"n": "最新", "v": "online"}]} + ] + } + }; + }, + + 推荐: async function () { + return await this.一级('all', 1, {}, {}); + }, + + 一级: async function (tid, pg, filter, extend) { + let url = `${this.host}/API_ROP/search/album/screen`; + let sect = extend?.sect || ''; + if (tid === 'all' && !sect) { + sect = ''; + } + + let payload = { + "cur": parseInt(pg), + "pageSize": 30, + "resType": 1, + "sect": sect, + "orderby": extend?.sort || 'hot', + "tagId": 0, + "userId": "92315ec6e58a45ba7f47fd143b3d7956", + "channel": "vivo", + "item": "y9", + "nodeCode": "001000", + "project": "lyhxcx" + }; + + let area = extend?.area || '0'; + if (area === '1' || area === '2') { + payload['free'] = parseInt(area); + } + + try { + let resp = await this.request(url, { data: payload }); + let json = JSON.parse(resp); + let data = json.pb || json.data || {}; + let vod_list = []; + for (let item of data.dataList || []) { + vod_list.push({ + title: item.name, + url: `${this.host}/API_ROP/album/res/list?albumCode=${item.code}`, + desc: (item.publishTime || '').split(' ')[0], + pic_url: this._format_img(item.imgsec), + vod_year: (item.publishTime || '').substring(0, 4) + }); + } + + return setResult(vod_list); + } catch (e) { + console.error(e); + return setResult([]); + } + }, + + 二级: async function () { + let albumCode = this.input.match(/albumCode=(.*?)(?:&|$)/)[1]; + let url = `${this.host}/API_ROP/album/res/list`; + + let payload = { + "albumCode": albumCode, + "cur": 1, + "pageSize": 500, + "userId": "92315ec6e58a45ba7f47fd143b3d7956", + "channel": "vivo", + "item": "y9", + "nodeCode": "001000", + "project": "lyhxcx" + }; + + try { + let resp = await this.request(url, { data: payload }); + let json = JSON.parse(resp); + let album = json.album || {}; + let tracks = json.pb?.dataList || []; + tracks.sort((a, b) => parseInt(a.sort || 0) - parseInt(b.sort || 0)); + let play_urls = []; + for (let t of tracks) { + if (t.code) { + play_urls.push(`${t.name.replace(/\$/g, '_')}$${t.code}`); + } + } + + let VOD = { + vod_id: albumCode, + vod_name: album.name || '未知', + vod_pic: this._format_img(album.imgsec), + type_name: "戏曲", + vod_year: album.publishTime || '', + vod_area: "中国", + vod_content: album.des || '暂无简介', + vod_play_from: "梨园行", + vod_play_url: play_urls.join('#') + }; + + return VOD; + } catch (e) { + console.error(e); + return {}; + } + }, + + 搜索: async function () { + let url = `${this.host}/API_ROP/search/album/list`; + let payload = { + "cur": parseInt(this.MY_PAGE), + "pageSize": 20, + "keyword": this.KEY, + "item": "y9", + "nodeCode": "001000", + "orderby": "hot", + "px": 2, + "sect": [], + "userId": "92315ec6e58a45ba7f47fd143b3d7956", + "project": "lyhxcx" + }; + + try { + let resp = await this.request(url, { data: payload }); + let json = JSON.parse(resp); + let data = json.pb || json.data || {}; + let vod_list = []; + for (let item of data.dataList || []) { + vod_list.push({ + title: item.name, + url: `${this.host}/API_ROP/album/res/list?albumCode=${item.code}`, + desc: (item.publishTime || ''), + pic_url: this._format_img(item.imgsec) + }); + } + return setResult(vod_list); + } catch (e) { + console.error(e); + return setResult([]); + } + }, + + lazy: async function () { + let resCode = this.input; + let url = `${this.host}/API_ROP/play/get/playurl`; + let payload = { + "resCode": resCode, + "item": "y9", + "mask": 0, + "nodeCode": "001000", + "project": "lyhxcx", + "px": 2, + "userId": "92315ec6e58a45ba7f47fd143b3d7956" + }; + + try { + let resp = await this.request(url, { data: payload }); + let json = JSON.parse(resp); + let play_url = json.playres?.playurl || ''; + return { + parse: 0, + url: play_url, + header: { 'User-Agent': this.headers['User-Agent'] } + }; + } catch (e) { + console.error(e); + return { + parse: 0, + url: '' + }; + } + } +}; \ No newline at end of file diff --git "a/spider/js/\347\210\261\347\216\251\351\237\263\344\271\220[\345\220\254].js" "b/spider/js/\347\210\261\347\216\251\351\237\263\344\271\220[\345\220\254].js" new file mode 100644 index 00000000..28c15f7c --- /dev/null +++ "b/spider/js/\347\210\261\347\216\251\351\237\263\344\271\220[\345\220\254].js" @@ -0,0 +1,14 @@ +/* +@header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '爱玩音乐', + author: 'EylinSir', + '类型': '音乐', + logo: 'https://www.22a5.com/favicon.ico', + lang: 'ds' +}) +*/ + +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICfpn7PkuZAnLAogICAgdGl0bGU6ICfniLHnjqnpn7PkuZAnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgaG9zdDogJ2h0dHBzOi8vd3d3LjIyYTUuY29tJywKICAgIHVybDogJy9meWNsYXNzL2Z5ZmlsdGVyLWZ5cGFnZS8nLAogICAgbG9nbzogJ2h0dHBzOi8vd3d3LjIyYTUuY29tL2Zhdmljb24uaWNvJywKICAgIGNsYXNzX25hbWU6ICfnlLXlj7Am5q2M5Y2VJuS4k+i+kSbmrYzmiYsm6auY5riFTVYm5paw5q2M5qacJlRPUOamnOWNlScsCiAgICBjbGFzc191cmw6ICcvcmFkaW9saXN0L2luZGV4Lmh0bWwmL3BsYXl0eXBlL2luZGV4Lmh0bWwmL2FsYnVtbGlzdC9pbmRleC5odG1sJi9zaW5nZXJsaXN0L2luZGV4L2luZGV4L2luZGV4L2luZGV4Lmh0bWwmL212bGlzdC9odWF5dS5odG1sJi9saXN0L25ldy5odG1sJi9saXN0L3RvcC5odG1sJywKICAgIHNlYXJjaFVybDogJy9zby8qKi9meXBhZ2UuaHRtbCcsCiAgICBzZWFyY2hhYmxlOiAxLAogICAgcXVpY2tTZWFyY2g6IDEsCiAgICBmaWx0ZXJhYmxlOiAxLAogICAgdGltZW91dDogNTAwMCwKICAgIHBsYXlfcGFyc2U6IHRydWUsCiAgICBoZWFkZXJzOiB7CiAgICAgICAgJ1VzZXItQWdlbnQnOiBNT0JJTEVfVUEsCiAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuMjJhNS5jb20vJwogICAgfSwKICAgIGZpbHRlcjogewogICAgICAgICIvcmFkaW9saXN0L2luZGV4Lmh0bWwiOiBbeyBrZXk6ICJpZCIsIG5hbWU6ICLliIbnsbsiLCB2YWx1ZTogW3sgIm4iOiAi5pyA5pawIiwgInYiOiAiaW5kZXgiIH0sIHsgIm4iOiAi5pyA54OtIiwgInYiOiAiaG90IiB9LCB7ICJuIjogIuacieWjsOWwj+ivtCIsICJ2IjogIm5vdmVsIiB9LCB7ICJuIjogIuebuOWjsCIsICJ2IjogInhpYW5neWkiIH0sIHsgIm4iOiAi6Z+z5LmQIiwgInYiOiAibXVzaWMiIH0sIHsgIm4iOiAi5oOF5oSfIiwgInYiOiAiZW1vdGlvbiIgfSwgeyAibiI6ICLlm73mvKsiLCAidiI6ICJnYW1lIiB9LCB7ICJuIjogIuW9seinhiIsICJ2IjogInlpbmdzaGkiIH0sIHsgIm4iOiAi6ISx5Y+j56eAIiwgInYiOiAidGFsa3Nob3ciIH0sIHsgIm4iOiAi5Y6G5Y+yIiwgInYiOiAiaGlzdG9yeSIgfSwgeyAibiI6ICLlhL/nq6UiLCAidiI6ICJjaGlsZHJlbiIgfSwgeyAibiI6ICLmlZnogrIiLCAidiI6ICJlZHVjYXRpb24iIH0sIHsgIm4iOiAi5YWr5Y2mIiwgInYiOiAiZ29zc2lwIiB9LCB7ICJuIjogIuaOqOeQhiIsICJ2IjogInR1aWxpIiB9LCB7ICJuIjogIuWktOadoSIsICJ2IjogImhlYWRsaW5lIiB9XSB9XSwKICAgICAgICAiL3Npbmdlcmxpc3QvaW5kZXgvaW5kZXgvaW5kZXgvaW5kZXguaHRtbCI6IFsKICAgICAgICAgICAgeyAia2V5IjogImFyZWEiLCAibmFtZSI6ICLlnLDljLoiLCAidmFsdWUiOiBbeyAibiI6ICLlhajpg6giLCAidiI6ICJpbmRleCIgfSwgeyAibiI6ICLljY7or60iLCAidiI6ICJodWF5dSIgfSwgeyAibiI6ICLmrKfnvo4iLCAidiI6ICJvdW1laSIgfSwgeyAibiI6ICLpn6nlm70iLCAidiI6ICJoYW5ndW8iIH0sIHsgIm4iOiAi5pel5pysIiwgInYiOiAicmlicm4iIH1dIH0sCiAgICAgICAgICAgIHsgImtleSI6ICJzZXgiLCAibmFtZSI6ICLmgKfliKsiLCAidmFsdWUiOiBbeyAibiI6ICLlhajpg6giLCAidiI6ICJpbmRleCIgfSwgeyAibiI6ICLnlLciLCAidiI6ICJtYWxlIiB9LCB7ICJuIjogIuWlsyIsICJ2IjogImdpcmwiIH0sIHsgIm4iOiAi57uE5ZCIIiwgInYiOiAiYmFuZCIgfV0gfSwKICAgICAgICAgICAgeyAia2V5IjogImdlbnJlIiwgIm5hbWUiOiAi5rWB5rS+IiwgInZhbHVlIjogW3sgIm4iOiAi5YWo6YOoIiwgInYiOiAiaW5kZXgiIH0sIHsgIm4iOiAi5rWB6KGMIiwgInYiOiAibGl1eGluZyIgfSwgeyAibiI6ICLnlLXlrZAiLCAidiI6ICJkaWFuemkiIH0sIHsgIm4iOiAi5pGH5ruaIiwgInYiOiAieWFvZ3VuIiB9LCB7ICJuIjogIuWYu+WTiCIsICJ2IjogInhpaGEiIH0sIHsgIm4iOiAiUiZCIiwgInYiOiAicmIiIH0sIHsgIm4iOiAi5rCR6LCjIiwgInYiOiAibWlueWFvIiB9LCB7ICJuIjogIueIteWjqyIsICJ2IjogImp1ZXNoaSIgfSwgeyAibiI6ICLlj6TlhbgiLCAidiI6ICJndWRpYW4iIH1dIH0sCiAgICAgICAgICAgIHsgImtleSI6ICJjaGFyIiwgIm5hbWUiOiAi5a2X5q+NIiwgInZhbHVlIjogW3sgIm4iOiAi5YWo6YOoIiwgInYiOiAiaW5kZXgiIH0sIHsgIm4iOiAiQSIsICJ2IjogImEiIH0sIHsgIm4iOiAiQiIsICJ2IjogImIiIH0sIHsgIm4iOiAiQyIsICJ2IjogImMiIH0sIHsgIm4iOiAiRCIsICJ2IjogImQiIH0sIHsgIm4iOiAiRSIsICJ2IjogImUiIH0sIHsgIm4iOiAiRiIsICJ2IjogImYiIH0sIHsgIm4iOiAiRyIsICJ2IjogImciIH0sIHsgIm4iOiAiSCIsICJ2IjogImgiIH0sIHsgIm4iOiAiSSIsICJ2IjogImkiIH0sIHsgIm4iOiAiSiIsICJ2IjogImoiIH0sIHsgIm4iOiAiSyIsICJ2IjogImsiIH0sIHsgIm4iOiAiTCIsICJ2IjogImwiIH0sIHsgIm4iOiAiTSIsICJ2IjogIm0iIH0sIHsgIm4iOiAiTiIsICJ2IjogIm4iIH0sIHsgIm4iOiAiTyIsICJ2IjogIm8iIH0sIHsgIm4iOiAiUCIsICJ2IjogInAiIH0sIHsgIm4iOiAiUSIsICJ2IjogInEiIH0sIHsgIm4iOiAiUiIsICJ2IjogInIiIH0sIHsgIm4iOiAiUyIsICJ2IjogInMiIH0sIHsgIm4iOiAiVCIsICJ2IjogInQiIH0sIHsgIm4iOiAiVSIsICJ2IjogInUiIH0sIHsgIm4iOiAiViIsICJ2IjogInYiIH0sIHsgIm4iOiAiVyIsICJ2IjogInciIH0sIHsgIm4iOiAiWCIsICJ2IjogIngiIH0sIHsgIm4iOiAiWSIsICJ2IjogInkiIH0sIHsgIm4iOiAiWiIsICJ2IjogInoiIH1dIH0KICAgICAgICBdLAogICAgICAgICIvbXZsaXN0L2h1YXl1Lmh0bWwiOiBbeyAia2V5IjogImlkIiwgIm5hbWUiOiAi57G75Z6LIiwgInZhbHVlIjogW3sgIm4iOiAi5Y2O6K+t57K+6YCJIiwgInYiOiAiaHVheXUiIH0sIHsgIm4iOiAi5pel6Z+p57K+6YCJIiwgInYiOiAiIHJpaGFuIiB9LCB7ICJuIjogIuasp+e+jueyvumAiSIsICJ2IjogIm91bWVpIiB9XSB9XQogICAgfSwKCiAgICBfYWJzOiAodXJsKSA9PiB7CiAgICAgICAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHJldHVybiAnJzsKICAgICAgICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IHVybCA6IGBodHRwczovL3d3dy4yMmE1LmNvbSR7dXJsLnN0YXJ0c1dpdGgoJy8nKSA/IHVybCA6ICcvJyArIHVybH1gOwogICAgfSwKCiAgICBfY2xlYW46ICh0ZXh0KSA9PiAodGV4dCB8fCAnJykucmVwbGFjZSgvKOeIseeOqemfs+S5kOe9kXzop4bpopHkuIvovb3or7TmmI586KeG6aKR5LiL6L295Zyw5Z2AfHd3d1wuMnQ1OFwuY29tfE1QM+WFjei0ueS4i+i9vXxMUkPmrYzor43kuIvovb185YWo6YOo5q2M5puyfFxb56ysXGQr6aG1XF185Yi35pawfOavj+aXpeaOqOiNkHzmnIDmlrB854Ot6ZeofOaOqOiNkHxNVnzpq5jmuIV85peg5o2fKS9naSwgJycpLnRyaW0oKSwKCiAgICBfZ2V0X2l0ZW1zOiBmdW5jdGlvbihodG1sLCBwZGZhLCBwZCwgcGRmaCkgewogICAgICAgIGlmICh0eXBlb2YgaHRtbCAhPT0gJ3N0cmluZycpIHJldHVybiBbXTsKICAgICAgICBjb25zdCBzZWxlY3RvcnMgPSBbJy52aWRlb19saXN0IGxpJywgJy5wbGF5X2xpc3QgbGknLCAnLnBpY19saXN0IGxpJywgJy5zaW5nZXJfbGlzdCBsaScsICcuYWxpIGxpJywgJy5sYXl1aS1yb3cgbGknLCAnLmJhc2VfbCBsaScsICcubGlzdCBsaScsICcuaXRlbSBsaSddOwogICAgICAgIGxldCBpdGVtcyA9IFtdOwogICAgICAgIGZvciAobGV0IHNlbCBvZiBzZWxlY3RvcnMpIHsKICAgICAgICAgICAgbGV0IGxpc3QgPSBwZGZhKGh0bWwsIHNlbCkgfHwgW107CiAgICAgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgY29udGludWU7CiAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHsKICAgICAgICAgICAgICAgIGxldCBocmVmID0gcGQoaXQsICdhJiZocmVmJyk7CiAgICAgICAgICAgICAgICBpZiAoIWhyZWYgfHwgaHJlZiA9PT0gJy8nIHx8IC8oXC91c2VyXC98XC9sb2dpblwvfGphdmFzY3JpcHQpLy50ZXN0KGhyZWYpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHRoaXMuX2NsZWFuKHBkZmgoaXQsICcubmFtZSYmVGV4dCcpIHx8IHBkKGl0LCAnYSYmdGl0bGUnKSB8fCBwZChpdCwgJ2EmJlRleHQnKSk7CiAgICAgICAgICAgICAgICBpZiAoIXRpdGxlKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGxldCBpbWdfc3JjID0gcGQoaXQsICdpbWcmJmRhdGEtb3JpZ2luYWwnKSB8fCBwZChpdCwgJ2ltZyYmZGF0YS1zcmMnKSB8fCBwZChpdCwgJ2ltZyYmc3JjJyk7CiAgICAgICAgICAgICAgICBsZXQgcGljX3VybCA9IHRoaXMuX2FicygoaW1nX3NyYyB8fCAnJykucmVwbGFjZSgnMTIwJywgJzUwMCcpKTsKICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSwKICAgICAgICAgICAgICAgICAgICB1cmw6IHRoaXMuX2FicyhocmVmKSwKICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBwaWNfdXJsLAogICAgICAgICAgICAgICAgICAgIGRlc2M6ICcnCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaXRlbXM7CiAgICB9LAoKICAgIOaOqOiNkDogYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgfSwKCiAgICDkuIDnuqc6IGFzeW5jIGZ1bmN0aW9uKHRpZCwgcGcsIGZpbHRlciwgZXh0ZW5kKSB7CiAgICAgICAgbGV0IHBhZ2UgPSBwZyB8fCAxOwogICAgICAgIGxldCB1cmwgPSB0aWQucmVwbGFjZSgvXC9cLy9nLCAnLycpLnJlcGxhY2UoJy9meWZpbHRlci0xLycsICcnKTsKICAgICAgICBpZiAoL1wvc2luZ2VybGlzdFwvLy50ZXN0KHRpZCkpIHsKICAgICAgICAgICAgbGV0IHAgPSB0aWQuc3BsaXQoJy8nKTsKICAgICAgICAgICAgaWYgKHAubGVuZ3RoID49IDIpIHsKICAgICAgICAgICAgICAgIGxldCBhcmVhID0gZXh0ZW5kLmFyZWEgfHwgcFsyXSB8fCAnaW5kZXgnOwogICAgICAgICAgICAgICAgbGV0IHNleCA9IGV4dGVuZC5zZXggfHwgcFszXSB8fCAnaW5kZXgnOwogICAgICAgICAgICAgICAgbGV0IGdlbnJlID0gZXh0ZW5kLmdlbnJlIHx8IHBbNF0gfHwgJ2luZGV4JzsKICAgICAgICAgICAgICAgIGxldCBjaGFyID0gZXh0ZW5kLmNoYXIgfHwgJ2luZGV4JzsKICAgICAgICAgICAgICAgIHVybCA9IGAvJHtwWzFdfS8ke2FyZWF9LyR7c2V4fS8ke2dlbnJlfS8ke2NoYXJ9Lmh0bWxgOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoZXh0ZW5kLmlkICYmICFbJ2luZGV4JywgJ3RvcCddLmluY2x1ZGVzKGV4dGVuZC5pZCkpIHsKICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoLyhcdyspXC5odG1sJC8sIGV4dGVuZC5pZCArICcuaHRtbCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHBhZ2UgPiAxKSB7CiAgICAgICAgICAgIGxldCBzZXAgPSAvKFwvc2luZ2VybGlzdFwvfFwvcmFkaW9saXN0XC98XC9tdmxpc3RcL3xcL3BsYXl0eXBlXC98XC9saXN0XC8pLy50ZXN0KHVybCkgPyAnLycgOiAnXyc7CiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKC8oX1xkK3xcL1xkKyk/XC5odG1sJC8sIGAke3NlcH0ke3BhZ2V9Lmh0bWxgKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IGZpbmFsVXJsID0gdGhpcy5fYWJzKHVybCk7CiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcmVxKGZpbmFsVXJsKTsKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHRoaXMuX2dldF9pdGVtcyhyZXNwb25zZS5jb250ZW50IHx8IHJlc3BvbnNlLCB0aGlzLnBkZmEsIHRoaXMucGQsIHRoaXMucGRmaCkpOwogICAgfSwKCiAgICDmkJzntKI6IGFzeW5jIGZ1bmN0aW9uKHdkLCBxdWljaywgcGcpIHsKICAgICAgICBsZXQgcGFnZSA9IHBnIHx8IDE7CiAgICAgICAgbGV0IHVybCA9IHRoaXMuX2FicyhgL3NvLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHdkKX0vJHtwYWdlfS5odG1sYCk7CiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcmVxKHVybCk7CiAgICAgICAgcmV0dXJuIHNldFJlc3VsdCh0aGlzLl9nZXRfaXRlbXMocmVzcG9uc2UuY29udGVudCB8fCByZXNwb25zZSwgdGhpcy5wZGZhLCB0aGlzLnBkLCB0aGlzLnBkZmgpKTsKICAgIH0sCgogICAg5LqM57qnOiBhc3luYyBmdW5jdGlvbihpZHMpIHsKICAgICAgICBjb25zdCB7IHBkZmEsIHBkZmgsIHBkIH0gPSB0aGlzOwogICAgICAgIGxldCB1cmwgPSAoQXJyYXkuaXNBcnJheShpZHMpID8gaWRzWzBdIDogaWRzKS5yZXBsYWNlKC9bYCBdL2csICcnKTsKICAgICAgICB1cmwgPSB0aGlzLl9hYnModXJsKTsKICAgICAgICAKICAgICAgICBsZXQgaHRtbCA9IChhd2FpdCByZXEodXJsKSkuY29udGVudDsKICAgICAgICBsZXQgY292ZXIgPSB0aGlzLl9hYnMocGQoaHRtbCwgJy5zaW5nZXJfaW5mbyAucGljIGltZyYmc3JjJykpOwogICAgICAgIGxldCBjb250ZW50ID0gcGRmaChodG1sLCAnLnNpbmdlcl9pbmZvIC5saXN0X3IgLmluZm8gcCYmVGV4dCcpOwogICAgICAgIAogICAgICAgIGxldCB2b2QgPSB7CiAgICAgICAgICAgIHZvZF9uYW1lOiB0aGlzLl9jbGVhbihwZGZoKGh0bWwsICdoMSYmVGV4dCcpIHx8IHBkZmgoaHRtbCwgJ3RpdGxlJiZUZXh0JykpLAogICAgICAgICAgICB2b2RfcGljOiBjb3ZlciwKICAgICAgICAgICAgdm9kX3BsYXlfZnJvbTogJ+eIseeOqemfs+S5kCcsCiAgICAgICAgICAgIHZvZF9jb250ZW50OiBjb250ZW50IHx8ICcnLAogICAgICAgICAgICB2b2RfcmVtYXJrczogJycKICAgICAgICB9OwogICAgICAgIAogICAgICAgIGxldCBwbGF5X2xpc3QgPSBbXTsKICAgICAgICBsZXQgbWFrZUlkID0gKHUsIGxyYyA9ICcnKSA9PiBgJHt1fXx8fCR7Y292ZXJ9fHx8JHtscmN9YDsKICAgICAgICBsZXQgZ2V0THJjTGluayA9IChsaW5rKSA9PiB7CiAgICAgICAgICAgIGxldCBtYXRjaCA9IGxpbmsubWF0Y2goL1wvKHNvbmd8bXAzfHJhZGlvfHJhZGlvbGlzdHxyYWRpb3BsYXkpXC8oW14vXSspXC5odG1sLyk7CiAgICAgICAgICAgIHJldHVybiBtYXRjaCA/IHRoaXMuX2FicyhgL3BsdWcvZG93bi5waHA/YWM9bXVzaWMmbGs9bHJjJmlkPSR7bWF0Y2hbMl19YCkgOiAnJzsKICAgICAgICB9OwoKICAgICAgICBpZiAoL1wvKHZpZGVvfG1wNClcLyhbXi9dKylcLmh0bWwvLnRlc3QodXJsKSkgewogICAgICAgICAgICBsZXQgdmlkID0gdXJsLm1hdGNoKC9cLyh2aWRlb3xtcDQpXC8oW14vXSspXC5odG1sLylbMl07CiAgICAgICAgICAgIGxldCBxdWFsaXRpZXMgPSBbeyBuYW1lOiAn6JOd5YWJJywgcTogJzEwODAnIH0sIHsgbmFtZTogJ+i2hea4hScsIHE6ICc3MjAnIH0sIHsgbmFtZTogJ+mrmOa4hScsIHE6ICc0ODAnIH1dOwogICAgICAgICAgICBxdWFsaXRpZXMuZm9yRWFjaChxID0+IHsKICAgICAgICAgICAgICAgIHBsYXlfbGlzdC5wdXNoKGAke3EubmFtZX0kJHttYWtlSWQodGhpcy5fYWJzKGAvcGx1Zy9kb3duLnBocD9hYz12cGxheSZpZD0ke3ZpZH0mcT0ke3EucX1gKSl9YCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxldCBpdGVtcyA9IHBkZmEoaHRtbCwgJy5wbGF5X2xpc3QmJmxpJykgfHwgW107CiAgICAgICAgICAgIGlmICghaXRlbXMubGVuZ3RoKSBpdGVtcyA9IHBkZmEoaHRtbCwgJy5zb25nX2xpc3QmJmxpJykgfHwgW107CiAgICAgICAgICAgIGlmICghaXRlbXMubGVuZ3RoKSBpdGVtcyA9IHBkZmEoaHRtbCwgJy5tdXNpY19saXN0JiZsaScpIHx8IFtdOwogICAgICAgICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgaXRlbXMgPSBwZGZhKGh0bWwsICd1bCYmbGknKSB8fCBbXTsKICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCAmJiAvXC8oc29uZ3xtcDN8cmFkaW98cmFkaW9saXN0fHJhZGlvcGxheSlcLy8udGVzdCh1cmwpKSB7CiAgICAgICAgICAgICAgICBwbGF5X2xpc3QucHVzaChg5pKt5pS+JCR7bWFrZUlkKHVybCwgZ2V0THJjTGluayh1cmwpKX1gKTsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ID0+IHsKICAgICAgICAgICAgICAgICAgICBsZXQgYSA9IHBkKGl0LCAnYSYmaHJlZicpOwogICAgICAgICAgICAgICAgICAgIGlmICghYSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGlmICgvXC8oc29uZ3xtcDN8cmFkaW98cmFkaW9saXN0fHJhZGlvcGxheXx2aWRlb3xtcDQpXC8vLnRlc3QoYSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5fY2xlYW4ocGRmaChpdCwgJy5uYW1lJiZUZXh0JykgfHwgcGQoaXQsICdhJiZUZXh0JykpOwogICAgICAgICAgICAgICAgICAgICAgICBwbGF5X2xpc3QucHVzaChgJHt0aXRsZX0kJHttYWtlSWQodGhpcy5fYWJzKGEpLCBnZXRMcmNMaW5rKGEpKX1gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2b2Qudm9kX3BsYXlfdXJsID0gcGxheV9saXN0LmpvaW4oJyMnKTsKICAgICAgICByZXR1cm4gdm9kOwogICAgfSwKCiAgICBsYXp5OiBhc3luYyBmdW5jdGlvbihmbGFnLCBpZCwgZmxhZ3MpIHsKICAgICAgICBsZXQgW3VybCwgcGljLCBscmNVcmxdID0gaWQuc3BsaXQoJ3x8fCcpOwogICAgICAgIHVybCA9ICh1cmwgfHwgJycpLnJlcGxhY2UoL0AuKyQvLCAnJykudHJpbSgpOwogICAgICAgIGxldCBhcGlIZWFkZXJzID0gewogICAgICAgICAgICAnUmVmZXJlcic6IHRoaXMuaG9zdCArICcvJywKICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiB0aGlzLmhlYWRlcnNbJ1VzZXItQWdlbnQnXQogICAgICAgIH07CgogICAgICAgIGxldCBwbGF5VXJsID0gJyc7CiAgICAgICAgbGV0IGlzVmlkZW8gPSB1cmwuaW5jbHVkZXMoJ2Rvd24ucGhwJykgJiYgdXJsLmluY2x1ZGVzKCdhYz12cGxheScpOwogICAgICAgIGlmIChpc1ZpZGVvKSB7CiAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCByZXEodXJsLCB7IG1ldGhvZDogJ0dFVCcsIHJlZGlyZWN0OiAwLCBoZWFkZXJzOiBhcGlIZWFkZXJzIH0pOwogICAgICAgICAgICBwbGF5VXJsID0gcmVzLmhlYWRlcnMuTG9jYXRpb24gfHwgcmVzLmhlYWRlcnMubG9jYXRpb24gfHwgdGhpcy5fcHJvY2Vzc19hcGlfcmVzcG9uc2UocmVzKTsKICAgICAgICB9CgogICAgICAgIGVsc2UgaWYgKC9cLyhzb25nfG1wM3xyYWRpb3xyYWRpb2xpc3R8cmFkaW9wbGF5KVwvKFteL10rKVwuaHRtbC8udGVzdCh1cmwpKSB7CiAgICAgICAgICAgIGxldCBtaWQgPSB1cmwubWF0Y2goL1wvKFteL10rKVwuaHRtbC8pWzFdOwogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgcmVxKHRoaXMuX2FicygnL2pzL3BsYXkucGhwJyksIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgIC4uLmFwaUhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLAogICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRhdGE6IHsgaWQ6IG1pZCwgdHlwZTogJ211c2ljJyB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwbGF5VXJsID0gdGhpcy5fcHJvY2Vzc19hcGlfcmVzcG9uc2UocmVzKTsKICAgICAgICB9CgogICAgICAgIGxldCBmaW5hbFVybCA9IHRoaXMuX2FicyhwbGF5VXJsIHx8IHVybCk7CiAgICAgICAgbGV0IHBsYXllckhlYWRlcnMgPSB7CiAgICAgICAgICAgICdVc2VyLUFnZW50JzogYXBpSGVhZGVyc1snVXNlci1BZ2VudCddLAogICAgICAgICAgICAuLi4oZmluYWxVcmwuaW5jbHVkZXMoJzIyYTUuY29tJykgJiYgeyAnUmVmZXJlcic6IGFwaUhlYWRlcnNbJ1JlZmVyZXInXSB9KQogICAgICAgIH07CgogICAgICAgIGlmIChpc1ZpZGVvKSB7CiAgICAgICAgICAgIHJldHVybiB7IHBhcnNlOiAwLCB1cmw6IGZpbmFsVXJsLCBoZWFkZXI6IHBsYXllckhlYWRlcnMgfTsKICAgICAgICB9CgogICAgICAgIGxldCBjb3ZlciA9ICcnOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCBwYWdlUmVzID0gYXdhaXQgcmVxKHVybCwgeyBoZWFkZXJzOiBhcGlIZWFkZXJzIH0pOwogICAgICAgICAgICBsZXQgcGFnZUh0bWwgPSB0eXBlb2YgcGFnZVJlcyA9PT0gJ29iamVjdCcgPyBwYWdlUmVzLmNvbnRlbnQgOiBwYWdlUmVzOwogICAgICAgICAgICBsZXQgb2dJbWFnZU1hdGNoID0gcGFnZUh0bWwubWF0Y2goLzxtZXRhW14+XStwcm9wZXJ0eT0ib2c6aW1hZ2UiW14+XStjb250ZW50PSIoW14iXSspIltePl0qPi9pKTsKICAgICAgICAgICAgaWYgKG9nSW1hZ2VNYXRjaCAmJiBvZ0ltYWdlTWF0Y2hbMV0pIHsKICAgICAgICAgICAgICAgIGNvdmVyID0gb2dJbWFnZU1hdGNoWzFdOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCB7fQoKICAgICAgICBsZXQgbHJjRGF0YSA9ICcnOwogICAgICAgIGlmIChscmNVcmwpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxldCBscmNSZXMgPSBhd2FpdCByZXEobHJjVXJsLCB7IGhlYWRlcnM6IGFwaUhlYWRlcnMgfSk7CiAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IHR5cGVvZiBscmNSZXMgPT09ICdvYmplY3QnID8gbHJjUmVzLmNvbnRlbnQgOiBscmNSZXM7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQuaW5jbHVkZXMoJ1snKSAmJiBjb250ZW50LmluY2x1ZGVzKCddJykpIHsKICAgICAgICAgICAgICAgICAgICBscmNEYXRhID0gY29udGVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGFyc2U6IDAsCiAgICAgICAgICAgIHVybDogZmluYWxVcmwsCiAgICAgICAgICAgIGhlYWRlcjogcGxheWVySGVhZGVycywKICAgICAgICAgICAgbHJjOiBscmNEYXRhLAogICAgICAgICAgICBwaWM6IGNvdmVyLAogICAgICAgICAgICBjb3ZlcjogY292ZXIsCiAgICAgICAgICAgIGhlaWdodDogNzIwCiAgICAgICAgfTsKICAgIH0sCgogICAgX3Byb2Nlc3NfYXBpX3Jlc3BvbnNlOiAocmVzKSA9PiB7CiAgICAgICAgaWYgKCFyZXMpIHJldHVybiAnJzsKICAgICAgICBjb25zdCBjb250ZW50ID0gdHlwZW9mIHJlcyA9PT0gJ29iamVjdCcgPyByZXMuY29udGVudCA6IHJlczsKICAgICAgICBjb25zdCB0cmltbWVkID0gY29udGVudC50cmltKCk7CiAgICAgICAgbGV0IGpzb247CiAgICAgICAgdHJ5IHsganNvbiA9IEpTT04ucGFyc2UoY29udGVudCk7IH0gY2F0Y2gge30gCiAgICAgICAgcmV0dXJuIGpzb24/LnVybCA/IGpzb24udXJsLnJlcGxhY2UoL1xcXC8vZywgJy8nKSA6ICh0cmltbWVkLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IHRyaW1tZWQgOiAnJyk7CiAgICB9Cn07 \ No newline at end of file diff --git "a/spider/js/\347\261\263\345\205\224\351\237\263\344\271\220[\345\220\254].js" "b/spider/js/\347\261\263\345\205\224\351\237\263\344\271\220[\345\220\254].js" index 6a2a6720..92050aca 100644 --- "a/spider/js/\347\261\263\345\205\224\351\237\263\344\271\220[\345\220\254].js" +++ "b/spider/js/\347\261\263\345\205\224\351\237\263\344\271\220[\345\220\254].js" @@ -9,51 +9,4 @@ }) */ -var rule = { - title: '米兔音乐', - host: 'https://api.qqmp3.vip', - url: '/api/fyclass', - searchUrl: '/api/songs.php?type=search&keyword=**', - class_name: '热门歌曲&新歌曲&随机歌曲', - class_url: 'songs.php&songs.php?type=new&songs.php?type=rand', - searchable: 2, - quickSearch: 0, - filterable: 0, - play_parse: true, - limit: 6, - double: true, - headers: { - 'User-Agent': 'Mozilla/5.0 (Linux; Android 12; V2284A Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.61 Safari/537.36', - 'Accept': '*/*', - 'Origin': 'https://www.qqmp3.vip', - 'referer': 'https://www.qqmp3.vip', - 'x-requested-with': 'com.mmbox.xbrowser', - 'Sec-Fetch-Site': 'same-site', - 'Sec-Fetch-Mode': 'cors', - 'Sec-Fetch-Dest': 'empty', - 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7' - }, - 推荐: '*', - 一级: 'json:data;name;pic;artist;rid', - 二级: '*', - 搜索: 'json:data;name;pic;artist;rid', - lazy: async function() { - let ridMatch = this.input.match(/api\/([^/?]+)/); - if (!ridMatch) return this.input; - let rid = ridMatch[1]; - let api = 'https://api.qqmp3.vip/api/kw.php?rid=' + rid; - // console.log('解析接口:', api); - let json = await request(api); - let data = JSON.parse(json); - if (data.code === 200 && data.data?.url) { - return { - parse: 0, - url: data.data.url, - header: this.headers, - lrc: data.data.lrc || '', - playMode: 'repeat' - }; - } - return this.input; - }, -}; \ No newline at end of file +dmFyIHJ1bGUgPSB7CiAgdGl0bGU6ICfnsbPlhZTpn7PkuZAnLAogIGhvc3Q6ICdodHRwczovL2FwaS5xcW1wMy52aXAnLAogIHVybDogJy9hcGkvZnljbGFzcycsCiAgc2VhcmNoVXJsOiAnL2FwaS9zb25ncy5waHA/dHlwZT1zZWFyY2gma2V5d29yZD0qKicsCiAgY2xhc3NfbmFtZTogJ+eDremXqOatjOabsibmlrDmrYzmm7Im6ZqP5py65q2M5puyJywKICBjbGFzc191cmw6ICdzb25ncy5waHAmc29uZ3MucGhwP3R5cGU9bmV3JnNvbmdzLnBocD90eXBlPXJhbmQnLAogIHNlYXJjaGFibGU6IDIsCiAgcXVpY2tTZWFyY2g6IDAsCiAgZmlsdGVyYWJsZTogMCwKICBwbGF5X3BhcnNlOiB0cnVlLAogIGxpbWl0OiA2LAogIGRvdWJsZTogdHJ1ZSwKICBoZWFkZXJzOiB7CiAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTI7IFYyMjg0QSBCdWlsZC9WNDE3SVI7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvMTAxLjAuNDk1MS42MSBTYWZhcmkvNTM3LjM2JywKICAgICdBY2NlcHQnOiAnKi8qJywKICAgICdPcmlnaW4nOiAnaHR0cHM6Ly93d3cucXFtcDMudmlwJywKICAgICdyZWZlcmVyJzogJ2h0dHBzOi8vd3d3LnFxbXAzLnZpcCcsCiAgICAneC1yZXF1ZXN0ZWQtd2l0aCc6ICdjb20ubW1ib3gueGJyb3dzZXInLAogICAgJ1NlYy1GZXRjaC1TaXRlJzogJ3NhbWUtc2l0ZScsCiAgICAnU2VjLUZldGNoLU1vZGUnOiAnY29ycycsCiAgICAnU2VjLUZldGNoLURlc3QnOiAnZW1wdHknLAogICAgJ0FjY2VwdC1MYW5ndWFnZSc6ICd6aC1DTix6aDtxPTAuOSxlbi1VUztxPTAuOCxlbjtxPTAuNycKICB9LAogIOaOqOiNkDogJyonLAogIOS4gOe6pzogJ2pzb246ZGF0YTtuYW1lO3BpYzthcnRpc3Q7cmlkJywKICDkuoznuqc6ICcqJywKICDmkJzntKI6ICdqc29uOmRhdGE7bmFtZTtwaWM7YXJ0aXN0O3JpZCcsCiAgbGF6eTogYXN5bmMgZnVuY3Rpb24oKSB7CiAgICBsZXQgcmlkTWF0Y2ggPSB0aGlzLmlucHV0Lm1hdGNoKC9hcGlcLyhbXi8/XSspLyk7CiAgICBpZiAoIXJpZE1hdGNoKSByZXR1cm4gdGhpcy5pbnB1dDsKICAgIGxldCByaWQgPSByaWRNYXRjaFsxXTsKICAgIGxldCBhcGkgPSAnaHR0cHM6Ly9hcGkucXFtcDMudmlwL2FwaS9rdy5waHA/cmlkPScgKyByaWQ7CiAgLy8gIGNvbnNvbGUubG9nKCfop6PmnpDmjqXlj6M6JywgYXBpKTsKICAgIGxldCBqc29uID0gYXdhaXQgcmVxdWVzdChhcGkpOwogICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pOwogICAgaWYgKGRhdGEuY29kZSA9PT0gMjAwICYmIGRhdGEuZGF0YT8udXJsKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGFyc2U6IDAsCiAgICAgICAgICAgIHVybDogZGF0YS5kYXRhLnVybCwKICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcnMsCiAgICAgICAgICAgIGxyYzogZGF0YS5kYXRhLmxyYyB8fCAnJywKICAgICAgICAgICAgcGxheU1vZGU6ICdyZXBlYXQnCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiB0aGlzLmlucHV0OwogIH0sCn07 \ No newline at end of file From 5a955fce36b3eb4a7b2b4311ec398e41232f8490 Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Wed, 21 Jan 2026 16:20:58 +0800 Subject: [PATCH 13/57] =?UTF-8?q?Change=20all=20const=20to=20let=20in=20?= =?UTF-8?q?=E9=BA=BB=E9=9B=80=E8=A7=86=E9=A2=91.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\272\273\351\233\200\350\247\206\351\242\221.js" | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 "spider/js/\351\272\273\351\233\200\350\247\206\351\242\221.js" diff --git "a/spider/js/\351\272\273\351\233\200\350\247\206\351\242\221.js" "b/spider/js/\351\272\273\351\233\200\350\247\206\351\242\221.js" new file mode 100644 index 00000000..b63b250d --- /dev/null +++ "b/spider/js/\351\272\273\351\233\200\350\247\206\351\242\221.js" @@ -0,0 +1,13 @@ +/* +@header({ + searchable: 1, + filterable: 1, + quickSearch: 0, + title: '麻雀视频', + author: 'EylinSir', + '类型': '影视', + lang: 'ds' +}) +*/ + +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICflvbHop4YnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICfpurvpm4Dop4bpopEnLAogICAgaG9zdDogJ2h0dHBzOi8vd3d3Lm1xdHYuY2MnLAogICAgaG9tZVVybDogJ2h0dHBzOi8vd3d3Lm1xdHYuY2MnLAogICAgdXJsOiAnL2xpYnMvVm9kTGlzdC5hcGkucGhwP3R5cGU9ZnljbGFzcyZyYW5rPXJhbmtob3QmY2F0PSZ5ZWFyPSZhcmVhPSZwYWdlPWZ5cGFnZSZ0b2tlbj1meXRva2VuJywKICAgIHNlYXJjaFVybDogJy9saWJzL1ZvZExpc3QuYXBpLnBocD9zZWFyY2g9KiomdG9rZW49Znl0b2tlbicsCiAgICBzZWFyY2hhYmxlOiAxLAogICAgcXVpY2tTZWFyY2g6IDAsCiAgICBmaWx0ZXJhYmxlOiAxLAogICAgdGltZW91dDogMTAwMDAsCiAgICBwbGF5X3BhcnNlOiB0cnVlLAogICAga2V5OiAnTWN4b3NAbXVjaG8hbm1tZScsCiAgICBoZWFkZXJzOiB7CiAgICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzE0Mi4wLjAuMCBTYWZhcmkvNTM3LjM2JywKICAgICAgICAnYWNjZXB0LWxhbmd1YWdlJzogJ3poLUNOLHpoO3E9MC45JywKICAgICAgICAnc2VjLWNoLXVhJzogJyJHb29nbGUgQ2hyb21lIjt2PSIxNDMiLCAiQ2hyb21pdW0iO3Y9IjE0MyIsICJOb3QgQShCcmFuZCI7dj0iMjQiJywKICAgICAgICAnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZScsCiAgICAgICAgJ3ByYWdtYSc6ICduby1jYWNoZScsCiAgICAgICAgJ3NlYy1jaC11YS1tb2JpbGUnOiAnPzAnLAogICAgICAgICdzZWMtY2gtdWEtcGxhdGZvcm0nOiAnIldpbmRvd3MiJywKICAgICAgICAnc2VjLWZldGNoLXNpdGUnOiAnc2FtZS1vcmlnaW4nCiAgICB9LAogICAgCiAgICBnZXRUb2tlbjogYXN5bmMgZnVuY3Rpb24gKHBhdGgsIHJlZlBhdGggPSAnJykgewogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAuLi50aGlzLmhlYWRlcnMsCiAgICAgICAgICAgICdBY2NlcHQnOiAndGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2UvYXZpZixpbWFnZS93ZWJwLGltYWdlL2FwbmcsKi8qO3E9MC44LGFwcGxpY2F0aW9uL3NpZ25lZC1leGNoYW5nZTt2PWIzO3E9MC43JywKICAgICAgICAgICAgJ3ByaW9yaXR5JzogJ3U9MCwgaScsCiAgICAgICAgICAgICdzZWMtZmV0Y2gtZGVzdCc6ICdkb2N1bWVudCcsCiAgICAgICAgICAgICdzZWMtZmV0Y2gtbW9kZSc6ICduYXZpZ2F0ZScsCiAgICAgICAgICAgICdzZWMtZmV0Y2gtdXNlcic6ICc/MScsCiAgICAgICAgICAgICd1cGdyYWRlLWluc2VjdXJlLXJlcXVlc3RzJzogJzEnCiAgICAgICAgfTsKICAgICAgICBpZiAocmVmUGF0aCkgaGVhZGVyc1sncmVmZXJlciddID0gYCR7dGhpcy5ob3N0fSR7cmVmUGF0aH1gOwogICAgICAgIGxldCByZXNwID0gYXdhaXQgX2ZldGNoKGAke3RoaXMuaG9zdH0ke3BhdGh9YCwgeyBoZWFkZXJzIH0pOwogICAgICAgIGxldCBodG1sID0gYXdhaXQgcmVzcC50ZXh0KCk7CiAgICAgICAgbGV0IG1hdGNoID0gaHRtbC5tYXRjaCgvd2luZG93XC5wYWdlaWRccz89XHM/JyguKj8pJzsvaSk7CiAgICAgICAgbGV0IHBhZ2VJZCA9IG1hdGNoID8gbWF0Y2hbMV0gOiAnJzsKICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVEYXRhKHBhZ2VJZCk7CiAgICB9LAoKICAgIGVuY29kZURhdGE6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgbGV0IGpzb25TdHIgPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKICAgICAgICBsZXQgYjY0XzEgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChqc29uU3RyKSkpOwogICAgICAgIGxldCB4b3JfcmVzdWx0ID0gJyc7CiAgICAgICAgbGV0IGtleUxlbiA9IHRoaXMua2V5Lmxlbmd0aDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGI2NF8xLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBjaGFyQ29kZSA9IGI2NF8xLmNoYXJDb2RlQXQoaSkgXiB0aGlzLmtleS5jaGFyQ29kZUF0KGkgJSBrZXlMZW4pOwogICAgICAgICAgICB4b3JfcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpOwogICAgICAgIH0KICAgICAgICBsZXQgYjY0XzIgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh4b3JfcmVzdWx0KSkpOwogICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYjY0XzIpOwogICAgfSwKCiAgICBkZWNvZGVEYXRhOiBmdW5jdGlvbiAoZW5jb2RlZFN0cikgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCBiYXNlNjREZWNvZGUgPSAoc3RyKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGF0b2Ioc3RyKSkpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGxldCBkZWNvZGVkU3RlcDFTdHIgPSBiYXNlNjREZWNvZGUoZW5jb2RlZFN0cik7CiAgICAgICAgICAgIGxldCB4b3JSZXN1bHQgPSAnJzsKICAgICAgICAgICAgbGV0IGtleUxlbiA9IHRoaXMua2V5Lmxlbmd0aDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVkU3RlcDFTdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHhvclJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRlY29kZWRTdGVwMVN0ci5jaGFyQ29kZUF0KGkpIF4gdGhpcy5rZXkuY2hhckNvZGVBdChpICUga2V5TGVuKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGxldCBkZWNvZGVkU3RlcDJTdHIgPSBiYXNlNjREZWNvZGUoeG9yUmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZFN0ZXAyU3RyKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlY29kZSBlcnJvcjonLCBlKTsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KICAgIH0sCiAgICAKICAgIGdldEhlYWRlcnMyOiBmdW5jdGlvbiAocmVmUGF0aCA9ICcnKSB7CiAgICAgICAgbGV0IGhlYWRlcnMgPSB7CiAgICAgICAgICAgIC4uLnRoaXMuaGVhZGVycywKICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJywKICAgICAgICAgICAgJ3ByaW9yaXR5JzogJ3U9MSwgaScsCiAgICAgICAgICAgICdzZWMtZmV0Y2gtZGVzdCc6ICdlbXB0eScsCiAgICAgICAgICAgICdzZWMtZmV0Y2gtbW9kZSc6ICdjb3JzJywKICAgICAgICAgICAgJ3gtcmVxdWVzdGVkLXdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnCiAgICAgICAgfTsKICAgICAgICBpZiAocmVmUGF0aCkgaGVhZGVyc1sncmVmZXJlciddID0gYCR7dGhpcy5ob3N0fSR7cmVmUGF0aH1gOwogICAgICAgIHJldHVybiBoZWFkZXJzOwogICAgfSwKCiAgICBhcnIydm9kczogZnVuY3Rpb24gKGFycikgewogICAgICAgIHJldHVybiAoYXJyIHx8IFtdKS5tYXAoaSA9PiAoewogICAgICAgICAgICB0aXRsZTogaS50aXRsZSwKICAgICAgICAgICAgdXJsOiBgJHt0aGlzLmhvc3R9JHtpLnVybH1gLAogICAgICAgICAgICBkZXNjOiBpLnJlbWFyaywKICAgICAgICAgICAgcGljX3VybDogaS5pbWcsCiAgICAgICAgICAgIHZvZF95ZWFyOiBpLnllYXIgfHwgJycKICAgICAgICB9KSk7CiAgICB9LAogICAgCiAgICDpooTlpITnkIY6IGFzeW5jIGZ1bmN0aW9uICgpIHt9LAoKICAgIGNsYXNzX3BhcnNlOiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgY2xhc3M6IFsKICAgICAgICAgICAgICAgIHsgJ3R5cGVfaWQnOiAnL3R5cGUvbW92aWUnLCAndHlwZV9uYW1lJzogJ+eUteW9sScgfSwKICAgICAgICAgICAgICAgIHsgJ3R5cGVfaWQnOiAnL3R5cGUvdHYnLCAndHlwZV9uYW1lJzogJ+eUteinhuWJpycgfSwKICAgICAgICAgICAgICAgIHsgJ3R5cGVfaWQnOiAnL3R5cGUvdmEnLCAndHlwZV9uYW1lJzogJ+e7vOiJuicgfSwKICAgICAgICAgICAgICAgIHsgJ3R5cGVfaWQnOiAnL3R5cGUvY3QnLCAndHlwZV9uYW1lJzogJ+WKqOa8qycgfQogICAgICAgICAgICBdLAogICAgICAgICAgICBmaWx0ZXJzOiB7fQogICAgICAgIH07CiAgICB9LAogICAgCiAgICDmjqjojZA6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFRva2VuKCcvJyk7CiAgICAgICAgbGV0IHVybCA9IGAke3RoaXMuaG9zdH0vbGlicy9Wb2RMaXN0LmFwaS5waHA/aG9tZT1pbmRleCZ0b2tlbj0ke3Rva2VufWA7CiAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBfZmV0Y2godXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVyczIoJy8nKSB9KTsKICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVzcC50ZXh0KCkpOwogICAgICAgIGxldCB2aWRlb3MgPSBbXTsKICAgICAgICBpZiAoanNvbi5kYXRhICYmIGpzb24uZGF0YS5tb3ZpZSkgewogICAgICAgICAgICBmb3IgKGxldCBpIG9mIGpzb24uZGF0YS5tb3ZpZSkgewogICAgICAgICAgICAgICAgdmlkZW9zLnB1c2goLi4udGhpcy5hcnIydm9kcyhpLnNob3cpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHZpZGVvcyk7CiAgICB9LAogICAgCiAgICDkuIDnuqc6IGFzeW5jIGZ1bmN0aW9uICh0aWQsIHBnLCBmaWx0ZXIsIGV4dGVuZCkgewogICAgICAgIGxldCB0eXBlS2V5ID0gdGlkLnNwbGl0KCcvJylbMl07CiAgICAgICAgbGV0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbih0aWQsICcvJyk7CiAgICAgICAgbGV0IHVybCA9IGAke3RoaXMuaG9zdH0vbGlicy9Wb2RMaXN0LmFwaS5waHA/dHlwZT0ke3R5cGVLZXl9JnJhbms9cmFua2hvdCZjYXQ9JnllYXI9JmFyZWE9JnBhZ2U9JHtwZ30mdG9rZW49JHt0b2tlbn1gOwogICAgICAgIGxldCByZXNwID0gYXdhaXQgX2ZldGNoKHVybCwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMyKHRpZCkgfSk7CiAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlc3AudGV4dCgpKTsKICAgICAgICBsZXQgdmlkZW9zID0gdGhpcy5hcnIydm9kcyhqc29uLmRhdGEpOwogICAgICAgIHJldHVybiBzZXRSZXN1bHQodmlkZW9zKTsKICAgIH0sCiAgICAKICAgIOS6jOe6pzogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCBpZCA9IHRoaXMuaW5wdXQucmVwbGFjZShgJHt0aGlzLmhvc3R9YCwgJycpOwogICAgICAgIGxldCByZWFsSWQgPSBpZC5zcGxpdCgnLycpW2lkLnNwbGl0KCcvJykubGVuZ3RoIC0gMV07CiAgICAgICAgbGV0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbihpZCwgJy8nKTsKICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5ob3N0fS9saWJzL1ZvZEluZm8uYXBpLnBocD90eXBlPWN0JmlkPSR7cmVhbElkfSZ0b2tlbj0ke3Rva2VufWA7CiAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBfZmV0Y2godXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVyczIoaWQpIH0pOwogICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCByZXNwLnRleHQoKSk7CiAgICAgICAgbGV0IGRhdGEgPSBqc29uLmRhdGE7CiAgICAgICAgbGV0IHBsYXlBcGkgPSBkYXRhLnBsYXlhcGkgfHwgW107CiAgICAgICAgbGV0IHBhcnNlcyA9IHBsYXlBcGkKICAgICAgICAgICAgLmZpbHRlcihpID0+IHR5cGVvZiBpID09PSAnb2JqZWN0JyAmJiBpICE9PSBudWxsICYmIGkudXJsICYmIHR5cGVvZiBpLnVybCA9PT0gJ3N0cmluZycpCiAgICAgICAgICAgIC5tYXAoaSA9PiBpLnVybC5zdGFydHNXaXRoKCcvLycpID8gYGh0dHBzOiR7aS51cmx9YCA6IGkudXJsKQogICAgICAgICAgICAuam9pbignLCcpOwogICAgICAgIGxldCBzaG93cyA9IFtdOwogICAgICAgIGxldCBwbGF5VXJscyA9IFtdOwogICAgICAgIGlmIChkYXRhLnBsYXlpbmZvKSB7CiAgICAgICAgICAgIGZvciAobGV0IGogb2YgZGF0YS5wbGF5aW5mbykgewogICAgICAgICAgICAgICAgbGV0IHVybHMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGsgb2Ygai5wbGF5ZXIpIHsKICAgICAgICAgICAgICAgICAgICB1cmxzLnB1c2goYCR7ay5ub30kJHtrLnVybH1AJHtwYXJzZXN9YCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheVVybHMucHVzaCh1cmxzLmpvaW4oJyMnKSk7CiAgICAgICAgICAgICAgICAgICAgc2hvd3MucHVzaChqLmNuc2l0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IFZPRCA9IHsKICAgICAgICAgICAgdm9kX2lkOiBpZCwKICAgICAgICAgICAgdm9kX25hbWU6IGRhdGEudGl0bGUsCiAgICAgICAgICAgIHZvZF9waWM6IGRhdGEuaW1nLAogICAgICAgICAgICB2b2RfcmVtYXJrczogZGF0YS5yZW1hcmssCiAgICAgICAgICAgIHZvZF95ZWFyOiBkYXRhLnllYXIsCiAgICAgICAgICAgIHZvZF9hcmVhOiBkYXRhLmFyZWEsCiAgICAgICAgICAgIHZvZF9hY3RvcjogZGF0YS5hY3RvciwKICAgICAgICAgICAgdm9kX2RpcmVjdG9yOiBkYXRhLmRpcmVjdG9yLAogICAgICAgICAgICB2b2RfY29udGVudDogJycsCiAgICAgICAgICAgIHZvZF9wbGF5X2Zyb206IHNob3dzLmpvaW4oJyQkJCcpLAogICAgICAgICAgICB2b2RfcGxheV91cmw6IHBsYXlVcmxzLmpvaW4oJyQkJCcpLAogICAgICAgICAgICB0eXBlX25hbWU6ICcnCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gVk9EOwogICAgfSwKICAgIAogICAg5pCc57SiOiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IHBhdGggPSBgL3NlYXJjaC8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLktFWSl9YDsKICAgICAgICBsZXQgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFRva2VuKHBhdGgsICcvJyk7CiAgICAgICAgbGV0IHVybCA9IGAke3RoaXMuaG9zdH0vbGlicy9Wb2RMaXN0LmFwaS5waHA/c2VhcmNoPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuS0VZKX0mdG9rZW49JHt0b2tlbn1gOwogICAgICAgIGxldCByZXNwID0gYXdhaXQgX2ZldGNoKHVybCwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMyKHBhdGgpIH0pOwogICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCByZXNwLnRleHQoKSk7CiAgICAgICAgbGV0IGRlY29kZURhdGEgPSB0aGlzLmRlY29kZURhdGEoanNvbi5kYXRhKTsKICAgICAgICBsZXQgdmlkZW9zID0gW107CiAgICAgICAgaWYgKGRlY29kZURhdGEudm9kX2FsbCkgewogICAgICAgICAgICBmb3IgKGxldCBpIG9mIGRlY29kZURhdGEudm9kX2FsbCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpID09PSAnb2JqZWN0JyAmJiBpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2goLi4udGhpcy5hcnIydm9kcyhpLnNob3cpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHZpZGVvcyk7CiAgICB9LAogICAgCiAgICBsYXp5OiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IFtyYXdVcmwsIHBhcnNlc1N0ciA9ICcnXSA9IHRoaXMuaW5wdXQuc3BsaXQoJ0AnKTsKICAgICAgICBsZXQgcGFyc2VzID0gcGFyc2VzU3RyLnNwbGl0KCcsJyk7CiAgICAgICAgbGV0IGp4ID0gMDsKICAgICAgICBsZXQgc25pZmYgPSAwOwogICAgICAgIGxldCB1cmwgPSAnJzsKICAgICAgICBpZiAocmF3VXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSAmJiAvKD86d3d3XC5pcWl5aXx2XC5xcXx2XC55b3VrdXx3d3dcLm1ndHZ8d3d3XC5iaWxpYmlsaSlcLmNvbS8udGVzdChyYXdVcmwpKSB7CiAgICAgICAgICAgIHVybCA9IHJhd1VybDsKICAgICAgICAgICAganggPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxldCBmaXJzdFZhbGlkUGFyc2UgPSBwYXJzZXMuZmluZChqID0+IGouc3RhcnRzV2l0aCgnaHR0cCcpKTsKICAgICAgICAgICAgaWYgKGZpcnN0VmFsaWRQYXJzZSkgewogICAgICAgICAgICAgICAgdXJsID0gYCR7Zmlyc3RWYWxpZFBhcnNlfSR7cmF3VXJsfWA7CiAgICAgICAgICAgICAgICBzbmlmZiA9IDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1cmwgPSByYXdVcmw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGFyc2U6IHNuaWZmIHx8IGp4LAogICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIGhlYWRlcjogeyAnVXNlci1BZ2VudCc6IHRoaXMuaGVhZGVyc1snVXNlci1BZ2VudCddIH0KICAgICAgICB9OwogICAgfQp9Ow== \ No newline at end of file From b2cad32883f96ed705778961b6d2e21eeff67fca Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Wed, 21 Jan 2026 16:21:53 +0800 Subject: [PATCH 14/57] Update multiple files --- "spider/js/3Q\345\275\261\350\247\206.js" | 13 + ...\345\233\255\350\241\214[\346\210\217].js" | 249 +----------------- ...55\346\222\255\345\275\261\350\247\206.js" | 13 + ...\345\260\217\350\257\264[\344\271\246].js" | 1 + ...\347\225\205\345\220\254[\345\220\254].js" | 3 +- ...\347\237\255\345\211\247[\347\237\255].js" | 3 +- ...75\346\226\260\345\244\247\345\205\250.js" | 13 + 7 files changed, 45 insertions(+), 250 deletions(-) create mode 100644 "spider/js/3Q\345\275\261\350\247\206.js" create mode 100644 "spider/js/\347\203\255\346\222\255\345\275\261\350\247\206.js" create mode 100644 "spider/js/\350\277\275\346\226\260\345\244\247\345\205\250.js" diff --git "a/spider/js/3Q\345\275\261\350\247\206.js" "b/spider/js/3Q\345\275\261\350\247\206.js" new file mode 100644 index 00000000..7236e339 --- /dev/null +++ "b/spider/js/3Q\345\275\261\350\247\206.js" @@ -0,0 +1,13 @@ +/* +@header({ + searchable: 1, + filterable: 1, + quickSearch: 0, + title: '3Q影视', + author: 'EylinSir', + '类型': '影视', + lang: 'ds' +}) +*/ + +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICflvbHop4YnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICczUeW9seinhicsCiAgICBkZXNjOiAnM1HlvbHop4bmupAnLAogICAgaG9zdDogJ2h0dHBzOi8vcXFxeXMuY29tJywKICAgIGhvbWVVcmw6ICdodHRwczovL3FxcXlzLmNvbScsCiAgICB1cmw6ICcvYXBpLnBocC9maWx0ZXIvdm9kP3R5cGVfbmFtZT1meWNsYXNzJnBhZ2U9ZnlwYWdlJnNvcnQ9aGl0cycsCiAgICBzZWFyY2hVcmw6ICcvYXBpLnBocC9zZWFyY2gvaW5kZXg/d2Q9KiomcGFnZT1meXBhZ2UmbGltaXQ9MTUnLAogICAgc2VhcmNoYWJsZTogMSwKICAgIHF1aWNrU2VhcmNoOiAwLAogICAgZmlsdGVyYWJsZTogMSwKICAgIHRpbWVvdXQ6IDEwMDAwLAogICAgcGxheV9wYXJzZTogdHJ1ZSwKICAgIGhlYWRlcnM6IHsKICAgICAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTQyLjAuMC4wIFNhZmFyaS81MzcuMzYnLAogICAgICAgICdhY2NlcHQtbGFuZ3VhZ2UnOiAnemgtQ04semg7cT0wLjknLAogICAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlJywKICAgICAgICAncHJhZ21hJzogJ25vLWNhY2hlJywKICAgICAgICAncHJpb3JpdHknOiAndT0xLCBpJywKICAgICAgICAnc2VjLWNoLXVhJzogJyJDaHJvbWl1bSI7dj0iMTQyIiwgIkdvb2dsZSBDaHJvbWUiO3Y9IjE0MiIsICJOb3RfQSBCcmFuZCI7dj0iOTkiJywKICAgICAgICAnc2VjLWNoLXVhLW1vYmlsZSc6ICI/MCIsCiAgICAgICAgJ3NlYy1jaC11YS1wbGF0Zm9ybSc6ICciV2luZG93cyInLAogICAgICAgICdzZWMtZmV0Y2gtZGVzdCc6ICJlbXB0eSIsCiAgICAgICAgJ3NlYy1mZXRjaC1tb2RlJzogImNvcnMiLAogICAgICAgICdzZWMtZmV0Y2gtc2l0ZSc6ICJzYW1lLW9yaWdpbiIKICAgIH0sCiAgICAKCgogICAganNvbjJ2b2RzOiBmdW5jdGlvbiAoYXJyKSB7CiAgICAgICAgbGV0IHZpZGVvcyA9IFtdOwogICAgICAgIGZvciAoY29uc3QgaSBvZiBhcnIpIHsKICAgICAgICAgICAgbGV0IHR5cGVfbmFtZSA9IGkudHlwZV9uYW1lIHx8ICcnOwogICAgICAgICAgICBpZiAoaS52b2RfY2xhc3MpIHsKICAgICAgICAgICAgICAgIHR5cGVfbmFtZSA9IHR5cGVfbmFtZSArICcsJyArIGkudm9kX2NsYXNzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZpZGVvcy5wdXNoKHsKICAgICAgICAgICAgICAgIHRpdGxlOiBpLnZvZF9uYW1lLAogICAgICAgICAgICAgICAgdXJsOiBgJHt0aGlzLmhvc3R9L2FwaS5waHAvdm9kL2dldF9kZXRhaWw/dm9kX2lkPSR7aS52b2RfaWR9YCwKICAgICAgICAgICAgICAgIGRlc2M6IGkudm9kX3JlbWFya3MsCiAgICAgICAgICAgICAgICBwaWNfdXJsOiBpLnZvZF9waWMsCiAgICAgICAgICAgICAgICB2b2RfeWVhcjogaS52b2RfeWVhciwKICAgICAgICAgICAgICAgIHR5cGVfbmFtZTogdHlwZV9uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmlkZW9zOwogICAgfSwKICAgIAogICAg6aKE5aSE55CGOiBhc3luYyBmdW5jdGlvbiAoKSB7fSwKICAgIAogICAgY2xhc3NfcGFyc2U6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5ob3N0fS9hcGkucGhwL2luZGV4L2hvbWVgOwogICAgICAgIGxldCByZXNwID0gYXdhaXQgX2ZldGNoKHVybCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSk7CiAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlc3AudGV4dCgpKTsKICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IGpzb24uZGF0YS5jYXRlZ29yaWVzOwogICAgICAgIGxldCBjbGFzc2VzID0gW107CiAgICAgICAgZm9yIChjb25zdCBpIG9mIGNhdGVnb3JpZXMpIHsKICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKHsKICAgICAgICAgICAgICAgIHR5cGVfaWQ6IGkudHlwZV9uYW1lLAogICAgICAgICAgICAgICAgdHlwZV9uYW1lOiBpLnR5cGVfbmFtZQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgY2xhc3M6IGNsYXNzZXMsIGZpbHRlcnM6IHt9IH07CiAgICB9LAogICAgCiAgICDmjqjojZA6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5ob3N0fS9hcGkucGhwL2luZGV4L2hvbWVgOwogICAgICAgIGxldCByZXNwID0gYXdhaXQgX2ZldGNoKHVybCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSk7CiAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlc3AudGV4dCgpKTsKICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IGpzb24uZGF0YS5jYXRlZ29yaWVzOwogICAgICAgIGxldCB2aWRlb3MgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGkgb2YgY2F0ZWdvcmllcykgewogICAgICAgICAgICB2aWRlb3MucHVzaCguLi50aGlzLmpzb24ydm9kcyhpLnZpZGVvcykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHZpZGVvcyk7CiAgICB9LAogICAgCiAgICDkuIDnuqc6IGFzeW5jIGZ1bmN0aW9uICh0aWQsIHBnLCBmaWx0ZXIsIGV4dGVuZCkgewogICAgICAgIGxldCB1cmwgPSBgJHt0aGlzLmhvc3R9L2FwaS5waHAvZmlsdGVyL3ZvZD90eXBlX25hbWU9JHtlbmNvZGVVUklDb21wb25lbnQodGlkKX0mcGFnZT0ke3BnfSZzb3J0PWhpdHNgOwogICAgICAgIGxldCByZXNwID0gYXdhaXQgX2ZldGNoKHVybCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSk7CiAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlc3AudGV4dCgpKTsKICAgICAgICBsZXQgdmlkZW9zID0gdGhpcy5qc29uMnZvZHMoanNvbi5kYXRhKTsKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHZpZGVvcyk7CiAgICB9LAogICAgCiAgICDkuoznuqc6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgdm9kSWQgPSB0aGlzLmlucHV0Lm1hdGNoKC92b2RfaWQ9KFxkKykvKVsxXTsKICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5ob3N0fS9hcGkucGhwL3ZvZC9nZXRfZGV0YWlsP3ZvZF9pZD0ke3ZvZElkfWA7CiAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBfZmV0Y2godXJsLCB7IGhlYWRlcnM6IHRoaXMuaGVhZGVycyB9KTsKICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVzcC50ZXh0KCkpOwogICAgICAgIGxldCBkYXRhID0ganNvbi5kYXRhWzBdOwogICAgICAgIGxldCB2b2RwbGF5ZXIgPSBqc29uLnZvZHBsYXllcjsKICAgICAgICBsZXQgc2hvd3MgPSBbXTsKICAgICAgICBsZXQgcGxheV91cmxzID0gW107CiAgICAgICAgbGV0IHJhd19zaG93cyA9IGRhdGEudm9kX3BsYXlfZnJvbS5zcGxpdCgnJCQkJyk7CiAgICAgICAgbGV0IHJhd191cmxzX2xpc3QgPSBkYXRhLnZvZF9wbGF5X3VybC5zcGxpdCgnJCQkJyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdfc2hvd3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IHNob3dfY29kZSA9IHJhd19zaG93c1tpXTsKICAgICAgICAgICAgbGV0IHVybHNfc3RyID0gcmF3X3VybHNfbGlzdFtpXTsKICAgICAgICAgICAgbGV0IG5lZWRfcGFyc2UgPSAwOwogICAgICAgICAgICBsZXQgaXNfc2hvdyA9IDA7CiAgICAgICAgICAgIGxldCBuYW1lID0gc2hvd19jb2RlOwogICAgICAgICAgICBmb3IgKGNvbnN0IHBsYXllciBvZiB2b2RwbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuZnJvbSA9PT0gc2hvd19jb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgaXNfc2hvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgbmVlZF9wYXJzZSA9IHBsYXllci5kZWNvZGVfc3RhdHVzOwogICAgICAgICAgICAgICAgICAgIGlmIChzaG93X2NvZGUudG9Mb3dlckNhc2UoKSAhPT0gcGxheWVyLnNob3cudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gYCR7cGxheWVyLnNob3d9ICgke3Nob3dfY29kZX0pYDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpc19zaG93ID09PSAxKSB7CiAgICAgICAgICAgICAgICBsZXQgdXJscyA9IFtdOwogICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gdXJsc19zdHIuc3BsaXQoJyMnKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmluY2x1ZGVzKCckJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcnRzID0gaXRlbS5zcGxpdCgnJCcpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXBpc29kZSA9IHBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbV91cmwgPSBwYXJ0c1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5wdXNoKGAke2VwaXNvZGV9JCR7c2hvd19jb2RlfUAke25lZWRfcGFyc2V9QCR7bV91cmx9YCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHVybHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHBsYXlfdXJscy5wdXNoKHVybHMuam9pbignIycpKTsKICAgICAgICAgICAgICAgICAgICBzaG93cy5wdXNoKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCBWT0QgPSB7CiAgICAgICAgICAgIHZvZF9pZDogZGF0YS52b2RfaWQudG9TdHJpbmcoKSwKICAgICAgICAgICAgdm9kX25hbWU6IGRhdGEudm9kX25hbWUsCiAgICAgICAgICAgIHZvZF9waWM6IGRhdGEudm9kX3BpYywKICAgICAgICAgICAgdm9kX3JlbWFya3M6IGRhdGEudm9kX3JlbWFya3MsCiAgICAgICAgICAgIHZvZF95ZWFyOiBkYXRhLnZvZF95ZWFyLAogICAgICAgICAgICB2b2RfYXJlYTogZGF0YS52b2RfYXJlYSwKICAgICAgICAgICAgdm9kX2FjdG9yOiBkYXRhLnZvZF9hY3RvciwKICAgICAgICAgICAgdm9kX2RpcmVjdG9yOiBkYXRhLnZvZF9kaXJlY3RvciwKICAgICAgICAgICAgdm9kX2NvbnRlbnQ6IGRhdGEudm9kX2NvbnRlbnQsCiAgICAgICAgICAgIHZvZF9wbGF5X2Zyb206IHNob3dzLmpvaW4oJyQkJCcpLAogICAgICAgICAgICB2b2RfcGxheV91cmw6IHBsYXlfdXJscy5qb2luKCckJCQnKSwKICAgICAgICAgICAgdHlwZV9uYW1lOiBkYXRhLnZvZF9jbGFzcwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFZPRDsKICAgIH0sCiAgICAKICAgIOaQnOe0ojogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCB1cmwgPSBgJHt0aGlzLmhvc3R9L2FwaS5waHAvc2VhcmNoL2luZGV4P3dkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuS0VZKX0mcGFnZT0ke3RoaXMuTVlfUEFHRX0mbGltaXQ9MTVgOwogICAgICAgIGxldCByZXNwID0gYXdhaXQgX2ZldGNoKHVybCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSk7CiAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlc3AudGV4dCgpKTsKICAgICAgICBsZXQgdmlkZW9zID0gdGhpcy5qc29uMnZvZHMoanNvbi5kYXRhKTsKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHZpZGVvcyk7CiAgICB9LAogICAgCiAgICBsYXp5OiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IFtwbGF5X2Zyb20sIG5lZWRfcGFyc2UsIHJhd191cmxdID0gdGhpcy5pbnB1dC5zcGxpdCgnQCcpOwogICAgICAgIGxldCBqeCA9IDA7CiAgICAgICAgbGV0IGZpbmFsX3VybCA9ICcnOwogICAgICAgIGlmIChuZWVkX3BhcnNlID09PSAnMScpIHsKICAgICAgICAgICAgbGV0IGF1dGhfdG9rZW4gPSAnJzsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaVVybCA9IGAke3RoaXMuaG9zdH0vYXBpLnBocC9kZWNvZGUvdXJsLz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQocmF3X3VybCl9JnZvZEZyb209JHtwbGF5X2Zyb219JHthdXRoX3Rva2VufWA7CiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBfZmV0Y2goYXBpVXJsLCB7IGhlYWRlcnM6IHRoaXMuaGVhZGVycyB9KTsKICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCByZXNwLnRleHQoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24uY29kZSA9PT0gMiAmJiBqc29uLmNoYWxsZW5nZSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9rZW4gPSBldmFsKGpzb24uY2hhbGxlbmdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF90b2tlbiA9IGAmdG9rZW49JHt0b2tlbn1gOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlfdXJsID0ganNvbi5kYXRhOwogICAgICAgICAgICAgICAgICAgIGlmIChwbGF5X3VybCAmJiBwbGF5X3VybC5zdGFydHNXaXRoKCdodHRwJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfdXJsID0gcGxheV91cmw7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICghZmluYWxfdXJsKSB7CiAgICAgICAgICAgIGZpbmFsX3VybCA9IHJhd191cmw7CiAgICAgICAgICAgIGlmICgvKD86d3d3XC5pcWl5aXx2XC5xcXx2XC55b3VrdXx3d3dcLm1ndHZ8d3d3XC5iaWxpYmlsaSlcLmNvbS8udGVzdChyYXdfdXJsKSkgewogICAgICAgICAgICAgICAganggPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHBhcnNlOiBqeCwKICAgICAgICAgICAgdXJsOiBmaW5hbF91cmwsCiAgICAgICAgICAgIGhlYWRlcjogeyAnVXNlci1BZ2VudCc6IHRoaXMuaGVhZGVyc1snVXNlci1BZ2VudCddIH0KICAgICAgICB9OwogICAgfQp9Ow== \ No newline at end of file diff --git "a/spider/js/\346\242\250\345\233\255\350\241\214[\346\210\217].js" "b/spider/js/\346\242\250\345\233\255\350\241\214[\346\210\217].js" index 22af9d45..7204c5db 100644 --- "a/spider/js/\346\242\250\345\233\255\350\241\214[\346\210\217].js" +++ "b/spider/js/\346\242\250\345\233\255\350\241\214[\346\210\217].js" @@ -11,251 +11,4 @@ }) */ -var rule = { - 类型: '影视', - author: 'EylinSir', - title: '梨园行戏曲', - desc: '梨园行戏曲源', - host: 'https://fly.daoran.tv', - homeUrl: 'https://fly.daoran.tv', - url: '/API_ROP/search/album/screen', - searchUrl: '/API_ROP/search/album/list?keyword=**', - logo: 'https://img.znds.com//uploads/new/221222/9-2212221050561N.png', - searchable: 1, - quickSearch: 0, - filterable: 1, - timeout: 10000, - play_parse: true, - headers: { - 'md5': 'SkvyrWqK9QHTdCT12Rhxunjx+WwMTe9y4KwgeASFDhbYabRSPskR0Q==', - 'Content-Type': 'application/json; charset=UTF-8', - 'User-Agent': 'okhttp/3.12.10', - 'Host': 'fly.daoran.tv', - 'Connection': 'Keep-Alive' - }, - - request: async function (url, obj) { - obj = obj || {}; - let response = await _fetch(url, { - method: obj.method || 'POST', - headers: obj.headers || this.headers, - body: obj.data ? JSON.stringify(obj.data) : undefined - }); - return response.text(); - }, - - _format_img: function (img) { - if (!img) { - return ''; - } - if (!img.startsWith('http')) { - return `https://ottphoto.daoran.tv/HD/${img}`; - } - return img; - }, - - 预处理: async function () {}, - - class_parse: async function () { - let cate_list = [ - {"n": "全部", "v": ""}, - {"n": "黄梅戏", "v": "hmx"}, {"n": "京剧", "v": "jingju"}, {"n": "曲剧", "v": "quju"}, - {"n": "秦腔", "v": "qinq"}, {"n": "潮剧", "v": "chaoju"}, {"n": "沪剧", "v": "huju"}, - {"n": "昆曲", "v": "kunqu"}, {"n": "淮剧", "v": "huaiju"}, {"n": "婺剧", "v": "wuju"}, - {"n": "河南大鼓书", "v": "hndgs"}, {"n": "滇剧", "v": "dianju"}, {"n": "老年大学", "v": "WK"}, - {"n": "绍剧", "v": "shaojv"}, {"n": "曲艺晚会", "v": "else"}, {"n": "皮影戏", "v": "pyx"}, - {"n": "四平调", "v": "spd"}, {"n": "吕剧", "v": "lvjv"}, {"n": "柳琴戏", "v": "liuqx"}, - {"n": "莆仙戏", "v": "pxx"}, {"n": "宛梆", "v": "wb"}, {"n": "锡剧", "v": "xiju"}, - {"n": "大平调", "v": "dpd"}, {"n": "话剧", "v": "huaju"}, {"n": "西秦戏", "v": "xqx"}, - {"n": "川剧", "v": "chuanju"}, {"n": "赣剧", "v": "tagId"}, {"n": "太康道情", "v": "tkdq"}, - {"n": "闽剧", "v": "minju"}, {"n": "梅花大鼓", "v": "mhdg"}, {"n": "吉剧", "v": "jiju"}, - {"n": "白字戏", "v": "bzx"}, {"n": "豫剧", "v": "yuju"}, {"n": "越剧", "v": "yueju"}, - {"n": "评剧", "v": "pingju"}, {"n": "坠子", "v": "hnzz"}, {"n": "河北梆子", "v": "hbbz"}, - {"n": "粤剧", "v": "gddx"}, {"n": "二夹弦", "v": "ejx"}, {"n": "河南琴书", "v": "hnqs"}, - {"n": "戏曲", "v": "xq"}, {"n": "二人台", "v": "ERT"}, {"n": "越调", "v": "yued"}, - {"n": "乐腔", "v": "lq"}, {"n": "扬剧", "v": "yangju"}, {"n": "京韵大鼓", "v": "jydg"}, - {"n": "彩调", "v": "caidiao"}, {"n": "琼剧", "v": "qiongju"}, {"n": "蒲剧", "v": "pujv"}, - {"n": "西河大鼓", "v": "xhdg"}, {"n": "湘剧", "v": "xj"}, {"n": "麦田乡韾", "v": "mtxy"}, - {"n": "评书", "v": "pingshu"}, {"n": "庐剧", "v": "luju"}, {"n": "单弦", "v": "danxian"}, - {"n": "花鼓戏", "v": "huagx"}, {"n": "相声", "v": "xiang"}, {"n": "四股弦", "v": "sgx"}, - {"n": "保定老调", "v": "bdld"}, {"n": "晋剧", "v": "jinju"}, {"n": "其他", "v": "other"}, - {"n": "正字戏", "v": "zzx"}, {"n": "楚剧", "v": "chuju"} - ]; - - return { - class: [{ 'type_name': '戏曲片库', 'type_id': 'all' }], - filters: { - "all": [ - {"key": "sect", "name": "曲种", "value": cate_list}, - {"key": "area", "name": "资费", "value": [{"n": "全部", "v": "0"}, {"n": "免费", "v": "1"}, {"n": "VIP", "v": "2"}]}, - {"key": "sort", "name": "排序", "value": [{"n": "最热", "v": "hot"}, {"n": "最新", "v": "online"}]} - ] - } - }; - }, - - 推荐: async function () { - return await this.一级('all', 1, {}, {}); - }, - - 一级: async function (tid, pg, filter, extend) { - let url = `${this.host}/API_ROP/search/album/screen`; - let sect = extend?.sect || ''; - if (tid === 'all' && !sect) { - sect = ''; - } - - let payload = { - "cur": parseInt(pg), - "pageSize": 30, - "resType": 1, - "sect": sect, - "orderby": extend?.sort || 'hot', - "tagId": 0, - "userId": "92315ec6e58a45ba7f47fd143b3d7956", - "channel": "vivo", - "item": "y9", - "nodeCode": "001000", - "project": "lyhxcx" - }; - - let area = extend?.area || '0'; - if (area === '1' || area === '2') { - payload['free'] = parseInt(area); - } - - try { - let resp = await this.request(url, { data: payload }); - let json = JSON.parse(resp); - let data = json.pb || json.data || {}; - let vod_list = []; - for (let item of data.dataList || []) { - vod_list.push({ - title: item.name, - url: `${this.host}/API_ROP/album/res/list?albumCode=${item.code}`, - desc: (item.publishTime || '').split(' ')[0], - pic_url: this._format_img(item.imgsec), - vod_year: (item.publishTime || '').substring(0, 4) - }); - } - - return setResult(vod_list); - } catch (e) { - console.error(e); - return setResult([]); - } - }, - - 二级: async function () { - let albumCode = this.input.match(/albumCode=(.*?)(?:&|$)/)[1]; - let url = `${this.host}/API_ROP/album/res/list`; - - let payload = { - "albumCode": albumCode, - "cur": 1, - "pageSize": 500, - "userId": "92315ec6e58a45ba7f47fd143b3d7956", - "channel": "vivo", - "item": "y9", - "nodeCode": "001000", - "project": "lyhxcx" - }; - - try { - let resp = await this.request(url, { data: payload }); - let json = JSON.parse(resp); - let album = json.album || {}; - let tracks = json.pb?.dataList || []; - tracks.sort((a, b) => parseInt(a.sort || 0) - parseInt(b.sort || 0)); - let play_urls = []; - for (let t of tracks) { - if (t.code) { - play_urls.push(`${t.name.replace(/\$/g, '_')}$${t.code}`); - } - } - - let VOD = { - vod_id: albumCode, - vod_name: album.name || '未知', - vod_pic: this._format_img(album.imgsec), - type_name: "戏曲", - vod_year: album.publishTime || '', - vod_area: "中国", - vod_content: album.des || '暂无简介', - vod_play_from: "梨园行", - vod_play_url: play_urls.join('#') - }; - - return VOD; - } catch (e) { - console.error(e); - return {}; - } - }, - - 搜索: async function () { - let url = `${this.host}/API_ROP/search/album/list`; - let payload = { - "cur": parseInt(this.MY_PAGE), - "pageSize": 20, - "keyword": this.KEY, - "item": "y9", - "nodeCode": "001000", - "orderby": "hot", - "px": 2, - "sect": [], - "userId": "92315ec6e58a45ba7f47fd143b3d7956", - "project": "lyhxcx" - }; - - try { - let resp = await this.request(url, { data: payload }); - let json = JSON.parse(resp); - let data = json.pb || json.data || {}; - let vod_list = []; - for (let item of data.dataList || []) { - vod_list.push({ - title: item.name, - url: `${this.host}/API_ROP/album/res/list?albumCode=${item.code}`, - desc: (item.publishTime || ''), - pic_url: this._format_img(item.imgsec) - }); - } - return setResult(vod_list); - } catch (e) { - console.error(e); - return setResult([]); - } - }, - - lazy: async function () { - let resCode = this.input; - let url = `${this.host}/API_ROP/play/get/playurl`; - let payload = { - "resCode": resCode, - "item": "y9", - "mask": 0, - "nodeCode": "001000", - "project": "lyhxcx", - "px": 2, - "userId": "92315ec6e58a45ba7f47fd143b3d7956" - }; - - try { - let resp = await this.request(url, { data: payload }); - let json = JSON.parse(resp); - let play_url = json.playres?.playurl || ''; - return { - parse: 0, - url: play_url, - header: { 'User-Agent': this.headers['User-Agent'] } - }; - } catch (e) { - console.error(e); - return { - parse: 0, - url: '' - }; - } - } -}; \ No newline at end of file +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICflvbHop4YnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICfmoqjlm63ooYzmiI/mm7InLAogICAgZGVzYzogJ+aiqOWbreihjOaIj+absua6kCcsCiAgICBob3N0OiAnaHR0cHM6Ly9mbHkuZGFvcmFuLnR2JywKICAgIGhvbWVVcmw6ICdodHRwczovL2ZseS5kYW9yYW4udHYnLAogICAgdXJsOiAnL0FQSV9ST1Avc2VhcmNoL2FsYnVtL3NjcmVlbicsCiAgICBzZWFyY2hVcmw6ICcvQVBJX1JPUC9zZWFyY2gvYWxidW0vbGlzdD9rZXl3b3JkPSoqJywKICAgIGxvZ286ICdodHRwczovL2ltZy56bmRzLmNvbS8vdXBsb2Fkcy9uZXcvMjIxMjIyLzktMjIxMjIyMTA1MDU2MU4ucG5nJywKICAgIHNlYXJjaGFibGU6IDEsCiAgICBxdWlja1NlYXJjaDogMCwKICAgIGZpbHRlcmFibGU6IDEsCiAgICB0aW1lb3V0OiAxMDAwMCwKICAgIHBsYXlfcGFyc2U6IHRydWUsCiAgICBoZWFkZXJzOiB7CiAgICAgICAgJ21kNSc6ICdTa3Z5cldxSzlRSFRkQ1QxMlJoeHVuangrV3dNVGU5eTRLd2dlQVNGRGhiWWFiUlNQc2tSMFE9PScsCiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04JywKICAgICAgICAnVXNlci1BZ2VudCc6ICdva2h0dHAvMy4xMi4xMCcsCiAgICAgICAgJ0hvc3QnOiAnZmx5LmRhb3Jhbi50dicsCiAgICAgICAgJ0Nvbm5lY3Rpb24nOiAnS2VlcC1BbGl2ZScKICAgIH0sCiAgICAKICAgIHJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uICh1cmwsIG9iaikgewogICAgICAgIG9iaiA9IG9iaiB8fCB7fTsKICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBfZmV0Y2godXJsLCB7CiAgICAgICAgICAgIG1ldGhvZDogb2JqLm1ldGhvZCB8fCAnUE9TVCcsCiAgICAgICAgICAgIGhlYWRlcnM6IG9iai5oZWFkZXJzIHx8IHRoaXMuaGVhZGVycywKICAgICAgICAgICAgYm9keTogb2JqLmRhdGEgPyBKU09OLnN0cmluZ2lmeShvYmouZGF0YSkgOiB1bmRlZmluZWQKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwogICAgfSwKCiAgICBfZm9ybWF0X2ltZzogZnVuY3Rpb24gKGltZykgewogICAgICAgIGlmICghaW1nKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKCFpbWcuc3RhcnRzV2l0aCgnaHR0cCcpKSB7CiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly9vdHRwaG90by5kYW9yYW4udHYvSEQvJHtpbWd9YDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGltZzsKICAgIH0sCiAgICAKICAgIOmihOWkhOeQhjogYXN5bmMgZnVuY3Rpb24gKCkge30sCiAgICAKICAgIGNsYXNzX3BhcnNlOiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IGNhdGVfbGlzdCA9IFsKICAgICAgICAgICAgeyJuIjogIuWFqOmDqCIsICJ2IjogIiJ9LAogICAgICAgICAgICB7Im4iOiAi6buE5qKF5oiPIiwgInYiOiAiaG14In0sIHsibiI6ICLkuqzliaciLCAidiI6ICJqaW5nanUifSwgeyJuIjogIuabsuWJpyIsICJ2IjogInF1anUifSwKICAgICAgICAgICAgeyJuIjogIuenpuiFlCIsICJ2IjogInFpbnEifSwgeyJuIjogIua9ruWJpyIsICJ2IjogImNoYW9qdSJ9LCB7Im4iOiAi5rKq5YmnIiwgInYiOiAiaHVqdSJ9LAogICAgICAgICAgICB7Im4iOiAi5piG5puyIiwgInYiOiAia3VucXUifSwgeyJuIjogIua3ruWJpyIsICJ2IjogImh1YWlqdSJ9LCB7Im4iOiAi5am65YmnIiwgInYiOiAid3VqdSJ9LAogICAgICAgICAgICB7Im4iOiAi5rKz5Y2X5aSn6byT5LmmIiwgInYiOiAiaG5kZ3MifSwgeyJuIjogIua7h+WJpyIsICJ2IjogImRpYW5qdSJ9LCB7Im4iOiAi6ICB5bm05aSn5a2mIiwgInYiOiAiV0sifSwKICAgICAgICAgICAgeyJuIjogIue7jeWJpyIsICJ2IjogInNoYW9qdiJ9LCB7Im4iOiAi5puy6Im65pma5LyaIiwgInYiOiAiZWxzZSJ9LCB7Im4iOiAi55qu5b2x5oiPIiwgInYiOiAicHl4In0sCiAgICAgICAgICAgIHsibiI6ICLlm5vlubPosIMiLCAidiI6ICJzcGQifSwgeyJuIjogIuWQleWJpyIsICJ2IjogImx2anYifSwgeyJuIjogIuafs+eQtOaIjyIsICJ2IjogImxpdXF4In0sCiAgICAgICAgICAgIHsibiI6ICLojobku5nmiI8iLCAidiI6ICJweHgifSwgeyJuIjogIuWum+aihiIsICJ2IjogIndiIn0sIHsibiI6ICLplKHliaciLCAidiI6ICJ4aWp1In0sCiAgICAgICAgICAgIHsibiI6ICLlpKflubPosIMiLCAidiI6ICJkcGQifSwgeyJuIjogIuivneWJpyIsICJ2IjogImh1YWp1In0sIHsibiI6ICLopb/np6bmiI8iLCAidiI6ICJ4cXgifSwKICAgICAgICAgICAgeyJuIjogIuW3neWJpyIsICJ2IjogImNodWFuanUifSwgeyJuIjogIui1o+WJpyIsICJ2IjogInRhZ0lkIn0sIHsibiI6ICLlpKrlurfpgZPmg4UiLCAidiI6ICJ0a2RxIn0sCiAgICAgICAgICAgIHsibiI6ICLpl73liaciLCAidiI6ICJtaW5qdSJ9LCB7Im4iOiAi5qKF6Iqx5aSn6byTIiwgInYiOiAibWhkZyJ9LCB7Im4iOiAi5ZCJ5YmnIiwgInYiOiAiamlqdSJ9LAogICAgICAgICAgICB7Im4iOiAi55m95a2X5oiPIiwgInYiOiAiYnp4In0sIHsibiI6ICLosavliaciLCAidiI6ICJ5dWp1In0sIHsibiI6ICLotorliaciLCAidiI6ICJ5dWVqdSJ9LAogICAgICAgICAgICB7Im4iOiAi6K+E5YmnIiwgInYiOiAicGluZ2p1In0sIHsibiI6ICLlnaDlrZAiLCAidiI6ICJobnp6In0sIHsibiI6ICLmsrPljJfmooblrZAiLCAidiI6ICJoYmJ6In0sCiAgICAgICAgICAgIHsibiI6ICLnsqTliaciLCAidiI6ICJnZGR4In0sIHsibiI6ICLkuozlpLnlvKYiLCAidiI6ICJlangifSwgeyJuIjogIuays+WNl+eQtOS5piIsICJ2IjogImhucXMifSwKICAgICAgICAgICAgeyJuIjogIuaIj+absiIsICJ2IjogInhxIn0sIHsibiI6ICLkuozkurrlj7AiLCAidiI6ICJFUlQifSwgeyJuIjogIui2iuiwgyIsICJ2IjogInl1ZWQifSwKICAgICAgICAgICAgeyJuIjogIuS5kOiFlCIsICJ2IjogImxxIn0sIHsibiI6ICLmiazliaciLCAidiI6ICJ5YW5nanUifSwgeyJuIjogIuS6rOmfteWkp+m8kyIsICJ2IjogImp5ZGcifSwKICAgICAgICAgICAgeyJuIjogIuW9qeiwgyIsICJ2IjogImNhaWRpYW8ifSwgeyJuIjogIueQvOWJpyIsICJ2IjogInFpb25nanUifSwgeyJuIjogIuiSsuWJpyIsICJ2IjogInB1anYifSwKICAgICAgICAgICAgeyJuIjogIuilv+ays+Wkp+m8kyIsICJ2IjogInhoZGcifSwgeyJuIjogIua5mOWJpyIsICJ2IjogInhqIn0sIHsibiI6ICLpuqbnlLDkuaHpn74iLCAidiI6ICJtdHh5In0sCiAgICAgICAgICAgIHsibiI6ICLor4TkuaYiLCAidiI6ICJwaW5nc2h1In0sIHsibiI6ICLlupDliaciLCAidiI6ICJsdWp1In0sIHsibiI6ICLljZXlvKYiLCAidiI6ICJkYW54aWFuIn0sCiAgICAgICAgICAgIHsibiI6ICLoirHpvJPmiI8iLCAidiI6ICJodWFneCJ9LCB7Im4iOiAi55u45aOwIiwgInYiOiAieGlhbmcifSwgeyJuIjogIuWbm+iCoeW8piIsICJ2IjogInNneCJ9LAogICAgICAgICAgICB7Im4iOiAi5L+d5a6a6ICB6LCDIiwgInYiOiAiYmRsZCJ9LCB7Im4iOiAi5pmL5YmnIiwgInYiOiAiamluanUifSwgeyJuIjogIuWFtuS7liIsICJ2IjogIm90aGVyIn0sCiAgICAgICAgICAgIHsibiI6ICLmraPlrZfmiI8iLCAidiI6ICJ6engifSwgeyJuIjogIualmuWJpyIsICJ2IjogImNodWp1In0KICAgICAgICBdOwogICAgICAgIAogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNsYXNzOiBbeyAndHlwZV9uYW1lJzogJ+aIj+absueJh+W6kycsICd0eXBlX2lkJzogJ2FsbCcgfV0sCiAgICAgICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgICAgICJhbGwiOiBbCiAgICAgICAgICAgICAgICAgICAgeyJrZXkiOiAic2VjdCIsICJuYW1lIjogIuabsuenjSIsICJ2YWx1ZSI6IGNhdGVfbGlzdH0sCiAgICAgICAgICAgICAgICAgICAgeyJrZXkiOiAiYXJlYSIsICJuYW1lIjogIui1hOi0uSIsICJ2YWx1ZSI6IFt7Im4iOiAi5YWo6YOoIiwgInYiOiAiMCJ9LCB7Im4iOiAi5YWN6LS5IiwgInYiOiAiMSJ9LCB7Im4iOiAiVklQIiwgInYiOiAiMiJ9XX0sCiAgICAgICAgICAgICAgICAgICAgeyJrZXkiOiAic29ydCIsICJuYW1lIjogIuaOkuW6jyIsICJ2YWx1ZSI6IFt7Im4iOiAi5pyA54OtIiwgInYiOiAiaG90In0sIHsibiI6ICLmnIDmlrAiLCAidiI6ICJvbmxpbmUifV19CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSwKICAgIAogICAg5o6o6I2QOiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMu5LiA57qnKCdhbGwnLCAxLCB7fSwge30pOwogICAgfSwKICAgIAogICAg5LiA57qnOiBhc3luYyBmdW5jdGlvbiAodGlkLCBwZywgZmlsdGVyLCBleHRlbmQpIHsKICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5ob3N0fS9BUElfUk9QL3NlYXJjaC9hbGJ1bS9zY3JlZW5gOwogICAgICAgIGxldCBzZWN0ID0gZXh0ZW5kPy5zZWN0IHx8ICcnOwogICAgICAgIGlmICh0aWQgPT09ICdhbGwnICYmICFzZWN0KSB7CiAgICAgICAgICAgIHNlY3QgPSAnJzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHBheWxvYWQgPSB7CiAgICAgICAgICAgICJjdXIiOiBwYXJzZUludChwZyksCiAgICAgICAgICAgICJwYWdlU2l6ZSI6IDMwLAogICAgICAgICAgICAicmVzVHlwZSI6IDEsCiAgICAgICAgICAgICJzZWN0Ijogc2VjdCwKICAgICAgICAgICAgIm9yZGVyYnkiOiBleHRlbmQ/LnNvcnQgfHwgJ2hvdCcsCiAgICAgICAgICAgICJ0YWdJZCI6IDAsCiAgICAgICAgICAgICJ1c2VySWQiOiAiOTIzMTVlYzZlNThhNDViYTdmNDdmZDE0M2IzZDc5NTYiLAogICAgICAgICAgICAiY2hhbm5lbCI6ICJ2aXZvIiwKICAgICAgICAgICAgIml0ZW0iOiAieTkiLAogICAgICAgICAgICAibm9kZUNvZGUiOiAiMDAxMDAwIiwKICAgICAgICAgICAgInByb2plY3QiOiAibHloeGN4IgogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgbGV0IGFyZWEgPSBleHRlbmQ/LmFyZWEgfHwgJzAnOwogICAgICAgIGlmIChhcmVhID09PSAnMScgfHwgYXJlYSA9PT0gJzInKSB7CiAgICAgICAgICAgIHBheWxvYWRbJ2ZyZWUnXSA9IHBhcnNlSW50KGFyZWEpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0cnkgewogICAgICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwsIHsgZGF0YTogcGF5bG9hZCB9KTsKICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHJlc3ApOwogICAgICAgICAgICBsZXQgZGF0YSA9IGpzb24ucGIgfHwganNvbi5kYXRhIHx8IHt9OwogICAgICAgICAgICBsZXQgdm9kX2xpc3QgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBkYXRhLmRhdGFMaXN0IHx8IFtdKSB7CiAgICAgICAgICAgICAgICB2b2RfbGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lLAogICAgICAgICAgICAgICAgICAgIHVybDogYCR7dGhpcy5ob3N0fS9BUElfUk9QL2FsYnVtL3Jlcy9saXN0P2FsYnVtQ29kZT0ke2l0ZW0uY29kZX1gLAogICAgICAgICAgICAgICAgICAgIGRlc2M6IChpdGVtLnB1Ymxpc2hUaW1lIHx8ICcnKS5zcGxpdCgnICcpWzBdLAogICAgICAgICAgICAgICAgICAgIHBpY191cmw6IHRoaXMuX2Zvcm1hdF9pbWcoaXRlbS5pbWdzZWMpLAogICAgICAgICAgICAgICAgICAgIHZvZF95ZWFyOiAoaXRlbS5wdWJsaXNoVGltZSB8fCAnJykuc3Vic3RyaW5nKDAsIDQpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdCh2b2RfbGlzdCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICByZXR1cm4gc2V0UmVzdWx0KFtdKTsKICAgICAgICB9CiAgICB9LAogICAgCiAgICDkuoznuqc6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgYWxidW1Db2RlID0gdGhpcy5pbnB1dC5tYXRjaCgvYWxidW1Db2RlPSguKj8pKD86JnwkKS8pWzFdOwogICAgICAgIGxldCB1cmwgPSBgJHt0aGlzLmhvc3R9L0FQSV9ST1AvYWxidW0vcmVzL2xpc3RgOwogICAgICAgIAogICAgICAgIGxldCBwYXlsb2FkID0gewogICAgICAgICAgICAiYWxidW1Db2RlIjogYWxidW1Db2RlLAogICAgICAgICAgICAiY3VyIjogMSwKICAgICAgICAgICAgInBhZ2VTaXplIjogNTAwLAogICAgICAgICAgICAidXNlcklkIjogIjkyMzE1ZWM2ZTU4YTQ1YmE3ZjQ3ZmQxNDNiM2Q3OTU2IiwKICAgICAgICAgICAgImNoYW5uZWwiOiAidml2byIsCiAgICAgICAgICAgICJpdGVtIjogInk5IiwKICAgICAgICAgICAgIm5vZGVDb2RlIjogIjAwMTAwMCIsCiAgICAgICAgICAgICJwcm9qZWN0IjogImx5aHhjeCIKICAgICAgICB9OwogICAgICAgIAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwgeyBkYXRhOiBwYXlsb2FkIH0pOwogICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UocmVzcCk7CiAgICAgICAgICAgIGxldCBhbGJ1bSA9IGpzb24uYWxidW0gfHwge307CiAgICAgICAgICAgIGxldCB0cmFja3MgPSBqc29uLnBiPy5kYXRhTGlzdCB8fCBbXTsKICAgICAgICAgICAgdHJhY2tzLnNvcnQoKGEsIGIpID0+IHBhcnNlSW50KGEuc29ydCB8fCAwKSAtIHBhcnNlSW50KGIuc29ydCB8fCAwKSk7CiAgICAgICAgICAgIGxldCBwbGF5X3VybHMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0cmFja3MpIHsKICAgICAgICAgICAgICAgIGlmICh0LmNvZGUpIHsKICAgICAgICAgICAgICAgICAgICBwbGF5X3VybHMucHVzaChgJHt0Lm5hbWUucmVwbGFjZSgvXCQvZywgJ18nKX0kJHt0LmNvZGV9YCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGxldCBWT0QgPSB7CiAgICAgICAgICAgICAgICB2b2RfaWQ6IGFsYnVtQ29kZSwKICAgICAgICAgICAgICAgIHZvZF9uYW1lOiBhbGJ1bS5uYW1lIHx8ICfmnKrnn6UnLAogICAgICAgICAgICAgICAgdm9kX3BpYzogdGhpcy5fZm9ybWF0X2ltZyhhbGJ1bS5pbWdzZWMpLAogICAgICAgICAgICAgICAgdHlwZV9uYW1lOiAi5oiP5puyIiwKICAgICAgICAgICAgICAgIHZvZF95ZWFyOiBhbGJ1bS5wdWJsaXNoVGltZSB8fCAnJywKICAgICAgICAgICAgICAgIHZvZF9hcmVhOiAi5Lit5Zu9IiwKICAgICAgICAgICAgICAgIHZvZF9jb250ZW50OiBhbGJ1bS5kZXMgfHwgJ+aaguaXoOeugOS7iycsCiAgICAgICAgICAgICAgICB2b2RfcGxheV9mcm9tOiAi5qKo5Zut6KGMIiwKICAgICAgICAgICAgICAgIHZvZF9wbGF5X3VybDogcGxheV91cmxzLmpvaW4oJyMnKQogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuIFZPRDsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CiAgICB9LAogICAgCiAgICDmkJzntKI6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5ob3N0fS9BUElfUk9QL3NlYXJjaC9hbGJ1bS9saXN0YDsKICAgICAgICBsZXQgcGF5bG9hZCA9IHsKICAgICAgICAgICAgImN1ciI6IHBhcnNlSW50KHRoaXMuTVlfUEFHRSksCiAgICAgICAgICAgICJwYWdlU2l6ZSI6IDIwLAogICAgICAgICAgICAia2V5d29yZCI6IHRoaXMuS0VZLAogICAgICAgICAgICAiaXRlbSI6ICJ5OSIsCiAgICAgICAgICAgICJub2RlQ29kZSI6ICIwMDEwMDAiLAogICAgICAgICAgICAib3JkZXJieSI6ICJob3QiLAogICAgICAgICAgICAicHgiOiAyLAogICAgICAgICAgICAic2VjdCI6IFtdLAogICAgICAgICAgICAidXNlcklkIjogIjkyMzE1ZWM2ZTU4YTQ1YmE3ZjQ3ZmQxNDNiM2Q3OTU2IiwKICAgICAgICAgICAgInByb2plY3QiOiAibHloeGN4IgogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCB0aGlzLnJlcXVlc3QodXJsLCB7IGRhdGE6IHBheWxvYWQgfSk7CiAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShyZXNwKTsKICAgICAgICAgICAgbGV0IGRhdGEgPSBqc29uLnBiIHx8IGpzb24uZGF0YSB8fCB7fTsKICAgICAgICAgICAgbGV0IHZvZF9saXN0ID0gW107CiAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgZGF0YS5kYXRhTGlzdCB8fCBbXSkgewogICAgICAgICAgICAgICAgdm9kX2xpc3QucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSwKICAgICAgICAgICAgICAgICAgICB1cmw6IGAke3RoaXMuaG9zdH0vQVBJX1JPUC9hbGJ1bS9yZXMvbGlzdD9hbGJ1bUNvZGU9JHtpdGVtLmNvZGV9YCwKICAgICAgICAgICAgICAgICAgICBkZXNjOiAoaXRlbS5wdWJsaXNoVGltZSB8fCAnJyksCiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogdGhpcy5fZm9ybWF0X2ltZyhpdGVtLmltZ3NlYykKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZXRSZXN1bHQodm9kX2xpc3QpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdChbXSk7CiAgICAgICAgfQogICAgfSwKICAgIAogICAgbGF6eTogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCByZXNDb2RlID0gdGhpcy5pbnB1dDsKICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5ob3N0fS9BUElfUk9QL3BsYXkvZ2V0L3BsYXl1cmxgOwogICAgICAgIGxldCBwYXlsb2FkID0gewogICAgICAgICAgICAicmVzQ29kZSI6IHJlc0NvZGUsCiAgICAgICAgICAgICJpdGVtIjogInk5IiwKICAgICAgICAgICAgIm1hc2siOiAwLAogICAgICAgICAgICAibm9kZUNvZGUiOiAiMDAxMDAwIiwKICAgICAgICAgICAgInByb2plY3QiOiAibHloeGN4IiwKICAgICAgICAgICAgInB4IjogMiwKICAgICAgICAgICAgInVzZXJJZCI6ICI5MjMxNWVjNmU1OGE0NWJhN2Y0N2ZkMTQzYjNkNzk1NiIKICAgICAgICB9OwogICAgICAgIAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwgeyBkYXRhOiBwYXlsb2FkIH0pOwogICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UocmVzcCk7CiAgICAgICAgICAgIGxldCBwbGF5X3VybCA9IGpzb24ucGxheXJlcz8ucGxheXVybCB8fCAnJzsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHBhcnNlOiAwLAogICAgICAgICAgICAgICAgdXJsOiBwbGF5X3VybCwKICAgICAgICAgICAgICAgIGhlYWRlcjogeyAnVXNlci1BZ2VudCc6IHRoaXMuaGVhZGVyc1snVXNlci1BZ2VudCddIH0KICAgICAgICAgICAgfTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBwYXJzZTogMCwKICAgICAgICAgICAgICAgIHVybDogJycKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn07 \ No newline at end of file diff --git "a/spider/js/\347\203\255\346\222\255\345\275\261\350\247\206.js" "b/spider/js/\347\203\255\346\222\255\345\275\261\350\247\206.js" new file mode 100644 index 00000000..4ffd935a --- /dev/null +++ "b/spider/js/\347\203\255\346\222\255\345\275\261\350\247\206.js" @@ -0,0 +1,13 @@ +/* +@header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '热播APP', + author: 'EylinSir', + '类型': '影视', + lang: 'ds' +}) +*/ + +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICflvbHop4YnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICfng63mkq1BUFAnLAogICAgZGVzYzogJ+eDreaSrUFQUOW9seinhua6kCcsCiAgICBob3N0OiAnaHR0cDovL3YucmJvdHYuY24nLAogICAgaG9tZVVybDogJ2h0dHA6Ly92LnJib3R2LmNuJywKICAgIHVybDogJy92My9ob21lL3R5cGVfc2VhcmNoJywKICAgIHNlYXJjaFVybDogJy92My9ob21lL3NlYXJjaCcsCiAgICBzZWFyY2hhYmxlOiAxLAogICAgcXVpY2tTZWFyY2g6IDEsCiAgICBmaWx0ZXJhYmxlOiAxLAogICAgdGltZW91dDogMTAwMDAsCiAgICBwbGF5X3BhcnNlOiB0cnVlLAogICAgaGVhZGVyczogewogICAgICAgICdVc2VyLUFnZW50JzogJ29raHR0cC1va2dvL2plYXNvbmx6eScsCiAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6ICd6aC1DTix6aDtxPTAuOCcKICAgIH0sCiAgICAKICAgIGdldGZpbGVzOiBmdW5jdGlvbiAocCA9IHt9KSB7CiAgICAgICAgbGV0IHQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKS50b1N0cmluZygpOwogICAgICAgIGxldCBzID0gbWQ1KCc3Z3AwYm5kMnNyODV5ZGlpMmozMnBjeXBzY29jNHc2YzdnNXNwbCcgKyB0KTsKICAgICAgICBsZXQgZmlsZXMgPSB7CiAgICAgICAgICAgICdzaWduJzogcywKICAgICAgICAgICAgJ3RpbWVzdGFtcCc6IHQKICAgICAgICB9OwogICAgICAgIHJldHVybiB7IC4uLnAsIC4uLmZpbGVzIH07CiAgICB9LAoKICAgIGdldHY6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgcmV0dXJuIGRhdGEuZmlsdGVyKGkgPT4gaS52b2RfaWQgJiYgaS52b2RfaWQudG9TdHJpbmcoKSAhPT0gJzAnKS5tYXAoaSA9PiAoewogICAgICAgICAgICB0aXRsZTogaS52b2RfbmFtZSwKICAgICAgICAgICAgdXJsOiBgJHt0aGlzLmhvc3R9L3YzL2hvbWUvdm9kX2RldGFpbHM/dm9kX2lkPSR7aS52b2RfaWR9YCwKICAgICAgICAgICAgZGVzYzogaS52b2RfcmVtYXJrcywKICAgICAgICAgICAgcGljX3VybDogaS52b2RfcGljIHx8IGkudm9kX3BpY190aHVtYiwKICAgICAgICAgICAgdm9kX3llYXI6IGkudGFnCiAgICAgICAgfSkpOwogICAgfSwKICAgIAogICAg6aKE5aSE55CGOiBhc3luYyBmdW5jdGlvbiAoKSB7fSwKCiAgICBjbGFzc19wYXJzZTogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRmaWxlcyh7ICcnOiAnJyB9KTsKICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IF9mZXRjaChgJHt0aGlzLmhvc3R9L3YzL3R5cGUvdG9wX3R5cGVgLCB7CiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLAogICAgICAgICAgICBoZWFkZXJzOiB7IC4uLnRoaXMuaGVhZGVycywgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sCiAgICAgICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoZGF0YSkudG9TdHJpbmcoKQogICAgICAgIH0pOwogICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCByZXNwLnRleHQoKSk7CiAgICAgICAgbGV0IGNsYXNzZXMgPSBqc29uLmRhdGEubGlzdC5tYXAoayA9PiAoewogICAgICAgICAgICB0eXBlX2lkOiBrLnR5cGVfaWQudG9TdHJpbmcoKSwKICAgICAgICAgICAgdHlwZV9uYW1lOiBrLnR5cGVfbmFtZQogICAgICAgIH0pKTsKICAgICAgICBsZXQgZmlsdGVycyA9IHt9OwogICAgICAgIGZvciAoY29uc3QgayBvZiBqc29uLmRhdGEubGlzdCkgewogICAgICAgICAgICBsZXQgZnRzID0gW107CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGspKSB7CiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgICAgIGZ0cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LAogICAgICAgICAgICAgICAgICAgICAgICBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5maWx0ZXIoaiA9PiBqICYmIGogIT09ICflhajpg6gnKS5tYXAoaiA9PiAoeyBuOiBqLCB2OiBqIH0pKQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmdHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBmaWx0ZXJzW2sudHlwZV9pZF0gPSBmdHM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgY2xhc3M6IGNsYXNzZXMsIGZpbHRlcnMgfTsKICAgIH0sCiAgICAKICAgIOaOqOiNkDogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRmaWxlcyh7ICcnOiAnJyB9KTsKICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IF9mZXRjaChgJHt0aGlzLmhvc3R9L3YzL3R5cGUvdGpfdm9kYCwgewogICAgICAgICAgICBtZXRob2Q6ICdwb3N0JywKICAgICAgICAgICAgaGVhZGVyczogeyAuLi50aGlzLmhlYWRlcnMsICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LAogICAgICAgICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKGRhdGEpLnRvU3RyaW5nKCkKICAgICAgICB9KTsKICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVzcC50ZXh0KCkpOwogICAgICAgIGxldCB2aWRlb3MgPSB0aGlzLmdldHYoanNvbi5kYXRhLmNhaS5jb25jYXQoanNvbi5kYXRhLmxvb3ApKTsKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHZpZGVvcyk7CiAgICB9LAogICAgCiAgICDkuIDnuqc6IGFzeW5jIGZ1bmN0aW9uICh0aWQsIHBnLCBmaWx0ZXIsIGV4dGVuZCkgewogICAgICAgIGxldCBmaWxlcyA9IHsKICAgICAgICAgICAgJ3R5cGVfaWQnOiB0aWQsCiAgICAgICAgICAgICdsaW1pdCc6ICcxMicsCiAgICAgICAgICAgICdwYWdlJzogcGcKICAgICAgICB9OwogICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGV4dGVuZCB8fCB7fSkpIHsKICAgICAgICAgICAgbGV0IGtleSA9IGsgPT09ICdleHRlbmQnID8gJ2NsYXNzJyA6IGs7CiAgICAgICAgICAgIGZpbGVzW2tleV0gPSB2OwogICAgICAgIH0KICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0ZmlsZXMoZmlsZXMpOwogICAgICAgIGxldCByZXNwID0gYXdhaXQgX2ZldGNoKGAke3RoaXMuaG9zdH0vdjMvaG9tZS90eXBlX3NlYXJjaGAsIHsKICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsCiAgICAgICAgICAgIGhlYWRlcnM6IHsgLi4udGhpcy5oZWFkZXJzLCAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSwKICAgICAgICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyhkYXRhKS50b1N0cmluZygpCiAgICAgICAgfSk7CiAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlc3AudGV4dCgpKTsKICAgICAgICBsZXQgdmlkZW9zID0gdGhpcy5nZXR2KGpzb24uZGF0YS5saXN0KTsKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHZpZGVvcyk7CiAgICB9LAogICAgCiAgICDkuoznuqc6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgdm9kSWQgPSB0aGlzLmlucHV0Lm1hdGNoKC92b2RfaWQ9KFxkKykvKVsxXTsKICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0ZmlsZXMoeyAndm9kX2lkJzogdm9kSWQgfSk7CiAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBfZmV0Y2goYCR7dGhpcy5ob3N0fS92My9ob21lL3ZvZF9kZXRhaWxzYCwgewogICAgICAgICAgICBtZXRob2Q6ICdwb3N0JywKICAgICAgICAgICAgaGVhZGVyczogeyAuLi50aGlzLmhlYWRlcnMsICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LAogICAgICAgICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKGRhdGEpLnRvU3RyaW5nKCkKICAgICAgICB9KTsKICAgICAgICBsZXQgdiA9IEpTT04ucGFyc2UoYXdhaXQgcmVzcC50ZXh0KCkpLmRhdGE7CiAgICAgICAgbGV0IFZPRCA9IHsKICAgICAgICAgICAgdm9kX2lkOiB2LnZvZF9pZC50b1N0cmluZygpLAogICAgICAgICAgICB2b2RfbmFtZTogdi52b2RfbmFtZSwKICAgICAgICAgICAgdHlwZV9uYW1lOiB2LnR5cGVfbmFtZSwKICAgICAgICAgICAgdm9kX3llYXI6IHYudm9kX3llYXIsCiAgICAgICAgICAgIHZvZF9hcmVhOiB2LnZvZF9hcmVhLAogICAgICAgICAgICB2b2RfcmVtYXJrczogdi52b2RfcmVtYXJrcywKICAgICAgICAgICAgdm9kX2FjdG9yOiB2LnZvZF9hY3RvciwKICAgICAgICAgICAgdm9kX2RpcmVjdG9yOiB2LnZvZF9kaXJlY3RvciwKICAgICAgICAgICAgdm9kX2NvbnRlbnQ6ICh2LnZvZF9jb250ZW50IHx8ICfml6AnKS5yZXBsYWNlKC88W14+XSo+L2csICcnKS50cmltKCkKICAgICAgICB9OwogICAgICAgIGxldCBuID0gW107CiAgICAgICAgbGV0IHAgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGkgb2Ygdi52b2RfcGxheV9saXN0KSB7CiAgICAgICAgICAgIGxldCBwYXJzZXMgPSBpLnBhcnNlX3VybHMuam9pbignLCcpOwogICAgICAgICAgICBsZXQgdXJscyA9IGkudXJscy5tYXAoaiA9PiBgJHtqLm5hbWV9JCR7ai51cmx9QCR7cGFyc2VzfUAke2kudWEgfHwgJyd9QCR7aS5yZWZlcmVyIHx8ICcnfWApOwogICAgICAgICAgICBwLnB1c2godXJscy5qb2luKCcjJykpOwogICAgICAgICAgICBsZXQgbmFtZSA9IChpLnRpdGxlIHx8IGkubmFtZSB8fCAnJykucmVwbGFjZSgvW1wo77yIXSg/OueCueWHu3zmjaIpW14pXSpbXCnvvIldfFta4pa24p2k44CQXS4qL2csICcnKTsKICAgICAgICAgICAgbi5wdXNoKG5hbWUgPT09IGkuZmxhZyA/IG5hbWUgOiBgJHtuYW1lfSgke2kuZmxhZ30pYCk7CiAgICAgICAgfQogICAgICAgIFZPRC52b2RfcGxheV9mcm9tID0gbi5qb2luKCckJCQnKTsKICAgICAgICBWT0Qudm9kX3BsYXlfdXJsID0gcC5qb2luKCckJCQnKTsKICAgICAgICByZXR1cm4gVk9EOwogICAgfSwKICAgIAogICAg5pCc57SiOiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IGZpbGVzID0gewogICAgICAgICAgICAnbGltaXQnOiAnMTInLAogICAgICAgICAgICAncGFnZSc6IHRoaXMuTVlfUEFHRSwKICAgICAgICAgICAgJ2tleXdvcmQnOiB0aGlzLktFWQogICAgICAgIH07CiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmdldGZpbGVzKGZpbGVzKTsKICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IF9mZXRjaChgJHt0aGlzLmhvc3R9L3YzL2hvbWUvc2VhcmNoYCwgewogICAgICAgICAgICBtZXRob2Q6ICdwb3N0JywKICAgICAgICAgICAgaGVhZGVyczogeyAuLi50aGlzLmhlYWRlcnMsICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LAogICAgICAgICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKGRhdGEpLnRvU3RyaW5nKCkKICAgICAgICB9KTsKICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVzcC50ZXh0KCkpOwogICAgICAgIGxldCB2aWRlb3MgPSB0aGlzLmdldHYoanNvbi5kYXRhLmxpc3QpOwogICAgICAgIHJldHVybiBzZXRSZXN1bHQodmlkZW9zKTsKICAgIH0sCiAgICAKICAgIGxhenk6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgW3Jhd191cmwsIHBhcnNlc1N0ciA9ICcnLCB1YSA9ICcnLCByZWZlcmVyID0gJyddID0gdGhpcy5pbnB1dC5zcGxpdCgnQCcpOwogICAgICAgIGxldCBwYXJzZXMgPSBwYXJzZXNTdHIgPyBwYXJzZXNTdHIuc3BsaXQoJywnKSA6IFtdOwogICAgICAgIGxldCBwbGF5X2hlYWRlcnMgPSB7fTsKICAgICAgICBpZiAodWEpIHBsYXlfaGVhZGVyc1snVXNlci1BZ2VudCddID0gdWE7CiAgICAgICAgaWYgKHJlZmVyZXIpIHBsYXlfaGVhZGVyc1snUmVmZXJlciddID0gcmVmZXJlcjsKICAgICAgICBsZXQgZmluYWxfdXJsID0gJyc7CiAgICAgICAgbGV0IGp4ID0gMDsKICAgICAgICBmb3IgKGNvbnN0IHBhcnNlIG9mIHBhcnNlcykgewogICAgICAgICAgICBpZiAocGFyc2Uuc3RhcnRzV2l0aCgnaHR0cCcpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBfZmV0Y2gocGFyc2UgKyByYXdfdXJsLCB7IGhlYWRlcnM6IHRoaXMuaGVhZGVycyB9KTsKICAgICAgICAgICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVzLnRleHQoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24udXJsICYmIGpzb24udXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF91cmwgPSBqc29uLnVybDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFmaW5hbF91cmwgJiYgcmF3X3VybC5zdGFydHNXaXRoKCdodHRwJykpIHsKICAgICAgICAgICAgZmluYWxfdXJsID0gcmF3X3VybDsKICAgICAgICAgICAgaWYgKC8oPzp3d3dcLmlxaXlpfHZcLnFxfHZcLnlvdWt1fHd3d1wubWd0dnx3d3dcLmJpbGliaWxpKVwuY29tLy50ZXN0KHJhd191cmwpKSB7CiAgICAgICAgICAgICAgICBqeCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGFyc2U6IGp4LAogICAgICAgICAgICB1cmw6IGZpbmFsX3VybCwKICAgICAgICAgICAgaGVhZGVyOiBwbGF5X2hlYWRlcnMKICAgICAgICB9OwogICAgfQp9Ow== \ No newline at end of file diff --git "a/spider/js/\347\225\252\350\214\204\345\260\217\350\257\264[\344\271\246].js" "b/spider/js/\347\225\252\350\214\204\345\260\217\350\257\264[\344\271\246].js" index 7a5a2929..bcb373ef 100644 --- "a/spider/js/\347\225\252\350\214\204\345\260\217\350\257\264[\344\271\246].js" +++ "b/spider/js/\347\225\252\350\214\204\345\260\217\350\257\264[\344\271\246].js" @@ -6,6 +6,7 @@ title: '番茄小说[书]', author: '道长', '类型': '小说', + logo: 'https://www.18zf.net/d/file/p/2023/1107/3ty5orktxrc.jpg', lang: 'ds' }) */ diff --git "a/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" "b/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" index d55334d0..9411cfbc 100644 --- "a/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" +++ "b/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" @@ -5,9 +5,10 @@ quickSearch: 0, title: '番茄畅听', author: 'EylinSir', + logo: 'https://www.18zf.net/d/file/p/2023/1107/3ty5orktxrc.jpg', '类型': '听书', lang: 'ds' }) */ -dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICflkKzkuaYnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICfnlarojITnlYXlkKwnLAogICAgaG9zdDogJ2h0dHBzOi8vcWtmcWFwaS52djl2LmNuJywKICAgIHVybDogJy9hcGkvZGlzY292ZXI/dGFiPeWQrOS5piZ0eXBlPWZ5Y2xhc3MmZ2VuZGVyPTImZ2VucmVfdHlwZT0xJnBhZ2U9e3twYWdlfX0nLAogICAgc2VhcmNoVXJsOiAnL2FwaS9zZWFyY2g/a2V5PSoqJnRhYl90eXBlPTImb2Zmc2V0PSgoZnlwYWdlLTEpKjEwKScsCiAgICBkZXRhaWxVcmw6ICcvYXBpL2RldGFpbD9ib29rX2lkPWZ5aWQnLAogICAgaGVhZGVyczogeydVc2VyLUFnZW50JzogJ1VDX1VBJ30sCiAgICBzZWFyY2hhYmxlOiAxLAogICAgcXVpY2tTZWFyY2g6IDAsCiAgICBmaWx0ZXJhYmxlOiAxLAogICAgZG91YmxlOiB0cnVlLAogICAgcGxheV9wYXJzZTogdHJ1ZSwKICAgIGxpbWl0OiAxMiwKICAgIGNsYXNzX25hbWU6ICfnsr7lk4HlsI/or7Qm55u45aOw6K+E5LmmJuS4lueVjOWOhuWPsiblkI3okZfop6Por7sm5a2m5Lmg5oiQ6ZW/JuaIj+absuiJuuacrybnlJ/mtLvnmb7np5Em5a625bqt5pWZ6IKyJuS6uuaWh+enkeWtpiblhbbku5YnLAogICAgY2xhc3NfdXJsOiAnODk5JjQ0NSYxMiYxMzImNDQ5JjExMyY5NjAmNDUwJjQ0NyYzOScsCiAgICBmaWx0ZXI6IHsKICAgICAgICAiODk5IjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6Ijg5OSJ9LHsibiI6IumDveW4giIsInYiOiIxIn0seyJuIjoi56m/6LaKIiwidiI6IjM3In0seyJuIjoi546w5Luj6KiA5oOFIiwidiI6IjMifSx7Im4iOiLlj6Tku6PoqIDmg4UiLCJ2IjoiNSJ9LHsibiI6IuaAu+ijgSIsInYiOiIyOSJ9LHsibiI6IueOhOW5uyIsInYiOiI3In0seyJuIjoi6YeN55SfIiwidiI6IjM2In0seyJuIjoi5oKs55aRIiwidiI6IjEwIn0seyJuIjoi54G15byCIiwidiI6IjEwMCJ9LHsibiI6Iuezu+e7nyIsInYiOiIxOSJ9LHsibiI6IuenjeeUsCIsInYiOiIyMyJ9LHsibiI6IueUnOWuoCIsInYiOiI5NiJ9LHsibiI6IuWuoOWmuyIsInYiOiIzMCJ9LHsibiI6IumDveW4gueUn+a0uyIsInYiOiIyIn0seyJuIjoi6LWY5am/IiwidiI6IjI1In0seyJuIjoi5YWI5ama5ZCO54ixIiwidiI6IjI2NSJ9LHsibiI6IuWuq+aWl+WuheaWlyIsInYiOiIyNDYifSx7Im4iOiLpg73luILml6XluLgiLCJ2IjoiMjYxIn0seyJuIjoi5oiY56We6LWY5am/IiwidiI6IjI3In0seyJuIjoi56We5Yy7IiwidiI6IjI2In0seyJuIjoi5b2x6KeG5bCP6K+0IiwidiI6IjQ1In0seyJuIjoi5Zu95YaF5b2x6KeGIiwidiI6Ijk5MSJ9LHsibiI6IuWbveWkluW9seinhiIsInYiOiI5OTIifSx7Im4iOiLnsr7lk4HlsI/or7QiLCJ2IjoiOTcwIn0seyJuIjoi5oKs55aR5o6o55CGIiwidiI6IjE2NSJ9LHsibiI6IuenkeW5u+Wwj+ivtCIsInYiOiIxNjYifSx7Im4iOiLmrabkvqDlsI/or7QiLCJ2IjoiOTkzIn0seyJuIjoi546E5bm75bCP6K+0IiwidiI6Ijk3MSJ9LHsibiI6IueOsOWunuWwj+ivtCIsInYiOiI0MDAifSx7Im4iOiLmg4XmhJ/lsI/or7QiLCJ2IjoiOTcyIn0seyJuIjoi5Lyg57uf546E5bm7IiwidiI6IjI1OCJ9LHsibiI6IueOi+WmgyIsInYiOiI4NSJ9LHsibiI6IuWlh+W5u+S7meS+oCIsInYiOiIyNTkifSx7Im4iOiLokIzlrp0iLCJ2IjoiMjgifSx7Im4iOiLpg73luILohJHmtJ4iLCJ2IjoiMjYyIn0seyJuIjoi6IGM5Zy6IiwidiI6IjEyNyJ9LHsibiI6IuWroeWlsyIsInYiOiI4OCJ9LHsibiI6IumDveW4guS/ruecnyIsInYiOiIxMjQifSx7Im4iOiLlubvmg7PoqIDmg4UiLCJ2IjoiMzIifSx7Im4iOiLnpZ7osaoiLCJ2IjoiMjAifSx7Im4iOiLnqbrpl7QiLCJ2IjoiNDQifSx7Im4iOiLlhbbku5YiLCJ2IjoiMzEifSx7Im4iOiLnjoTlubvoqIDmg4UiLCJ2IjoiMjQ4In0seyJuIjoi546E5bm76ISR5rSeIiwidiI6IjI1NyJ9LHsibiI6IuWOhuWPsuWPpOS7oyIsInYiOiIyNzMifSx7Im4iOiLnp5HlubvmnKvkuJYiLCJ2IjoiOCJ9LHsibiI6IuW5tOS7oyIsInYiOiI3OSJ9LHsibiI6IuWkqeaJjSIsInYiOiI5MCJ9LHsibiI6IuWls+W8uiIsInYiOiI4NiJ9LHsibiI6IuaOqOeQhiIsInYiOiI2MSJ9LHsibiI6IuiFuem7kSIsInYiOiI5MiJ9LHsibiI6IuivuOWkqeS4h+eVjCIsInYiOiI3MSJ9LHsibiI6IuWMu+acryIsInYiOiIyNDcifSx7Im4iOiLmmJ/pmYUiLCJ2IjoiNzcifSx7Im4iOiLpibTlrp0iLCJ2IjoiMTcifSx7Im4iOiLlm6LlrqAiLCJ2IjoiOTQifSx7Im4iOiLmia7njKrlkIPomY4iLCJ2IjoiOTMifSx7Im4iOiLmrabkvqAiLCJ2IjoiMTYifSx7Im4iOiLnjrDoqIDohJHmtJ4iLCJ2IjoiMjY3In0seyJuIjoi6YO95biC56eN55SwIiwidiI6IjI2MyJ9LHsibiI6IuaXoOaVjCIsInYiOiIzODQifSx7Im4iOiLnm5flopMiLCJ2IjoiODEifSx7Im4iOiLpqaznlLIiLCJ2IjoiMjY2In0seyJuIjoi55qH5ZCOIiwidiI6Ijg0In0seyJuIjoi54m556eN5YW1IiwidiI6IjM3NSJ9LHsibiI6IuWkp+WUkCIsInYiOiI3MyJ9LHsibiI6IuWFrOS4uyIsInYiOiI4MyJ9LHsibiI6IuWoseS5kOWciCIsInYiOiI0MyJ9LHsibiI6IumdkuaiheeruemprCIsInYiOiIzODcifSx7Im4iOiLlj6ToqIDohJHmtJ4iLCJ2IjoiMjUzIn0seyJuIjoi5Y6G5Y+y6ISR5rSeIiwidiI6IjI3MiJ9LHsibiI6Iuacq+S4liIsInYiOiI2OCJ9LHsibiI6IuWJkemBkyIsInYiOiI4MCJ9LHsibiI6IueOsOiogOeUnOWuoCIsInYiOiIzOTUifSx7Im4iOiLmuLjmiI/liqjmvKsiLCJ2IjoiNTcifSx7Im4iOiLmtKrojZIiLCJ2IjoiNjYifSx7Im4iOiLlv6vnqb8iLCJ2IjoiMjQifSx7Im4iOiLmmI7mnJ0iLCJ2IjoiMTI2In0seyJuIjoi5aSW5Y2WIiwidiI6Ijc1In0seyJuIjoi5qCh6IqxIiwidiI6IjM4NSJ9LHsibiI6IuWltueIuCIsInYiOiI0MiJ9LHsibiI6IuagoeWbrSIsInYiOiI0In0seyJuIjoi5LiJ5Zu9IiwidiI6IjY3In0seyJuIjoi55u05pKtIiwidiI6IjY5In0seyJuIjoi56m/5LmmIiwidiI6IjM4MiJ9LHsibiI6Iua1t+WymyIsInYiOiI0MCJ9LHsibiI6Iue+jumjnyIsInYiOiI3OCJ9LHsibiI6IuWPjea0viIsInYiOiIzNjkifSx7Im4iOiLnjrDoqIDlpI3ku4ciLCJ2IjoiMjY4In0seyJuIjoi6KW/5ri46KGN55SfIiwidiI6IjM3MyJ9LHsibiI6IuaxgueUnyIsInYiOiIzNzkifSx7Im4iOiLmsJHlm70iLCJ2IjoiMzkwIn0seyJuIjoi5a625bqtIiwidiI6IjEyNSJ9LHsibiI6IuWtpumcuCIsInYiOiI4MiJ9LHsibiI6Iueah+WPlCIsInYiOiI4NyJ9LHsibiI6IuWuoOeJqSIsInYiOiI3NCJ9LHsibiI6IuaXoENQIiwidiI6IjM5MiJ9LHsibiI6IuWls+aJrueUt+ijhSIsInYiOiIzODgifSx7Im4iOiLnvZHmuLgiLCJ2IjoiMzcyIn0seyJuIjoi55eF5aiHIiwidiI6IjM4MCJ9LHsibiI6IueyvueBtSIsInYiOiI4OSJ9LHsibiI6IuiZkOaWhyIsInYiOiI5NSJ9LHsibiI6IumDveW4gumdkuaYpSIsInYiOiIzOTYifSx7Im4iOiLmuIXnqb8iLCJ2IjoiNzYifV19XSwKICAgICAgICAiNDQ1IjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjQ0NSJ9LHsibiI6IumDreW+t+e6siIsInYiOiIxMjgifSx7Im4iOiLnlLDov57lhYMiLCJ2IjoiMjAzIn0seyJuIjoi5YiY5YWw6IqzIiwidiI6IjIwMiJ9LHsibiI6IuWwj+WTgSIsInYiOiIxMTQifSx7Im4iOiLoooHpmJTmiJAiLCJ2IjoiMjA0In0seyJuIjoi5Y2V55Sw6IqzIiwidiI6IjIwMSJ9LHsibiI6IuivhOS5piIsInYiOiIxMTAifSx7Im4iOiLnm7jlo7AiLCJ2IjoiMTExIn1dfV0sCiAgICAgICAgIjEyIjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjEyIn0seyJuIjoi6a2P5pmL5Y2X5YyX5pydIiwidiI6IjIwOSJ9LHsibiI6IuenpuaxiSIsInYiOiIyMDgifSx7Im4iOiLkuJbnlYzlj7IiLCJ2IjoiMjE0In0seyJuIjoi5ZSQ5a6LIiwidiI6IjIxMCJ9LHsibiI6IuaYjua4hSIsInYiOiIyMTEifSx7Im4iOiLov5HnjrDku6MiLCJ2IjoiMjEzIn0seyJuIjoi5Lit5Zu95Y+yIiwidiI6IjIxMiJ9LHsibiI6IuaImOS6ieWPsiIsInYiOiIyMDYifSx7Im4iOiLlkI3kurrkvKAiLCJ2IjoiMjA3In0seyJuIjoi5Lit5Zu95Y6G5Y+yIiwidiI6IjQwMiJ9LHsibiI6IuS4lueVjOWOhuWPsiIsInYiOiI0MDMifSx7Im4iOiLljoblj7LlsI/or7QiLCJ2IjoiOTg4In0seyJuIjoi5Y6G5Y+y5paH5YyWIiwidiI6IjI0MSJ9XX1dLAogICAgICAgICIxMzIiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLlhajpg6giLCJ2IjoiMTMyIn0seyJuIjoi5oiY5LqJIiwidiI6Ijk3In0seyJuIjoi5Lit5Zu95ZCN6JGXIiwidiI6Ijk4In0seyJuIjoi5aSW5Zu95ZCN6JGXIiwidiI6Ijk5In0seyJuIjoi57uP566h5Yqx5b+XIiwidiI6IjI0MiJ9LHsibiI6IuS6uueJqeS8oOiusCIsInYiOiI0MDkifSx7Im4iOiLnu4/lhbjmloflraYiLCJ2IjoiMjQzIn0seyJuIjoi6Z2S5pil5paH5a2mIiwidiI6IjE2OCJ9LHsibiI6IuaImOS6ieWGm+aXhSIsInYiOiI5NzMifV19XSwKICAgICAgICAiNDQ5IjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjQ0OSJ9LHsibiI6IuazleW+iyIsInYiOiIxNDIifSx7Im4iOiLlv4PnkIYiLCJ2IjoiMTQ2In0seyJuIjoi5b+D55CG5a2mIiwidiI6IjQwNyJ9LHsibiI6IuWwkeWEv+W/g+eQhiIsInYiOiI5ODYifSx7Im4iOiLlv4PnkIbnlpfmhIgiLCJ2IjoiOTk0In0seyJuIjoi5oqV6LWE55CG6LSiIiwidiI6IjE0MyJ9LHsibiI6IuiBjOS4muiBjOWcuiIsInYiOiIxNDUifSx7Im4iOiLnu4/nrqHllYbkuJoiLCJ2IjoiMjM4In0seyJuIjoi5rKf6YCa6KGo6L6+IiwidiI6IjE0NCJ9LHsibiI6IuWKseW/l+aIkOWKnyIsInYiOiIyMzkifV19XSwKICAgICAgICAiMTEzIjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjExMyJ9LHsibiI6IuS6rOWJpyIsInYiOiIxNzEifSx7Im4iOiLotorliaciLCJ2IjoiMTcyIn0seyJuIjoi6buE5qKF5oiPIiwidiI6IjE3MyJ9LHsibiI6IuivhOWJpyIsInYiOiIxNzQifSx7Im4iOiLosavliaciLCJ2IjoiMTc1In0seyJuIjoi5piG5puyIiwidiI6IjE3NiJ9LHsibiI6IuiJuuacryIsInYiOiIxMzQifSx7Im4iOiLoibrmnK/mlofljJYiLCJ2IjoiOTQ1In0seyJuIjoi6Z+z5LmQ6Iie6LmIIiwidiI6Ijk0NiJ9LHsibiI6Iue7mOeUuyIsInYiOiI5NTkifSx7Im4iOiLmkYTlvbEiLCJ2IjoiOTYxIn0seyJuIjoi6Ym06LWP55CG6K66IiwidiI6Ijk2MiJ9XX1dLAogICAgICAgICI5NjAiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLlhajpg6giLCJ2IjoiOTYwIn0seyJuIjoi576O6aOf54O56aWqIiwidiI6IjI0MCJ9LHsibiI6IuaXhea4uCIsInYiOiIxNTgifSx7Im4iOiLlgaXlurflhbvnlJ8iLCJ2IjoiMTU5In0seyJuIjoi6L+Q5Yqo5YGl6LqrIiwidiI6IjQxNyJ9LHsibiI6IuaXtuWwmue+juWmhiIsInYiOiI0MTgifSx7Im4iOiLnvo7po5/kvJHpl7IiLCJ2IjoiNDE5In0seyJuIjoi5a625bGF5peF5ri4IiwidiI6IjQyMCJ9LHsibiI6IumjjuawtOWNoOWNnCIsInYiOiI0MjEifSx7Im4iOiLnmb7np5HluLjor4YiLCJ2IjoiOTYzIn0seyJuIjoi55Sf5rS75oOF5oSfIiwidiI6Ijk2NCJ9XX1dLAogICAgICAgICI0NTAiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLlhajpg6giLCJ2IjoiNDUwIn0seyJuIjoi5Lqy5a2QIiwidiI6IjQ0NyJ9LHsibiI6IuWpmuWnuyIsInYiOiIyMzQifSx7Im4iOiLnvo7mlociLCJ2IjoiMjMwIn0seyJuIjoi5aSc6K+dIiwidiI6IjIzMiJ9LHsibiI6IuWls+aApyIsInYiOiIyMzEifSx7Im4iOiLlv4PnkIblgaXlurciLCJ2IjoiMjMzIn0seyJuIjoi5oOF5oSf5pWF5LqLIiwidiI6IjIyOSJ9LHsibiI6IuS6p+WQjuaKpOeQhiIsInYiOiIyMjYifSx7Im4iOiLlhL/nq6Xoi7Hor60iLCJ2IjoiMjIyIn0seyJuIjoi5a2V5pyf5L+d5YGlIiwidiI6IjIyNyJ9LHsibiI6IuS6suWtkOWBpeW6tyIsInYiOiIyMjgifSx7Im4iOiLnp5Hmma4iLCJ2IjoiMjIzIn0seyJuIjoi5Zu95a2m5Y6G5Y+yIiwidiI6IjIyNCJ9LHsibiI6IuiDjuaVmeaXqeaVmSIsInYiOiIyMjUifSx7Im4iOiLlhL/nq6XmloflraYiLCJ2IjoiMjIwIn1dfV0sCiAgICAgICAgIjQ0NyI6IFt7a2V5OiAidHlwZSIsIG5hbWU6ICLnsbvlnosiLCB2YWx1ZTogW3sibiI6IuWFqOmDqCIsInYiOiI0NDcifSx7Im4iOiLnp5HlrabmioDmnK8iLCJ2IjoiMTAwMCJ9LHsibiI6IuiHqueEtuenkeWtpiIsInYiOiIxMzYifSx7Im4iOiLkvZvlraYiLCJ2IjoiMTE1In0seyJuIjoi56S+56eRIiwidiI6IjIzNyJ9LHsibiI6IuWbveWtpiIsInYiOiIxMTYifSx7Im4iOiLmlaPmlofmiI/liaciLCJ2IjoiMjM2In0seyJuIjoi5paH5YyWIiwidiI6IjExOCJ9LHsibiI6IuaKgOacryIsInYiOiI5NjkifSx7Im4iOiLnp5HlraYiLCJ2IjoiOTc5In0seyJuIjoi5bel5LiaIiwidiI6Ijk4MCJ9LHsibiI6IuWGnOael+eJp+a4lCIsInYiOiI5ODEifSx7Im4iOiLorqHnrpfmnLoiLCJ2IjoiOTgyIn0seyJuIjoi5bu6562R5Zut5p6XIiwidiI6Ijk4MyJ9XX1dLAogICAgICAgICIzOSI6IFt7a2V5OiAidHlwZSIsIG5hbWU6ICLnsbvlnosiLCB2YWx1ZTogW3sibiI6IuS6jOasoeWFgyIsInYiOiIzOSJ9LHsibiI6IuWoseS5kCIsInYiOiIxMjEifSx7Im4iOiLnuqrlvZUiLCJ2IjoiMTMzIn0seyJuIjoi5paw6Ze7IiwidiI6IjQ0NiJ9XX1dCiAgICB9LAoKICAgIOS4gOe6pzogYXN5bmMgZnVuY3Rpb24gKHRpZCwgcGcsIGZpbHRlciwgZXh0ZW5kKSB7CiAgICAgICAgbGV0IHBhZ2UgPSBwZyB8fCAxOwogICAgICAgIGxldCB0eXBlSWQgPSAoZXh0ZW5kICYmIGV4dGVuZC50eXBlKSA/IGV4dGVuZC50eXBlIDogdGlkOwogICAgICAgIGxldCBmaW5hbFVybCA9IGAke3RoaXMuaG9zdH0vYXBpL2Rpc2NvdmVyP3RhYj3lkKzkuaYmdHlwZT0ke3R5cGVJZH0mZ2VuZGVyPTImZ2VucmVfdHlwZT0xJnBhZ2U9JHtwYWdlfWA7CiAgICAgICAgbGV0IGpzb24gPSBhd2FpdCByZXF1ZXN0KGZpbmFsVXJsKTsKICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgICAgbGV0IGJvb2tfbGlzdCA9IGRhdGEuY29kZSA9PT0gMjAwID8gZGF0YS5kYXRhIDogW107CiAgICAgICAgbGV0IGQgPSBbXTsKICAgICAgICBib29rX2xpc3QuZm9yRWFjaCgoaXQpID0+IHsKICAgICAgICAgICAgZC5wdXNoKHsKICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5ib29rX25hbWUgfHwgaXQuQm9va05hbWUsCiAgICAgICAgICAgICAgICB1cmw6IGl0LmJvb2tfaWQgfHwgaXQuQm9va0lkLAogICAgICAgICAgICAgICAgZGVzYzogaXQuYXV0aG9yIHx8IGl0LkF1dGhvciwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0LmFic3RyYWN0IHx8IGl0LkFic3RyYWN0IHx8IGl0LmJvb2tfYWJzdHJhY3RfdjIsCiAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdC50aHVtYl91cmwgfHwgaXQuVGh1bWJVUkwgfHwgaXQuYXVkaW9fdGh1bWJfdXJpCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGQpOwogICAgfSwKCiAgICDkuoznuqc6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgZGV0YWlsQXBpID0gYCR7dGhpcy5ob3N0fS9hcGkvZGV0YWlsP2Jvb2tfaWQ9JHt0aGlzLm9ySWR9YDsKICAgICAgICBsZXQgZGV0YWlsSnNvbiA9IGF3YWl0IHJlcXVlc3QoZGV0YWlsQXBpKTsKICAgICAgICBsZXQgZGV0YWlsRGF0YSA9IEpTT04ucGFyc2UoZGV0YWlsSnNvbik7CiAgICAgICAgbGV0IGRhdGEgPSBkZXRhaWxEYXRhLmRhdGEuZGF0YTsKICAgICAgICBsZXQgY2hhcHRlcnNBcGkgPSBgJHt0aGlzLmhvc3R9L2FwaS9ib29rP2Jvb2tfaWQ9JHt0aGlzLm9ySWR9YDsKICAgICAgICBsZXQgY2hhcHRlcnNKc29uID0gYXdhaXQgcmVxdWVzdChjaGFwdGVyc0FwaSk7CiAgICAgICAgbGV0IGNoYXB0ZXJzRGF0YSA9IEpTT04ucGFyc2UoY2hhcHRlcnNKc29uKTsKICAgICAgICBsZXQgYm9va0RhdGEgPSBjaGFwdGVyc0RhdGEuZGF0YS5kYXRhOwogICAgICAgIGxldCBsaXN0ID0gYm9va0RhdGEuY2hhcHRlckxpc3RXaXRoVm9sdW1lPy5mbGF0KCkgfHwgYm9va0RhdGEuY2hhcHRlckxpc3QgfHwgW107CiAgICAgICAgbGV0IHVybHMgPSBsaXN0Lm1hcChpdCA9PiBpdC50aXRsZSArICckJyArIGl0Lml0ZW1JZCArICdAJyArIGl0LnRpdGxlKS5qb2luKCcjJyk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdm9kX2lkOiB0aGlzLm9ySWQsCiAgICAgICAgICAgIHZvZF9uYW1lOiBkYXRhLmJvb2tfbmFtZSwKICAgICAgICAgICAgdHlwZV9uYW1lOiBkYXRhLmNhdGVnb3J5LAogICAgICAgICAgICB2b2RfcGljOiBkYXRhLnRodW1iX3VybCB8fCBkYXRhLmV4cGFuZF90aHVtYl91cmwsCiAgICAgICAgICAgIHZvZF9jb250ZW50OiBkYXRhLmFic3RyYWN0IHx8IGRhdGEuYm9va19hYnN0cmFjdF92MiwKICAgICAgICAgICAgdm9kX3JlbWFya3M6IGRhdGEuc3ViX2luZm8sCiAgICAgICAgICAgIHZvZF9kaXJlY3RvcjogZGF0YS5hdXRob3IsCiAgICAgICAgICAgIHZvZF9wbGF5X2Zyb206ICfnlarojITnlYXlkKwnLAogICAgICAgICAgICB2b2RfcGxheV91cmw6IHVybHMKICAgICAgICB9OwogICAgfSwKCiAgICDmkJzntKI6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQge2lucHV0fSA9IHRoaXM7CiAgICAgICAgbGV0IGh0bWwgPSBhd2FpdCByZXF1ZXN0KGlucHV0KTsKICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaHRtbCk7CiAgICAgICAgbGV0IGRhdGEgPSBqc29uLmRhdGEuc2VhcmNoX3RhYnNbNF0uZGF0YTsKICAgICAgICBsZXQgZCA9IFtdOwogICAgICAgIGZvciAobGV0IGl0IG9mIGRhdGEuZmlsdGVyKGkgPT4gaS5ib29rX2RhdGEpKSB7CiAgICAgICAgICAgIGxldCBib29rID0gaXQuYm9va19kYXRhWzBdOwogICAgICAgICAgICBkLnB1c2goewogICAgICAgICAgICAgICAgdGl0bGU6IGJvb2suYm9va19uYW1lLAogICAgICAgICAgICAgICAgdXJsOiBib29rLmJvb2tfaWQsCiAgICAgICAgICAgICAgICBkZXNjOiBib29rLmF1dGhvciwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGJvb2suYm9va19hYnN0cmFjdCB8fCBib29rLmFic3RyYWN0LAogICAgICAgICAgICAgICAgcGljX3VybDogYm9vay50aHVtYl91cmwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZXRSZXN1bHQoZCk7CiAgICB9LAoKICAgIGxhenk6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQge2lucHV0fSA9IHRoaXM7CiAgICAgICAgbGV0IHBhcnRzID0gaW5wdXQuc3BsaXQoJ0AnKTsKICAgICAgICBsZXQgaXRlbUlkID0gcGFydHNbMF07CiAgICAgICAgbGV0IHRvbmVJZCA9ICcxJzsKICAgICAgICBsZXQgY29udGVudF91cmwgPSBgJHt0aGlzLmhvc3R9L2FwaS9jb250ZW50P2l0ZW1faWQ9JHtpdGVtSWR9JnRhYj3lkKzkuaYmdG9uZV9pZD0ke3RvbmVJZH1gOwogICAgICAgIGxldCBqc29uU3RyID0gYXdhaXQgcmVxdWVzdChjb250ZW50X3VybCk7CiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGpzb25TdHIpOwogICAgICAgIHJldHVybiB7cGFyc2U6IDAsIHVybDogZGF0YS5kYXRhLmNvbnRlbnR9OwogICAgfQp9Ow== \ No newline at end of file +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICflkKzkuaYnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICfnlarojITnlYXlkKwnLAogICAgaG9zdDogJ2h0dHBzOi8vcWtmcWFwaS52djl2LmNuJywKICAgIHVybDogJy9hcGkvZGlzY292ZXI/dGFiPeWQrOS5piZ0eXBlPWZ5Y2xhc3MmZ2VuZGVyPTImZ2VucmVfdHlwZT0xJnBhZ2U9e3twYWdlfX0nLAogICAgc2VhcmNoVXJsOiAnL2FwaS9zZWFyY2g/a2V5PSoqJnRhYl90eXBlPTImb2Zmc2V0PSgoZnlwYWdlLTEpKjEwKScsCiAgICBkZXRhaWxVcmw6ICcvYXBpL2RldGFpbD9ib29rX2lkPWZ5aWQnLAogICAgaGVhZGVyczogeydVc2VyLUFnZW50JzogJ1VDX1VBJ30sCiAgICBzZWFyY2hhYmxlOiAxLAogICAgcXVpY2tTZWFyY2g6IDAsCiAgICBmaWx0ZXJhYmxlOiAxLAogICAgZG91YmxlOiB0cnVlLAogICAgcGxheV9wYXJzZTogdHJ1ZSwKICAgIGxpbWl0OiAxMiwKICAgIGNsYXNzX25hbWU6ICfnsr7lk4HlsI/or7Qm55u45aOw6K+E5LmmJuS4lueVjOWOhuWPsiblkI3okZfop6Por7sm5a2m5Lmg5oiQ6ZW/JuaIj+absuiJuuacrybnlJ/mtLvnmb7np5Em5a625bqt5pWZ6IKyJuS6uuaWh+enkeWtpiblhbbku5YnLAogICAgY2xhc3NfdXJsOiAnODk5JjQ0NSYxMiYxMzImNDQ5JjExMyY5NjAmNDUwJjQ0NyYzOScsCiAgICBmaWx0ZXI6IHsKICAgICAgICAiODk5IjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6Ijg5OSJ9LHsibiI6IumDveW4giIsInYiOiIxIn0seyJuIjoi56m/6LaKIiwidiI6IjM3In0seyJuIjoi546w5Luj6KiA5oOFIiwidiI6IjMifSx7Im4iOiLlj6Tku6PoqIDmg4UiLCJ2IjoiNSJ9LHsibiI6IuaAu+ijgSIsInYiOiIyOSJ9LHsibiI6IueOhOW5uyIsInYiOiI3In0seyJuIjoi6YeN55SfIiwidiI6IjM2In0seyJuIjoi5oKs55aRIiwidiI6IjEwIn0seyJuIjoi54G15byCIiwidiI6IjEwMCJ9LHsibiI6Iuezu+e7nyIsInYiOiIxOSJ9LHsibiI6IuenjeeUsCIsInYiOiIyMyJ9LHsibiI6IueUnOWuoCIsInYiOiI5NiJ9LHsibiI6IuWuoOWmuyIsInYiOiIzMCJ9LHsibiI6IumDveW4gueUn+a0uyIsInYiOiIyIn0seyJuIjoi6LWY5am/IiwidiI6IjI1In0seyJuIjoi5YWI5ama5ZCO54ixIiwidiI6IjI2NSJ9LHsibiI6IuWuq+aWl+WuheaWlyIsInYiOiIyNDYifSx7Im4iOiLpg73luILml6XluLgiLCJ2IjoiMjYxIn0seyJuIjoi5oiY56We6LWY5am/IiwidiI6IjI3In0seyJuIjoi56We5Yy7IiwidiI6IjI2In0seyJuIjoi5b2x6KeG5bCP6K+0IiwidiI6IjQ1In0seyJuIjoi5Zu95YaF5b2x6KeGIiwidiI6Ijk5MSJ9LHsibiI6IuWbveWkluW9seinhiIsInYiOiI5OTIifSx7Im4iOiLnsr7lk4HlsI/or7QiLCJ2IjoiOTcwIn0seyJuIjoi5oKs55aR5o6o55CGIiwidiI6IjE2NSJ9LHsibiI6IuenkeW5u+Wwj+ivtCIsInYiOiIxNjYifSx7Im4iOiLmrabkvqDlsI/or7QiLCJ2IjoiOTkzIn0seyJuIjoi546E5bm75bCP6K+0IiwidiI6Ijk3MSJ9LHsibiI6IueOsOWunuWwj+ivtCIsInYiOiI0MDAifSx7Im4iOiLmg4XmhJ/lsI/or7QiLCJ2IjoiOTcyIn0seyJuIjoi5Lyg57uf546E5bm7IiwidiI6IjI1OCJ9LHsibiI6IueOi+WmgyIsInYiOiI4NSJ9LHsibiI6IuWlh+W5u+S7meS+oCIsInYiOiIyNTkifSx7Im4iOiLokIzlrp0iLCJ2IjoiMjgifSx7Im4iOiLpg73luILohJHmtJ4iLCJ2IjoiMjYyIn0seyJuIjoi6IGM5Zy6IiwidiI6IjEyNyJ9LHsibiI6IuWroeWlsyIsInYiOiI4OCJ9LHsibiI6IumDveW4guS/ruecnyIsInYiOiIxMjQifSx7Im4iOiLlubvmg7PoqIDmg4UiLCJ2IjoiMzIifSx7Im4iOiLnpZ7osaoiLCJ2IjoiMjAifSx7Im4iOiLnqbrpl7QiLCJ2IjoiNDQifSx7Im4iOiLlhbbku5YiLCJ2IjoiMzEifSx7Im4iOiLnjoTlubvoqIDmg4UiLCJ2IjoiMjQ4In0seyJuIjoi546E5bm76ISR5rSeIiwidiI6IjI1NyJ9LHsibiI6IuWOhuWPsuWPpOS7oyIsInYiOiIyNzMifSx7Im4iOiLnp5HlubvmnKvkuJYiLCJ2IjoiOCJ9LHsibiI6IuW5tOS7oyIsInYiOiI3OSJ9LHsibiI6IuWkqeaJjSIsInYiOiI5MCJ9LHsibiI6IuWls+W8uiIsInYiOiI4NiJ9LHsibiI6IuaOqOeQhiIsInYiOiI2MSJ9LHsibiI6IuiFuem7kSIsInYiOiI5MiJ9LHsibiI6IuivuOWkqeS4h+eVjCIsInYiOiI3MSJ9LHsibiI6IuWMu+acryIsInYiOiIyNDcifSx7Im4iOiLmmJ/pmYUiLCJ2IjoiNzcifSx7Im4iOiLpibTlrp0iLCJ2IjoiMTcifSx7Im4iOiLlm6LlrqAiLCJ2IjoiOTQifSx7Im4iOiLmia7njKrlkIPomY4iLCJ2IjoiOTMifSx7Im4iOiLmrabkvqAiLCJ2IjoiMTYifSx7Im4iOiLnjrDoqIDohJHmtJ4iLCJ2IjoiMjY3In0seyJuIjoi6YO95biC56eN55SwIiwidiI6IjI2MyJ9LHsibiI6IuaXoOaVjCIsInYiOiIzODQifSx7Im4iOiLnm5flopMiLCJ2IjoiODEifSx7Im4iOiLpqaznlLIiLCJ2IjoiMjY2In0seyJuIjoi55qH5ZCOIiwidiI6Ijg0In0seyJuIjoi54m556eN5YW1IiwidiI6IjM3NSJ9LHsibiI6IuWkp+WUkCIsInYiOiI3MyJ9LHsibiI6IuWFrOS4uyIsInYiOiI4MyJ9LHsibiI6IuWoseS5kOWciCIsInYiOiI0MyJ9LHsibiI6IumdkuaiheeruemprCIsInYiOiIzODcifSx7Im4iOiLlj6ToqIDohJHmtJ4iLCJ2IjoiMjUzIn0seyJuIjoi5Y6G5Y+y6ISR5rSeIiwidiI6IjI3MiJ9LHsibiI6Iuacq+S4liIsInYiOiI2OCJ9LHsibiI6IuWJkemBkyIsInYiOiI4MCJ9LHsibiI6IueOsOiogOeUnOWuoCIsInYiOiIzOTUifSx7Im4iOiLmuLjmiI/liqjmvKsiLCJ2IjoiNTcifSx7Im4iOiLmtKrojZIiLCJ2IjoiNjYifSx7Im4iOiLlv6vnqb8iLCJ2IjoiMjQifSx7Im4iOiLmmI7mnJ0iLCJ2IjoiMTI2In0seyJuIjoi5aSW5Y2WIiwidiI6Ijc1In0seyJuIjoi5qCh6IqxIiwidiI6IjM4NSJ9LHsibiI6IuWltueIuCIsInYiOiI0MiJ9LHsibiI6IuagoeWbrSIsInYiOiI0In0seyJuIjoi5LiJ5Zu9IiwidiI6IjY3In0seyJuIjoi55u05pKtIiwidiI6IjY5In0seyJuIjoi56m/5LmmIiwidiI6IjM4MiJ9LHsibiI6Iua1t+WymyIsInYiOiI0MCJ9LHsibiI6Iue+jumjnyIsInYiOiI3OCJ9LHsibiI6IuWPjea0viIsInYiOiIzNjkifSx7Im4iOiLnjrDoqIDlpI3ku4ciLCJ2IjoiMjY4In0seyJuIjoi6KW/5ri46KGN55SfIiwidiI6IjM3MyJ9LHsibiI6IuaxgueUnyIsInYiOiIzNzkifSx7Im4iOiLmsJHlm70iLCJ2IjoiMzkwIn0seyJuIjoi5a625bqtIiwidiI6IjEyNSJ9LHsibiI6IuWtpumcuCIsInYiOiI4MiJ9LHsibiI6Iueah+WPlCIsInYiOiI4NyJ9LHsibiI6IuWuoOeJqSIsInYiOiI3NCJ9LHsibiI6IuaXoENQIiwidiI6IjM5MiJ9LHsibiI6IuWls+aJrueUt+ijhSIsInYiOiIzODgifSx7Im4iOiLnvZHmuLgiLCJ2IjoiMzcyIn0seyJuIjoi55eF5aiHIiwidiI6IjM4MCJ9LHsibiI6IueyvueBtSIsInYiOiI4OSJ9LHsibiI6IuiZkOaWhyIsInYiOiI5NSJ9LHsibiI6IumDveW4gumdkuaYpSIsInYiOiIzOTYifSx7Im4iOiLmuIXnqb8iLCJ2IjoiNzYifV19XSwKICAgICAgICAiNDQ1IjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjQ0NSJ9LHsibiI6IumDreW+t+e6siIsInYiOiIxMjgifSx7Im4iOiLnlLDov57lhYMiLCJ2IjoiMjAzIn0seyJuIjoi5YiY5YWw6IqzIiwidiI6IjIwMiJ9LHsibiI6IuWwj+WTgSIsInYiOiIxMTQifSx7Im4iOiLoooHpmJTmiJAiLCJ2IjoiMjA0In0seyJuIjoi5Y2V55Sw6IqzIiwidiI6IjIwMSJ9LHsibiI6IuivhOS5piIsInYiOiIxMTAifSx7Im4iOiLnm7jlo7AiLCJ2IjoiMTExIn1dfV0sCiAgICAgICAgIjEyIjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjEyIn0seyJuIjoi6a2P5pmL5Y2X5YyX5pydIiwidiI6IjIwOSJ9LHsibiI6IuenpuaxiSIsInYiOiIyMDgifSx7Im4iOiLkuJbnlYzlj7IiLCJ2IjoiMjE0In0seyJuIjoi5ZSQ5a6LIiwidiI6IjIxMCJ9LHsibiI6IuaYjua4hSIsInYiOiIyMTEifSx7Im4iOiLov5HnjrDku6MiLCJ2IjoiMjEzIn0seyJuIjoi5Lit5Zu95Y+yIiwidiI6IjIxMiJ9LHsibiI6IuaImOS6ieWPsiIsInYiOiIyMDYifSx7Im4iOiLlkI3kurrkvKAiLCJ2IjoiMjA3In0seyJuIjoi5Lit5Zu95Y6G5Y+yIiwidiI6IjQwMiJ9LHsibiI6IuS4lueVjOWOhuWPsiIsInYiOiI0MDMifSx7Im4iOiLljoblj7LlsI/or7QiLCJ2IjoiOTg4In0seyJuIjoi5Y6G5Y+y5paH5YyWIiwidiI6IjI0MSJ9XX1dLAogICAgICAgICIxMzIiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLlhajpg6giLCJ2IjoiMTMyIn0seyJuIjoi5oiY5LqJIiwidiI6Ijk3In0seyJuIjoi5Lit5Zu95ZCN6JGXIiwidiI6Ijk4In0seyJuIjoi5aSW5Zu95ZCN6JGXIiwidiI6Ijk5In0seyJuIjoi57uP566h5Yqx5b+XIiwidiI6IjI0MiJ9LHsibiI6IuS6uueJqeS8oOiusCIsInYiOiI0MDkifSx7Im4iOiLnu4/lhbjmloflraYiLCJ2IjoiMjQzIn0seyJuIjoi6Z2S5pil5paH5a2mIiwidiI6IjE2OCJ9LHsibiI6IuaImOS6ieWGm+aXhSIsInYiOiI5NzMifV19XSwKICAgICAgICAiNDQ5IjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjQ0OSJ9LHsibiI6IuazleW+iyIsInYiOiIxNDIifSx7Im4iOiLlv4PnkIYiLCJ2IjoiMTQ2In0seyJuIjoi5b+D55CG5a2mIiwidiI6IjQwNyJ9LHsibiI6IuWwkeWEv+W/g+eQhiIsInYiOiI5ODYifSx7Im4iOiLlv4PnkIbnlpfmhIgiLCJ2IjoiOTk0In0seyJuIjoi5oqV6LWE55CG6LSiIiwidiI6IjE0MyJ9LHsibiI6IuiBjOS4muiBjOWcuiIsInYiOiIxNDUifSx7Im4iOiLnu4/nrqHllYbkuJoiLCJ2IjoiMjM4In0seyJuIjoi5rKf6YCa6KGo6L6+IiwidiI6IjE0NCJ9LHsibiI6IuWKseW/l+aIkOWKnyIsInYiOiIyMzkifV19XSwKICAgICAgICAiMTEzIjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjExMyJ9LHsibiI6IuS6rOWJpyIsInYiOiIxNzEifSx7Im4iOiLotorliaciLCJ2IjoiMTcyIn0seyJuIjoi6buE5qKF5oiPIiwidiI6IjE3MyJ9LHsibiI6IuivhOWJpyIsInYiOiIxNzQifSx7Im4iOiLosavliaciLCJ2IjoiMTc1In0seyJuIjoi5piG5puyIiwidiI6IjE3NiJ9LHsibiI6IuiJuuacryIsInYiOiIxMzQifSx7Im4iOiLoibrmnK/mlofljJYiLCJ2IjoiOTQ1In0seyJuIjoi6Z+z5LmQ6Iie6LmIIiwidiI6Ijk0NiJ9LHsibiI6Iue7mOeUuyIsInYiOiI5NTkifSx7Im4iOiLmkYTlvbEiLCJ2IjoiOTYxIn0seyJuIjoi6Ym06LWP55CG6K66IiwidiI6Ijk2MiJ9XX1dLAogICAgICAgICI5NjAiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLlhajpg6giLCJ2IjoiOTYwIn0seyJuIjoi576O6aOf54O56aWqIiwidiI6IjI0MCJ9LHsibiI6IuaXhea4uCIsInYiOiIxNTgifSx7Im4iOiLlgaXlurflhbvnlJ8iLCJ2IjoiMTU5In0seyJuIjoi6L+Q5Yqo5YGl6LqrIiwidiI6IjQxNyJ9LHsibiI6IuaXtuWwmue+juWmhiIsInYiOiI0MTgifSx7Im4iOiLnvo7po5/kvJHpl7IiLCJ2IjoiNDE5In0seyJuIjoi5a625bGF5peF5ri4IiwidiI6IjQyMCJ9LHsibiI6IumjjuawtOWNoOWNnCIsInYiOiI0MjEifSx7Im4iOiLnmb7np5HluLjor4YiLCJ2IjoiOTYzIn0seyJuIjoi55Sf5rS75oOF5oSfIiwidiI6Ijk2NCJ9XX1dLAogICAgICAgICI0NTAiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLlhajpg6giLCJ2IjoiNDUwIn0seyJuIjoi5Lqy5a2QIiwidiI6IjQ0NyJ9LHsibiI6IuWpmuWnuyIsInYiOiIyMzQifSx7Im4iOiLnvo7mlociLCJ2IjoiMjMwIn0seyJuIjoi5aSc6K+dIiwidiI6IjIzMiJ9LHsibiI6IuWls+aApyIsInYiOiIyMzEifSx7Im4iOiLlv4PnkIblgaXlurciLCJ2IjoiMjMzIn0seyJuIjoi5oOF5oSf5pWF5LqLIiwidiI6IjIyOSJ9LHsibiI6IuS6p+WQjuaKpOeQhiIsInYiOiIyMjYifSx7Im4iOiLlhL/nq6Xoi7Hor60iLCJ2IjoiMjIyIn0seyJuIjoi5a2V5pyf5L+d5YGlIiwidiI6IjIyNyJ9LHsibiI6IuS6suWtkOWBpeW6tyIsInYiOiIyMjgifSx7Im4iOiLnp5Hmma4iLCJ2IjoiMjIzIn0seyJuIjoi5Zu95a2m5Y6G5Y+yIiwidiI6IjIyNCJ9LHsibiI6IuiDjuaVmeaXqeaVmSIsInYiOiIyMjUifSx7Im4iOiLlhL/nq6XmloflraYiLCJ2IjoiMjIwIn1dfV0sCiAgICAgICAgIjQ0NyI6IFt7a2V5OiAidHlwZSIsIG5hbWU6ICLnsbvlnosiLCB2YWx1ZTogW3sibiI6IuWFqOmDqCIsInYiOiI0NDcifSx7Im4iOiLnp5HlrabmioDmnK8iLCJ2IjoiMTAwMCJ9LHsibiI6IuiHqueEtuenkeWtpiIsInYiOiIxMzYifSx7Im4iOiLkvZvlraYiLCJ2IjoiMTE1In0seyJuIjoi56S+56eRIiwidiI6IjIzNyJ9LHsibiI6IuWbveWtpiIsInYiOiIxMTYifSx7Im4iOiLmlaPmlofmiI/liaciLCJ2IjoiMjM2In0seyJuIjoi5paH5YyWIiwidiI6IjExOCJ9LHsibiI6IuaKgOacryIsInYiOiI5NjkifSx7Im4iOiLnp5HlraYiLCJ2IjoiOTc5In0seyJuIjoi5bel5LiaIiwidiI6Ijk4MCJ9LHsibiI6IuWGnOael+eJp+a4lCIsInYiOiI5ODEifSx7Im4iOiLorqHnrpfmnLoiLCJ2IjoiOTgyIn0seyJuIjoi5bu6562R5Zut5p6XIiwidiI6Ijk4MyJ9XX1dLAogICAgICAgICIzOSI6IFt7a2V5OiAidHlwZSIsIG5hbWU6ICLnsbvlnosiLCB2YWx1ZTogW3sibiI6IuS6jOasoeWFgyIsInYiOiIzOSJ9LHsibiI6IuWoseS5kCIsInYiOiIxMjEifSx7Im4iOiLnuqrlvZUiLCJ2IjoiMTMzIn0seyJuIjoi5paw6Ze7IiwidiI6IjQ0NiJ9XX1dCiAgICB9LAoKICAgIOS4gOe6pzogYXN5bmMgZnVuY3Rpb24gKHRpZCwgcGcsIGZpbHRlciwgZXh0ZW5kKSB7CiAgICAgICAgbGV0IHBhZ2UgPSBwZyB8fCAxOwogICAgICAgIGxldCB0eXBlSWQgPSAoZXh0ZW5kICYmIGV4dGVuZC50eXBlKSA/IGV4dGVuZC50eXBlIDogdGlkOwogICAgICAgIGxldCBmaW5hbFVybCA9IGAke3RoaXMuaG9zdH0vYXBpL2Rpc2NvdmVyP3RhYj3lkKzkuaYmdHlwZT0ke3R5cGVJZH0mZ2VuZGVyPTImZ2VucmVfdHlwZT0xJnBhZ2U9JHtwYWdlfWA7CiAgICAgICAgbGV0IGpzb24gPSBhd2FpdCByZXF1ZXN0KGZpbmFsVXJsKTsKICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgICAgbGV0IGJvb2tfbGlzdCA9IGRhdGEuY29kZSA9PT0gMjAwID8gZGF0YS5kYXRhIDogW107CiAgICAgICAgbGV0IGQgPSBbXTsKICAgICAgICBib29rX2xpc3QuZm9yRWFjaCgoaXQpID0+IHsKICAgICAgICAgICAgZC5wdXNoKHsKICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5ib29rX25hbWUgfHwgaXQuQm9va05hbWUsCiAgICAgICAgICAgICAgICB1cmw6IGl0LmJvb2tfaWQgfHwgaXQuQm9va0lkLAogICAgICAgICAgICAgICAgZGVzYzogaXQuYXV0aG9yIHx8IGl0LkF1dGhvciwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0LmFic3RyYWN0IHx8IGl0LkFic3RyYWN0IHx8IGl0LmJvb2tfYWJzdHJhY3RfdjIsCiAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdC50aHVtYl91cmwgfHwgaXQuVGh1bWJVUkwgfHwgaXQuYXVkaW9fdGh1bWJfdXJpCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGQpOwogICAgfSwKCiAgICDkuoznuqc6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgZGV0YWlsQXBpID0gYCR7dGhpcy5ob3N0fS9hcGkvZGV0YWlsP2Jvb2tfaWQ9JHt0aGlzLm9ySWR9YDsKICAgICAgICBsZXQgZGV0YWlsSnNvbiA9IGF3YWl0IHJlcXVlc3QoZGV0YWlsQXBpKTsKICAgICAgICBsZXQgZGV0YWlsRGF0YSA9IEpTT04ucGFyc2UoZGV0YWlsSnNvbik7CiAgICAgICAgbGV0IGRhdGEgPSBkZXRhaWxEYXRhLmRhdGEuZGF0YTsKICAgICAgICBsZXQgY2hhcHRlcnNBcGkgPSBgJHt0aGlzLmhvc3R9L2FwaS9ib29rP2Jvb2tfaWQ9JHt0aGlzLm9ySWR9YDsKICAgICAgICBsZXQgY2hhcHRlcnNKc29uID0gYXdhaXQgcmVxdWVzdChjaGFwdGVyc0FwaSk7CiAgICAgICAgbGV0IGNoYXB0ZXJzRGF0YSA9IEpTT04ucGFyc2UoY2hhcHRlcnNKc29uKTsKICAgICAgICBsZXQgYm9va0RhdGEgPSBjaGFwdGVyc0RhdGEuZGF0YS5kYXRhOwogICAgICAgIGxldCBsaXN0ID0gYm9va0RhdGEuY2hhcHRlckxpc3RXaXRoVm9sdW1lPy5mbGF0KCkgfHwgYm9va0RhdGEuY2hhcHRlckxpc3QgfHwgW107CiAgICAgICAgbGV0IHVybHMgPSBsaXN0Lm1hcChpdCA9PiBpdC50aXRsZSArICckJyArIGl0Lml0ZW1JZCArICdAJyArIGl0LnRpdGxlKS5qb2luKCcjJyk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdm9kX2lkOiB0aGlzLm9ySWQsCiAgICAgICAgICAgIHZvZF9uYW1lOiBkYXRhLmJvb2tfbmFtZSwKICAgICAgICAgICAgdHlwZV9uYW1lOiBkYXRhLmNhdGVnb3J5LAogICAgICAgICAgICB2b2RfcGljOiBkYXRhLnRodW1iX3VybCB8fCBkYXRhLmV4cGFuZF90aHVtYl91cmwsCiAgICAgICAgICAgIHZvZF9jb250ZW50OiBkYXRhLmFic3RyYWN0IHx8IGRhdGEuYm9va19hYnN0cmFjdF92MiwKICAgICAgICAgICAgdm9kX3JlbWFya3M6IGRhdGEuc3ViX2luZm8sCiAgICAgICAgICAgIHZvZF9kaXJlY3RvcjogZGF0YS5hdXRob3IsCiAgICAgICAgICAgIHZvZF9wbGF5X2Zyb206ICfnlarojITnlYXlkKwnLAogICAgICAgICAgICB2b2RfcGxheV91cmw6IHVybHMKICAgICAgICB9OwogICAgfSwKCiAgICDmkJzntKI6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQge2lucHV0fSA9IHRoaXM7CiAgICAgICAgbGV0IGh0bWwgPSBhd2FpdCByZXF1ZXN0KGlucHV0KTsKICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaHRtbCk7CiAgICAgICAgbGV0IGRhdGEgPSBqc29uLmRhdGEuc2VhcmNoX3RhYnNbNF0uZGF0YTsKICAgICAgICBsZXQgZCA9IFtdOwogICAgICAgIGZvciAobGV0IGl0IG9mIGRhdGEuZmlsdGVyKGkgPT4gaS5ib29rX2RhdGEpKSB7CiAgICAgICAgICAgIGxldCBib29rID0gaXQuYm9va19kYXRhWzBdOwogICAgICAgICAgICBkLnB1c2goewogICAgICAgICAgICAgICAgdGl0bGU6IGJvb2suYm9va19uYW1lLAogICAgICAgICAgICAgICAgdXJsOiBib29rLmJvb2tfaWQsCiAgICAgICAgICAgICAgICBkZXNjOiBib29rLmF1dGhvciwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGJvb2suYm9va19hYnN0cmFjdCB8fCBib29rLmFic3RyYWN0LAogICAgICAgICAgICAgICAgcGljX3VybDogYm9vay50aHVtYl91cmwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZXRSZXN1bHQoZCk7CiAgICB9LAoKICAgIGxhenk6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQge2lucHV0fSA9IHRoaXM7CiAgICAgICAgbGV0IHBhcnRzID0gaW5wdXQuc3BsaXQoJ0AnKTsKICAgICAgICBsZXQgaXRlbUlkID0gcGFydHNbMF07CiAgICAgICAgbGV0IHRvbmVJZCA9ICcxJzsKICAgICAgICBsZXQgY29udGVudF91cmwgPSBgJHt0aGlzLmhvc3R9L2FwaS9jb250ZW50P2l0ZW1faWQ9JHtpdGVtSWR9JnRhYj3lkKzkuaYmdG9uZV9pZD0ke3RvbmVJZH1gOwogICAgICAgIGxldCBqc29uU3RyID0gYXdhaXQgcmVxdWVzdChjb250ZW50X3VybCk7CiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGpzb25TdHIpOwogICAgICAgIHJldHVybiB7cGFyc2U6IDAsIHVybDogZGF0YS5kYXRhLmNvbnRlbnR9OwogICAgfQp9Ow== diff --git "a/spider/js/\347\225\252\350\214\204\347\237\255\345\211\247[\347\237\255].js" "b/spider/js/\347\225\252\350\214\204\347\237\255\345\211\247[\347\237\255].js" index ac10661c..001dd9a4 100644 --- "a/spider/js/\347\225\252\350\214\204\347\237\255\345\211\247[\347\237\255].js" +++ "b/spider/js/\347\225\252\350\214\204\347\237\255\345\211\247[\347\237\255].js" @@ -4,6 +4,7 @@ filterable: 0, quickSearch: 0, title: '番茄短剧', + logo: 'https://www.18zf.net/d/file/p/2023/1107/3ty5orktxrc.jpg', '类型': '影视', lang: 'ds' }) @@ -177,4 +178,4 @@ var rule = { }); return VODS }, -} \ No newline at end of file +} diff --git "a/spider/js/\350\277\275\346\226\260\345\244\247\345\205\250.js" "b/spider/js/\350\277\275\346\226\260\345\244\247\345\205\250.js" new file mode 100644 index 00000000..e7a48126 --- /dev/null +++ "b/spider/js/\350\277\275\346\226\260\345\244\247\345\205\250.js" @@ -0,0 +1,13 @@ +/* +@header({ + searchable: 1, + filterable: 1, + quickSearch: 0, + title: '追新大全', + author: 'EylinSir', + '类型': '影视', + lang: 'ds' +}) +*/ + +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICflvbHop4YnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICfov73mlrDlpKflhagnLAogICAgaG9zdDogJ2h0dHA6Ly96eHlzLmdhb3pob3Vrai5jbicsCiAgICBob21lVXJsOiAnaHR0cDovL3p4eXMuZ2FvemhvdWtqLmNuJywKICAgIHVybDogJy9wdWJsaWMvP3NlcnZpY2U9QXBwLk1vdi5HZXRPbmxpbmVMaXN0JnR5cGVfaWQ9ZnljbGFzcyZwYWdlPWZ5cGFnZSZsaW1pdD0xOCcsCiAgICBzZWFyY2hVcmw6ICcvcHVibGljLz9zZXJ2aWNlPUFwcC5Nb3YuU2VhcmNoVm9kJmtleT0qKicsCiAgICBzZWFyY2hhYmxlOiAxLAogICAgcXVpY2tTZWFyY2g6IDAsCiAgICBmaWx0ZXJhYmxlOiAxLAogICAgdGltZW91dDogMTAwMDAsCiAgICBwbGF5X3BhcnNlOiB0cnVlLAogICAga2V5OiAnJywKICAgIGl2OiAnMTIzNDU2Nzg5MDEyMzQ1NicsCiAgICBoZWFkZXJzOiB7CiAgICAgICAgJ1VzZXItQWdlbnQnOiAnb2todHRwLzMuMTIuMCcsCiAgICAgICAgJ0Nvbm5lY3Rpb24nOiAnS2VlcC1BbGl2ZScsCiAgICAgICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwJwogICAgfSwKICAgIAogICAgY2xhc3NfcGFyc2U6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIXRoaXMuaG9zdCkgcmV0dXJuIHsgY2xhc3M6IFtdLCBmaWx0ZXJzOiB7fSB9OwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNsYXNzOiBbCiAgICAgICAgICAgICAgICB7ICd0eXBlX2lkJzogJzEnLCAndHlwZV9uYW1lJzogJ+eUteW9sScgfSwKICAgICAgICAgICAgICAgIHsgJ3R5cGVfaWQnOiAnMicsICd0eXBlX25hbWUnOiAn6L+e57ut5YmnJyB9LAogICAgICAgICAgICAgICAgeyAndHlwZV9pZCc6ICczJywgJ3R5cGVfbmFtZSc6ICfnu7zoibonIH0sCiAgICAgICAgICAgICAgICB7ICd0eXBlX2lkJzogJzQnLCAndHlwZV9uYW1lJzogJ+WKqOa8qycgfQogICAgICAgICAgICBdLAogICAgICAgICAgICBmaWx0ZXJzOiB7fQogICAgICAgIH07CiAgICB9LAoKICAgIOmihOWkhOeQhjogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCByZXNwMSA9IGF3YWl0IF9mZXRjaChgJHt0aGlzLmhvc3R9L3B1YmxpYy8/c2VydmljZT1BcHAuTW92LkdldFR5cGVMaXN0YCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSk7CiAgICAgICAgICAgIGxldCB0ZXh0MSA9IGF3YWl0IHJlc3AxLnRleHQoKTsKICAgICAgICAgICAgaWYgKHRleHQxLnN0YXJ0c1dpdGgoJ++7vycpKSB0ZXh0MSA9IHRleHQxLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgbGV0IGRhdGExID0gSlNPTi5wYXJzZSh0ZXh0MSk7CiAgICAgICAgICAgIGxldCBzaWduX3N0YXJ0ID0gKGRhdGExLkRhdGEgfHwgW10pLmZpbmQoaSA9PiBpLnR5cGVfaWQudG9TdHJpbmcoKSA9PT0gJzEnKT8udHlwZV91bmlvbiB8fCAnJzsKICAgICAgICAgICAgbGV0IHJlc3AyID0gYXdhaXQgX2ZldGNoKGAke3RoaXMuaG9zdH0vcHVibGljLz9zZXJ2aWNlPUFwcC5Nb3YuR2V0QWRUeXBlYCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSk7CiAgICAgICAgICAgIGxldCB0ZXh0MiA9IGF3YWl0IHJlc3AyLnRleHQoKTsKICAgICAgICAgICAgaWYgKHRleHQyLnN0YXJ0c1dpdGgoJ++7vycpKSB0ZXh0MiA9IHRleHQyLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgbGV0IGRhdGEyID0gSlNPTi5wYXJzZSh0ZXh0Mik7CiAgICAgICAgICAgIGxldCBzaWduX2VuZCA9IGRhdGEyLkRhdGEudG1wIHx8ICcnOwogICAgICAgICAgICBsZXQgZnVsbEtleSA9IHNpZ25fc3RhcnQgKyBzaWduX2VuZDsKICAgICAgICAgICAgaWYgKGZ1bGxLZXkubGVuZ3RoID49IDE2KSB7CiAgICAgICAgICAgICAgICB0aGlzLmtleSA9IGZ1bGxLZXkuc3Vic3RyaW5nKDAsIDE2KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcign5Yid5aeL5YyWIEtleSDlpLHotKU6JywgZSk7CiAgICAgICAgICAgIHRoaXMuaG9zdCA9ICcnOwogICAgICAgIH0KICAgIH0sCiAgICAKICAgIOaOqOiNkDogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghdGhpcy5ob3N0KSByZXR1cm4gc2V0UmVzdWx0KFtdKTsKICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IF9mZXRjaChgJHt0aGlzLmhvc3R9L3B1YmxpYy8/c2VydmljZT1BcHAuTW92LkdldEhvbWVMZXZlbGAsIHsgaGVhZGVyczogdGhpcy5oZWFkZXJzIH0pOwogICAgICAgIGxldCB0ZXh0ID0gYXdhaXQgcmVzcC50ZXh0KCk7CiAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCgn77u/JykpIHRleHQgPSB0ZXh0LnN1YnN0cmluZygxKTsKICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UodGV4dCk7CiAgICAgICAgCiAgICAgICAgbGV0IHZpZGVvcyA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsID8gCiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoZGF0YSkKICAgICAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgIC5mbGF0TWFwKGl0ZW0gPT4gT2JqZWN0LnZhbHVlcyhpdGVtKSkKICAgICAgICAgICAgICAgIC5maWx0ZXIoQXJyYXkuaXNBcnJheSkKICAgICAgICAgICAgICAgIC5mbGF0TWFwKGxpc3QgPT4gbGlzdC5tYXAoayA9PiAoewogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrLnZvZF9uYW1lLAogICAgICAgICAgICAgICAgICAgIHVybDogYCR7dGhpcy5ob3N0fS9wdWJsaWMvP3NlcnZpY2U9QXBwLk1vdi5HZXRPbmxpbmVNdkJ5SWQmdm9kaWQ9JHtrLnZvZF9pZH1gLAogICAgICAgICAgICAgICAgICAgIGRlc2M6IGsudm9kX3JlbWFya3MsCiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogay52b2RfcGljLAogICAgICAgICAgICAgICAgICAgIHZvZF95ZWFyOiBrLnZvZF95ZWFyLAogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGsudm9kX2NvbnRlbnQKICAgICAgICAgICAgICAgIH0pKSkKICAgICAgICAgICAgOiBbXTsKICAgICAgICAKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHZpZGVvcyk7CiAgICB9LAogICAgCiAgICDkuIDnuqc6IGFzeW5jIGZ1bmN0aW9uICh0aWQsIHBnLCBmaWx0ZXIsIGV4dGVuZCkgewogICAgICAgIGlmICghdGhpcy5ob3N0KSByZXR1cm4gc2V0UmVzdWx0KFtdKTsKICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5ob3N0fS9wdWJsaWMvP3NlcnZpY2U9QXBwLk1vdi5HZXRPbmxpbmVMaXN0JnR5cGVfaWQ9JHt0aWR9JnBhZ2U9JHtwZ30mbGltaXQ9MThgOwogICAgICAgIGxldCByZXNwID0gYXdhaXQgX2ZldGNoKHVybCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSk7CiAgICAgICAgbGV0IHRleHQgPSBhd2FpdCByZXNwLnRleHQoKTsKICAgICAgICBpZiAodGV4dC5zdGFydHNXaXRoKCfvu78nKSkgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDEpOwogICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZSh0ZXh0KTsKICAgICAgICBsZXQgdmlkZW9zID0gKGRhdGEuRGF0YSB8fCBbXSkubWFwKGkgPT4gKHsKICAgICAgICAgICAgdGl0bGU6IGkudm9kX25hbWUsCiAgICAgICAgICAgIHVybDogYCR7dGhpcy5ob3N0fS9wdWJsaWMvP3NlcnZpY2U9QXBwLk1vdi5HZXRPbmxpbmVNdkJ5SWQmdm9kaWQ9JHtpLnZvZF9pZH1gLAogICAgICAgICAgICBkZXNjOiBpLnZvZF9yZW1hcmtzLAogICAgICAgICAgICBwaWNfdXJsOiBpLnZvZF9waWMsCiAgICAgICAgICAgIHZvZF95ZWFyOiBpLnZvZF95ZWFyLAogICAgICAgICAgICBjb250ZW50OiBpLnZvZF9jb250ZW50CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBzZXRSZXN1bHQodmlkZW9zKTsKICAgIH0sCiAgICAKICAgIOS6jOe6pzogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCB2b2RJZCA9IHRoaXMuaW5wdXQubWF0Y2goL3ZvZGlkPShcZCspLylbMV07CiAgICAgICAgbGV0IHVybCA9IGAke3RoaXMuaG9zdH0vcHVibGljLz9zZXJ2aWNlPUFwcC5Nb3YuR2V0T25saW5lTXZCeUlkJnZvZGlkPSR7dm9kSWR9YDsKICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IF9mZXRjaCh1cmwsIHsgaGVhZGVyczogdGhpcy5oZWFkZXJzIH0pOwogICAgICAgIGxldCB0ZXh0ID0gYXdhaXQgcmVzcC50ZXh0KCk7CiAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCgn77u/JykpIHRleHQgPSB0ZXh0LnN1YnN0cmluZygxKTsKICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UodGV4dCk7CiAgICAgICAgbGV0IGZpcnN0SXRlbSA9IChkYXRhLkRhdGEgfHwgW10pLmZpbmQoaSA9PiB0eXBlb2YgaSA9PT0gJ29iamVjdCcgJiYgaSAhPT0gbnVsbCk7CiAgICAgICAgCiAgICAgICAgaWYgKGZpcnN0SXRlbSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdm9kX2lkOiBmaXJzdEl0ZW0udm9kX2lkLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICB2b2RfbmFtZTogZmlyc3RJdGVtLnZvZF9uYW1lLAogICAgICAgICAgICAgICAgdm9kX3BpYzogZmlyc3RJdGVtLnZvZF9waWMsCiAgICAgICAgICAgICAgICB2b2RfcmVtYXJrczogZmlyc3RJdGVtLnZvZF9yZW1hcmtzLAogICAgICAgICAgICAgICAgdm9kX3llYXI6IGZpcnN0SXRlbS52b2RfeWVhciwKICAgICAgICAgICAgICAgIHZvZF9hcmVhOiBmaXJzdEl0ZW0udm9kX2FyZWEsCiAgICAgICAgICAgICAgICB2b2RfYWN0b3I6IGZpcnN0SXRlbS52b2RfYWN0b3IsCiAgICAgICAgICAgICAgICB2b2RfY29udGVudDogZmlyc3RJdGVtLnZvZF9jb250ZW50LAogICAgICAgICAgICAgICAgdm9kX3BsYXlfZnJvbTogZmlyc3RJdGVtLnZvZF9wbGF5X2Zyb20sCiAgICAgICAgICAgICAgICB2b2RfcGxheV91cmw6IGZpcnN0SXRlbS52b2RfcGxheV91cmwsCiAgICAgICAgICAgICAgICB0eXBlX25hbWU6IGZpcnN0SXRlbS52b2RfY2xhc3MKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHt9OwogICAgfSwKICAgIAogICAg5pCc57SiOiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhvc3QpIHJldHVybiBzZXRSZXN1bHQoW10pOwogICAgICAgIGxldCB1cmwgPSBgJHt0aGlzLmhvc3R9L3B1YmxpYy8/c2VydmljZT1BcHAuTW92LlNlYXJjaFZvZCZrZXk9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5LRVkpfWA7CiAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBfZmV0Y2godXJsLCB7IGhlYWRlcnM6IHRoaXMuaGVhZGVycyB9KTsKICAgICAgICBsZXQgdGV4dCA9IGF3YWl0IHJlc3AudGV4dCgpOwogICAgICAgIGlmICh0ZXh0LnN0YXJ0c1dpdGgoJ++7vycpKSB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSk7CiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHRleHQpOwogICAgICAgIGxldCB2aWRlb3MgPSAoZGF0YS5EYXRhIHx8IFtdKS5tYXAoaSA9PiAoewogICAgICAgICAgICB0aXRsZTogaS52b2RfbmFtZSwKICAgICAgICAgICAgdXJsOiBgJHt0aGlzLmhvc3R9L3B1YmxpYy8/c2VydmljZT1BcHAuTW92LkdldE9ubGluZU12QnlJZCZ2b2RpZD0ke2kudm9kX2lkfWAsCiAgICAgICAgICAgIGRlc2M6IGkudm9kX3JlbWFya3MsCiAgICAgICAgICAgIHBpY191cmw6IGkudm9kX3BpYywKICAgICAgICAgICAgdm9kX3llYXI6IGkudm9kX3llYXIsCiAgICAgICAgICAgIGNvbnRlbnQ6IGkudm9kX2NvbnRlbnQKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHNldFJlc3VsdCh2aWRlb3MpOwogICAgfSwKICAgIAogICAgbGF6eTogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCBqeCA9IDA7CiAgICAgICAgbGV0IHVybCA9ICcnOwogICAgICAgIGxldCB1YSA9ICdjb20uZ2prai56eHlzZHEvMS4xLjAgKExpbnV4O0FuZHJvaWQgMTIpIEV4b1BsYXllckxpYi8yLjEyLjMnOwogICAgICAgIGxldCBpZCA9IHRoaXMuaW5wdXQ7CiAgICAgICAgaWYgKGlkLm1hdGNoKC9eaHR0cHM/OlwvXC8uKlwuKG0zdTh8bXA0fGZsdnxta3YpL2kpKSB7CiAgICAgICAgICAgIHVybCA9IGlkOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IF9mZXRjaChgJHt0aGlzLmhvc3R9L3B1YmxpYy8/c2VydmljZT1BcHAuTW92LkdldE12SlhVcmxCeVVybCZ1cmw9JHtpZH1gLCB7IGhlYWRlcnM6IHRoaXMuaGVhZGVycyB9KTsKICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gYXdhaXQgcmVzcC50ZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAodGV4dC5zdGFydHNXaXRoKCfvu78nKSkgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHRleHQpOwogICAgICAgICAgICAgICAgbGV0IHJhd191cmwgPSBkYXRhLkRhdGEudXJsOwogICAgICAgICAgICAgICAgLy8g5bCd6K+V5L2/55SoQ3J5cHRvSlPov5vooYxBRVPop6Plr4YKICAgICAgICAgICAgICAgIGlmICh0aGlzLmtleSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh0aGlzLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdiA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHRoaXMuaXYpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVjcnlwdGVkVXJsID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQocmF3X3VybCwga2V5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M1CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gZGVjcnlwdGVkVXJsICYmIGRlY3J5cHRlZFVybC5zdGFydHNXaXRoKCdodHRwJykgPyBkZWNyeXB0ZWRVcmwgOiB1cmw7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBRVPop6Plr4blpLHotKU6JywgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoLyg/Ond3d1wuaXFpeWl8dlwucXF8dlwueW91a3V8d3d3XC5tZ3R2fHd3d1wuYmlsaWJpbGkpXC5jb20vLnRlc3QoaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgdXJsID0gaWQ7CiAgICAgICAgICAgICAgICAgICAganggPSAxOwogICAgICAgICAgICAgICAgICAgIHVhID0gTU9CSUxFX1VBOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHBhcnNlOiBqeCwKICAgICAgICAgICAgdXJsLAogICAgICAgICAgICBoZWFkZXI6IHsgJ1VzZXItQWdlbnQnOiB1YSB9CiAgICAgICAgfTsKICAgIH0KfTs= \ No newline at end of file From db6b9840cf2d8160fa699b8820d32aac1876ab7e Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Wed, 21 Jan 2026 18:46:25 +0800 Subject: [PATCH 15/57] Update files and directories --- ...1\220\350\201\232\345\220\210[\345\220\254].js" | 14 ++++++++++++++ ...5\220\351\237\263\344\271\220[\345\220\254].js" | 0 ...5\220\351\237\263\344\271\220[\345\220\254].js" | 0 ...261\263\345\205\224\351\237\263\344\271\220.js" | 0 .../\350\234\273\350\234\223FM[\345\220\254].js" | 0 5 files changed, 14 insertions(+) create mode 100644 "spider/js/\351\237\263\344\271\220\350\201\232\345\220\210[\345\220\254].js" rename "spider/js/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" => "spider/js_bad/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" (100%) rename "spider/js_dr2/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" => "spider/js_dr2_old/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" (100%) rename "spider/js_dr2/\347\261\263\345\205\224\351\237\263\344\271\220.js" => "spider/js_dr2_old/\347\261\263\345\205\224\351\237\263\344\271\220.js" (100%) rename "spider/js_dr2/\350\234\273\350\234\223FM[\345\220\254].js" => "spider/js_dr2_old/\350\234\273\350\234\223FM[\345\220\254].js" (100%) diff --git "a/spider/js/\351\237\263\344\271\220\350\201\232\345\220\210[\345\220\254].js" "b/spider/js/\351\237\263\344\271\220\350\201\232\345\220\210[\345\220\254].js" new file mode 100644 index 00000000..94802096 --- /dev/null +++ "b/spider/js/\351\237\263\344\271\220\350\201\232\345\220\210[\345\220\254].js" @@ -0,0 +1,14 @@ +/* +@header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '音乐聚合', + author: 'EylinSir', + '类型': '音乐', + logo: 'https://pic.5577.com/up/2021-9/202198191801219.png', + lang: 'ds' +}) +*/ + +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICfpn7PkuZAnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICfpn7PkuZDogZrlkIgnLAogICAgaG9zdDogJ2h0dHBzOi8vbXVzaWMtZGwuc2F5cXouY29tJywKICAgIGxvZ286ICdodHRwczovL3BpYy41NTc3LmNvbS91cC8yMDIxLTkvMjAyMTk4MTkxODAxMjE5LnBuZycsCiAgICBoZWFkZXJzOiB7CiAgICAgICAgJ1VzZXItQWdlbnQnOiBNT0JJTEVfVUEKICAgIH0sCiAgICBzZWFyY2hhYmxlOiAxLAogICAgcXVpY2tTZWFyY2g6IDEsCiAgICBmaWx0ZXJhYmxlOiAxLAogICAgdGltZW91dDogMTAwMDAsCiAgICBwbGF5X3BhcnNlOiB0cnVlLAogICAgY2xhc3NfbmFtZTogJ+e9keaYk+S6kemfs+S5kCZRUemfs+S5kCbphbfmiJHpn7PkuZAnLAogICAgY2xhc3NfdXJsOiAnbmV0ZWFzZSZxcSZrdXdvJywKICAgIHNlYXJjaFVybDogJy9hcGkvP3R5cGU9YWdncmVnYXRlU2VhcmNoJmtleXdvcmQ9KiombGltaXQ9MTAmcGFnZT0xJywKICAgIHR5cGVzOiBbCiAgICAgICAgeyBuYW1lOiAnSGktUmVz6Z+z6LSoJywgdmFsdWU6ICdmbGFjMjRiaXQnIH0sCiAgICAgICAgeyBuYW1lOiAn5peg5o2f6Z+z6LSoJywgdmFsdWU6ICdmbGFjJyB9LAogICAgICAgIHsgbmFtZTogJ+mrmOWTgemfs+i0qCcsIHZhbHVlOiAnMzIwaycgfSwKICAgICAgICB7IG5hbWU6ICfmoIflh4bpn7PotKgnLCB2YWx1ZTogJzEyOGsnIH0KICAgIF0sCiAgICBwbGF0Zm9ybXM6IFsnbmV0ZWFzZScsICdxcScsICdrdXdvJ10sCiAgICBwbGF0Zm9ybU5hbWVNYXA6IHsKICAgICAgICBuZXRlYXNlOiAn572R5piT5LqR6Z+z5LmQJywKICAgICAgICBxcTogJ1FR6Z+z5LmQJywKICAgICAgICBrdXdvOiAn6YW35oiR6Z+z5LmQJwogICAgfSwKCiAgICDkuIDnuqc6IGFzeW5jIGZ1bmN0aW9uICh0aWQsIHBnLCBmaWx0ZXIsIGV4dGVuZCkgewogICAgICAgIGxldCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgdGFyZ2V0UGxhdGZvcm1zID0gdGlkICYmIHRoaXMucGxhdGZvcm1zLmluY2x1ZGVzKHRpZCkgPyBbdGlkXSA6IHRoaXMucGxhdGZvcm1zOwogICAgICAgIGZvciAobGV0IHBsYXRmb3JtIG9mIHRhcmdldFBsYXRmb3JtcykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGF3YWl0IHJlcXVlc3QoYCR7dGhpcy5ob3N0fS9hcGkvP3NvdXJjZT0ke3BsYXRmb3JtfSZ0eXBlPXRvcGxpc3RzYCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSkpOwogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uKGRhdGE/LmNvZGUgPT09IDIwMCAmJiBkYXRhLmRhdGE/Lmxpc3QgPyAKICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGEubGlzdC5tYXAoaXRlbSA9PiAoewogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGAke3BsYXRmb3JtfV8ke2l0ZW0uaWR9YCwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogaXRlbS51cGRhdGVGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgIHBpY191cmw6IGl0ZW0ucGljCiAgICAgICAgICAgICAgICAgICAgfSkpIDogW10pKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNldFJlc3VsdChyZXN1bHQpOwogICAgfSwKCiAgICDkuoznuqc6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgW3BsYXRmb3JtLCByZWFsSWRdID0gdGhpcy5vcklkLnNwbGl0KCdfJyk7CiAgICAgICAgaWYgKCFwbGF0Zm9ybSB8fCAhcmVhbElkKSByZXR1cm4ge307CiAgICAgICAgbGV0IHNvbmdMaXN0ID0gW107CiAgICAgICAgbGV0IHZvZF9uYW1lID0gdGhpcy5vcklkOwogICAgICAgIGxldCB2b2RfZGVzYyA9ICcnOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCByZXF1ZXN0KGAke3RoaXMuaG9zdH0vYXBpLz9zb3VyY2U9JHtwbGF0Zm9ybX0maWQ9JHtyZWFsSWR9JnR5cGU9dG9wbGlzdGAsIHsgaGVhZGVyczogdGhpcy5oZWFkZXJzIH0pOwogICAgICAgICAgICBsZXQgc29uZ0RhdGEgPSBKU09OLnBhcnNlKHJlcyk7CiAgICAgICAgICAgIGlmIChzb25nRGF0YT8uY29kZSA9PT0gMjAwICYmIHNvbmdEYXRhLmRhdGE/Lmxpc3QpIHsKICAgICAgICAgICAgICAgIHNvbmdMaXN0ID0gc29uZ0RhdGEuZGF0YS5saXN0OwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBsZXQgdG9wTGlzdHNSZXMgPSBhd2FpdCByZXF1ZXN0KGAke3RoaXMuaG9zdH0vYXBpLz9zb3VyY2U9JHtwbGF0Zm9ybX0mdHlwZT10b3BsaXN0c2AsIHsgaGVhZGVyczogdGhpcy5oZWFkZXJzIH0pOwogICAgICAgICAgICAgICAgICAgIGxldCB0b3BMaXN0c0RhdGEgPSBKU09OLnBhcnNlKHRvcExpc3RzUmVzKTsKICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudExpc3QgPSB0b3BMaXN0c0RhdGE/LmNvZGUgPT09IDIwMCAmJiB0b3BMaXN0c0RhdGEuZGF0YT8ubGlzdCA/IAogICAgICAgICAgICAgICAgICAgICAgICB0b3BMaXN0c0RhdGEuZGF0YS5saXN0LmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSByZWFsSWQpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdm9kX25hbWUgPSBjdXJyZW50TGlzdC5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB2b2RfZGVzYyA9IGN1cnJlbnRMaXN0LnVwZGF0ZUZyZXF1ZW5jeSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IHJlcXVlc3QoYCR7dGhpcy5ob3N0fS9hcGkvP3NvdXJjZT0ke3BsYXRmb3JtfSZpZD0ke3JlYWxJZH0mdHlwZT1pbmZvYCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSk7CiAgICAgICAgICAgICAgICBzb25nRGF0YSA9IEpTT04ucGFyc2UocmVzKTsKICAgICAgICAgICAgICAgIGlmIChzb25nRGF0YT8uY29kZSAhPT0gMjAwIHx8ICFzb25nRGF0YS5kYXRhKSByZXR1cm4ge307CiAgICAgICAgICAgICAgICBzb25nTGlzdCA9IFtzb25nRGF0YS5kYXRhXTsKICAgICAgICAgICAgICAgIHZvZF9uYW1lID0gYCR7c29uZ0RhdGEuZGF0YS5uYW1lfSAtICR7c29uZ0RhdGEuZGF0YS5hcnRpc3R9YDsKICAgICAgICAgICAgICAgIHZvZF9kZXNjID0gc29uZ0RhdGEuZGF0YS5hbGJ1bSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCfojrflj5bmlbDmja7lpLHotKU6JywgZXJyKTsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHZvZF9uYW1lID09PSB0aGlzLm9ySWQgJiYgc29uZ0xpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHZvZF9uYW1lID0gYCR7c29uZ0xpc3RbMF0uYWxidW19IC0g5q2M5puy5YiX6KGoYDsKICAgICAgICAgICAgdm9kX2Rlc2MgPSBg5YWx5YyF5ZCrICR7c29uZ0xpc3QubGVuZ3RofSDpppbmrYzmm7JgOwogICAgICAgIH0KCiAgICAgICAgbGV0IHBsYXlfdXJsID0gc29uZ0xpc3QubWFwKHNvbmcgPT4gYCR7c29uZy5uYW1lfSAtICR7c29uZy5hcnRpc3R9JCR7cGxhdGZvcm19XyR7c29uZy5pZCB8fCByZWFsSWR9YCkuam9pbignIycpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHZvZF9pZDogdGhpcy5vcklkLAogICAgICAgICAgICB2b2RfbmFtZSwKICAgICAgICAgICAgdm9kX3BsYXlfZnJvbTogdGhpcy5wbGF0Zm9ybU5hbWVNYXBbcGxhdGZvcm1dLAogICAgICAgICAgICB2b2RfcGxheV91cmw6IHBsYXlfdXJsLAogICAgICAgICAgICB2b2RfZGVzYwogICAgICAgIH07CiAgICB9LAoKICAgIOaQnOe0ojogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCB1cmwgPSB0aGlzLnNlYXJjaFVybC5yZXBsYWNlKCcqKicsIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLktFWSkpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgcmVxdWVzdCh1cmwsIHsKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycywKICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDEwMDAwIAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGRhdGEpOwogICAgICAgICAgICBpZiAoanNvbj8uY29kZSA9PT0gMjAwICYmIGpzb24/LmRhdGE/LnJlc3VsdHMpIHsKICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBqc29uLmRhdGEucmVzdWx0cy5tYXAoaXRlbSA9PiAoewogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgJHtpdGVtLm5hbWV9IC0gJHtpdGVtLmFydGlzdH1gLAogICAgICAgICAgICAgICAgICAgIGRlc2M6IGAke2l0ZW0ucGxhdGZvcm0gPT09ICduZXRlYXNlJyA/ICfnvZHmmJPkupEnIDogaXRlbS5wbGF0Zm9ybSA9PT0gJ3FxJyA/ICdRUScgOiAn6YW35oiRJ33pn7PkuZAgLSAke2l0ZW0uYWxidW19YCwKICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYywKICAgICAgICAgICAgICAgICAgICB1cmw6IGAke2l0ZW0ucGxhdGZvcm19XyR7aXRlbS5pZH1gCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCfmkJzntKLor7fmsYLplJnor686JywgZXJyb3IpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2V0UmVzdWx0KFtdKTsKICAgIH0sCgogICAgbGF6eTogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCBbcGxhdGZvcm0sIHJlYWxJZF0gPSB0aGlzLmlucHV0LnNwbGl0KCdfJyk7CiAgICAgICAgaWYgKCFwbGF0Zm9ybSB8fCAhcmVhbElkKSB7CiAgICAgICAgICAgIHJldHVybiB7IHBhcnNlOiAwLCBwbGF5VXJsOiAnJywgdXJsOiBbXSwgaGVhZGVyOiB0aGlzLmhlYWRlcnMsIGxyYzogJycsIGNvdmVyOiAnJywgaGVpZ2h0OiA3MjAgfTsKICAgICAgICB9CiAgICAgICAgbGV0IGx5cmljID0gJyc7CiAgICAgICAgbGV0IGluZm9EYXRhID0ge307CiAgICAgICAgbGV0IFtseXJpY1JlcywgaW5mb1Jlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgICAgIHJlcXVlc3QoYCR7dGhpcy5ob3N0fS9hcGkvP3NvdXJjZT0ke3BsYXRmb3JtfSZpZD0ke3JlYWxJZH0mdHlwZT1scmNgLCB7IGhlYWRlcnM6IHRoaXMuaGVhZGVycyB9KS5jYXRjaCgoKSA9PiAnJyksCiAgICAgICAgICAgIHJlcXVlc3QoYCR7dGhpcy5ob3N0fS9hcGkvP3NvdXJjZT0ke3BsYXRmb3JtfSZpZD0ke3JlYWxJZH0mdHlwZT1pbmZvYCwgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSkuY2F0Y2goKCkgPT4gJ3t9JykKICAgICAgICBdKTsKICAgICAgICBpZiAodHlwZW9mIGx5cmljUmVzID09PSAnc3RyaW5nJykgbHlyaWMgPSBseXJpY1JlczsKICAgICAgICB0cnkgewogICAgICAgICAgICBpbmZvRGF0YSA9IEpTT04ucGFyc2UoaW5mb1Jlcyk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgIGxldCBjb3ZlciA9IGluZm9EYXRhPy5jb2RlID09PSAyMDAgPyBpbmZvRGF0YS5kYXRhPy5waWMgfHwgJycgOiAnJzsKICAgICAgICBsZXQgdXJsID0gdGhpcy50eXBlcy5mbGF0TWFwKHR5cGUgPT4gW3R5cGUubmFtZSwgYCR7dGhpcy5ob3N0fS9hcGkvP3NvdXJjZT0ke3BsYXRmb3JtfSZpZD0ke3JlYWxJZH0mdHlwZT11cmwmYnI9JHt0eXBlLnZhbHVlfWBdKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwYXJzZTogMCwKICAgICAgICAgICAgcGxheVVybDogJycsCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcnMsCiAgICAgICAgICAgIGxyYzogbHlyaWMsCiAgICAgICAgICAgIGNvdmVyLAogICAgICAgICAgICBwaWM6IGNvdmVyLAogICAgICAgICAgICBoZWlnaHQ6IDcyMAogICAgICAgIH07CiAgICB9Cn07 \ No newline at end of file diff --git "a/spider/js/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" "b/spider/js_bad/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" similarity index 100% rename from "spider/js/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" rename to "spider/js_bad/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" diff --git "a/spider/js_dr2/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" "b/spider/js_dr2_old/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" similarity index 100% rename from "spider/js_dr2/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" rename to "spider/js_dr2_old/\347\247\215\345\255\220\351\237\263\344\271\220[\345\220\254].js" diff --git "a/spider/js_dr2/\347\261\263\345\205\224\351\237\263\344\271\220.js" "b/spider/js_dr2_old/\347\261\263\345\205\224\351\237\263\344\271\220.js" similarity index 100% rename from "spider/js_dr2/\347\261\263\345\205\224\351\237\263\344\271\220.js" rename to "spider/js_dr2_old/\347\261\263\345\205\224\351\237\263\344\271\220.js" diff --git "a/spider/js_dr2/\350\234\273\350\234\223FM[\345\220\254].js" "b/spider/js_dr2_old/\350\234\273\350\234\223FM[\345\220\254].js" similarity index 100% rename from "spider/js_dr2/\350\234\273\350\234\223FM[\345\220\254].js" rename to "spider/js_dr2_old/\350\234\273\350\234\223FM[\345\220\254].js" From d88ef787c99e751a303740e71268e06d781ee63b Mon Sep 17 00:00:00 2001 From: Taois Date: Wed, 21 Jan 2026 23:57:35 +0800 Subject: [PATCH 16/57] =?UTF-8?q?add:=20=E5=B0=9D=E8=AF=95=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0ds=E6=9C=AC=E5=9C=B0=E5=8C=85=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- controllers/web.js | 314 ++++++++++++++++++++++++++++++++++++++++++++- package.js | 12 +- package.json | 4 + package.py | 22 ++-- public/index.html | 3 +- 6 files changed, 342 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index f8488af2..89cdbf6f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ nodejs作为服务端的drpy实现。全面升级异步写法 ### 常用超链接 * [本项目主页-免翻](https://github.com/hjdhnx/drpy-node) -* [最新DS本地包-适配皮卡丘](/gh/release) +* ~~[最新DS本地包-适配皮卡丘](/gh/release)~~ +* [DS本地包下载中心](/admin/download) * [接口文档](docs/apidoc.md) | [接口列表如定时任务](docs/apiList.md) | ~~[小猫影视-待对接T4](https://github.com/waifu-project/movie/pull/135)~~ * [代码质量评估工具说明](docs/codeCheck.md) | [DS项目代码评估报告](docs/codeCheckReport.md) diff --git a/controllers/web.js b/controllers/web.js index ce58537a..9327d27c 100644 --- a/controllers/web.js +++ b/controllers/web.js @@ -1,9 +1,92 @@ -import {readFileSync, existsSync} from 'fs'; +import {readFileSync, existsSync, readdirSync, statSync} from 'fs'; +import {createReadStream} from 'fs'; +import {execSync} from 'child_process'; import path from 'path'; +import {fileURLToPath} from 'url'; +import {createHash} from 'crypto'; import {ENV} from '../utils/env.js'; import COOKIE from '../utils/cookieManager.js'; +import {validateBasicAuth} from '../utils/api_validate.js'; const COOKIE_AUTH_CODE = process.env.COOKIE_AUTH_CODE || 'drpys'; +const IS_VERCEL = process.env.VERCEL; +const DOWNLOAD_AUTH_SECRET = process.env.DOWNLOAD_AUTH_SECRET || 'drpys_download_secret'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const projectRootDir = path.dirname(__dirname); + +const generateDownloadToken = (filename) => { + const timestamp = Date.now(); + const data = `${filename}-${timestamp}-${DOWNLOAD_AUTH_SECRET}`; + const token = createHash('md5').update(data).digest('hex'); + return `${token}-${timestamp}`; +}; + +const validateDownloadToken = (filename, token) => { + if (!token) return false; + const parts = token.split('-'); + if (parts.length < 2) return false; + const timestamp = parseInt(parts.pop()); + const hash = parts.join('-'); + const data = `${filename}-${timestamp}-${DOWNLOAD_AUTH_SECRET}`; + const expectedHash = createHash('md5').update(data).digest('hex'); + const now = Date.now(); + return hash === expectedHash && (now - timestamp) < 3600000; +}; + +const findLatestPackage = (projectDir, packageName) => { + try { + const parentDir = path.dirname(projectDir); + const files = readdirSync(parentDir); + + const isGreen = packageName.includes('-green'); + const ext = packageName.split('.').pop(); + const baseName = packageName.replace(/-green\.[^.]+$/, '').replace(/\.[^.]+$/, ''); + const pattern = new RegExp(`^${baseName.replace(/\./g, '\\.')}-\\d{8}${isGreen ? '-green' : ''}\\.${ext}`); + + console.log(`查找包: ${packageName}, 正则: ${pattern.source}, 父目录: ${parentDir}`); + console.log('目录中的文件:', files.filter(f => f.includes('drpy-node'))); + + const packageFiles = files + .filter(file => pattern.test(file)) + .map(file => { + const filePath = path.join(parentDir, file); + const stats = statSync(filePath); + return {file, filePath, mtime: stats.mtime}; + }) + .sort((a, b) => b.mtime - a.mtime); + + console.log('匹配到的文件:', packageFiles.map(f => f.file)); + return packageFiles.length > 0 ? packageFiles[0] : null; + } catch (error) { + console.error('查找包失败:', error.message); + return null; + } +}; + +const buildPackage = (packageName) => { + try { + let command = 'node package.js'; + if (packageName.includes('-green')) { + command += ' -g'; + } + if (packageName.includes('.zip')) { + command += ' -z'; + } + + console.log(`执行打包命令: ${command}, 目录: ${projectRootDir}`); + const output = execSync(command, {cwd: projectRootDir, stdio: 'pipe'}); + console.log('打包输出:', output.toString()); + const result = findLatestPackage(projectRootDir, packageName); + console.log('打包后查找结果:', result ? result.file : '未找到'); + return result; + } catch (error) { + console.error('打包失败:', error.message); + console.error('错误详情:', error.stdout?.toString(), error.stderr?.toString()); + throw error; + } +}; export default (fastify, options, done) => { fastify.get('/admin/encoder', async (request, reply) => { @@ -75,5 +158,234 @@ export default (fastify, options, done) => { } }); + fastify.get('/admin/download', { + preHandler: validateBasicAuth + }, async (request, reply) => { + try { + if (IS_VERCEL) { + return reply.code(403).send({ + success: false, + message: 'Vercel 环境不支持文件下载功能', + }); + } + + const projectName = path.basename(projectRootDir); + + const files = [ + {name: `${projectName}.7z`, desc: '7z 压缩包(标准版)'}, + {name: `${projectName}.zip`, desc: 'ZIP 压缩包(标准版)'}, + {name: `${projectName}-green.7z`, desc: '7z 压缩包(绿色版,不含[密]文件)'}, + {name: `${projectName}-green.zip`, desc: 'ZIP 压缩包(绿色版,不含[密]文件)'} + ]; + + const html = ` + + + + + + 下载 ${projectName} + + + +

    ${projectName} 下载中心

    +
    链接已复制到剪贴板
    +
    + ${files.map(file => { + const token = generateDownloadToken(file.name); + const downloadUrl = `/admin/download/${file.name}?auth=${token}`; + return ` +
    +
    + ${file.name} +
    ${file.desc}
    +
    +
    + 下载 + +
    +
    `; + }).join('')} +
    + + +`; + + reply.type('text/html').send(html); + } catch (error) { + console.error('下载页面加载失败:', error.message); + return reply.code(500).send({ + success: false, + message: '加载下载页面失败', + error: error.message, + }); + } + }); + + fastify.get('/admin/download/:filename', { + preHandler: async (request, reply) => { + const {auth} = request.query; + if (validateDownloadToken(request.params.filename, auth)) { + return; + } + const authHeader = request.headers.authorization; + if (!authHeader) { + reply.header('WWW-Authenticate', 'Basic'); + return reply.code(401).send('Authentication required'); + } + const base64Credentials = authHeader.split(' ')[1]; + const credentials = Buffer.from(base64Credentials, 'base64').toString('utf-8'); + const [username, password] = credentials.split(':'); + const validUsername = process.env.API_AUTH_NAME || ''; + const validPassword = process.env.API_AUTH_CODE || ''; + if (username === validUsername && password === validPassword) { + return; + } + reply.header('WWW-Authenticate', 'Basic'); + return reply.code(401).send('Invalid credentials'); + } + }, async (request, reply) => { + try { + if (IS_VERCEL) { + return reply.code(403).send({ + success: false, + message: 'Vercel 环境不支持文件下载功能', + }); + } + + const {filename} = request.params; + const projectName = path.basename(projectRootDir); + + const validFilenames = [ + `${projectName}.7z`, + `${projectName}.zip`, + `${projectName}-green.7z`, + `${projectName}-green.zip` + ]; + + if (!validFilenames.includes(filename)) { + return reply.code(400).send({ + success: false, + message: '无效的文件名', + }); + } + + let latestPackage = findLatestPackage(projectRootDir, filename); + + if (!latestPackage) { + console.log(`未找到 ${filename},开始打包...`); + latestPackage = buildPackage(filename); + if (!latestPackage) { + return reply.code(500).send({ + success: false, + message: '打包失败,无法创建压缩文件', + }); + } + } + + const fileStream = createReadStream(latestPackage.filePath); + const contentType = filename.endsWith('.zip') ? 'application/zip' : 'application/x-7z-compressed'; + reply.header('Content-Type', contentType); + reply.header('Content-Disposition', `attachment; filename="${encodeURIComponent(latestPackage.file)}"`); + return reply.send(fileStream); + } catch (error) { + console.error('下载文件失败:', error.message); + return reply.code(500).send({ + success: false, + message: '下载失败', + error: error.message, + }); + } + }); + done(); }; diff --git a/package.js b/package.js index 6489562d..9cc52648 100644 --- a/package.js +++ b/package.js @@ -37,7 +37,7 @@ const filterGreenFiles = (scriptDir) => { }; // 压缩目录 -const compressDirectory = (scriptDir, green) => { +const compressDirectory = (scriptDir, green, useZip) => { const currentDir = basename(scriptDir); const currentTime = new Date().toLocaleDateString('zh-CN', { year: 'numeric', @@ -45,12 +45,13 @@ const compressDirectory = (scriptDir, green) => { day: '2-digit' }).replace(/\//g, ''); const archiveSuffix = green ? '-green' : ''; - const archiveName = `${currentDir}-${currentTime}${archiveSuffix}.7z`; + const archiveExt = useZip ? '.zip' : '.7z'; + const archiveName = `${currentDir}-${currentTime}${archiveSuffix}${archiveExt}`; const parentDir = resolve(scriptDir, '..'); const archivePath = join(parentDir, archiveName); - // 构建 7z 命令 + // 构建压缩命令参数 const excludeParams = []; // 排除目录 @@ -77,7 +78,7 @@ const compressDirectory = (scriptDir, green) => { } // 构建命令,打包目录内容而不包含目录本身 - const command = `7z a "${archivePath}" "${join(scriptDir, '*')}" -r ${excludeParams.join(' ')}`; + const command = `7z a -t${useZip ? 'zip' : '7z'} "${archivePath}" "${join(scriptDir, '*')}" -r ${excludeParams.join(' ')}`; console.log(`构建的 7z 命令: ${command}`); try { @@ -95,8 +96,9 @@ const main = () => { // 简单解析命令行参数 const args = process.argv.slice(2); const green = args.includes('-g') || args.includes('--green'); + const useZip = args.includes('-z') || args.includes('--zip'); - compressDirectory(scriptDir, green); + compressDirectory(scriptDir, green, useZip); }; main(); diff --git a/package.json b/package.json index e350953d..e7e77108 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,12 @@ "node22-win": "chcp 65001 && node --trace-deprecation --experimental-sqlite index.js", "package": "python package.py", "package-green": "python package.py -g", + "package-zip": "python package.py -z", + "package-green-zip": "python package.py -g -z", "packageJS": "node package.js", "packageJS-green": "node package.js -g", + "packageJS-zip": "node package.js -z", + "packageJS-green-zip": "node package.js -g -z", "gzip-1": "node controllers/encoder.js json/十六万歌曲.json", "ungzip-1": "node controllers/decoder.js json/十六万歌曲.json.gz", "moontv": "node scripts/mjs/moontv.mjs 采集2025.json -p" diff --git a/package.py b/package.py index d34e7011..9949858f 100644 --- a/package.py +++ b/package.py @@ -45,13 +45,14 @@ def filter_green_files(script_dir): return green_files -def generate_archive_name(script_dir, green=False): +def generate_archive_name(script_dir, green=False, use_zip=False): """ 生成压缩包文件名 Args: script_dir (str): 脚本所在目录 green (bool): 是否为green模式 + use_zip (bool): 是否使用ZIP格式 Returns: str: 压缩包的完整路径 @@ -64,7 +65,8 @@ def generate_archive_name(script_dir, green=False): # 根据是否传入 green 参数生成压缩包文件名 archive_suffix = "-green" if green else "" - archive_name = f"{current_dir}-{current_time}{archive_suffix}.7z" + archive_ext = ".zip" if use_zip else ".7z" + archive_name = f"{current_dir}-{current_time}{archive_suffix}{archive_ext}" # 压缩包输出路径 (脚本所在目录的外面) parent_dir = os.path.abspath(os.path.join(script_dir, "..")) @@ -108,7 +110,7 @@ def build_exclude_params(script_dir, green=False): return exclude_params -def execute_compression(archive_path, script_dir, exclude_params): +def execute_compression(archive_path, script_dir, exclude_params, use_zip=False): """ 执行7z压缩命令 @@ -116,9 +118,11 @@ def execute_compression(archive_path, script_dir, exclude_params): archive_path (str): 压缩包输出路径 script_dir (str): 脚本所在目录 exclude_params (list): 排除参数列表 + use_zip (bool): 是否使用ZIP格式 """ # 构建命令,打包目录内容而不包含目录本身 - command = f"7z a \"{archive_path}\" \"{script_dir}\\*\" " + " ".join(exclude_params) + archive_type = "zip" if use_zip else "7z" + command = f"7z a -t{archive_type} \"{archive_path}\" \"{script_dir}\\*\" " + " ".join(exclude_params) # 打印构建的命令进行调试 print(f"构建的 7z 命令: {command}") @@ -131,22 +135,23 @@ def execute_compression(archive_path, script_dir, exclude_params): print(f"压缩失败: {e}") -def compress_directory(script_dir, green=False): +def compress_directory(script_dir, green=False, use_zip=False): """ 压缩目录为7z包 Args: script_dir (str): 要压缩的目录路径 green (bool): 是否启用green模式,筛选带[密]的文件 + use_zip (bool): 是否使用ZIP格式 """ # 生成压缩包文件名和路径 - archive_path = generate_archive_name(script_dir, green) + archive_path = generate_archive_name(script_dir, green, use_zip) # 构建排除参数 exclude_params = build_exclude_params(script_dir, green) # 执行压缩 - execute_compression(archive_path, script_dir, exclude_params) + execute_compression(archive_path, script_dir, exclude_params, use_zip) if __name__ == "__main__": @@ -156,7 +161,8 @@ def compress_directory(script_dir, green=False): # 解析命令行参数 parser = argparse.ArgumentParser(description="压缩当前目录为 7z 包,支持可选参数。") parser.add_argument('-g', '--green', action='store_true', help="启用 green 模式,筛选 js 目录下所有带 [密] 的文件。") + parser.add_argument('-z', '--zip', action='store_true', help="使用 ZIP 格式打包,默认使用 7z 格式。") args = parser.parse_args() # 调用压缩函数 - compress_directory(script_dir, green=args.green) + compress_directory(script_dir, green=args.green, use_zip=args.zip) diff --git a/public/index.html b/public/index.html index 41ed026e..a580710f 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,8 @@

    drpyS(drpy-node)

    常用超链接