// ==UserScript==
// @name (改)百度网盘会员青春版
// @author hmjz100、Gwen
// @namespace github.com/hmjz100
// @version 1.2.7.1
// @description 《也许同类型中最好用?》系列、LinkSwift 官方扩展 - 虚拟百度网盘身份信息为会员,支持隐藏云一朵、使用视频倍速、生成/查看/下载 AI字幕、修改头像、用户名、等级、SVIP 10 ID 等功能,自定义程度超高!
// @icon data:image/png;base64,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
// @license AGPL-3.0-or-later
// @homepage https://github.com/hmjz100/BaiduNetDiskYouthMember/
// @homepageURL https://github.com/hmjz100/BaiduNetDiskYouthMember/
// @support https://github.com/hmjz100/BaiduNetDiskYouthMember/issues
// @supportURL https://github.com/hmjz100/BaiduNetDiskYouthMember/issues
// @require https://unpkg.com/jquery@3.6.0/dist/jquery.min.js
// @require https://unpkg.com/sweetalert2@11.4.8/dist/sweetalert2.min.js
// @resource SwalLigt https://unpkg.com/sweetalert2@11.4.8/dist/sweetalert2.min.css
// @run-at document-start
// @early-start
// @match *://pan.baidu.com/*
// @match *://yun.baidu.com/*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_getResourceText
// @grant GM_registerMenuCommand
// @grant unsafeWindow
// @compatible Chrome
// @compatible Edge
// @compatible Firefox
// @compatible Safari
// @compatible Opera
// ==/UserScript==
(function $baidu() {
// 严格模式,确保代码安全执行,不越界
"use strict";
// unsafeWindow 检测,适用于 Via 这类无 unsafeWindow 的浏览器
if (typeof (unsafeWindow) === "undefined") window.unsafeWindow = window;
let temp = {
// 脚本已包含设置 UI,所以请不要修改此处的代码。
defaults: {
vip: true,
svip: true,
previous: false,
name: "百湿不得其解",
photo: "https://bkimg.cdn.bcebos.com/pic/cdbf6c81800a19d8bc3e5cfd95ab958ba61ea9d3e8b3",
// desc: "What's your problem? | 业绩增长凌驾于用户体验,简单经营替代了简单可依赖,我们与用户渐行渐远,我们与创业初期坚守的使命和价值观渐行渐远。",
level: 10,
point: 100000,
vip_id: "000001",
endtime: 253402185600,
unAnalytics: true,
unAI_Yiduo: true,
unPViewer: false,
unVerSwitch: false,
unTab_aiNote: true,
unTab_aiStudy: false,
unTab_aiCourseware: true,
unTab_aiDraft: false,
iLoveAD: false,
debug: false,
},
swalDefault: {
position: "center",
heightAuto: false,
scrollbarPadding: false,
confirmButtonText: `确认`,
denyButtonText: `拒绝`,
cancelButtonText: `取消`
},
hooker: new WeakMap(),
url: (url = location) => url.host + url.pathname + url.search + url.hash
}
/*
防止代码因其他原因被执行多次
代码出自 “Via 轻插件”,作者谷花泰
*/
let key = encodeURIComponent("(改)百度网盘会员青春版:主代码");
if (window[key]) return;
window[key] = true;
let mount = idontknow("BaiduNetDiskYouthMember");
let info = {
author: GM_info.script?.author,
name: GM_info.script?.name,
version: (GM_info.script?.version || "1.2.7.1"),
icon: (GM_info.script?.icon || "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAA1bSURBVHgB7VoJcFXVGf5PgkISkhcIL2GRzAMrKBYFtCjEDjyjw4DRGrcEp0pSTShuvIB1EMEkMq2jtRiLLGoliYAQrICJyAygOJWkILZBR61IS56CAgkZHmRhaXJPz7689wJZO9NOfrjJXc6993z/8v3/f24AeqVXeqVX/ocEQScF1xTHA/SZChAR36EbHWO/tdXYb2tsq76mx/jR+OyPoRPSBzoh+Pu3Xz7w5Xe+I4dqoan5HNEa1RvW1+kuOYUQOYmB/iTnsNAuEvv8Nx+P1X1Y7Jj7dAC5A/FhGNyDXID/XuyHFkhHE7P3QwekwxamYMvX7/aVl1VyJPKnfBIOGg9YKMQWh86e3ORIsMCBs9/ANcWwIj5WX+M6cLtdUPjUvYHE2BgvSsltN+gI6IDgw+vzd1bs81UwsABg/pSzESAvBFbqRFrRBksBOmI/CKjcyCOP152CxS9sjG8437IZVxe3O6zaDZhY9s7Dh44XlL35kTKn4cTc6+RDlS8jBR4UGGwA1S7NroGtAMd4h7K4CA+6UdDLVm/zwL/xZuhOwISgPHXHThYvf36TOMGnISKX+ibRAeLGRPwyUta3X8FcVECl4xzLVbENnoIWY8hvanesgAM9h/Ge6n/C21sqp+I9xS9DO+SigCnY5jPOrqXPlsWfOB6gwCyrUUzqCId9ggCgQUqgkrDpbwdDqOuCYVmuX6SfhZhW6bV171XCF99858N//dMs6CpgiLxkS8mybZ662lMcLNZxKchYWFoFcBBcaTnlGMzKEoxjqMUEalk+6JokSsXk5HjJq5vhaG2gCFe+Pg46C5gycsWGqmur9x60qEdiMs+Z5CTD2cHCBSUI7oZBjIuhVZGUZmRQ43XqdvgDles7xjMaSHpc8NI78acbzm/Gu9omsTYBM0Yu3+cr31AZgk5nIK1zrOzAB4QwMW6DccUNPE45CKkYMEhPWlyPkTFONsQtfrT+FKx6Z5cH+rRs7hBgXLOGMPKxgrLVHxknVZrAEiCzKoqwSMp0OQdwG3FpTBaCiYvfz3K0SNIavH2/2nc0uW2v+hJKy6um4k/eyA+HDYWCLfbU1jbvWppf5qkncRtWIRAax/oamCwK0kqjr7kCrkuZAFdeeyXERPVlZSWmpSXZmk43gv9fh6G4tBwam87oZyADGDYITFjUMSo0B4zqjMjSeRkwbnRyFprycGmbgCnYJsLIS+aVKrDBgNpQALUxEqbXJENOR/WPghzfL2HCZMIlkaSSjYgEaGnhdbTcxPHGsu2w4d0dBptjAdqwqiBOFe9idqRY4eWnMEh/otTXFj4QGDbIPR55s/1yrrZLR15S/H5ZlaeeJHQdqLqgCBEkfyEkig8FVrrr00sehQk3jLXUo3expm4i0TH9wrg+tOnKsljn/yRYvp0mJLZ41XuExE7vMklMAaYkVb6haurOis+4lWRxgRAKmqYgJTLCMctBEJrWOTU9YxokjxgGoYoK9Zna2pNQsW23XU1Z4DUry3jVOV2PMfI2fHukDpa9+7EHWs8pEmPdEv5+XVb1ngMFFZSRZeODkVEkcxsq1JykkBVj6pJ25597r7O0VHe8HkpXlrF4dcSssEhJjY3N0EDiV8a8ZGExd8SPTWBynOYJ1XQY89i65yv4yTD3VLzjNR+6dXZRHzHLuaxGBlAuhpBNSnRetHg0CcvBWGnDSjtEiGXRoMSBwpp8fMmKMvi0qpoTPXmBsJIAhNX7FPnw5yL5HvpmR/SKsoRV97DU5mjwgsiovPF+JUyfeHU+2eWAD/vrxmmSskoIDpzNT2QhjBR5cKLCFlj2QjIyKibKNC7bCFjrHuUsQhzBetK6INiYTgJrMuR+p/gCWUwuTYKV5Uk8nzkL1QcPx+NtKz0RWkdiblZ4IZtjhHo1U2r3VbEswDQRF7UFwZhrRokpI5WHZfpSHCCeF5KfhSLAcGtZsEjXlvHN7xcbtTp5H2VtKszCCe44P2FIT3PT2eA52voglpNWUHkSQMcOnyibSY3/R6gjROQe4lYPevSph2Drpp3Q2NAIvP3h/c9xEtuHan4gMdwMDlZRBJLtzSkIYExrDqhSSDUV3PpGnIsbE12xfjR9jp8BJmCLbs+cXETjGCsf44gUGQkXUw9EYMUJBtXPKh8pfXMLPLkoR51JHJwA2Y9k2nnY2N/54aew9s870LG6k6IOF7ndsKTIgMhR6YySJ9YVGp2DOmaXIXfGZBg+yMUKkEj6o7Bo0963Vj0+jlj4yppvj1rmRRKsyYACsNY26BworEynduSHWvbCq0mVBRERfGNh4hj5y1G5ZeTwJJh03VVQ9dnXtBlAwalJAhdpEaylIAjN3XRgpncCPHbHlP1o+q9n0jO68Gg9n535q9T9Kam6SJAuZdK8GadCiUiPk2TGXJ/WPrhs3VZ4dekaqCVuq54qZ2WFDD9OSnBB/tyZwlIybLCKSxWnYHAHMo7FOPo/7cafwvy7U/fDmUu9YJlRvpcuvUb0rX5p8dueA18eDqlPzYW34DLPtLD6jWwGnXjTePCMHA5JJF3R+IVWh9XVI5MHE6Bx3L1buHsvX7MV3t2xl81QLwtpwIAMa5qkSfbpEtMVl7lhxeP3+V1R/bw0dsMC5qDXk3q6adfvF5d5vq85btexAKGbBRB09aNY1NEuj0Vvq0Gwa9HR/eDFwjlw+WWJAnALfP7VIfC9UBLktpxJ1KIB1op1SGslVihgCPGStQse9Mf162uBtV1aamDETH9MVIz3N89l+BPIUmgIWC4Qtr/FOgQAFNGhEAVhmTN58dHQfBbWbNxuaJ27tnRdXToi5GCtVEmUDvUWXorAELJmvfyJ+8KCDQtYgY6O8T5ZmOlPSHSpAoCTFUL4Qr0piAYejKbdHEutIUC0Oo567mmat636lVuUL9livVoir5jHopobMtAFK5/ICAwf6AoLtk3AEnRSUnz6gucyAgPdcWCTlaPBOI61GqHcTDK5MI8u+KVj8onKFY5p3p9ps5HzR+sDjMZw0PoVB6qtLs8OIRywYm4GaQf7twmW4YKLCK5ZN+5EXaD6aV8xac7Pqlc44chKgATDtaNjomHE5ZfZXiIZXfhmyvVj4K4ZN/H4pcTltMLvXtsEH+yutsEaFuV1M39XLOGAtQtnwdABrnQ0bfaWC+G5KGAO+q0s/6G64iWL1tMVCU4cqqC3QYulGXZ846Rr4Zlnc3njHxnJNxpvBhtbBYgAfLS2Hu7NW8rerTMFlks+SLI/5ajY6L6wypcBo4YnZaFbZpdeDEu7FuLRiAdLPB533vwF6crNQsEKyxs98h2/mALhet8QPauyCMPREwF44rerQaxmYpbMBWi2Dm0nUph398141FB3YXvAthswm+LlDxaNGZNc+MhjM1iq4USENDPzis9o0jF88cVBXWBI4FI7wUJOfbLva8he8Ef48cRJWYtQgEjHr0ZLc+28e1Ih7YYxz6FpcwqgvTigg4IPril4v2Jf/uriD0PzLyjXUwXKrbdOIjX0IMARcoWTFxzM/SlLk/0GwtDbPtrLFgBkuxfSCHALix8Ycm5Lgdzpkwo7Albe3WHBB0oLNmyszF+/4ROTRJgtRX7VpCbZNEzFpHI3YMvwjghQWkxgxFtxo4kiYCdDbtpNr6Bbcn3QQenUB3E0elYB/scaD5nZrHUbdwMvmRCyqi4FDIU5Z3qEzQHAj3l7iHSzL02Tk0Ysm5ZSglI7DrbTgBnoqx7Iwl+VuBoaz9255YN9YWprfexYYPRHcEeuURjhwMcwlCD/SkB+wKOdT+70yZ8TsNnQSenQB/EQOY+zc2bdvD91ylhFVA62P4vYQLBRfWGrsOCCwizv8Ctpk8bC/AzS+Vxy6VTognQJMBqfHSAfo73zHpnhHzsmWRYVGIzqSC6WYzBqbMOtrW9GogqTXymlX9DOJ+8ebw1EOOlkUT0AXZCuWRg06EV5d/pHehJZ3MmvfmIEr4ixKC8BrOLfrKDMhQbRVrPOZ0Vepj8uNu5m5G27ZGyvdBkwFQLaHxcd5X1xYaY/if6FjayMQH28touUoIZdub3RPNBn0Pp4uS/D74q91Gt+LumKdAtgKgx0fwGaNBtg97F6RcRoMMQinByHjacxsCvnzwwMT4rzdodlpXQbYCoU9LCEAel/eGZmIHFQrOW2PA/rY/3FgF9E4psOPR5Kwc7LJJ2Pq1vBiml0v+BPi8cdqw9UZy1cTaqnsxo06LUvDdaIW+DNwNpFWaTzGZCObnl4C3SzdKuFpdC/jhucEJe97Jn7ob/6IohDPpDrdVE6EdH5zM+EoQP7Z/cEWP6eHhI08aGSK5Ldvufn3gXB1ZX+mM7pGovvLnn3pcKoYYmFKHVOCfSQ9BhgKmjiw69MGJ1cuDgnTRFVEDuxnEs6H5SX4YXbJ19NwM4ugB6UHgVMBU16qOA2AiTv/lSWdhDiIM0/jMm5PQVmpl5fiLw9C5ZKp2vpjghKySnAlW9QkPnrt39GmvxTDChdmhFgX0He3AL4L0iPsHRbgv/yehbpifP/9s13nliyAD94QFyAFCzEsjlF8P8s9G8uyOaBXumVXumVXrmw/AdT224dpRDt7wAAAABJRU5ErkJggg=="),
maction: GM_info.scriptaction,
mversion: GM_info.version,
};
let base = {
hooker: {
toString: function () {
if (temp.hooker.has(this)) return `function ${this.name}() { [native code] }`;
return originalToString.call(this);
},
toLocaleString: function () {
if (temp.hooker.has(this)) return `function ${this.name}() { [native code] }`;
return originalToLocaleString.call(this);
},
attachShadow(options) {
if (options?.mode === "closed") {
options.mode = "open";
console.log("【(改)百度网盘会员青春版】Hook Shadow\n新增:", this);
};
return originalAttachShadow.call(this, options);
},
async fetch(input, init = {}) {
let url = typeof input === "string" ? input : input?.url || "";
url = new URL(url, location.origin);
if (rules.some(r => r.match(url) && r.condition() && r.runat === "url")) url = base.hooker.universal("fetch", url, url, "url");
if (rules.some(r => r.match(url) && r.condition() && r.runat === "header")) {
if (!init.headers) init.headers = {};
let tempHeaders = {};
if (init.headers instanceof Headers) {
for (let [key, value] of init.headers.entries()) {
tempHeaders[key] = value;
}
} else {
tempHeaders = { ...init.headers };
}
init.headers = new Headers(base.hooker.universal("fetch", url, tempHeaders, "header"));
}
if (rules.some(r => r.match(url) && r.condition() && r.runat === "end")) {
try {
let response = await originalFetch.call(this, url, init);
let responseText = await response.text();
let res = base.hooker.universal("fetch", url, responseText, "end");
return new Response(res, {
status: response.status,
statusText: response.statusText,
headers: response.headers
});
} catch (e) {
return originalFetch.call(this, url, init);
}
}
if (rules.some(r => r.match(url) && r.condition() && r.runat === "start")) {
try {
let res = base.hooker.universal("fetch", url, null, "start");
return new Response(res, {
status: 200,
statusText: "OK",
headers: { "Content-Type": "plain/text" }
});
} catch (e) {
return originalFetch.call(this, url, init);
}
}
return originalFetch.call(this, url, init);
},
send(data) {
let url = this[mount];
if (this.headers) {
for (let [name, value] of Object.entries(this.headers)) {
originalSetRequestHeader.call(this, name, value);
}
}
if (rules.find(rule => rule.match(url) && rule.condition() && rule.runat === "start")) {
try {
let res = base.hooker.universal("XHR", url, null, "start");
Object.defineProperty(this, "responseText", {
writable: true,
});
Object.defineProperty(this, "response", {
writable: true,
});
this.response = res;
this.responseText = res;
["readystatechange", "load", "loadend"].forEach(prop => {
this.dispatchEvent(new Event(prop));
if (typeof this[prop] === "function") this[prop]();
if (typeof this[`on${prop}`] === "function") this[`on${prop}`]();
});
return true; // 显式 return
} catch (e) {
return originalSend.apply(this, arguments);
}
}
return originalSend.apply(this, arguments);
},
open(method, input) {
let url = new URL(input, location.origin);
if (rules.some(r => r.match(url) && r.condition() && r.runat === "url")) url = base.hooker.universal("XHR", url, url, "url");
this[mount] = url;
this.addEventListener("readystatechange", function () {
if (this.readyState === 4) {
if (rules.some(r => r.match(url) && r.condition() && r.runat === "end")) {
let response = this.response;
if (this.responseType === "" || this.responseType === "text") response = this.responseText;
let res = base.hooker.universal("XHR", url, response, "end");
Object.defineProperty(this, "responseText", {
writable: true,
});
Object.defineProperty(this, "response", {
writable: true,
});
this.response = res;
this.responseText = res;
}
}
});
return originalOpen.call(this, method, url);
},
setRequestHeader(name, value) {
let url = this[mount];
if (url && rules.some(r => r.match(url) && r.condition() && r.runat === "header")) {
if (!this.headers) this.headers = {};
this.headers[name] = value;
this.headers = base.hooker.universal("XHR", url, { ...this.headers }, "header");
return true; // 显式 return
}
return originalSetRequestHeader.call(this, name, value);
},
sendBeacon(input, data) {
let url = new URL(input, location.origin);
if (rules.some(rule => rule.match(url) && rule.condition() && rule.runat === "start")) {
data = base.hooker.universal("sendBeacon", url, data, "start");
return true;
}
return originalSendBeacon.call(this, url, data);
},
Image: function Image(...args) {
return new Proxy(new OriginalImage(...args), {
set(target, prop, value) {
if (prop === "src") {
let url = new URL(value, location.origin);
if (rules.some(r => r.match(url) && r.condition() && r.runat === "image")) {
// if (user.debug) console.log(`${log_head} Image`, "\n请求地址:", url.href, "\n模拟回复: 成功");
return true; // 显式 return
}
}
return (target[prop] = value); // 未匹配,设置属性
},
get(target, prop) {
return target[prop]; // 获取属性值
}
});
},
createElement(tagName) {
let element = originalCreateElement.call(unsafeWindow.document, tagName)
if (tagName.toLowerCase() === "img") {
Object.defineProperty(element, "src", {
set(value) {
let url = new URL(value, location.origin);
if (rules.some(r => r.match(url) && r.condition() && r.runat === "image")) {
// if (user.debug) console.log(`${log_head} createElement img`, "\n请求地址:", url.href, "\n模拟回复: 成功");
return true; // 显式 return
}
return element.setAttribute("src", value); // 未匹配,设置属性
},
get() {
return element.getAttribute("src");
}
});
}
return element;
},
universal(from, url, data, type) {
let res, oriRes;
try {
res = typeof data === "string" ? JSON.parse(data) : data;
oriRes = typeof data === "string" ? JSON.parse(data) : base.deepClone(data);
} catch (e) {
res = data;
oriRes = base.deepClone(data);
}
let rule = rules.find(r => r.match(url) && r.condition() && r.runat === type);
if (rule && typeof rule.action === "function") {
if (type === "variable") {
var originalSet = res.set;
if (originalSet) res.set = (...args) => { set("set", ...args) };
var originalMSet = res.mset;
if (originalMSet) res.mset = (...args) => { set("mset", ...args) };
var originalSetData = res.setData;
if (originalSetData) res.setData = (...args) => { set("setData", ...args) };
function set(type, ...args) {
let object;
if (typeof args[0] === "object" && !Array.isArray(args[0]) && args[0] !== null) {
object = args[0];
} else if (args[1] && args[1] !== null) {
object = { [args[0]]: args[1] };
}
for (let key in object) {
if (Object.prototype.hasOwnProperty.call(object, key)) {
if (["function", "symbol", "undefined"].includes((typeof object[key]).toLowerCase())) {
delete object[key];
}
}
}
object = base.hooker.universal(from, url, object, "variable");
if (type === "set") for (key in object) {
originalSet.call(res, key, object[key]);
}
if (type === "mset") {
if (originalSet) for (key in object) {
originalSet.call(res, key, object[key]);
} else {
originalMSet.call(res, object);
}
}
if (type === "setData") originalSetData.call(res, object);
}
if (!originalMSet && !originalMSet && !originalSetData) res = rule.action(res, url);
}
if (!["variable"].includes(type)) res = rule.action(res, url);
if (type === "header" && res !== null && typeof res === "object") try {
let tempHeaders = {};
for (let key in res) tempHeaders[key.toLowerCase().split("-").map(word => word.charAt(0).toUpperCase() + word.slice(1)).join("-")] = res[key];
res = tempHeaders;
} catch { }
if (user.debug) {
let log_head = `【(改)百度网盘会员青春版】Hook`
if (!base.deepEqual(res, oriRes)) {
let format = (data) => typeof data === "string" && data.startsWith("#EXTM3U") ? "(M3U8预览) " + data.split("\n").slice(0, 5).join("\\n") : data;
type === "start" && console.log(`${log_head} ${from} Virt`, "\n请求地址:", url.href, "\n模拟回复:", format(res) || "空");
type === "end" && console.log(`${log_head} ${from} Repl`, "\n请求地址:", url.href, "\n原始回复:", format(oriRes) || "空", "\n修改回复:", format(res) || "空");
type === "header" && console.log(`${log_head} ${from} Head`, "\n请求地址:", url.href, "\n原始头部:", oriRes || "空", "\n修改头部:", res || "空");
type === "variable" && console.log(`${log_head} ${from}`, "\n原始内容:", oriRes || "空", "\n修改内容:", res || "空");
}
type === "url" && console.log(`${log_head} ${from} URL`, "\n原始地址:", oriRes?.href || "空", "\n修改地址:", res?.href || "空");
}
if (typeof res === "object" && !["header", "variable", "url"].includes(type)) try { res = JSON.stringify(res); } catch { }
}
return res;
},
},
deepClone(obj) {
if (obj instanceof URL) return new URL(obj.href);
if (obj === null || typeof obj !== "object") return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
if (typeof obj === "function") return obj; // 函数直接引用(无法真正克隆)
if (Array.isArray(obj)) {
return obj.map(item => this.deepClone(item));
}
let cloned = {};
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
cloned[key] = this.deepClone(obj[key]);
}
}
return cloned;
},
deepEqual(a, b) {
// 严格相等
if (Object.is(a, b)) return true;
// 类型不同直接返回 false
if (typeof a !== typeof b) return false;
// null 或 undefined(typeof null === "object",需提前处理)
if (a === null || b === null || a === undefined || b === undefined) {
return a === b;
}
// Date
if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime();
}
// RegExp
if (a instanceof RegExp && b instanceof RegExp) {
return a.toString() === b.toString();
}
// 函数:只有同一个引用才算相等
if (typeof a === "function" && typeof b === "function") {
return a === b;
}
// 非对象类型(string, number, boolean 等)已在 Object.is 处理,此处可跳过
if (typeof a !== "object") {
return false;
}
// 数组
let aIsArray = Array.isArray(a);
let bIsArray = Array.isArray(b);
if (aIsArray !== bIsArray) return false;
if (aIsArray) {
if (a.length !== b.length) return false;
for (let i = 0; i < a.length; i++) {
if (!this.deepEqual(a[i], b[i])) return false;
}
return true;
}
// 普通对象
let aKeys = Object.keys(a);
let bKeys = Object.keys(b);
if (aKeys.length !== bKeys.length) return false;
for (let key of aKeys) {
if (!Object.prototype.hasOwnProperty.call(b, key)) return false;
if (!this.deepEqual(a[key], b[key])) return false;
}
return true;
},
getSettings() {
var now = GM_getValue("user_settings", {});
return { ...temp.defaults, ...now };
},
async setSettings(settings) {
await GM_setValue("user_settings", settings);
},
/**
* 显示脚本设置
* @author hmjz100
*/
async showSettings() {
let settings = base.getSettings();
function generateHTML(title, key, type, other = {}) {
function escapeHtml(str) {
if (typeof str !== "string") return str;
return str.replace(/[&<>""]/g,
tag => ({
"&": "&",
"<": "<",
">": ">",
"\"": `"`,
"'": `'`
}[tag] || tag)
);
}
// 将 other 对象转换为属性字符串
function buildAttrs(obj = {}) {
let attrs = "";
for (let [k, v] of Object.entries(obj)) {
// 跳过空值或 undefined
if (v === undefined || v === null) continue;
if (typeof v === "boolean") {
if (v) attrs += ` ${k}`;
continue;
}
// 其他值作为 k="value"
attrs += ` ${k}="${escapeHtml(String(v))}"`;
}
return attrs;
};
let control = "";
let attrs = buildAttrs(other);
if (type === "boolean") {
let checked = settings[key] == true ? " checked" : "";
control = ``
} else if (type === "string") {
let value = settings[key] || "";
let inputType = other?.type ? `type="${escapeHtml(String(other.type))}"` : `type="text"`;
if (key === "vip_id") value = parseInt(value) || "";
control = ``
}
if (title.includes("|")) {
let parts = title.split("|").map(part => `${part}`);
title = parts.join("
");
} else {
title = `${title}`;
}
return ``;
}
let dialog = await Swal.fire({
...temp.swalDefault,
icon: "info",
iconHtml: "⚙︎",
title: "设置",
html: `
风雨送春归,飞雪迎春到。已是悬崖百丈冰,犹有花枝俏。俏也不争春,只把春来报。待到山花烂漫时,她在丛中笑。
http(s): 或 data: 链接", "photo", "string", { "type": "string", "placeholder": "留空将使用已登录账户信息" })}
${generateHTML("等级|会员等级|1 ~ 10", "level", "string", { "type": "number", "min": "1", "max": "10", "placeholder": "留空将使用已登录账户信息" })}
${generateHTML("成长值|会员成长值|1 ~ 100000", "point", "string", { "type": "number", "min": "1", "max": "100000", "placeholder": "留空将使用已登录账户信息" })}
${generateHTML("SVIP 10 专属 ID|显示时会自动补零|1 ~ 999999", "vip_id", "string", { "type": "number", "min": "1", "max": "999999", "placeholder": "留空将使用已登录账户信息" })}
${generateHTML("会员过期时间|对外展示信息|Unix 时间戳", "endtime", "string", { "type": "number", "min": "-2147483648", "max": "253402185600", "placeholder": temp.defaults.endtime })}
${generateHTML("屏蔽网页数据分析", "unAnalytics", "boolean")}
${generateHTML("禁用 “云一朵” 相关功能入口", "unAI_Yiduo", "boolean")}
${generateHTML(`禁用新版在线文档查看器|勾选后新版的 PDF 在线预览会变为 WPS`, "unPViewer", "boolean")}
${generateHTML("隐藏新旧版切换入口", "unVerSwitch", "boolean")}
${generateHTML("隐藏视频页 “笔记” ", "unTab_aiNote", "boolean")}
${generateHTML("隐藏视频页 “AI看” ", "unTab_aiStudy", "boolean")}
${generateHTML("隐藏视频页 “课件” ", "unTab_aiCourseware", "boolean")}
${generateHTML("隐藏视频页 “文稿” ", "unTab_aiDraft", "boolean")}
${generateHTML("我爱看广告|修改视频广告播放时间为 200 秒,SVIP 下无效", "iLoveAD", "boolean")}
${generateHTML("显示调试信息到控制台", "debug", "boolean")}
感谢您选择会员青春版,喜欢的话就来给个 Star 吧~
`, }); if (dialog.isConfirmed) { location.reload(); // 刷新页面使设置生效 } }, /** * 等待指定元素加载完成并执行回调 * @author hmjz100 * @description 监听 DOM 元素是否出现,若未出现则每隔一段时间重试,直到找到为止。 * 支持在 iframe 内部查找元素,适用于异步加载场景。 * @param {string} selectorElem - 要等待的目标元素选择器 * @param {Function} actionFunction - 找到元素后执行的回调函数,接收 jQuery 元素作为参数,返回 true 可以不再继续寻找 * @param {boolean} [bWaitOnce=false] - 是否只执行一次回调,默认为 false,如果不设置为 true 的话需要自行判断是否对元素进行操作 * @param {string} [iframeSelector] - 若目标元素位于 iframe 中,传入 iframe 的选择器 * @param {string} [controlKey] - 控制唯一性的键名,用于避免重复处理 */ waitForKeyElements(selectorElem, actionFunction, bWaitOnce, iframeSelector, controlKey) { // 初始化管理器 let manager = this.waitForKeyElements.manager; if (!manager) { manager = this.waitForKeyElements.manager = { observers: new WeakMap(), tasks: new Map(), instanceCounter: 0 }; } // 获取目标文档 let targetDoc = iframeSelector ? $(iframeSelector).get(0)?.contentDocument : document; if (!targetDoc) return; // 生成唯一键 controlKey = controlKey || `wkfe_${manager.instanceCounter++}`; // 清理重复任务 let existingTask = manager.tasks.get(controlKey); if (existingTask) { existingTask.observer.disconnect(); manager.tasks.delete(controlKey); } // 递归扫描shadowRoot function scanShadowDOM(root, selector) { let results = []; try { // 扫描当前根节点 let currentMatches = root.querySelectorAll(selector); results.push(...Array.from(currentMatches)); // 递归扫描shadowRoot let walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); let node; while (node = walker.nextNode()) { if (node.shadowRoot && node.shadowRoot.mode === 'open') { results.push(...scanShadowDOM(node.shadowRoot, selector)); } } } catch (e) { // 跨域shadowRoot静默跳过 } return results; } // 元素扫描核心逻辑 function scanElements() { // 全局扫描(含shadowRoot) let rawElements = scanShadowDOM(targetDoc.documentElement, selectorElem); let jElements = $(rawElements); let foundActive = false; jElements.each(function () { let jEl = $(this); if (jEl.data(controlKey)) return true; // 跳过已处理元素 let cancel = actionFunction(jEl); if (cancel) { foundActive = true; } else if (bWaitOnce) { jEl.data(controlKey, true); // 标记已处理 } }); // 一次性任务清理 if (bWaitOnce && foundActive) { observer.disconnect(); manager.tasks.delete(controlKey); } } // 创建观察器 let observer = new MutationObserver(scanElements); // 配置观察项(增强shadowRoot监听) observer.observe(targetDoc.documentElement, { childList: true, subtree: true, attributes: true, characterData: true }); // 注册任务 manager.tasks.set(controlKey, { observer: observer, targetDoc: targetDoc }); // 首次扫描 scanElements(); }, } function has(value) { return !["undefined", "null"].includes(typeof value) } let user = base.getSettings(); let rules = [ { // 综合变量 runat: "variable", match: (url) => !url.pathname.includes("buy/checkoutcounter"), condition: () => user.vip == true, action: (res, url) => { if (/\/s\/.*?\?fid=.*?/.test(url.href)) res.self = 1 if (res.userInfo) { if (has(res.userInfo?.username) && has(user.name)) res.userInfo.username = user.name; if (has(res.userInfo?.["photo_url"]) && has(user.photo)) res.userInfo["photo_url"] = user.photo; if (has(res.userInfo?.vip_level) && has(user.level)) res.userInfo.vip_level = user.level; if (has(res.userInfo?.svip10_id) && has(user.vip_id)) res.userInfo.svip10_id = user.vip_id; if (has(res.userInfo?.vip_identity) && user.previous == false) res.userInfo.vip_identity = Number(`${user.svip == true ? 2 : 1}1`); } if (has(user.name)) res.username = user.name; if (has(res.MYNAME) && has(user.name)) res.MYNAME = user.name; if (has(user.photo)) res.photo = user.photo; if (has(res.MYAVATAR) && has(user.photo)) res.MYAVATAR = user.photo; if (user.previous == false) res.is_vip = 1; if (has(res.ISVIP) && user.previous == false) res.ISVIP = 1; if (user.svip == true && user.previous == false) res.is_svip = 1; if (has(res.ISSVIP) && user.svip == true && user.previous == false) res.ISSVIP = 1; if (has(res.ISYEARVIP)) res.ISYEARVIP = 1; if (has(res.is_plus_buy)) res.is_plus_buy = 1; if (has(res.is_vip_v2) && has(user.level) && user.level >= 2) res.is_vip_v2 = 1; if (has(res.is_vip_v2_new) && has(user.level) && user.level >= 2) res.is_vip_v2_new = 1; if (has(res.is_evip) && user.previous == false) res.is_evip = 1; if (has(res.is_mvip) && user.previous == false) res.is_mvip = 1; if (has(res.vipsid) && has(user.vip_id)) { let idStr = String(user.vip_id); let six = idStr.match(/\d{6}/)?.[0]; let all = idStr.replace(/\D/g, ""); let finalId = six ? +six : (all ? +all : 1); res.vipsid = finalId; } if (has(user.vip_id)) res.v10_id = user.vip_id; if (has(user.level)) res.vip_level = user.level; if (has(res.show_vip_ad)) res.show_vip_ad = 0; return res; } }, { // 用户信息 基本 runat: "end", match: (url) => url.pathname.includes("api/user/getinfo"), condition: () => user.vip == true, action: (res, url) => { let key = localStorage.getItem("realNameVerify"); if (key && res.records?.[0] && res.records.some(item => item.uk === Number(key))) { let info = res.records.find(item => item.uk === Number(key)); if (has(info.uname) && has(user.name)) info.uname = user.name; if (has(info.priority_name) && has(user.name)) info.priority_name = user.name; if (has(info.avatar_url) && has(user.photo)) info.avatar_url = user.photo; } return res; } }, { // 登录信息 基本 runat: "end", match: (url) => url.pathname.includes("api/loginStatus"), condition: () => user.vip == true, action: (res, url) => { if (has(res.login_info?.username) && has(user.name)) res.login_info.username = user.name; if (has(res.login_info?.["photo_url"]) && has(user.photo)) res.login_info["photo_url"] = user.photo; if (has(res.login_info?.vip_level) && has(user.level)) res.login_info.vip_level = user.level; if (has(res.login_info?.vip_point) && has(user.point)) res.login_info.vip_point = user.point; if (has(res.login_info?.vip_type)) res.login_info.vip_type = user.svip == true ? "21" : "11"; if (has(res.login_info?.vip_identity)) res.login_info.vip_identity = user.svip == true ? 21 : 11; return res; } }, { // 会员信息 用户 runat: "end", match: (url) => url.pathname.includes("rest/2.0/membership/user") && (!url.searchParams.get("method") || url.searchParams.get("method") == "query"), condition: () => user.vip == true, action: (res, url) => { if (has(res.current_product) && user.previous == false) res.current_product = res.current_product_v2 = { "cluster": "vip", "detail_cluster": user.svip == true ? "svip" : "vip", // 决定会员标签变化 "product_type": user.svip == true ? `vip2_1m_auto` : `vip_1m_auto`, "product_id": "12187135090581539740" } // 决定会员等级变化 if (has(res.level_info)) res.level_info = { ...res.level_info, "current_value": has(user.point) && user.point != "" ? user.point : 0, // 决定所有会员标签 "current_level": has(user.level) && user.level != "" ? user.level : 1, // 决定所有会员标签 "history_value": has(user.point) && user.point != "" ? user.point : 0, "history_level": has(user.level) && user.level != "" ? user.level : 1, "v10_id": user.vip_id, "last_manual_collection_time": 0 } if (has(res.privilege_list)) [...res.privilege_list].forEach(item => { item.free_count = 100 }) // 决定会员剩余时间变化 if (has(res.reminder) && user.previous == false) res.reminder = { ...res.reminder, [user.svip == true ? "svip" : "vip"]: { "leftseconds": ((has(user.endtime) && user.endtime != "" ? user.endtime : 2147483648) * 1000 - Date.now()) / 1000, "nextState": "normal" } } // 其它(已有套餐、之前套餐) if (has(res.product_infos) && user.previous == false) res.product_infos.unshift({ "product_id": "12187135090581539740", "buy_time": "946656000", "start_time": 946656000, "end_time": has(user.endtime) && user.endtime != "" ? user.endtime : 2147483648, "cluster": "vip", "detail_cluster": user.svip == true ? "svip" : "vip", "product_name": user.svip == true ? "svip2_nd" : "vip1_nd", "cur_svip_type": "year", "function_num": 8, "status": 0, "buy_description": "超级SVIP套餐(永久)", "product_description": "自打百度一诞生我就买了!" }) if (has(res.previous_product)) res.previous_product = { "cluster": "vip", "detail_cluster": user.svip == true ? "svip" : "vip", // 决定之前会员标签 "product_type": user.svip == true ? `vip2_1m_auto` : `vip_1m_auto`, "expired_time": 946656000 } if (has(res.previous_product_v2)) res.previous_product_v2 = { "cluster": "vip", "detail_cluster": user.svip == true ? "svip" : "vip", // 决定之前会员标签 "product_type": user.svip == true ? `vip2_1m_auto` : `vip_1m_auto`, "expired_time": 946656000 } return res; } }, { // 会员信息 用户导览 runat: "end", match: (url) => url.pathname.includes("rest/2.0/membership/user") && url.searchParams.get("method") == "guide", condition: () => user.vip == true, action: (res, url) => { if (has(res.status_data) && has(user.endtime)) res.status_data = `${user.svip == true ? "SVIP" : "VIP"}至:${new Date(user.endtime * 1000).toLocaleDateString()}`; if (has(res.status_data) && has(user.endtime)) res.status_data_arr = [`${user.svip == true ? "SVIP" : "VIP"}至:${new Date(user.endtime * 1000).toLocaleDateString()}`]; return res; } }, { // 会员信息 用户信息 runat: "end", match: (url) => url.pathname.includes("rest/2.0/membership/user/info") && url.searchParams.get("method") == "query", condition: () => user.vip == true, action: (res, url) => { if (has(res.user_info?.username) && has(user.name)) res.user_info.username = user.name; if (has(res.user_info?.["photo_url"]) && has(user.photo)) res.user_info["photo_url"] = user.photo; if (has(res.user_info?.phone) && has(user.phone)) res.user_info.phone = Number(user.phone); if (has(res.user_info?.vipsid) && has(user.vip_id)) { let idStr = String(user.vip_id); let six = idStr.match(/\d{6}/)?.[0]; let all = idStr.replace(/\D/g, ""); let finalId = six ? +six : (all ? +all : 1); res.user_info.vipsid = finalId; } if (has(res.user_info?.is_vip) && user.previous == false) res.user_info.is_vip = 1; if (has(res.user_info?.is_svip) && user.svip == true && user.previous == false) res.user_info.is_svip = 1; if (has(res.user_info?.is_mvip) && user.previous == false) res.user_info.is_mvip = 1; if (has(res.user_info?.is_vip_v2) && has(user.level) && user.level >= 2) res.user_info.is_vip_v2 = 1; if (has(res.user_info?.is_vip_v2_new) && has(user.level) && user.level >= 2) res.user_info.is_vip_v2_new = 1; if (has(res.user_info?.is_first_charge)) res.user_info.is_first_charge = 1; if (has(res.user_info?.is_first_charge) && user.svip == true) res.user_info.is_first_charge_svip = 1; if (has(res.user_info?.is_plus_buy)) res.user_info.is_plus_buy = 1; if (has(res.user_info?.plus_buy_hit)) res.user_info.plus_buy_hit = 1; return res; } }, { // 会员信息 手机 runat: "end", match: (url) => url.pathname.includes("rest/2.0/membership/phone") && url.searchParams.get("method") == "query", condition: () => user.vip == true, action: (res, url) => { if (has(res.phone) && has(user.phone)) res.phone = user.phone; if (has(res.phone_enc) && has(user.phone)) res.phone_enc = user.phone; return res; } }, { // 会员信息 等级 runat: "end", match: (url) => url.pathname.includes("rest/2.0/membership/level") && url.searchParams.get("method", "") == "getv10info", condition: () => user.vip == true, action: (res, url) => { if (has(res.data.points) && has(user.point)) res.data.points = user.point; if (has(res.data.svip_expire_time) && has(user.endtime)) res.data.svip_expire_time = user.endtime; if (has(res.data.v10_expire_time) && has(user.endtime)) res.data.v10_expire_time = user.endtime; if (has(res.data.v10_id) && has(user.vip_id)) res.data.v10_id = user.vip_id; console.log(user) if (has(res.data.v10_rank) && has(user.vip_id)) { let idStr = String(user.vip_id); let six = idStr.match(/\d{6}/)?.[0]; let all = idStr.replace(/\D/g, ""); let finalId = six ? +six : (all ? +all : 1); res.data.v10_rank = finalId; } return res; } }, { // 视频信息 runat: "end", match: (url) => url.pathname.includes("api/filemetas"), condition: () => user.vip == true, action: (res, url) => { // 百度网盘不允许非会员用户在线观看 1080P 及以上分辨率,所以在此处将其移除。 if (Array.isArray(res?.info) && res.info.length > 0) { for (let item of res.info) { if (!item || typeof item !== "object") continue; // 从 resolution 解析宽高 let width = item.width || 0, height = item.height || 0; if (item.resolution) { let match = item.resolution.match(/width:(\d+).*?height:(\d+)/i); if (match) { width = parseInt(match[1], 10) || 0; height = parseInt(match[2], 10) || 0; } } // 判断是否高于 720P if (Math.min(width, height) >= 720 || Math.max(width, height) >= 1280) { if (width >= height) { width = 1280, height = 720; // 横屏 } else { width = 720, height = 1280; // 竖屏 } item.width = width; item.height = height; item.resolution = `width:${width},height:${height}`; } } } return res; } }, { // 视频信息 视频流 M3U8 runat: "url", match: (url) => url.pathname.includes("api/streaming") && has(url.searchParams.get("vip")) && url.searchParams.get("type"), condition: () => user.vip == true, action: (url) => { url.searchParams.set("vip", "0"); if (temp.adToken) { url.searchParams.set("adToken", temp.adToken); delete temp.adToken; } return url; } }, { // 视频信息 视频流 M3U8 runat: "end", match: (url) => url.pathname.includes("api/streaming") && has(url.searchParams.get("vip")) && /^M3U8_(AUTO|FLV)/.test(url.searchParams.get("type")), condition: () => user.vip == true, action: (res, url) => { if (typeof res === "object") { temp.adToken = res.adToken; res.adTime = 2; res.ltime = 1; if (user.iLoveAD) { res.adTime = 200; res.ltime = 100; } } return res; } }, { // 视频信息 字幕流 M3U8 runat: "end", match: (url) => url.pathname.includes("api/streaming") && has(url.searchParams.get("vip")) && url.searchParams.get("type") == "M3U8_SUBTITLE_SRT", condition: () => user.vip == true, action: (res, url) => { if (typeof res === "string" && res.startsWith("#EXTM3U") && res.includes("#MEDIA:SUBTITLES")) { function getSubtitles(text) { let regex = /#EXT-X-MEDIA:TYPE=SUBTITLES,[^#]*\n\s*(https?:\/\/[^\s]+)/g; let subtitles = []; let match; while ((match = regex.exec(text)) !== null) { let line = text.substring(match.index, regex.lastIndex).split('\n')[0]; let attrs = Object.fromEntries( line.replace('#EXT-X-MEDIA:', '').split(',').map(pair => { let [k, v = ''] = pair.split('='); return [k.trim(), v.replace(/"/g, '').trim()]; }) ); subtitles.push({ name: attrs.NAME || '', language: attrs.LANGUAGE || '', default: attrs.DEFAULT === 'YES', ai: attrs['AI-SUB'] === 'YES', url: match[1] }); } return subtitles; }; let subtitles = getSubtitles(res); console.log(subtitles); base.waitForKeyElements("div.vjs-subtitle-item", (element) => { if (!element.parent("style.ym").length) element.parent().append(``); let subName = element.find(".vjs-subtitle-item-text").text()?.trim(); let maybeAI = element.find(".vjs-subtitle-item-text").prev(".vjs-subtitle-item-icon").length; if (subName && subtitles.some(i => i.name === subName && i.ai == maybeAI)) { let subtitle = subtitles.find(i => i.name === subName && i.ai == maybeAI); let button = $(``); button.on('click', function (e) { e.preventDefault(); e.stopPropagation(); window.open(subtitle.url, '_blank', 'noopener,noreferrer'); }); element.append(button); } }, true) base.waitForKeyElements(".vp-video__control-bar--video-subtitles-select-item", (element) => { let subName = element.find(".vp-video__control-bar--video-subtitles-select-desc").text()?.trim(); let maybeAI = element.find(".vp-video__control-bar--video-subtitles-select-desc").prev(".vp-img-container").length; if (subName && subtitles.some(i => i.name === subName && i.ai == maybeAI)) { let subtitle = subtitles.find(i => i.name === subName && i.ai == maybeAI); let button = $(``); button.on('click', function (e) { e.preventDefault(); e.stopPropagation(); window.open(subtitle.url, '_blank', 'noopener,noreferrer'); }); if (element.find(".downloadSubtitle").length) element.find(".downloadSubtitle").remove(); element.append(button); } }, true) } return res; } }, { // 界面信息 runat: "end", match: (url) => url.pathname.includes("api/getsyscfg"), condition: () => user.vip == true, action: (res, url) => { // huge_upgrade if (res.huge_upgrade?.cfg_list && has(user.unVerSwitch)) { let hue_config = res.huge_upgrade.cfg_list.find(item => item.node_key === "huge_upgrade_entrance_config"); if (hue_config) { if (has(hue_config.new_nav_show)) hue_config.new_nav_show = (user.unVerSwitch == true ? "0" : "1") if (has(hue_config.new_nav_href)) hue_config.new_nav_href = "https://pan.baidu.com/disk/main" if (has(hue_config.old_nav_show)) hue_config.old_nav_show = (user.unVerSwitch == true ? "0" : "1") if (has(hue_config.old_nav_href)) hue_config.old_nav_href = "https://pan.baidu.com/disk/home?stayAtHome=true" } } // netdisk_docchat_config if (res.netdisk_docchat_config?.cfg_list && user.unAI_Yiduo == true) { let ce_config = res.netdisk_docchat_config.cfg_list.find(item => item.node_key === "chat_enter_config"); ce_config.is_chat_show = "0"; ce_config.is_docview_chat_auto_show = "0"; ce_config.is_docview_chat_show = "0"; ce_config.is_home_need_out_sug = "0"; ce_config.is_main_chat_show = "0"; ce_config.is_videoview_chat_auto_show = "0"; ce_config.is_videoview_chat_show = "0"; } // ai_collect if (res.ai_collect?.cfg_list && user.unAI_Yiduo == true) { let ac_config = res.ai_collect.cfg_list.find(item => item.node_key === "ai_collect_config"); ac_config.is_ai_collect_show = "0"; } // netdisk_docview_config if (res.netdisk_docview_config?.cfg_list) { let dv_type = res.netdisk_docview_config.cfg_list.find(item => item.node_key === "docview_type"); dv_type.auto_search_to_ai = (user.unAI_Yiduo == true ? "0" : "1"); dv_type.use_pfile_for_doc = (user.unPViewer == true ? "0" : "1"); dv_type.use_pfile_for_ppt = (user.unPViewer == true ? "0" : "1"); dv_type.use_pfile_reader = (user.unPViewer == true ? "0" : "1"); dv_type.use_wps_reader = (user.unPViewer == true ? "1" : "0"); } return res; } }, { // 界面信息 视频页 笔记 Tab 展示状态 runat: "end", match: (url) => url.pathname.includes("learn/query/strategy"), condition: () => true, action: (res, url) => { if (Array.isArray(res.data?.module_info) && res.data.module_info.length > 0 && res.data.module_info.some(i => i.module_name === "ainote")) { res.data.module_info.find(i => i.module_name === "ainote").display_strategy.enable = (user.unTab_aiNote !== true); } return res; } }, { // 界面信息 视频页 AI看 Tab 展示状态 runat: "end", match: (url) => url.pathname.includes("learn/query/roiinfo"), condition: () => true, action: (res, url) => { if (Array.isArray(res.data?.file_infos) && res.data?.file_infos.length > 0 && res.data.file_infos.some(i => has(i.roi_status))) { res.data.file_infos.forEach(i => { i.roi_status = user.unTab_aiStudy ? 0 : 1; }); } return res; } }, { // AI看 功能 runat: "end", match: (url) => url.pathname.includes("api/study/kpointinfo"), condition: () => user.vip == true, action: (res, url) => { if (res.data?.left_times != null && Array.isArray(res.data?.display_data) && res.data.display_data.length > 0) { for (const item of res.data.display_data) { if (!["ready", "fail"].includes(item.ai_status)) continue; // 仅当免费次数用完时才修改状态 if (res.data.left_times === 0) { if (item.id === 1) { item.ai_status = "done"; item.content = "您的 AI 看免费使用次数已用尽,此视频无法生成 AI 总结(百度云盘会员青春版)"; } else { item.ai_status = "done_empty"; } } } } return res; } }, { // 界面信息 视频页 课件/文稿 Tab 展示状态 runat: "end", match: (url) => url.pathname.includes("/common") && url.searchParams.get("method") === "status", condition: () => true, action: (res, url) => { // 课件 - aitrans/ppt if (url.pathname.includes("aitrans/ppt") && has(res.data?.roi_status)) { res.data.roi_status = (user.unTab_aiCourseware == true ? 0 : 1); } // 文稿 - richsearch/autosubtitle if (url.pathname.includes("richsearch/autosubtitle") && has(res.res?.roi_status)) { res.res.roi_status = (user.unTab_aiDraft == true ? 0 : 1) } return res; } }, { runat: "start", match: (url) => url.pathname.includes("cloudapp/api/v1/isLocateRight"), condition: () => user.vip == true, action: (res, url) => { res = { "errno": 0, "msg": "success", "result": false, "requestId": "" } return res; } }, { // 广告信息 弹窗 runat: "start", match: (url) => url.pathname.includes("rest/2.0/pcs/adx"), condition: () => user.vip == true, action: (res, url) => { res = { "list": { "tab": { "web-popup": [] }, "version": 0, "home_banner_version": 0 }, "request_id": "" } return res; } }, { // 分析信息 报告 runat: "start", match: (url) => { if (url.pathname.includes("api/report/user")) return true; if (url.pathname.includes("mwb2.gif")) return true; return false }, condition: () => user.unAnalytics == true, action: () => { } }, { // 分析信息 报告 runat: "image", match: (url) => { if (url.host == "mbd.baidu.com" && url.pathname.includes("ztbox")) return true; if (url.host == "hm.baidu.com" && url.pathname.includes("hm.gif")) return true; if (url.host == "update.pan.baidu.com" && url.pathname.includes("statistics")) return true; if (url.pathname.includes("api/analytics")) return true; return false }, condition: () => user.unAnalytics == true, action: () => { } }, ]; /** * 控制台输出 * @author 油小猴 * @author hmjz100 * @description 来自【网盘智能识别助手】,有改动 */ console.log(`%c %c (改)百度网盘会员青春版\n虚拟百度网盘身份信息为会员\n仓库:https://github.com/hmjz100/BaiduNetDiskYouthMember\n版本:${info.version}\n领域:${(window.self !== window.top ? "[iframe] " : "") + (document.title ? (document.title + " (" + location.origin + location.pathname + ")") : temp.url())}`, `background:url(${info.icon}) center center no-repeat;background-size:12px;padding:3px`, `padding:2px`); // 没有什么是 Hook 解决不了的。 var originalFetch = fetch; unsafeWindow.fetch = base.hooker.fetch; temp.hooker.set(fetch); var originalSend = XMLHttpRequest.prototype.send; unsafeWindow.XMLHttpRequest.prototype.send = base.hooker.send; temp.hooker.set(XMLHttpRequest.prototype.send); var originalOpen = XMLHttpRequest.prototype.open; unsafeWindow.XMLHttpRequest.prototype.open = base.hooker.open; temp.hooker.set(XMLHttpRequest.prototype.open); var originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader; unsafeWindow.XMLHttpRequest.prototype.setRequestHeader = base.hooker.setRequestHeader; temp.hooker.set(XMLHttpRequest.prototype.setRequestHeader); var originalSendBeacon = navigator.sendBeacon; unsafeWindow.navigator.sendBeacon = base.hooker.sendBeacon; temp.hooker.set(navigator.sendBeacon); var OriginalImage = Image; unsafeWindow.Image = base.hooker.Image; temp.hooker.set(Image); var originalCreateElement = document.createElement; unsafeWindow.document.createElement = base.hooker.createElement; temp.hooker.set(document.createElement); var originalToString = Function.prototype.toString; unsafeWindow.Function.prototype.toString = base.hooker.toString; temp.hooker.set(Function.prototype.toString); var originalToLocaleString = Function.prototype.toLocaleString; unsafeWindow.Function.prototype.toLocaleString = base.hooker.toLocaleString; temp.hooker.set(Function.prototype.toLocaleString); var originalAttachShadow = Element.prototype.attachShadow; unsafeWindow.Element.prototype.attachShadow = base.hooker.attachShadow; temp.hooker.set(Element.prototype.attachShadow); let localsTimer = setInterval(() => { if (!unsafeWindow.locals) return; clearInterval(localsTimer); let url = new URL(location.href); if (rules.some(r => r.match(url) && r.condition() && r.runat === "variable")) { unsafeWindow.locals = base.hooker.universal("locals", url, unsafeWindow.locals, "variable"); } }, 1) let yunDataTimer = setInterval(() => { if (!unsafeWindow.yunData) return; clearInterval(yunDataTimer); let url = new URL(location.href); if (rules.some(r => r.match(url) && r.condition() && r.runat === "variable")) { unsafeWindow.yunData = base.hooker.universal("yunData", url, unsafeWindow.yunData, "variable"); } }, 1) let yunDataRequireTimer = setInterval(() => { if (!unsafeWindow.require) return; clearInterval(yunDataRequireTimer); var originalRequire = unsafeWindow.require; originalRequire.async("pan-center:widget/data/yunData", (yunData) => { let url = new URL(location.href); return base.hooker.universal("require yunData", url, yunData, "variable"); }) /*unsafeWindow.require = function (url) { Object.assign(unsafeWindow.require, originalRequire); if (url.includes("widget/data/yunData")) { let url = new URL(location.href); return base.hooker.universal("require yunData", url, originalRequire.apply(this, arguments), "variable"); } return originalRequire.apply(this, arguments); }*/ }, 1) GM_registerMenuCommand("⚙️ 设置", () => { base.showSettings(); }); base.waitForKeyElements("head:not(:has(.style.swal-pub-style))", (element) => { element.prepend(``); }, true) base.waitForKeyElements("head:not(:has(.style.listener-ym))", (element) => { element.append(``); }, true) // 这是啥?我不到啊 function idontknow(input) { let charArray = input.split(""); // 这是 Fisher-Yates 洗牌算法的实现 for (let i = charArray.length - 1; i > 0; i--) { let j = Math.floor(Math.random() * (i + 1)); [charArray[i], charArray[j]] = [charArray[j], charArray[i]]; } return charArray.join(""); } })();