refactor(drpy): 优化代码结构并添加新功能
- 使用 drpy-core-lite.min.js 替代原有的 drpy-core.min.js - 添加新功能: - wasm 支持 - 引入 TextEncoder、TextDecoder 对象 - 引入 WXXH 加解密库 - 所有依赖打包成一个 js 文件 - 增加 buildQueryString 函数 - 增加 removeHeader 函数,用于清除 js/py 文件的头信息及所有头注释 - 优化功能: - 增加 tab_order 线路模糊排序 - 优化解密算法支持文件头 - 优化去广告算法 - 调整部分功能实现,如 m3u8 处理等
This commit is contained in:
parent
7cc032df2c
commit
f6b0d7a405
101
api.json
101
api.json
@ -23,6 +23,13 @@
|
||||
"type": 3,
|
||||
"api": "csp_LocalFile"
|
||||
},
|
||||
{
|
||||
"key": "huban",
|
||||
"name": "弹幕|搜索",
|
||||
"type": 3,
|
||||
"jar": "https://gitee.com/zj521jj/little-tiger-spot/raw/master/jar/HubanTC.jar",
|
||||
"api": "csp_Huban"
|
||||
},
|
||||
{
|
||||
"key": "配置中心",
|
||||
"name": "配置|中心",
|
||||
@ -36,13 +43,6 @@
|
||||
"ratio": 1.597
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "huban",
|
||||
"name": "弹幕|搜索",
|
||||
"type": 3,
|
||||
"jar": "https://gitee.com/zj521jj/little-tiger-spot/raw/master/jar/HubanTC.jar",
|
||||
"api": "csp_Huban"
|
||||
},
|
||||
{
|
||||
"key": "热播影视",
|
||||
"name": "热播|APP",
|
||||
@ -121,21 +121,6 @@
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "魔方",
|
||||
"name": "魔方|APP",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppGet",
|
||||
"ext": {
|
||||
"url": "",
|
||||
"site": "https://www.snysw.xyz/mfys.txt",
|
||||
"dataKey": "1234567887654321",
|
||||
"dataIv": "1234567887654321",
|
||||
"deviceId": "",
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "火猫",
|
||||
"name": "火猫丨APP",
|
||||
@ -166,21 +151,6 @@
|
||||
"version": "120"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "海豚",
|
||||
"name": "海豚丨APP",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppGet2",
|
||||
"ext": {
|
||||
"url": "https://qjappcms.htsp4k.top",
|
||||
"site": "",
|
||||
"dataKey": "R69yVluzg6yLpjp0",
|
||||
"dataIv": "R69yVluzg6yLpjp0",
|
||||
"deviceId": "",
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "哔滴",
|
||||
"name": "哔滴丨APP",
|
||||
@ -210,21 +180,6 @@
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "小野",
|
||||
"name": "小野|APP",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppGet",
|
||||
"ext": {
|
||||
"url": "https://appcms.xy4k.com",
|
||||
"site": "",
|
||||
"dataKey": "7SDWjknU34zqFbVr",
|
||||
"dataIv": "7SDWjknU34zqFbVr",
|
||||
"deviceId": "",
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "爱看",
|
||||
"name": "爱看丨APP",
|
||||
@ -297,20 +252,6 @@
|
||||
"version": "120"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "榴莲",
|
||||
"name": "榴莲|APP",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppGet2",
|
||||
"ext": {
|
||||
"url": "https://qjappcms.ll4k.xyz",
|
||||
"dataKey": "1yGA85sJ5STtE7uj",
|
||||
"dataIv": "1yGA85sJ5STtE7uj",
|
||||
"deviceId": "",
|
||||
"version": "50000"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "仓鼠",
|
||||
"name": "仓鼠|APP",
|
||||
@ -384,20 +325,6 @@
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "溜溜",
|
||||
"name": "溜溜|APP",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppGet",
|
||||
"ext": {
|
||||
"url": "https://appcms.ll4k.xyz",
|
||||
"dataKey": "NiDGaKiVnkO3QX1Q",
|
||||
"dataIv": "NiDGaKiVnkO3QX1Q",
|
||||
"deviceId": "2fbaf48ee97783260bc907e3ab0bd40c3",
|
||||
"version": "200"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "晴天",
|
||||
"name": "晴天|APP",
|
||||
@ -512,20 +439,6 @@
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "诺映",
|
||||
"name": "诺映|APP",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppGet",
|
||||
"ext": {
|
||||
"url": "https://www.noad.top",
|
||||
"dataKey": "708FA298F0855840",
|
||||
"dataIv": "708FA298F0855840",
|
||||
"deviceId": "2129ec9e6e5703cb0aeeddd79554e38f8",
|
||||
"version": "103"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "移动",
|
||||
"name": "移动|APP",
|
||||
|
216
js/cloud.min.js
vendored
216
js/cloud.min.js
vendored
@ -1,26 +1,49 @@
|
||||
import cheerio from "assets://js/lib/cheerio.min.js";
|
||||
import "assets://js/lib/crypto-js.js";
|
||||
import "./jsencrypt.js";
|
||||
import "./node-rsa.js";
|
||||
import "./pako.min.js";
|
||||
import 模板 from "./模板.js";
|
||||
import {
|
||||
gbkTool
|
||||
} from "./gbk.js";
|
||||
import "./json5.js";
|
||||
import "./jinja.js";
|
||||
const _jinja2 = cheerio.jinja2;
|
||||
cheerio.jinja2 = function(template, obj) {
|
||||
try {
|
||||
return jinja.render(template, obj)
|
||||
} catch (e) {
|
||||
console.log("新的jinja2库渲染失败,换回原始cheerio:" + e.message);
|
||||
return _jinja2(template, obj)
|
||||
}
|
||||
};
|
||||
cheerio,
|
||||
模板
|
||||
} from "./drpy-core-lite.min.js";
|
||||
let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2";
|
||||
const VERSION = vercode + " 3.9.51beta5 20241104";
|
||||
const VERSION = vercode + " 3.9.52beta3 20250801";
|
||||
const UpdateInfo = [{
|
||||
date: "20250801",
|
||||
title: "drpy依赖更新,使用drpy-core-lite.min.js",
|
||||
version: "3.9.52beta3 20250801",
|
||||
msg: `
|
||||
drpy-core.min.js 更换为更小的drpy-core-lite.min.js
|
||||
|
||||
`
|
||||
}, {
|
||||
date: "20250729",
|
||||
title: "drpy更新,所有依赖打包成一个js文件",
|
||||
version: "3.9.52beta2 20250729",
|
||||
msg: `
|
||||
1. wasm支持
|
||||
2. 引入 TextEncoder、TextDecoder对象
|
||||
3. 引入 WXXH 加解密库
|
||||
4. 所有依赖打包成一个js
|
||||
5. 增加 buildQueryString
|
||||
|
||||
`
|
||||
}, {
|
||||
date: "20250728",
|
||||
title: "drpy更新,增加tab_order线路模糊排序,优化解密算法支持文件头",
|
||||
version: "3.9.52beta1 20250728",
|
||||
msg: `
|
||||
1. 增加tab_order线路模糊排序
|
||||
2. 优化解密算法支持文件头
|
||||
3. wasm支持
|
||||
4. 增加 removeHeader 函数可用于清除js/py文件的头信息及所有头注释
|
||||
5. 引入 TextEncoder、TextDecoder对象
|
||||
6. 引入 WXXH 加解密库
|
||||
`
|
||||
}, {
|
||||
date: "20241126",
|
||||
title: "drpy更新,优化去广告算法",
|
||||
version: "3.9.51beta6 20241126",
|
||||
msg: `
|
||||
1. 更新龙头大佬提供的去广告算法
|
||||
`
|
||||
}, {
|
||||
date: "20241104",
|
||||
title: "drpy更新,增加新特性",
|
||||
version: "3.9.51beta5 20241104",
|
||||
@ -701,8 +724,7 @@ function ungzip(b64Data) {
|
||||
function encodeStr(input, encoding) {
|
||||
encoding = encoding || "gbk";
|
||||
if (encoding.startsWith("gb")) {
|
||||
const strTool = gbkTool();
|
||||
input = strTool.encode(input)
|
||||
input = gbkTool.encode(input)
|
||||
}
|
||||
return input
|
||||
}
|
||||
@ -710,8 +732,7 @@ function encodeStr(input, encoding) {
|
||||
function decodeStr(input, encoding) {
|
||||
encoding = encoding || "gbk";
|
||||
if (encoding.startsWith("gb")) {
|
||||
const strTool = gbkTool();
|
||||
input = strTool.decode(input)
|
||||
input = gbkTool.decode(input)
|
||||
}
|
||||
return input
|
||||
}
|
||||
@ -866,30 +887,73 @@ function fixAdM3u8Ai(m3u8_url, headers) {
|
||||
}
|
||||
let s = m3u8.trim().split("\n").filter(it => it.trim()).join("\n");
|
||||
let ss = s.split("\n");
|
||||
if (m3u8_url.indexOf("ffzy") > 0) {
|
||||
let j = 0,
|
||||
k1 = 0,
|
||||
m = 0,
|
||||
n = 0,
|
||||
t = 0;
|
||||
let s2 = "";
|
||||
for (let i = 0; i < ss.length; i++) {
|
||||
let s = ss[i];
|
||||
let s1 = "";
|
||||
if (s.startsWith("#EXTINF")) {
|
||||
s1 = s.slice(8);
|
||||
n++;
|
||||
if (n == 1) k1 = i;
|
||||
if (s2.indexOf(s1) == -1) {
|
||||
s2 = s2 + s1;
|
||||
m++
|
||||
}
|
||||
t = t + parseFloat(s1);
|
||||
i++;
|
||||
s = ss[i]
|
||||
}
|
||||
if (s.startsWith("#EXT-X-DISCONTINUITY")) {
|
||||
if (n == 5) {
|
||||
log("n:" + n);
|
||||
log("m:" + m);
|
||||
for (let j = k1; j < k1 + n * 2; j++) {
|
||||
log(ss[j])
|
||||
}
|
||||
log("广告位置:" + k1);
|
||||
log("数据条数:" + n);
|
||||
log("数据种类:" + m);
|
||||
log("广告时间:" + t.toFixed(5));
|
||||
ss.splice(k1, 2 * n + 1);
|
||||
i = i - 2 * n + 1
|
||||
}
|
||||
t = 0;
|
||||
m = 0;
|
||||
n = 0;
|
||||
s2 = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
let firststr = "";
|
||||
let maxl = 0;
|
||||
let kk = 0;
|
||||
let kkk = 2;
|
||||
let kkk1 = 1;
|
||||
let kkk2 = 0;
|
||||
let secondstr = "";
|
||||
for (let i = 0; i < ss.length; i++) {
|
||||
let s = ss[i];
|
||||
if (!s.startsWith("#")) {
|
||||
if (kk == 0) firststr = s;
|
||||
if (kk == 1) maxl = b(firststr, s);
|
||||
if (kk > 1) {
|
||||
if (maxl > b(firststr, s)) {
|
||||
if (kk > 0) {
|
||||
if (maxl > b(firststr, s) + 1) {
|
||||
if (secondstr.length < 5) secondstr = s;
|
||||
kkk = kkk + 2
|
||||
kkk2++
|
||||
} else {
|
||||
maxl = b(firststr, s);
|
||||
kkk++
|
||||
kkk1++
|
||||
}
|
||||
}
|
||||
kk++;
|
||||
if (kk >= 20) break
|
||||
if (kk >= 30) break
|
||||
}
|
||||
}
|
||||
if (kkk > 30) firststr = secondstr;
|
||||
if (kkk2 > kkk1) firststr = secondstr;
|
||||
let firststrlen = firststr.length;
|
||||
let ml = Math.round(ss.length / 2).toString().length;
|
||||
let maxc = 0;
|
||||
@ -925,6 +989,7 @@ function fixAdM3u8Ai(m3u8_url, headers) {
|
||||
log(ad_urls);
|
||||
m3u8 = ss.join("\n");
|
||||
log("处理耗时:" + ((new Date).getTime() - ts).toString());
|
||||
log(m3u8);
|
||||
return m3u8
|
||||
}
|
||||
|
||||
@ -1300,6 +1365,24 @@ function keysToLowerCase(obj) {
|
||||
}, {})
|
||||
}
|
||||
|
||||
function buildQueryString(params) {
|
||||
const queryArray = [];
|
||||
for (const key in params) {
|
||||
if (params.hasOwnProperty(key)) {
|
||||
let value = params[key];
|
||||
if (value === undefined || value === null) {
|
||||
value = ""
|
||||
} else {
|
||||
value = value.toString()
|
||||
}
|
||||
const encodedKey = encodeURIComponent(key);
|
||||
const encodedValue = encodeURIComponent(value);
|
||||
queryArray.push(encodedKey + "=" + encodedValue)
|
||||
}
|
||||
}
|
||||
return queryArray.join("&")
|
||||
}
|
||||
|
||||
function parseQueryString(query) {
|
||||
const params = {};
|
||||
query.split("&").forEach(function(part) {
|
||||
@ -2170,7 +2253,7 @@ function detailParse(detailObj) {
|
||||
}
|
||||
}
|
||||
if (p === "*") {
|
||||
vod.vod_play_from = "云盘";
|
||||
vod.vod_play_from = "兵哥视界";
|
||||
vod.vod_remarks = detailUrl;
|
||||
vod.vod_actor = "没有二级,只有一级链接直接嗅探播放";
|
||||
vod.vod_content = MY_URL;
|
||||
@ -2276,7 +2359,7 @@ function detailParse(detailObj) {
|
||||
}
|
||||
console.log(JSON.stringify(playFrom))
|
||||
} else {
|
||||
playFrom = ["云盘"]
|
||||
playFrom = ["兵哥视界"]
|
||||
}
|
||||
vod.vod_play_from = playFrom.join(vod_play_from);
|
||||
let vod_play_url = "$$$";
|
||||
@ -2391,7 +2474,17 @@ function vodDeal(vod) {
|
||||
if (rule.tab_order && rule.tab_order.length > 0) {
|
||||
let tab_order = rule.tab_order;
|
||||
tab_ordered_list = tab_removed_list.sort((a, b) => {
|
||||
return (tab_order.indexOf(a) === -1 ? 9999 : tab_order.indexOf(a)) - (tab_order.indexOf(b) === -1 ? 9999 : tab_order.indexOf(b))
|
||||
const getOrderIndex = (tabName, orderRules) => {
|
||||
for (let i = 0; i < orderRules.length; i++) {
|
||||
if (tabName.includes(orderRules[i])) {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return 9999
|
||||
};
|
||||
const indexA = getOrderIndex(a, tab_order);
|
||||
const indexB = getOrderIndex(b, tab_order);
|
||||
return indexA - indexB
|
||||
});
|
||||
tab_list = tab_ordered_list
|
||||
}
|
||||
@ -2523,11 +2616,62 @@ function isVideoParse(isVideoObj) {
|
||||
}
|
||||
}
|
||||
|
||||
function removeHeader(content, options = {}) {
|
||||
const {
|
||||
mode = "header-only", fileType
|
||||
} = options;
|
||||
const COMMENT_CONFIG = {
|
||||
".js": {
|
||||
start: "/*",
|
||||
end: "*/",
|
||||
regex: /^\s*\/\*([\s\S]*?)\*\/\s*/,
|
||||
headerRegex: /@header\(([\s\S]*?)\)/,
|
||||
topCommentsRegex: /^(\s*(\/\/[^\n]*\n|\/\*[\s\S]*?\*\/)\s*)+/
|
||||
},
|
||||
".py": {
|
||||
start: '"""',
|
||||
end: '"""',
|
||||
regex: /^\s*"""([\s\S]*?)"""\s*/,
|
||||
headerRegex: /@header\(([\s\S]*?)\)/,
|
||||
topCommentsRegex: /^(\s*(#[^\n]*\n|'''[\s\S]*?'''|"""[\s\S]*?""")\s*)+/
|
||||
}
|
||||
};
|
||||
if (!fileType) throw new Error("fileType option is required");
|
||||
const ext = fileType.startsWith(".") ? fileType : `.${fileType}`;
|
||||
const config = COMMENT_CONFIG[ext];
|
||||
if (!config) throw new Error(`Unsupported file type: ${ext}`);
|
||||
if (mode === "top-comments") {
|
||||
const match = content.match(config.topCommentsRegex);
|
||||
if (match) {
|
||||
return content.substring(match[0].length).trim()
|
||||
}
|
||||
return content.trim()
|
||||
}
|
||||
const match = content.match(config.regex);
|
||||
if (!match) return content.trim();
|
||||
let [fullComment, innerContent] = match;
|
||||
if (config.headerRegex.test(innerContent)) {
|
||||
innerContent = innerContent.replace(config.headerRegex, "");
|
||||
const cleanedInner = innerContent.split("\n").filter(line => line.trim().length > 0).join("\n");
|
||||
if (!cleanedInner.trim()) {
|
||||
return content.replace(fullComment, "").trim()
|
||||
} else {
|
||||
const newComment = `${config.start}${cleanedInner}${config.end}`;
|
||||
return content.replace(fullComment, newComment).trim()
|
||||
}
|
||||
}
|
||||
return content.trim()
|
||||
}
|
||||
|
||||
function getOriginalJs(js_code) {
|
||||
let current_match = /var rule|[\u4E00-\u9FA5]+|function|let |var |const |\(|\)|"|'/;
|
||||
let current_match = /var rule|function|let |var |const|class Rule|async|this\./;
|
||||
if (current_match.test(js_code)) {
|
||||
return js_code
|
||||
}
|
||||
js_code = removeHeader(js_code, {
|
||||
mode: "top-comments",
|
||||
fileType: ".js"
|
||||
});
|
||||
let rsa_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs=";
|
||||
let decode_content = "";
|
||||
|
||||
|
1
js/drpy-core-lite.min.js
vendored
Normal file
1
js/drpy-core-lite.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
149
js/drpy2.min.js
vendored
149
js/drpy2.min.js
vendored
@ -1,26 +1,42 @@
|
||||
import cheerio from "assets://js/lib/cheerio.min.js";
|
||||
import "assets://js/lib/crypto-js.js";
|
||||
import "./jsencrypt.js";
|
||||
import "./node-rsa.js";
|
||||
import "./pako.min.js";
|
||||
import 模板 from "./模板.js";
|
||||
import {
|
||||
gbkTool
|
||||
} from "./gbk.js";
|
||||
import "./json5.js";
|
||||
import "./jinja.js";
|
||||
const _jinja2 = cheerio.jinja2;
|
||||
cheerio.jinja2 = function(template, obj) {
|
||||
try {
|
||||
return jinja.render(template, obj)
|
||||
} catch (e) {
|
||||
console.log("新的jinja2库渲染失败,换回原始cheerio:" + e.message);
|
||||
return _jinja2(template, obj)
|
||||
}
|
||||
};
|
||||
cheerio,
|
||||
模板
|
||||
} from "./drpy-core-lite.min.js";
|
||||
let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2";
|
||||
const VERSION = vercode + " 3.9.51beta6 20241126";
|
||||
const VERSION = vercode + " 3.9.52beta3 20250801";
|
||||
const UpdateInfo = [{
|
||||
date: "20250801",
|
||||
title: "drpy依赖更新,使用drpy-core-lite.min.js",
|
||||
version: "3.9.52beta3 20250801",
|
||||
msg: `
|
||||
drpy-core.min.js 更换为更小的drpy-core-lite.min.js
|
||||
|
||||
`
|
||||
}, {
|
||||
date: "20250729",
|
||||
title: "drpy更新,所有依赖打包成一个js文件",
|
||||
version: "3.9.52beta2 20250729",
|
||||
msg: `
|
||||
1. wasm支持
|
||||
2. 引入 TextEncoder、TextDecoder对象
|
||||
3. 引入 WXXH 加解密库
|
||||
4. 所有依赖打包成一个js
|
||||
5. 增加 buildQueryString
|
||||
|
||||
`
|
||||
}, {
|
||||
date: "20250728",
|
||||
title: "drpy更新,增加tab_order线路模糊排序,优化解密算法支持文件头",
|
||||
version: "3.9.52beta1 20250728",
|
||||
msg: `
|
||||
1. 增加tab_order线路模糊排序
|
||||
2. 优化解密算法支持文件头
|
||||
3. wasm支持
|
||||
4. 增加 removeHeader 函数可用于清除js/py文件的头信息及所有头注释
|
||||
5. 引入 TextEncoder、TextDecoder对象
|
||||
6. 引入 WXXH 加解密库
|
||||
`
|
||||
}, {
|
||||
date: "20241126",
|
||||
title: "drpy更新,优化去广告算法",
|
||||
version: "3.9.51beta6 20241126",
|
||||
@ -708,8 +724,7 @@ function ungzip(b64Data) {
|
||||
function encodeStr(input, encoding) {
|
||||
encoding = encoding || "gbk";
|
||||
if (encoding.startsWith("gb")) {
|
||||
const strTool = gbkTool();
|
||||
input = strTool.encode(input)
|
||||
input = gbkTool.encode(input)
|
||||
}
|
||||
return input
|
||||
}
|
||||
@ -717,8 +732,7 @@ function encodeStr(input, encoding) {
|
||||
function decodeStr(input, encoding) {
|
||||
encoding = encoding || "gbk";
|
||||
if (encoding.startsWith("gb")) {
|
||||
const strTool = gbkTool();
|
||||
input = strTool.decode(input)
|
||||
input = gbkTool.decode(input)
|
||||
}
|
||||
return input
|
||||
}
|
||||
@ -1351,6 +1365,24 @@ function keysToLowerCase(obj) {
|
||||
}, {})
|
||||
}
|
||||
|
||||
function buildQueryString(params) {
|
||||
const queryArray = [];
|
||||
for (const key in params) {
|
||||
if (params.hasOwnProperty(key)) {
|
||||
let value = params[key];
|
||||
if (value === undefined || value === null) {
|
||||
value = ""
|
||||
} else {
|
||||
value = value.toString()
|
||||
}
|
||||
const encodedKey = encodeURIComponent(key);
|
||||
const encodedValue = encodeURIComponent(value);
|
||||
queryArray.push(encodedKey + "=" + encodedValue)
|
||||
}
|
||||
}
|
||||
return queryArray.join("&")
|
||||
}
|
||||
|
||||
function parseQueryString(query) {
|
||||
const params = {};
|
||||
query.split("&").forEach(function(part) {
|
||||
@ -2221,7 +2253,7 @@ function detailParse(detailObj) {
|
||||
}
|
||||
}
|
||||
if (p === "*") {
|
||||
vod.vod_play_from = "在线播放";
|
||||
vod.vod_play_from = "兵哥视界";
|
||||
vod.vod_remarks = detailUrl;
|
||||
vod.vod_actor = "没有二级,只有一级链接直接嗅探播放";
|
||||
vod.vod_content = MY_URL;
|
||||
@ -2327,7 +2359,7 @@ function detailParse(detailObj) {
|
||||
}
|
||||
console.log(JSON.stringify(playFrom))
|
||||
} else {
|
||||
playFrom = ["在线播放"]
|
||||
playFrom = ["兵哥视界"]
|
||||
}
|
||||
vod.vod_play_from = playFrom.join(vod_play_from);
|
||||
let vod_play_url = "$$$";
|
||||
@ -2442,7 +2474,17 @@ function vodDeal(vod) {
|
||||
if (rule.tab_order && rule.tab_order.length > 0) {
|
||||
let tab_order = rule.tab_order;
|
||||
tab_ordered_list = tab_removed_list.sort((a, b) => {
|
||||
return (tab_order.indexOf(a) === -1 ? 9999 : tab_order.indexOf(a)) - (tab_order.indexOf(b) === -1 ? 9999 : tab_order.indexOf(b))
|
||||
const getOrderIndex = (tabName, orderRules) => {
|
||||
for (let i = 0; i < orderRules.length; i++) {
|
||||
if (tabName.includes(orderRules[i])) {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return 9999
|
||||
};
|
||||
const indexA = getOrderIndex(a, tab_order);
|
||||
const indexB = getOrderIndex(b, tab_order);
|
||||
return indexA - indexB
|
||||
});
|
||||
tab_list = tab_ordered_list
|
||||
}
|
||||
@ -2574,11 +2616,62 @@ function isVideoParse(isVideoObj) {
|
||||
}
|
||||
}
|
||||
|
||||
function removeHeader(content, options = {}) {
|
||||
const {
|
||||
mode = "header-only", fileType
|
||||
} = options;
|
||||
const COMMENT_CONFIG = {
|
||||
".js": {
|
||||
start: "/*",
|
||||
end: "*/",
|
||||
regex: /^\s*\/\*([\s\S]*?)\*\/\s*/,
|
||||
headerRegex: /@header\(([\s\S]*?)\)/,
|
||||
topCommentsRegex: /^(\s*(\/\/[^\n]*\n|\/\*[\s\S]*?\*\/)\s*)+/
|
||||
},
|
||||
".py": {
|
||||
start: '"""',
|
||||
end: '"""',
|
||||
regex: /^\s*"""([\s\S]*?)"""\s*/,
|
||||
headerRegex: /@header\(([\s\S]*?)\)/,
|
||||
topCommentsRegex: /^(\s*(#[^\n]*\n|'''[\s\S]*?'''|"""[\s\S]*?""")\s*)+/
|
||||
}
|
||||
};
|
||||
if (!fileType) throw new Error("fileType option is required");
|
||||
const ext = fileType.startsWith(".") ? fileType : `.${fileType}`;
|
||||
const config = COMMENT_CONFIG[ext];
|
||||
if (!config) throw new Error(`Unsupported file type: ${ext}`);
|
||||
if (mode === "top-comments") {
|
||||
const match = content.match(config.topCommentsRegex);
|
||||
if (match) {
|
||||
return content.substring(match[0].length).trim()
|
||||
}
|
||||
return content.trim()
|
||||
}
|
||||
const match = content.match(config.regex);
|
||||
if (!match) return content.trim();
|
||||
let [fullComment, innerContent] = match;
|
||||
if (config.headerRegex.test(innerContent)) {
|
||||
innerContent = innerContent.replace(config.headerRegex, "");
|
||||
const cleanedInner = innerContent.split("\n").filter(line => line.trim().length > 0).join("\n");
|
||||
if (!cleanedInner.trim()) {
|
||||
return content.replace(fullComment, "").trim()
|
||||
} else {
|
||||
const newComment = `${config.start}${cleanedInner}${config.end}`;
|
||||
return content.replace(fullComment, newComment).trim()
|
||||
}
|
||||
}
|
||||
return content.trim()
|
||||
}
|
||||
|
||||
function getOriginalJs(js_code) {
|
||||
let current_match = /var rule|[\u4E00-\u9FA5]+|function|let |var |const |\(|\)|"|'/;
|
||||
let current_match = /var rule|function|let |var |const|class Rule|async|this\./;
|
||||
if (current_match.test(js_code)) {
|
||||
return js_code
|
||||
}
|
||||
js_code = removeHeader(js_code, {
|
||||
mode: "top-comments",
|
||||
fileType: ".js"
|
||||
});
|
||||
let rsa_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs=";
|
||||
let decode_content = "";
|
||||
|
||||
|
2
js/爱搜.js
2
js/爱搜.js
@ -31,7 +31,7 @@ var rule = {
|
||||
img: 'img&&src',
|
||||
desc: '.card-text:eq(2)&&Text;;;;',
|
||||
content: 'body&&.semi-space-loose-vertical&&a&&href',
|
||||
tabs: "js:TABS = ['懒盘']",
|
||||
tabs: "js:TABS = ['爱搜']",
|
||||
lists: "js:\n LISTS = [];\n let lists1 = pdfa(html, 'body&&.semi-space-loose-vertical').map(it => {\n let _tt = pdfh(it, 'span&&title');\n let _uu = pdfh(it, 'a&&href');\n return _tt + '$' + _uu;\n });\n LISTS.push(lists1);\n ",
|
||||
},
|
||||
搜索: 'js:\n let html = fetch(input);\n let list = pdfa(html, "body&&.semi-space-medium-vertical");\n VODS = list.map(x => {\n let remarks = pdfh(x, "div&&img&&alt");\n // 过滤掉包含"迅雷云盘"的内容\n if(remarks.includes("迅雷云盘") || remarks.includes("115") || remarks.includes("阿里")) return null;let vodName = pdfh(x, "div&&a&&title");\n // 过滤条件:迅雷云盘、.txt后缀、空名称\n if(vodName.endsWith(".zip") || vodName.endsWith(".txt") || !vodName.trim()) return null;\n return {\n vod_name: pdfh(x, "div&&a&&title"),\n vod_pic: \'\',\n vod_remarks: remarks,\n vod_content: remarks,\n vod_id: pdfh(x, "div&&a&&href")\n }\n }).filter(x => x !== null);\n ',
|
||||
|
@ -33,8 +33,12 @@
|
||||
"name": "🚀小米"
|
||||
},
|
||||
{
|
||||
"url": "http://肥猫.com",
|
||||
"name": "🚀肥猫"
|
||||
"url": "http://www.饭太硬.com/tv",
|
||||
"name": "🚀饭太硬"
|
||||
},
|
||||
{
|
||||
"url": "https://raw.githubusercontent.com/yoursmile66/TVBox/main/XC.json",
|
||||
"name": "🚀南风"
|
||||
},
|
||||
{
|
||||
"url": "http://104.168.19.207:3000/lwang/tvbox/raw/branch/main/adult.json",
|
||||
|
BIN
spider.jar
BIN
spider.jar
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user