// ==UserScript==
// @name LinkSwift
// @namespace github.com/hmjz100
// @version 1.0.9.7
// @author Hmjz100、油小猴
// @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNMTAzLjYgMTA3LjRjMy41LTIuMiA4LjktNi4xIDEzLjgtMTIuNXM3LjMtMTIuNSA4LjUtMTYuNWMuNS0xLjcgMi4yLTcuNSAyLjItMTQuNyAwLTEwLjEtMy4zLTI1LjEtMTUuNC0zNi44LTE0LjUtMTQtMzIuMS0xNC4zLTM1LjctMTQuMy04IDAtMTUuNyAxLjktMjIuNiA1LjJDNDQgMjMgMzUuNyAzMS40IDMwLjggNDEuN2MtMS4zIDIuOC00IDQuNy03LjEgNS00IC4zLTcuNSA0LjQtOC45IDkuNi0uNSAxLjktMS42IDMuNS0zLjEgNC43QzQuNCA2Ni44IDAgNzUuNyAwIDg1YzAgNi44IDIuMyAxMy4xIDYuMSAxOC4yIDUuNSA3LjQgMTQuMiAxMi4yIDI0IDEyLjJoNDcuMWM0LjQgMCAxMS0uNSAxOC4zLTMuNSAzLjItMS40IDUuOS0zIDguMS00LjV6IiBmaWxsPSIjQTA5OUYwIi8+PHBhdGggZD0iTTExOS44IDY0LjNjLjEtMTcuMS0xMC40LTI4LTEyLjUtMzAuMUM5NSAyMi4xIDc5LjkgMjEuOCA3Ni45IDIxLjhjLTE3LjYgMC0zMy4zIDEwLjUtMzkuOSAyNi43LS42IDEuMy0xLjggMi4zLTMuNCAyLjNoLS40Yy01LjggMC0xMC42IDQuOC0xMC42IDEwLjd2LjVjMCAxLjQtLjggMi42LTEuOSAzLjNDMTMuNCA2OSA4LjggNzYuOCA4LjggODVjMCAxMi4yIDkuOSAyMi4zIDIyLjIgMjIuM2g0NS4yYzMuNi0uMSAxNy42LS45IDI5LjYtMTIgMi45LTIuOCAxMy45LTEzLjcgMTQtMzF6IiBmaWxsPSIjNTc0QUI4Ii8+PHBhdGggZD0iTTExMC44IDU3LjRsLjIgMy4zYzAgMS4zLTEuMSAyLjQtMi4zIDIuNC0xLjMgMC0yLjMtMS4xLTIuMy0yLjRsLS4xLTIuOHYtLjNjMC0xLjIuOS0yLjIgMi4xLTIuM2guM2MuNyAwIDEuMy4zIDEuNy43LS4yLjEuMy41LjQgMS40em0tMy4zLTEwLjNjMCAxLjItMSAyLjMtMi4yIDIuM2gtLjFjLS44IDAtMS42LS41LTItMS4yLTQuNi04LjMtMTMuMy0xMy41LTIyLjgtMTMuNS0xLjIgMC0yLjMtMS0yLjMtMi4ydi0uMWMwLTEuMiAxLTIuMyAyLjItMi4zaC4xYTMwLjM3IDMwLjM3IDAgMCAxIDE1LjggNC40YzQuNiAyLjggOC40IDYuOCAxMS4xIDExLjUuMS4zLjIuNy4yIDEuMXpNODguMyA3My44TDczLjUgOTMuMmMtMS41IDEuOS0zLjUgMy4xLTUuNyAzLjVoLS4yYy0uNC4xLS44LjEtMS4yLjEtLjYgMC0xLjEtLjEtMS42LS4yLTIuMi0uNC00LjItMS43LTUuNi0zLjVMNDQuMyA3My45Yy0yLTIuNi0yLjUtNS40LTEuNC03LjcuMS0uMS4xLS4yLjItLjIgMS4yLTIgMy41LTMuMiA2LjQtMy4yaDYuNnYtNS43YzAtNi44IDQuNy0xMiAxMC45LTEyIDQuOCAwIDguNSAyLjYgMTAuMyA3LjIuNSAxLjMtLjIgMi43LTEuNSAzLjJzLTIuOC0uMS0zLjMtMS40Yy0xLjEtMi43LTIuOS00LTUuNS00LTMuNSAwLTYgMy02IDd2OC4xYzAgLjUtLjIgMS0uNiAxLjQtLjYuNy0xLjcgMS4xLTIuNiAxLjFoLTguNGMtMS4zIDAtMiAuNC0yLjEuNy0uMi40IDAgMS4zLjkgMi40TDYzLjEgOTBjLjkgMS4yIDIuMSAxLjggMy4zIDEuOHMyLjMtLjYgMy4xLTEuN2wxNC44LTE5LjNjLjktMS4xIDEuMS0yIC45LTIuNC0uMi0uMy0uOS0uNy0yLjEtLjdoLTcuNmMtLjkgMC0xLjctLjUtMi4xLTEuMi0uMy0uNC0uNC0uOC0uNC0xLjMgMC0xLjQgMS4xLTIuNSAyLjUtMi41aDcuNmMzLjEgMCA1LjUgMS4zIDYuNiAzLjVsLjMuN2MuNyAyLjEuMSA0LjYtMS43IDYuOXoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=
// @description 一个基于 JavaScript 的网盘文件下载地址获取工具,支持 百度网盘/阿里云盘/天翼云盘/迅雷云盘/夸克网盘/移动网盘 六大网盘 | 基于【网盘直链下载助手】修改自6.2.7版本 | 开源 - 自用 - 去广 | 改界面 - 添功能 - 修Bug | 不仅能够精简网盘界面 还支持修改网盘界面主题颜色!
// @license AGPL-3.0-or-later
// @homepage https://github.com/hmjz100/LinkSwift/
// @support https://github.com/hmjz100/LinkSwift/issues
// @supportURL https://github.com/hmjz100/LinkSwift/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
// @require https://unpkg.com/js-md5@0.7.3/build/md5.min.js
// @resource Swal https://unpkg.com/sweetalert2@11/dist/sweetalert2.min.css
// @resource SwalDark https://unpkg.com/@sweetalert2/theme-dark@5/dark.min.css
// @run-at document-body
// @match *://pan.baidu.com/disk/home*
// @match *://yun.baidu.com/disk/home*
// @match *://pan.baidu.com/disk/timeline*
// @match *://yun.baidu.com/disk/timeline*
// @match *://pan.baidu.com/disk/main*
// @match *://yun.baidu.com/disk/main*
// @match *://pan.baidu.com/youth/pan/main*
// @match *://yun.baidu.com/youth/pan/main*
// @match *://pan.baidu.com/disk/base*
// @match *://yun.baidu.com/disk/base*
// @match *://pan.baidu.com/disk/timeline*
// @match *://yun.baidu.com/disk/timeline*
// @match *://pan.baidu.com/pfile/*
// @match *://yun.baidu.com/pfile/*
// @match *://pan.baidu.com/s/*
// @match *://pan.baidu.com/aipan/*
// @match *://yun.baidu.com/s/*
// @match *://yun.baidu.com/aipan/*
// @match *://pan.baidu.com/share/*
// @match *://yun.baidu.com/share/*
// @match *://openapi.baidu.com/*
// @match *://www.aliyundrive.com/s/*
// @match *://www.aliyundrive.com/drive*
// @match *://www.alipan.com/s/*
// @match *://www.alipan.com/drive*
// @match *://cloud.189.cn/web/*
// @match *://pan.xunlei.com/*
// @match *://pan.quark.cn/*
// @match *://yun.139.com/*
// @match *://caiyun.139.com/*
// @match *://*.youxiaohou.com/*
// @connect baidu.com
// @connect baidupcs.com
// @connect aliyundrive.com
// @connect aliyundrive.net
// @connect alipan.com
// @connect alicloudccp.com
// @connect aliyundrive.cloud
// @connect 189.cn
// @connect xunlei.com
// @connect quark.cn
// @connect localhost
// @connect *
// @grant unsafeWindow
// @grant window.close
// @grant GM_xmlhttpRequest
// @grant GM.xmlhttpRequest
// @grant GM_setClipboard
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @grant GM_openInTab
// @grant GM_info
// @grant GM_registerMenuCommand
// @grant GM_cookie
// @grant GM_getResourceText
// @compatible Chrome
// @compatible Edge
// @compatible Firefox
// @compatible Safari
// @compatible Opera
// ==/UserScript==
(function Panlinker() {
'use strict';
/*
防止代码因其他原因被执行多次
这段代码出自 Via轻插件,作者谷花泰
*/
const key = encodeURIComponent('(改)网盘直链下载助手:主代码');
if (window[key]) return;
window[key] = true;
/*
网盘直链下载助手
以下代码均改自 网盘直链下载助手,作者油小猴
*/
/* 全局参数 */
let page = '', selectList = [], shareParams = {}, mode = '', color = '',
doc = $(document), progress = {}, request = {}, ins = {}, idm = {}, colored = false,
scriptInfo = GM_info.script,
realAuthor = scriptInfo.author,
realName = scriptInfo.name,
realVersion = scriptInfo.version,
manageHandler = GM_info.scriptHandler,
manageVersion = GM_info.version;
/* 设置选项 */
// Shell类型(用于curl下载)
let terminalType = {
wc: "Microsoft Windows 命令提示符",
wp: "Microsoft Windows PowerShell",
lt: "Linux 终端",
ls: "Linux Shell",
mt: "Apple MacOS 终端",
};
// 更换 百度网盘新界面/阿里云盘/迅雷云盘/移动云盘 主题颜色
let assistantTheme = {
yes: "更换主题颜色",
no: "不更换主题颜色"
};
/* Sweet Alert 2 */
// 自定义元素 Class 名(于 showMainDialog() 中)
let customClass = {
popup: 'pl-popup',
header: 'pl-header',
title: 'pl-title',
closeButton: 'pl-close',
content: 'pl-content',
input: 'pl-input',
footer: 'pl-footer'
};
// 弹窗默认设置
let swalDefault = {
heightAuto: false,
scrollbarPadding: false,
}
// Toast 提示配置
let toast = Swal.mixin({
toast: true,
position: 'bottom-end',
showConfirmButton: false,
timer: 3500,
timerProgressBar: true,
showCloseButton: true,
didOpen: function (toast) {
toast.addEventListener('mouseenter', Swal.stopTimer);
toast.addEventListener('mouseleave', Swal.resumeTimer);
}
});
// Toast 简易调用
let message = {
success: function (text) {
toast.fire({ title: text, icon: 'success' });
},
error: function (text) {
toast.fire({ title: text, icon: 'error' });
},
warning: function (text) {
toast.fire({ title: text, icon: 'warning' });
},
info: function (text) {
toast.fire({ title: text, icon: 'info' });
},
question: function (text) {
toast.fire({ title: text, icon: 'question' });
}
};
/* 内置配置 */
const config = {
"base": {
"num": "865746",
"license": "AGPL3",
"service": {
"account": "https://pic.rmb.bdstatic.com/bjh/8b9e14345b3cdf96aedac2f3971adcb02681.png",
"rpc": "https://d.youxiaohou.com"
},
"dom": {
"footer": "
",
"button": {
"api": {
"title": "API下载(适用于 IDM,NDM 以及浏览器自带下载)",
"footer": "点击链接直接下载,例如:IDM,若未唤起IDM,请 点击这里 配置文件类型,建议配合超级会员使用。"
},
"aria": {
"title": "Aria下载(适用于 XDown 及 Linux Shell命令行)",
"footer": "点击链接复制地址到剪切板,粘贴到支持 aria2c 协议的下载器中,例如:XDown,Linux Shell,建议配合超级会员使用。"
},
"rpc": {
"title": "RPC下载(适用于 Motrix,Aria2 Tools,AriaNgGUI)",
"footer": "点击按钮发送链接至本地或远程 RPC 服务,例如:Motrix,RPC 参数含义见此处,建议配合超级会员使用。"
},
"curl": {
"title": "cURL下载(适用于 Windows,Linux,MacOS 终端)",
"footer": "点击链接复制地址到剪切板,粘贴到 Windows,Linux,MacOS 终端,支持断点续传,建议配合超级会员使用。"
},
"bc": {
"title": "BC下载(适用于 比特彗星)",
"footer": "点击链接复制地址到剪切板,粘贴到 比特彗星 下载器中,建议配合超级会员使用。"
}
}
},
"assistant": {
"message": "请先安装网盘万能助手哦,安装后再刷新本页就好啦",
"link": "https://www.crxsoso.com/addon/detail/mphijdmblaalbakceeadippfkbgfgaaa"
}
},
"baidu": {
"api": {
"ua": {
"downloadLink": "pan.baidu.com"
},
"getAccessToken": "https://openapi.baidu.com/oauth/2.0/authorize?response_type=token&scope=basic,netdisk&client_id=IlLqBbU3GjQ0t46TRwFateTprHWl39zF&redirect_uri=oob&confirm_login=0",
"getLink": "https://pan.baidu.com/rest/2.0/xpan/multimedia?method=filemetas&dlink=1",
"getFiles": "https://pan.baidu.com/rest/2.0/xpan/file?method=list&showempty=1",
"getShareLink": "https://pan.baidu.com/api/sharedownload?channel=chunlei&clienttype=12&web=1&app_id=250528"
},
"mount": {
"home": ".tcuLAu",
"main": ".wp-s-agile-tool-bar__header",
"share": ".module-share-top-bar .x-button-box"
}
},
"ali": {
"api": {
"getLink": "https://api.aliyundrive.com/v2/file/get_download_url",
"getShareLink": "https://api.aliyundrive.com/v2/file/get_share_link_download_url"
},
"mount": {
"home": ".actions--M9Np-",
"share": ".right--x0Z1g",
"list": "[class^=\"node-list-table-view--\"]",
"grid": "[class^=\"node-list-grid-view--\"]",
"switch": "[class^=\"switch-wrapper--\"]"
}
},
"tcloud": {
"api": {
"getAccessToken": "https://api.cloud.189.cn/open/oauth2/ssoH5.action",
"getLink": "https://api.cloud.189.cn/open/file/getFileDownloadUrl.action"
},
"mount": {
"home": "[class*=\"FileHead_file-head-left\"]",
"share": ".nav-opea"
}
},
"xunlei": {
"api": {
"mirror": [
"vod0007-h05-vip-lixian.xunlei.com", "vod0008-h05-vip-lixian.xunlei.com", "vod0009-h05-vip-lixian.xunlei.com", "vod0010-h05-vip-lixian.xunlei.com", "vod0011-h05-vip-lixian.xunlei.com", "vod0012-h05-vip-lixian.xunlei.com", "vod0013-h05-vip-lixian.xunlei.com", "vod0014-h05-vip-lixian.xunlei.com", "vod0067-aliyun08-vip-lixian.xunlei.com", "vod0254-aliyun08-vip-lixian.xunlei.com", "vod0255-aliyun08-vip-lixian.xunlei.com", "vod0256-aliyun08-vip-lixian.xunlei.com", "vod0257-aliyun08-vip-lixian.xunlei.com", "vod0258-aliyun08-vip-lixian.xunlei.com", "vod0259-aliyun08-vip-lixian.xunlei.com", "vod0260-aliyun08-vip-lixian.xunlei.com", "vod0261-aliyun08-vip-lixian.xunlei.com", "vod0262-aliyun08-vip-lixian.xunlei.com", "vod0263-aliyun08-vip-lixian.xunlei.com", "vod0264-aliyun08-vip-lixian.xunlei.com", "vod0265-aliyun08-vip-lixian.xunlei.com", "vod0266-aliyun08-vip-lixian.xunlei.com", "vod0267-aliyun08-vip-lixian.xunlei.com", "vod0554-aliyun06-vip-lixian.xunlei.com", "vod0555-aliyun06-vip-lixian.xunlei.com", "vod0556-aliyun06-vip-lixian.xunlei.com", "vod0680-aliyun08-vip-lixian.xunlei.com", "vod0681-aliyun08-vip-lixian.xunlei.com", "vod0682-aliyun08-vip-lixian.xunlei.com", "vod0683-aliyun08-vip-lixian.xunlei.com", "vod0684-aliyun08-vip-lixian.xunlei.com", "vod0685-aliyun08-vip-lixian.xunlei.com", "vod0686-aliyun08-vip-lixian.xunlei.com", "vod0687-aliyun08-vip-lixian.xunlei.com", "vod0688-aliyun08-vip-lixian.xunlei.com", "vod0689-aliyun08-vip-lixian.xunlei.com", "vod0690-aliyun08-vip-lixian.xunlei.com", "vod0724-aliyun08-vip-lixian.xunlei.com", "vod0725-aliyun08-vip-lixian.xunlei.com", "vod0726-aliyun08-vip-lixian.xunlei.com", "vod0727-aliyun08-vip-lixian.xunlei.com", "vod0728-aliyun08-vip-lixian.xunlei.com", "vod0075.aliyun06.vip.lixian.xunlei.com", "vod0076.aliyun06.vip.lixian.xunlei.com", "vod0077.aliyun06.vip.lixian.xunlei.com", "vod0779-aliyun04-vip-lixian.xunlei.com", "vod0078.aliyun06.vip.lixian.xunlei.com", "vod0780-aliyun04-vip-lixian.xunlei.com", "vod0781-aliyun04-vip-lixian.xunlei.com", "vod0079.aliyun06.vip.lixian.xunlei.com", "vod0080.aliyun06.vip.lixian.xunlei.com", "vod0117.aliyun04.vip.lixian.xunlei.com", "vod0118.aliyun04.vip.lixian.xunlei.com", "vod0119.aliyun04.vip.lixian.xunlei.com", "vod1284-aliyun06-vip-lixian.xunlei.com", "vod1285-aliyun06-vip-lixian.xunlei.com", "vod1363-aliyun06-vip-lixian.xunlei.com", "vod1371-aliyun06-vip-lixian.xunlei.com", "vod1372-aliyun06-vip-lixian.xunlei.com", "vod1426-aliyun06-vip-lixian.xunlei.com", "vod1427-aliyun06-vip-lixian.xunlei.com", "vod1428-aliyun06-vip-lixian.xunlei.com", "vod1429-aliyun06-vip-lixian.xunlei.com", "vod1442-aliyun06-vip-lixian.xunlei.com", "vod1443-aliyun06-vip-lixian.xunlei.com", "vod1444-aliyun06-vip-lixian.xunlei.com", "vod1445-aliyun06-vip-lixian.xunlei.com", "vod1446-aliyun06-vip-lixian.xunlei.com", "vod1447-aliyun06-vip-lixian.xunlei.com", "vod1469-aliyun06-vip-lixian.xunlei.com", "vod1470-aliyun06-vip-lixian.xunlei.com", "vod1471-aliyun06-vip-lixian.xunlei.com", "vod1489-aliyun06-vip-lixian.xunlei.com", "vod1490-aliyun06-vip-lixian.xunlei.com", "vod1491-aliyun06-vip-lixian.xunlei.com", "vod1492-aliyun06-vip-lixian.xunlei.com", "vod1493-aliyun06-vip-lixian.xunlei.com", "vod0215.aliyun06.vip.lixian.xunlei.com", "vod0216.aliyun06.vip.lixian.xunlei.com", "vod0217.aliyun06.vip.lixian.xunlei.com", "vod0218.aliyun06.vip.lixian.xunlei.com", "vod0219.aliyun06.vip.lixian.xunlei.com", "vod0220.aliyun06.vip.lixian.xunlei.com", "vod0241.aliyun08.vip.lixian.xunlei.com", "vod0244.aliyun08.vip.lixian.xunlei.com", "vod0251.aliyun08.vip.lixian.xunlei.com", "vod0252.aliyun08.vip.lixian.xunlei.com", "vod0253.aliyun08.vip.lixian.xunlei.com", "vod0254.aliyun08.vip.lixian.xunlei.com", "vod0255.aliyun08.vip.lixian.xunlei.com", "vod0256.aliyun08.vip.lixian.xunlei.com", "vod0257.aliyun08.vip.lixian.xunlei.com", "vod0260.aliyun08.vip.lixian.xunlei.com", "vod0261.aliyun08.vip.lixian.xunlei.com", "vod0262.aliyun08.vip.lixian.xunlei.com", "vod0263.aliyun08.vip.lixian.xunlei.com", "vod0264.aliyun08.vip.lixian.xunlei.com", "vod0265.aliyun08.vip.lixian.xunlei.com", "vod0266.aliyun08.vip.lixian.xunlei.com", "vod0267.aliyun08.vip.lixian.xunlei.com", "vod3379-aliyun04-vip-lixian.xunlei.com", "vod3380-aliyun04-vip-lixian.xunlei.com", "vod3429-aliyun04-vip-lixian.xunlei.com", "vod3458-aliyun04-vip-lixian.xunlei.com", "vod3459-aliyun04-vip-lixian.xunlei.com", "vod3496-aliyun04-vip-lixian.xunlei.com", "vod3497-aliyun04-vip-lixian.xunlei.com", "vod3498-aliyun04-vip-lixian.xunlei.com", "vod3499-aliyun04-vip-lixian.xunlei.com", "vod3500-aliyun04-vip-lixian.xunlei.com", "vod3501-aliyun04-vip-lixian.xunlei.com", "vod3522-aliyun04-vip-lixian.xunlei.com", "vod3523-aliyun04-vip-lixian.xunlei.com", "vod3533-aliyun04-vip-lixian.xunlei.com", "vod3534-aliyun04-vip-lixian.xunlei.com", "vod3535-aliyun04-vip-lixian.xunlei.com", "vod3536-aliyun04-vip-lixian.xunlei.com", "vod3549-aliyun04-vip-lixian.xunlei.com", "vod3550-aliyun04-vip-lixian.xunlei.com", "vod3551-aliyun04-vip-lixian.xunlei.com", "vod3552-aliyun04-vip-lixian.xunlei.com", "vod3553-aliyun04-vip-lixian.xunlei.com", "vod3554-aliyun04-vip-lixian.xunlei.com", "vod3555-aliyun04-vip-lixian.xunlei.com", "vod0551.aliyun06.vip.lixian.xunlei.com", "vod0552.aliyun06.vip.lixian.xunlei.com", "vod0553.aliyun06.vip.lixian.xunlei.com", "vod0554.aliyun06.vip.lixian.xunlei.com", "vod0555.aliyun06.vip.lixian.xunlei.com", "vod0556.aliyun06.vip.lixian.xunlei.com", "vod0686.aliyun08.vip.lixian.xunlei.com", "vod0687.aliyun08.vip.lixian.xunlei.com", "vod0688.aliyun08.vip.lixian.xunlei.com", "vod0689.aliyun08.vip.lixian.xunlei.com", "vod0724.aliyun08.vip.lixian.xunlei.com", "vod0725.aliyun08.vip.lixian.xunlei.com", "vod0726.aliyun08.vip.lixian.xunlei.com", "vod0727.aliyun08.vip.lixian.xunlei.com", "vod0728.aliyun08.vip.lixian.xunlei.com", "vod0759.aliyun04.vip.lixian.xunlei.com", "vod0760.aliyun04.vip.lixian.xunlei.com", "vod0769.aliyun04.vip.lixian.xunlei.com", "vod0770.aliyun04.vip.lixian.xunlei.com", "vod0771.aliyun04.vip.lixian.xunlei.com", "vod0772.aliyun04.vip.lixian.xunlei.com", "vod0773.aliyun04.vip.lixian.xunlei.com", "vod0774.aliyun04.vip.lixian.xunlei.com", "vod0775.aliyun04.vip.lixian.xunlei.com", "vod0776.aliyun04.vip.lixian.xunlei.com", "vod0777.aliyun04.vip.lixian.xunlei.com", "vod0778.aliyun04.vip.lixian.xunlei.com", "vod0779.aliyun04.vip.lixian.xunlei.com", "vod0780.aliyun04.vip.lixian.xunlei.com", "vod0781.aliyun04.vip.lixian.xunlei.com", "vod3522.aliyun04.vip.lixian.xunlei.com", "vod3523.aliyun04.vip.lixian.xunlei.com", "vod3533.aliyun04.vip.lixian.xunlei.com", "vod3535.aliyun04.vip.lixian.xunlei.com", "vod3550.aliyun04.vip.lixian.xunlei.com", "vod3551.aliyun04.vip.lixian.xunlei.com", "vod3552.aliyun04.vip.lixian.xunlei.com", "vod3553.aliyun04.vip.lixian.xunlei.com", "vod3554.aliyun04.vip.lixian.xunlei.com", "vod3555.aliyun04.vip.lixian.xunlei.com"
],
"getLink": "https://api-pan.xunlei.com/drive/v1/files/"
},
"mount": {
"home": ".FileMenu__menu--XBFEH",
"share": ".Share__batchActionBox--VKPyR"
}
},
"quark": {
"api": {
"ua": {
"downloadLink": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch"
},
"getLink": "https://drive.quark.cn/1/clouddrive/file/download?pr=ucpro&fr=pc"
},
"mount": {
"home": ".btn-operate .btn-main",
"share": ".file-info-share-buttom"
}
},
"mcloud": {
"api": {
"getLink": "https://personal-kd-njs.yun.139.com/hcy/file/getDownloadUrl"
},
"mount": {
"home": ".top_button",
"share": ".top-btns"
}
}
}
/* 基础函数 */
let base = {
// 创建 GreaseMonkey 菜单
registerMenuCommand() {
GM_registerMenuCommand('⚙️ 设置', function () {
base.showSetting();
});
GM_registerMenuCommand('🍃️ 美化', function () {
base.showBeautify();
});
GM_registerMenuCommand('📃 更新', function () {
base.showUpdateLog();
});
GM_registerMenuCommand('🛠️ 调试', function () {
base.showDebug();
});
},
// 取消注册
unRegisterInit(value) {
message.warning("正在注入设置项目...");
base.setValue('setting_init_code', value);
base.setValue('setting_init_license', value);
base.setValue('baidu_access_token', "");
if (location.host.includes("baidu")) base.setStorage('baiduyunPlugin_BDUSS', "")
history.go(0)
},
/*-- 对象类型判断
示例:
isType([]) // 输出"array"
isType(123) // 输出"number"
isType(null) // 输出"null"
isType(new Date()) // 输出"date"
*/
isType(obj) {
return Object.prototype.toString.call(obj).replace(/^\[object (.+)\]$/, '$1').toLowerCase();
},
// 获取本地保存的数值(仅用于 Greasemonkey)
getValue(name) {
return GM_getValue(name);
},
// 增改本地保存的数值(仅用于 Greasemonkey)
setValue(name, value) {
GM_setValue(name, value);
},
// 删除本地保存的数值(仅用于 Greasemonkey)
deleteValue(name) {
GM_deleteValue(name);
},
// 获取本地保存的数值
getStorage(key) {
try {
return JSON.parse(localStorage.getItem(key));
} catch (e) {
return localStorage.getItem(key);
}
},
// 修改本地保存的数值
setStorage(key, value) {
if (this.isType(value) === 'object' || this.isType(value) === 'array') {
return localStorage.setItem(key, JSON.stringify(value));
}
return localStorage.setItem(key, value);
},
// 设置剪贴板
setClipboard(text) {
GM_setClipboard(text, 'text');
},
// 加密成base64(先转换成URL编码)
encode(str) {
return btoa(unescape(encodeURIComponent(str)));
},
// 从base64解密
decode(str) {
return decodeURIComponent(escape(atob(str)));
},
// 数字补零
repairTimer(i) {
if (i >= 0 && i <= 9) {
return "0" + i;
} else {
return i;
}
},
// 接受文件名并返回大写扩展名
getExtension(name) {
const reg = /(?!\.)\w+$/;
if (reg.test(name)) {
let match = name.match(reg);
return match[0].toUpperCase();
}
return '';
},
// 文件大小转换(以字节为单位)
sizeFormat(value) {
if (value === +value) {
let unit = ["字节(B)", "千字节(KB)", "兆字节(MB)", "吉字节(GB)", "太字节(TB)", "拍字节(PB)", "艾字节(EB)", "泽字节(ZB)", "尧字节(YB)"];
if (value === 0) {
return "0字节(B)";
} else {
let index = Math.floor(Math.log(value) / Math.log(1024));
let size = value / Math.pow(1024, index);
size = size.toFixed(1);
return size + unit[index];
}
}
return '';
},
// 根据数组中的每个文件名进行排序,使用 localeCompare 方法来比较中文字符串的顺序。
sortByName(arr) {
const handle = function () {
return (a, b) => {
const p1 = a.filename ? a.filename : a.server_filename;
const p2 = b.filename ? b.filename : b.server_filename;
return p1.localeCompare(p2, "zh-CN");
};
};
arr.sort(handle());
},
// 替换特殊字符为下划线
fixFilename(name) {
let replace = /[!?&|`"'*\/:<>\\]/g
return name.replace(replace, '_');
},
// 传递 Document Cookie
getCookie(name) {
let cname = name + "=";
let ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i].trim();
if (c.indexOf(cname) == 0) return c.substring(cname.length, c.length);
}
return "";
},
// 接受Blob对象和文件名,然后创建临时链接指向blob对象,之后创建a标签指向临时链接和设置文件名,最后模拟点击a标签实现下载和释放临时链接
blobDownload(blob, filename) {
if (blob instanceof Blob) {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
URL.revokeObjectURL(url);
}
},
xmlHttpRequest(option) {
// 检查 GM_xmlhttpRequest 是否可用,并使用可用的请求方式
let request = (typeof GM_xmlhttpRequest !== "undefined") ? GM_xmlhttpRequest : GM.xmlHttpRequest;
// 调用请求函数并传入 option
if (request && typeof request === 'function') {
return request(option);
}
},
/* 请求 */
// 使用 Post 发送请求
post(url, data, headers, type, maxRetries = 3, currentRetry = 0) {
if (this.isType(data) === 'object') {
data = JSON.stringify(data);
}
return new Promise((resolve, reject) => {
const sendRequest = function () {
base.xmlHttpRequest({
method: "POST", url, headers, data,
responseType: type || 'json',
onloadstart() {
console.log('【(改)网盘直链下载助手】Post(start)\n请求地址:' + url + '\n请求头部:', headers);
},
onload: function (res) {
// 尝试格式化请求结果以方便调试
if (res.response) {
try {
res.decodedResponse = JSON.parse(res.response);
} catch (e) { }
try {
res.decodedResponse = JSON.parse(base.decode(res.response));
} catch (e) { }
}
if (res.responseText) {
try {
res.decodedResponseText = JSON.stringify(JSON.parse(res.responseText));
} catch (e) { }
try {
res.decodedResponseText = JSON.stringify(base.decode(res.responseText));
} catch (e) { }
}
console.log('【(改)网盘直链下载助手】Post(load)\n请求地址:' + url + '\n请求头部:', headers, '\n请求数据:' + JSON.stringify(data) + '\n请求结果:', res);
type === 'blob' ? resolve(res) : resolve(res.response || res.responseText);
},
onerror: function (err) {
if (currentRetry < maxRetries) {
currentRetry++;
console.error(`【(改)网盘直链下载助手】Post(error)\n请求出现错误,可能是网络问题\n5秒后将重试 (错误次数:${currentRetry}/${maxRetries})...`, err);
setTimeout(function () {
console.log(`【(改)网盘直链下载助手】Post(error)\n重新尝试请求...`);
sendRequest(); // 重新发送请求
}, 5000)
} else {
reject('【(改)网盘直链下载助手】Post(error)\n请求出现错误,可能是网络问题\n无法继续请求,达到最大错误次数。', err); // 达到最大重试次数,拒绝 Promise
}
},
});
};
sendRequest(); // 初始请求
});
},
// 使用 Get 发送请求
get(url, headers, type, extra, maxRetries = 3, currentRetry = 0) {
return new Promise((resolve, reject) => {
const sendRequest = function () {
let requestObj = base.xmlHttpRequest({
method: "GET", url, headers,
responseType: type || 'json',
onload: function (res) {
if (res.status === 204) {
console.log('【(改)网盘直链下载助手】Get(load)\n\x1B[31m该请求已被某个下载工具捕获。' + (res.statusText ? ("\n\x1B[0m工具提示:\x1B[31m" + res.statusText) : "") + '\x1B[0m\n请求地址:' + url + '\n请求头部:', headers, '\n请求结果:', res);
requestObj.abort();
idm[extra.index] = true;
return;
}
if (type === 'blob') {
console.log('【(改)网盘直链下载助手】Get(load) Blob\n请求地址:' + url + '\n请求头部:', headers, '\n请求结果:', res);
res.status === 200 && base.blobDownload(res.response, extra.filename);
resolve(res);
} else {
// 尝试格式化请求结果以方便调试
if (res.response) {
try {
res.decodedResponse = JSON.parse(res.response);
} catch (e) { }
try {
res.decodedResponse = JSON.parse(base.decode(res.response));
} catch (e) { }
}
if (res.responseText) {
try {
res.decodedResponseText = JSON.stringify(JSON.parse(res.responseText));
} catch (e) { }
try {
res.decodedResponseText = JSON.stringify(base.decode(res.responseText));
} catch (e) { }
}
console.log('【(改)网盘直链下载助手】Get(load)\n请求地址:' + url + '\n请求头部:', headers, '\n请求结果:', res);
resolve(res.response || res.responseText);
}
},
onprogress: function (res) {
if (res.status === 204) {
console.log('【(改)网盘直链下载助手】Get(progress)\n\x1B[31m该请求已被某个下载工具捕获。' + (res.statusText ? ("\n\x1B[0m工具提示:\x1B[31m" + res.statusText) : "") + '\x1B[0m\n请求地址:' + url + '\n请求头部:', headers, '\n请求结果:', res);
requestObj.abort();
idm[extra.index] = true;
return;
}
if (extra && extra.filename && extra.index) {
res.total > 0 ? progress[extra.index] = (res.loaded * 100 / res.total).toFixed(2) : progress[extra.index] = 0.00;
// console.log('【(改)网盘直链下载助手】Get(progress)\n\x1B[31m该请求正在进行中。' + (progress[extra.index] ? ("\n\x1B[0m下载进度:\x1B[31m" + progress[extra.index]) : "") + '\x1B[0m');
}
},
onloadstart(res) {
if (res.status === 204) {
console.log('【(改)网盘直链下载助手】Get(start)\n\x1B[31m该请求已被某个下载工具捕获。' + (res.statusText ? ("\n\x1B[0m工具提示:\x1B[31m" + res.statusText) : "") + '\x1B[0m\n请求地址:' + url + '\n请求头部:', headers, '\n请求结果:', res);
requestObj.abort();
idm[extra.index] = true;
return;
}
console.log('【(改)网盘直链下载助手】Get(start)\n请求地址:' + url + '\n请求头部:', headers);
if (extra && extra.filename && extra.index) request[extra.index] = requestObj;
},
onerror: function (err) {
if (currentRetry < maxRetries) {
currentRetry++;
console.error(`【(改)网盘直链下载助手】Get(error)\n请求出现错误,可能是网络问题\n5秒后将重试 (错误次数:${currentRetry}/${maxRetries})...`, err);
setTimeout(function () {
console.log(`【(改)网盘直链下载助手】Get(error)\n重新尝试请求...`);
sendRequest(); // 重新发送请求
}, 5000)
} else {
reject('【(改)网盘直链下载助手】Get(error)\n请求出现错误,可能是网络问题\n无法继续请求,达到最大错误次数。', err); // 达到最大重试次数,拒绝 Promise
}
},
});
};
sendRequest(); // 初始请求
});
},
// 使用 Get 发送请求获取跳转后的链接
getFinalUrl(url, headers, maxRetries = 3, currentRetry = 0) {
return new Promise((resolve, reject) => {
const sendRequest = function () {
base.xmlHttpRequest({
method: "GET", url, headers,
onloadstart() {
console.log('【(改)网盘直链下载助手】Get(start) FinalUrl\n请求地址:' + url + '\n请求头部:', headers);
},
onload: function (res) {
console.log('【(改)网盘直链下载助手】Get(load) FinalUrl\n请求地址:' + url + '\n请求头部:', headers, '\n返回结果:', res);
resolve(res.finalUrl)
},
onerror: function (err) {
if (currentRetry < maxRetries) {
currentRetry++;
console.error(`【(改)网盘直链下载助手】Get(error) FinalUrl\n请求出现错误,可能是网络问题\n5秒后将重试 (错误次数:${currentRetry}/${maxRetries})...`);
setTimeout(function () {
console.log(`【(改)网盘直链下载助手】Get(error) FinalUrl\n重新尝试请求...`);
sendRequest(); // 重新发送请求
}, 5000)
} else {
reject('【(改)网盘直链下载助手】Get(error) FinalUrl\n请求出现错误,可能是网络问题\n无法继续请求,达到最大错误次数。', err); // 达到最大重试次数,拒绝 Promise
}
},
});
};
sendRequest(); // 初始请求
});
},
// RPC测试
async rpcTest(domain, port, path, token) {
return new Promise((resolve, reject) => {
let rpc = { domain, port, path, token };
let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
let rpcData = {
id: new Date().getTime(),
jsonrpc: '2.0',
method: 'system.listMethods',
params: [`token:${rpc.token}`],
};
base.xmlHttpRequest({
method: "POST", url, headers: {}, data: JSON.stringify(rpcData),
responseType: 'json',
onloadstart() {
console.log('【(改)网盘直链下载助手】Post(start) RPCTest\n请求地址:' + url + '\n请求内容:', rpcData);
},
onload: function (res) {
console.log('【(改)网盘直链下载助手】Post(load) RPCTest\n请求地址:' + url + '\n请求结果:', res);
if (res.response) {
resolve("success");
} else {
resolve("fail");
}
},
onerror: function (err) {
console.error('【(改)网盘直链下载助手】Post(error) RPCTest\n请求失败', err);
resolve("fail");
},
});
});
},
_resetData() {
progress = {};
$.each(request, function (key) {
(request[key]).abort();
});
$.each(ins, function (key) {
clearInterval(ins[key]);
});
idm = {};
ins = {};
request = {};
},
// 将对象转换为 URL 加密
stringify(obj) {
let str = '';
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
let value = obj[key];
if (Array.isArray(value)) {
for (let i = 0; i < value.length; i++) {
str += encodeURIComponent(key) + '=' + encodeURIComponent(value[i]) + '&';
}
} else {
str += encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&';
}
}
}
return str.slice(0, -1); // 去掉末尾的 "&"
},
// 动态添加样式
addStyle(id, tag, css, element, position = "append") {
tag = tag || 'style';
element = element || 'body';
let styleDom = document.getElementById(id);
if (styleDom) styleDom.remove();
let style = document.createElement(tag);
style.rel = 'stylesheet';
style.id = id;
tag === 'style' ? style.innerHTML = css : style.href = css;
if (position === "before") {
$(element).before($(style));
} else if (position === "after") {
$(element).after($(style));
} else if (position === "prepend") {
$(element).prepend($(style));
} else {
$(element).append($(style));
}
},
hexToRgba(hex) {
// 去掉 # 号
hex = hex.replace(/^#/, '');
// 如果是四位十六进制颜色值,转换为八位
if (hex.length === 4) {
hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2] + hex[3] + hex[3];
}
// 解析 RGB 分量
let r = parseInt(hex.substring(0, 2), 16);
let g = parseInt(hex.substring(2, 4), 16);
let b = parseInt(hex.substring(4, 6), 16);
let a = '';
// 如果是八位十六进制颜色值,解析 alpha 通道
if (hex.length === 8) {
a = parseInt(hex.substring(6, 8), 16) / 255; // 将 alpha 值转换为 0 到 1 之间的小数
a = ',' + a
}
// 返回 rgba 格式字符串
return r + ', ' + g + ', ' + b + a;
},
rgbaToHex(rgba) {
// 去掉前缀 "rgba" 或 "rgb" 并移除空格
rgba = rgba.replace(/^(rgba?|RGBA?)\(/, '').replace(/\s+/g, '').replace(')', '');
// 将颜色值分割为数组
let [r, g, b, a] = rgba.split(',');
// 将 RGB 转换为十六进制
r = parseInt(r).toString(16).padStart(2, '0');
g = parseInt(g).toString(16).padStart(2, '0');
b = parseInt(b).toString(16).padStart(2, '0');
// 如果存在 alpha 通道,处理透明度值
if (a !== undefined) {
// 将 alpha 转换为 0 到 255 的十六进制
a = Math.round(parseFloat(a) * 255).toString(16).padStart(2, '0');
return `#${r}${g}${b}${a}`;
}
// 如果没有 alpha 通道,返回标准六位的十六进制颜色
return `#${r}${g}${b}`;
},
replaceColors(cssText, baseURI, type, colorMap) {
if (!cssText) return '';
let colorList = ['#09AAFF', '#cc3235', '#518c17', '#ed944b', '#f969a5', '#bca280', '#574AB8', '#b673ab', '#1d2327', '#18a497', '#637dff', '#0d53ff', '#3181f9', '#f8d800', '#0396ff', '#32ccbc', '#f6416c', '#2271b1', '#59524c', '#ff679a', '#f44236', '#fec107', '#8bc24a', '#2594ed', '#9c28b1']
colorList.forEach(function (oldColor) {
cssText = cssText.replace(new RegExp(base.hexToRgba(oldColor), 'ig'), base.hexToRgba(color));
cssText = cssText.replace(new RegExp(oldColor, 'ig'), color);
});
if (type === 'other') {
// 遍历颜色映射数组,将旧颜色替换为新颜色,并添加过渡效果
colorMap.forEach(function (colorPair) {
let oldColor = colorPair[0];
let newColor = colorPair[1];
// 判断新颜色是否为 color
cssText = cssText.replace(new RegExp(oldColor, 'ig'), newColor);
});
return cssText;
}
if (colorMap) {
// 遍历颜色映射数组,将旧颜色替换为新颜色,并添加过渡效果
colorMap.forEach(function (colorPair) {
let oldColor = colorPair[0];
let newColor = colorPair[1];
// 判断新颜色是否为 color
if (oldColor.includes("#")) {
cssText = cssText.replace(new RegExp(oldColor + '(.*?)}', 'ig'), newColor + '$1; ' + 'transition: all 0.1s ease;}');
} else {
cssText = cssText.replace(new RegExp(oldColor, 'ig'), newColor);
}
});
};
if (baseURI) {
// 替换相对路径资源为绝对路径
cssText = cssText.replace(/url\(\s*(['"]?)([^'"]*?)\1\s*\)/ig, (match, quote, url) => {
// 如果 URL 是相对路径,则将其转换为绝对路径
if (url && !/^(data:|https?:|\/\/)/i.test(url)) {
try {
let absoluteURL = new URL(url, baseURI).href;
return `url(${absoluteURL})`;
} catch (e) {
return match;
}
}
return match;
});
}
return cssText;
},
setColors(colorMap, type) {
let cssText
document.querySelectorAll('[id^="Panlinker-ColorUI-"]').forEach(function (tag) {
if (!tag.parentElement) return;
// 替换颜色并添加样式
if (
tag.innerText === base.replaceColors(tag.innerText, '', type, colorMap)
) return;
cssText = base.replaceColors(tag.innerText, '', type, colorMap);
tag.innerText = cssText;
console.log(`【(改)网盘直链下载助手】UI\n修改 Panlinker-ColorUI