// ==UserScript==
// @name 网盘提速
// @namespace https://github.com/syhyz1990/baiduyun
// @version 1.3.0
// @author ahonker999夸克/百度/阿里/天翼/迅雷/移动六大网盘
// @description 加速六大网盘链接下载速度:
// @license AGPL-3.0-or-later
// @homepage http://bds.yt3166.com
// @supportURL http://bds.yt3166.com
// @antifeature membership
// @match *://pan.baidu.com/disk/home*
// @match *://yun.baidu.com/disk/home*
// @match *://pan.baidu.com/disk/main*
// @match *://yun.baidu.com/disk/main*
// @match *://pan.baidu.com/s/*
// @match *://yun.baidu.com/s/*
// @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/*
// @require https://unpkg.com/[email protected]/dist/jquery.min.js
// @require https://unpkg.com/[email protected]/dist/sweetalert2.all.min.js
// @require https://unpkg.com/[email protected]/build/md5.min.js
// @connect baidu.com
// @connect baidupcs.com
// @connect aliyundrive.com
// @connect alipan.com
// @connect 189.cn
// @connect xunlei.com
// @connect quark.cn
// @connect bds.yt3166.com
// @connect yun.139.com
// @connect caiyun.139.com
// @connect localhost
// @connect *
// @run-at document-idle
// @grant unsafeWindow
// @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 window.close
// @icon data:image/png;base64,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
// ==/UserScript==
(function () {
'use strict';
let pt = '', selectList = [], params = {}, mode = '', width = 800, pan = {}, color = '',
doc = $(document), progress = {}, request = {}, ins = {}, idm = {};
const scriptInfo = GM_info.script;
const version = scriptInfo.version;
const author = scriptInfo.author;
const name = scriptInfo.name;
const manageHandler = GM_info.scriptHandler;
const manageVersion = GM_info.version;
const customClass = {
popup: 'pl-popup',
header: 'pl-header',
title: 'pl-title',
closeButton: 'pl-close',
content: 'pl-content',
input: 'pl-input',
footer: 'pl-footer'
};
const terminalType = {
wc: "Windows CMD",
wp: "Windows PowerShell",
lt: "Linux 终端",
ls: "Linux Shell",
mt: "MacOS 终端",
};
let toast = Swal.mixin({
toast: true,
position: 'top',
showConfirmButton: false,
timer: 3500,
timerProgressBar: false,
didOpen: (toast) => {
toast.addEventListener('mouseenter', Swal.stopTimer);
toast.addEventListener('mouseleave', Swal.resumeTimer);
}
});
const message = {
success: (text) => {
toast.fire({title: text, icon: 'success'});
},
error: (text) => {
toast.fire({title: text, icon: 'error'});
},
warning: (text) => {
toast.fire({title: text, icon: 'warning'});
},
info: (text) => {
toast.fire({title: text, icon: 'info'});
},
question: (text) => {
toast.fire({title: text, icon: 'question'});
}
};
let base = {
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 "";
},
isType(obj) {
return Object.prototype.toString.call(obj).replace(/^\[object (.+)\]$/, '$1').toLowerCase();
},
getValue(name) {
return GM_getValue(name);
},
setValue(name, value) {
GM_setValue(name, value);
},
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');
},
e(str) {
return btoa(unescape(encodeURIComponent(str)));
},
d(str) {
return decodeURIComponent(escape(atob(str)));
},
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"];
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 '';
},
sortByName(arr) {
const handle = () => {
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) {
return name.replace(/[!?&|`"'*\/:<>\\]/g, '_');
},
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);
}
},
post(url, data, headers, type) {
if (this.isType(data) === 'object') {
data = JSON.stringify(data);
}
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "POST", url, headers, data,
responseType: type || 'json',
onload: (res) => {
type === 'blob' ? resolve(res) : resolve(res.response || res.responseText);
},
onerror: (err) => {
reject(err);
},
});
});
},
get(url, headers, type, extra) {
return new Promise((resolve, reject) => {
let requestObj = GM_xmlhttpRequest({
method: "GET", url, headers,
responseType: type || 'json',
onload: (res) => {
if (res.status === 204) {
requestObj.abort();
idm[extra.index] = true;
}
if (type === 'blob') {
res.status === 200 && base.blobDownload(res.response, extra.filename);
resolve(res);
} else {
resolve(res.response || res.responseText);
}
},
onprogress: (res) => {
if (extra && extra.filename && extra.index) {
res.total > 0 ? progress[extra.index] = (res.loaded * 100 / res.total).toFixed(2) : progress[extra.index] = 0.00;
}
},
onloadstart() {
extra && extra.filename && extra.index && (request[extra.index] = requestObj);
},
onerror: (err) => {
reject(err);
},
});
});
},
getFinalUrl(url, headers) {
return new Promise((resolve, reject) => {
let requestObj = GM_xmlhttpRequest({
method: "GET", url, headers,
onload: (res) => {
resolve(res.finalUrl)
},
onerror: (err) => {
reject(err);
}
});
});
},
stringify(obj) {
let str = '';
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var value = obj[key];
if (Array.isArray(value)) {
for (var 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) {
tag = tag || 'style';
let doc = document, styleDom = doc.getElementById(id);
if (styleDom) return;
let style = doc.createElement(tag);
style.rel = 'stylesheet';
style.id = id;
tag === 'style' ? style.innerHTML = css : style.href = css;
doc.getElementsByTagName('head')[0].appendChild(style);
},
sleep(time) {
return new Promise(resolve => setTimeout(resolve, time));
},
getMajorVersion(version) {
const [major] = (version || '').split('.');
return /^\d+$/.test(major) ? major : null;
},
findReact(dom, traverseUp = 0) {
const key = Object.keys(dom).find(key => {
return key.startsWith("__reactFiber$")
|| key.startsWith("__reactInternalInstance$");
});
const domFiber = dom[key];
if (domFiber == null) return null;
if (domFiber._currentElement) {
let compFiber = domFiber._currentElement._owner;
for (let i = 0; i < traverseUp; i++) {
compFiber = compFiber._currentElement._owner;
}
return compFiber._instance;
}
const GetCompFiber = fiber => {
let parentFiber = fiber.return;
while (typeof parentFiber.type == "string") {
parentFiber = parentFiber.return;
}
return parentFiber;
};
let compFiber = GetCompFiber(domFiber);
for (let i = 0; i < traverseUp; i++) {
compFiber = GetCompFiber(compFiber);
}
return compFiber.stateNode || compFiber;
},
initDefaultConfig() {
let value = [{
name: 'setting_rpc_domain',
value: 'http://localhost'
}, {
name: 'setting_rpc_port',
value: '16800'
}, {
name: 'setting_rpc_path',
value: '/jsonrpc'
}, {
name: 'setting_rpc_token',
value: ''
}, {
name: 'setting_rpc_dir',
value: 'D:'
}, {
name: 'setting_terminal_type',
value: 'wc'
}, {
name: 'setting_theme_color',
value: '#09AAFF'
}, {
name: 'setting_init_code',
value: ''
}, {
name: 'license',
value: ''
}];
value.forEach((v) => {
base.getValue(v.name) === undefined && base.setValue(v.name, v.value);
});
},
showSetting() {
let dom = '', btn = '',
colorList = ['#09AAFF', '#cc3235', '#526efa', '#518c17', '#ed944b', '#f969a5', '#bca280'];
dom += `<label class="pl-setting-label"><div class="pl-label">RPC主机</div><input type="text" placeholder="主机地址,需带上http(s)://" class="pl-input listener-domain" value="${base.getValue('setting_rpc_domain')}"></label>`;
dom += `<label class="pl-setting-label"><div class="pl-label">RPC端口</div><input type="text" placeholder="端口号,例如:Motrix为16800" class="pl-input listener-port" value="${base.getValue('setting_rpc_port')}"></label>`;
dom += `<label class="pl-setting-label"><div class="pl-label">RPC路径</div><input type="text" placeholder="路径,默认为/jsonrpc" class="pl-input listener-path" value="${base.getValue('setting_rpc_path')}"></label>`;
dom += `<label class="pl-setting-label"><div class="pl-label">RPC密钥</div><input type="text" placeholder="无密钥无需填写" class="pl-input listener-token" value="${base.getValue('setting_rpc_token')}"></label>`;
dom += `<label class="pl-setting-label"><div class="pl-label">保存路径</div><input type="text" placeholder="文件下载后保存路径,例如:D:" class="pl-input listener-dir" value="${base.getValue('setting_rpc_dir')}"></label>`;
colorList.forEach((v) => {
btn += `<div data-color="${v}" style="background: ${v};border: 1px solid ${v}" class="pl-color-box listener-color ${v === base.getValue('setting_theme_color') ? 'checked' : ''}"></div>`;
});
dom += `<label class="pl-setting-label"><div class="pl-label">终端类型</div><select class="pl-input listener-terminal">`;
Object.keys(terminalType).forEach(k => {
dom += `<option value="${k}" ${base.getValue('setting_terminal_type') === k ? 'selected' : ''}>${terminalType[k]}</option>`;
});
dom += `</select></label>`;
dom += `<label class="pl-setting-label"><div class="pl-label">主题颜色</div> <div class="pl-color">${btn}<div></label>`;
dom = '<div>' + dom + '</div>';
Swal.fire({
title: '提速配置',
html: dom,
icon: 'info',
showCloseButton: true,
showConfirmButton: false,
}).then(() => {
message.success('设置成功!');
history.go(0);
});
doc.on('click', '.listener-color', async (e) => {
base.setValue('setting_theme_color', e.target.dataset.color);
message.success('设置成功!');
history.go(0);
});
doc.on('input', '.listener-domain', async (e) => {
base.setValue('setting_rpc_domain', e.target.value);
});
doc.on('input', '.listener-port', async (e) => {
base.setValue('setting_rpc_port', e.target.value);
});
doc.on('input', '.listener-path', async (e) => {
base.setValue('setting_rpc_path', e.target.value);
});
doc.on('input', '.listener-token', async (e) => {
base.setValue('setting_rpc_token', e.target.value);
});
doc.on('input', '.listener-dir', async (e) => {
base.setValue('setting_rpc_dir', e.target.value);
});
doc.on('change', '.listener-terminal', async (e) => {
base.setValue('setting_terminal_type', e.target.value);
});
},
registerMenuCommand() {
GM_registerMenuCommand('⚙️ 设置', () => {
this.showSetting();
});
},
createTip() {
$('body').append('<div class="pl-tooltip"></div>');
doc.on('mouseenter mouseleave', '.listener-tip', (e) => {
if (e.type === 'mouseenter') {
let filename = e.currentTarget.innerText;
let size = e.currentTarget.dataset.size;
let tip = `${filename}<span style="margin-left: 10px;color: #f56c6c;">${size}</span>`;
$(e.currentTarget).css({opacity: '0.5'});
$('.pl-tooltip').html(tip).css({
'left': e.pageX + 10 + 'px',
'top': e.pageY - e.currentTarget.offsetTop > 14 ? e.pageY + 'px' : e.pageY + 20 + 'px'
}).show();
} else {
$(e.currentTarget).css({opacity: '1'});
$('.pl-tooltip').hide(0);
}
});
},
createLoading() {
return $('<div class="pl-loading"><div class="pl-loading-box"><div><div></div><div></div></div></div></div>');
},
createDownloadIframe() {
let $div = $('<div style="padding:0;margin:0;display:block"></div>');
let $iframe = $('<iframe src="javascript:;" id="downloadIframe" style="display:none"></iframe>');
$div.append($iframe);
$('body').append($div);
},
getMirrorList(link, mirror, thread = 2) {
let host = new URL(link).host;
let mirrors = [];
for (let i = 0; i < mirror.length; i++) {
for (let j = 0; j < thread; j++) {
let item = link.replace(host, mirror[i]) + '&'.repeat(j);
mirrors.push(item);
}
}
return mirrors.join('\n');
},
listenElement(element, callback) {
const checkInterval = 500; // 检查元素的间隔时间(毫秒)
let wasElementFound = false; // 用于跟踪元素是否之前已经找到
function checkElement() {
if (document.querySelector(element)) {
wasElementFound = true;
callback();
} else if (wasElementFound) {
wasElementFound = false; // 元素消失后重置标志
}
setTimeout(checkElement, checkInterval);
}
checkElement();
},
addPanLinkerStyle() {
color = base.getValue('setting_theme_color');
let css = `
body::-webkit-scrollbar { display: none }
::-webkit-scrollbar { width: 6px; height: 10px }
::-webkit-scrollbar-track { border-radius: 0; background: none }
::-webkit-scrollbar-thumb { background-color: rgba(85,85,85,.4) }
::-webkit-scrollbar-thumb,::-webkit-scrollbar-thumb:hover { border-radius: 5px; -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.2) }
::-webkit-scrollbar-thumb:hover { background-color: rgba(85,85,85,.3) }
.swal2-popup { font-size: 16px !important; }
.pl-popup { font-size: 12px !important; }
.pl-popup a { color: ${color} !important; }
.pl-header { padding: 0!important;align-items: flex-start!important; border-bottom: 1px solid #eee!important; margin: 0 0 10px!important; padding: 0 0 5px!important; }
.pl-title { font-size: 16px!important; line-height: 1!important;white-space: nowrap!important; text-overflow: ellipsis!important;}
.pl-content { padding: 0 !important; font-size: 12px!important; }
.pl-main { max-height: 400px;overflow-y:scroll; }
.pl-footer {font-size: 12px!important;justify-content: flex-start!important; margin: 10px 0 0!important; padding: 5px 0 0!important; color: #f56c6c!important; }
.pl-item { display: flex; align-items: center; line-height: 22px; }
.pl-item-name { flex: 0 0 150px; text-align: left;margin-right: 10px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; cursor:default; }
.pl-item-link { flex: 1; overflow: hidden; text-align: left; white-space: nowrap; text-overflow: ellipsis;cursor:pointer }
.pl-item-btn { background: ${color}; padding: 4px 5px; border-radius: 3px; line-height: 1; cursor: pointer; color: #fff; }
.pl-item-tip { display: flex; justify-content: space-between;flex: 1; }
.pl-back { width: 70px; background: #ddd; border-radius: 3px; cursor:pointer; margin:1px 0; }
.pl-ext { display: inline-block; width: 44px; background: #999; color: #fff; height: 16px; line-height: 16px; font-size: 12px; border-radius: 3px;}
.pl-retry {padding: 3px 10px; background: #cc3235; color: #fff; border-radius: 3px; cursor: pointer;}
.pl-browserdownload { padding: 3px 10px; background: ${color}; color: #fff; border-radius: 3px; cursor: pointer;}
.pl-item-progress { display:flex;flex: 1;align-items:center}
.pl-progress { display: inline-block;vertical-align: middle;width: 100%; box-sizing: border-box;line-height: 1;position: relative;height:15px; flex: 1}
.pl-progress-outer { height: 15px;border-radius: 100px;background-color: #ebeef5;overflow: hidden;position: relative;vertical-align: middle;}
.pl-progress-inner{ position: absolute;left: 0;top: 0;background-color: #409eff;text-align: right;border-radius: 100px;line-height: 1;white-space: nowrap;transition: width .6s ease;}
.pl-progress-inner-text { display: inline-block;vertical-align: middle;color: #d1d1d1;font-size: 12px;margin: 0 5px;height: 15px}
.pl-progress-tip{ flex:1;text-align:right}
.pl-progress-how{ flex: 0 0 90px; background: #ddd; border-radius: 3px; margin-left: 10px; cursor: pointer; text-align: center;}
.pl-progress-stop{ flex: 0 0 50px; padding: 0 10px; background: #cc3235; color: #fff; border-radius: 3px; cursor: pointer;margin-left:10px;height:20px}
.pl-progress-inner-text:after { display: inline-block;content: "";height: 100%;vertical-align: middle;}
.pl-btn-primary { background: ${color}; border: 0; border-radius: 4px; color: #ffffff; cursor: pointer; font-size: 12px; outline: none; display:flex; align-items: center; justify-content: center; margin: 2px 0; padding: 6px 0;transition: 0.3s opacity; }
.pl-btn-primary:hover { opacity: 0.9;transition: 0.3s opacity; }
.pl-btn-success { background: #55af28; animation: easeOpacity 1.2s 2; animation-fill-mode:forwards }
.pl-btn-info { background: #606266; }
.pl-btn-warning { background: #da9328; }
.pl-btn-warning { background: #da9328; }
.pl-btn-danger { background: #cc3235; }
.ali-button {display: inline-flex;align-items: center;justify-content: center;border: 0 solid transparent;border-radius: 5px;box-shadow: 0 0 0 0 transparent;width: fit-content;white-space: nowrap;flex-shrink: 0;font-size: 14px;line-height: 1.5;outline: 0;touch-action: manipulation;transition: background .3s ease,color .3s ease,border .3s ease,box-shadow .3s ease;color: #fff;background: rgb(99 125 255);margin-left: 20px;padding: 1px 12px;position: relative; cursor:pointer; height: 32px;}
.ali-button:hover {background: rgb(122, 144, 255)}
.tianyi-button {margin-right: 20px; padding: 4px 12px; border-radius: 4px; color: #fff; font-size: 12px; border: 1px solid #0073e3; background: #2b89ea; cursor: pointer; position: relative;}
.tianyi-button:hover {border-color: #1874d3; background: #3699ff;}
.yidong-button {float: left; position: relative; margin: 20px 24px 20px 0; width: 98px; height: 36px; background: #3181f9; border-radius: 2px; font-size: 14px; color: #fff; line-height: 39px; text-align: center; cursor: pointer;}
.yidong-share-button {display: inline-block; position: relative; font-size: 14px; line-height: 36px; height: 36px; text-align: center; color: #fff; border: 1px solid #5a9afa; border-radius: 2px; padding: 0 24px; margin-left: 24px; background: #3181f9; cursor: pointer;}
.yidong-button:hover {background: #2d76e5;}
.xunlei-button {display: inline-flex;align-items: center;justify-content: center;border: 0 solid transparent;border-radius: 5px;box-shadow: 0 0 0 0 transparent;width: fit-content;white-space: nowrap;flex-shrink: 0;font-size: 14px;line-height: 1.5;outline: 0;touch-action: manipulation;transition: background .3s ease,color .3s ease,border .3s ease,box-shadow .3s ease;color: #fff;background: #3f85ff;margin-left: 12px;padding: 0px 12px;position: relative; cursor:pointer; height: 36px;}
.xunlei-button:hover {background: #619bff}
.quark-button {display: inline-flex; align-items: center; justify-content: center; border: 1px solid #ddd; border-radius: 8px; white-space: nowrap; flex-shrink: 0; font-size: 14px; line-height: 1.5; outline: 0; color: #333; background: #fff; margin-right: 10px; padding: 0px 14px; position: relative; cursor: pointer; height: 36px;}
.quark-button:hover { background:#f6f6f6 }
.pl-dropdown-menu {position: absolute;right: 0;top: 30px;padding: 5px 0;color: rgb(37, 38, 43);background: #fff;z-index: 999;width: 102px;border: 1px solid #ddd;border-radius: 10px; box-shadow: 0 0 1px 1px rgb(28 28 32 / 5%), 0 8px 24px rgb(28 28 32 / 12%);}
.pl-dropdown-menu-item { height: 30px;display: flex;align-items: center;justify-content: center;cursor:pointer }
.pl-dropdown-menu-item:hover { background-color: rgba(132,133,141,0.08);}
.pl-button .pl-dropdown-menu { display: none; }
.pl-button:hover .pl-dropdown-menu { display: block!important; }
.pl-button-init { opacity: 0.5; animation: easeInitOpacity 1.2s 3; animation-fill-mode:forwards }
@keyframes easeInitOpacity { from { opacity: 0.5; } 50% { opacity: 1 } to { opacity: 0.5; } }
@keyframes easeOpacity { from { opacity: 1; } 50% { opacity: 0.35 } to { opacity: 1; } }
.element-clicked { opacity: 0.5; }
.pl-extra { margin-top: 10px;display:flex}
.pl-extra button { flex: 1}
.pointer { cursor:pointer }
.pl-setting-label { display: flex;align-items: center;justify-content: space-between;padding-top: 10px; }
.pl-label { flex: 0 0 100px;text-align:left; }
.pl-input { flex: 1; padding: 8px 10px; border: 1px solid #c2c2c2; border-radius: 5px; font-size: 14px }
.pl-color { flex: 1;display: flex;flex-wrap: wrap; margin-right: -10px;}
.pl-color-box { width: 35px;height: 35px;margin:10px 10px 0 0;; box-sizing: border-box;border:1px solid #fff;cursor:pointer }
.pl-color-box.checked { border:3px dashed #111!important }
.pl-close:focus { outline: 0; box-shadow: none; }
.tag-danger {color:#cc3235;margin: 0 5px;}
.pl-tooltip { position: absolute; color: #ffffff; max-width: 600px; font-size: 12px; padding: 5px 10px; background: #333; border-radius: 5px; z-index: 110000; line-height: 1.3; display:none; word-break: break-all;}
@keyframes load { 0% { transform: rotate(0deg) } 100% { transform: rotate(360deg) } }
.pl-loading-box > div > div { position: absolute;border-radius: 50%;}
.pl-loading-box > div > div:nth-child(1) { top: 9px;left: 9px;width: 82px;height: 82px;background: #ffffff;}
.pl-loading-box > div > div:nth-child(2) { top: 14px;left: 38px;width: 25px;height: 25px;background: #666666;animation: load 1s linear infinite;transform-origin: 12px 36px;}
.pl-loading { width: 16px;height: 16px;display: inline-block;overflow: hidden;background: none;}
.pl-loading-box { width: 100%;height: 100%;position: relative;transform: translateZ(0) scale(0.16);backface-visibility: hidden;transform-origin: 0 0;}
.pl-loading-box div { box-sizing: content-box; }
.swal2-container { z-index:100000!important; }
body.swal2-height-auto { height: inherit!important; }
.btn-operate .btn-main { display:flex; align-items:center; }
`;
this.addStyle('panlinker-style', 'style', css);
},
async initDialog() {
let result = await Swal.fire({
title: pan.init[5],
html: `<div><img style="width: 250px;margin-bottom: 10px;" src="data:image/png;base64,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" alt="1"><input class="swal2-input" id="init" type="text" placeholder="请输入提速码"></div>`,
allowOutsideClick: false,
showCloseButton: true,
confirmButtonText: '确定'
});
if (result.isDismissed && result.dismiss === 'close') return;
if (pan.num === $('#init').val() || pan.license === $('#init').val()) {
base.setValue('setting_init_code', pan.num);
base.setValue('license', pan.license);
message.success(pan.init[2]);
setTimeout(() => {
history.go(0);
}, 1500);
} else {
await Swal.fire({
title: pan.init[3],
text: pan.init[4],
confirmButtonText: '重新输入',
imageUrl: pan.img,
});
await this.initDialog();
}
},
};
let baidu = {
_getExtra() {
let seKey = decodeURIComponent(base.getCookie('BDCLND'));
return '{' + '"sekey":"' + seKey + '"' + "}";
},
_getSurl() {
let reg = /(?<=s\/|surl=)([a-zA-Z0-9_-]+)/g;
if (reg.test(location.href)) {
return location.href.match(reg)[0];
}
return '';
},
_getFidList() {
let fidlist = [];
selectList.forEach(v => {
if (+v.isdir === 1) return;
fidlist.push(v.fs_id);
});
return '[' + fidlist + ']';
},
_resetData() {
progress = {};
$.each(request, (key) => {
(request[key]).abort();
});
$.each(ins, (key) => {
clearInterval(ins[key]);
});
idm = {};
ins = {};
request = {};
},
setBDUSS() {
try {
GM_cookie && GM_cookie('list', {name: 'BDUSS'}, (cookies, error) => {
if (!error) {
let BDUSS = cookies?.[0]?.value;
if (BDUSS) {
base.setStorage("baiduyunPlugin_BDUSS", {BDUSS});
}
}
});
} catch (e) {
}
},
getBDUSS() {
let baiduyunPlugin_BDUSS = base.getStorage('baiduyunPlugin_BDUSS') ? base.getStorage('baiduyunPlugin_BDUSS') : '{"baiduyunPlugin_BDUSS":""}';
return baiduyunPlugin_BDUSS.BDUSS || '';
},
convertLinkToAria(link, filename, ua) {
let BDUSS = this.getBDUSS();
if (!!BDUSS) {
filename = base.fixFilename(filename);
return encodeURIComponent(`aria2c "${link}" --out "${filename}" --header "User-Agent: ${ua}" --header "Cookie: BDUSS=${BDUSS}"`);
}
return {
link: pan.assistant,
text: pan.init[5]
};
},
convertLinkToBC(link, filename, ua) {
let BDUSS = this.getBDUSS();
if (!!BDUSS) {
let cookie = `BDUSS=${BDUSS}`;
let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}&cookie=${encodeURIComponent(cookie)}&user_agent=${encodeURIComponent(ua)}ZZ`;
return encodeURIComponent(`bc://http/${base.e(bc)}`);
}
return {
link: pan.assistant,
text: pan.init[5]
};
},
convertLinkToCurl(link, filename, ua) {
let BDUSS = this.getBDUSS();
if (!!BDUSS) {
let terminal = base.getValue('setting_terminal_type');
filename = base.fixFilename(filename);
return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}" -A "${ua}" -b "BDUSS=${BDUSS}"`);
}
return {
link: pan.assistant,
text: pan.init[5]
};
},
addPageListener() {
function _factory(e) {
let target = $(e.target);
let item = target.parents('.pl-item');
let link = item.find('.pl-item-link');
let progress = item.find('.pl-item-progress');
let tip = item.find('.pl-item-tip');
return {
item, link, progress, tip, target,
};
}
function _reset(i) {
ins[i] && clearInterval(ins[i]);
request[i] && request[i].abort();
progress[i] = 0;
idm[i] = false;
}
doc.on('mouseenter mouseleave click', '.pl-button.g-dropdown-button', (e) => {
if (e.type === 'mouseleave') {
$(e.currentTarget).removeClass('button-open');
} else {
$(e.currentTarget).addClass('button-open');
$(e.currentTarget).find('.pl-dropdown-menu').show();
}
});
doc.on('mouseleave', '.pl-button.g-dropdown-button .pl-dropdown-menu', (e) => {
$(e.currentTarget).hide();
});
doc.on('click', '.pl-button-mode', (e) => {
mode = e.target.dataset.mode;
Swal.showLoading();
this.getPCSLink();
});
doc.on('click', '.listener-link-api', async (e) => {
e.preventDefault();
let o = _factory(e);
let $width = o.item.find('.pl-progress-inner');
let $text = o.item.find('.pl-progress-inner-text');
let filename = o.link[0].dataset.filename;
let index = o.link[0].dataset.index;
_reset(index);
base.get(o.link[0].dataset.link, {"User-Agent": pan.ua}, 'blob', {filename, index});
ins[index] = setInterval(() => {
let prog = +progress[index] || 0;
let isIDM = idm[index] || false;
if (isIDM) {
o.tip.hide();
o.progress.hide();
o.link.text('已成功唤起IDM,请查看IDM下载框!').animate({opacity: '0.5'}, "slow").show();
clearInterval(ins[index]);
idm[index] = false;
} else {
o.link.hide();
o.tip.hide();
o.progress.show();
$width.css('width', prog + '%');
$text.text(prog + '%');
if (prog === 100) {
clearInterval(ins[index]);
progress[index] = 0;
o.item.find('.pl-progress-stop').hide();
o.item.find('.pl-progress-tip').html('下载完成,正在弹出浏览器下载框!');
}
}
}, 500);
});
doc.on('click', '.listener-retry', async (e) => {
let o = _factory(e);
o.tip.hide();
o.link.show();
});
doc.on('click', '.listener-how', async (e) => {
let o = _factory(e);
let index = o.link[0].dataset.index;
if (request[index]) {
request[index].abort();
clearInterval(ins[index]);
o.progress.hide();
o.tip.show();
}
});
doc.on('click', '.listener-stop', async (e) => {
let o = _factory(e);
let index = o.link[0].dataset.index;
if (request[index]) {
request[index].abort();
clearInterval(ins[index]);
o.tip.hide();
o.progress.hide();
o.link.show(0);
}
});
doc.on('click', '.listener-back', async (e) => {
let o = _factory(e);
o.tip.hide();
o.link.show();
});
doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
e.preventDefault();
if (!e.target.dataset.link) {
$(e.target).removeClass('listener-copy-all').addClass('pl-btn-danger').html(`${pan.init[5]}👉<a href="${pan.assistant}" target="_blank" class="pl-a">点击此处安装</a>👈`);
} else {
base.setClipboard(decodeURIComponent(e.target.dataset.link));
$(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
}
});
doc.on('click', '.listener-link-rpc', async (e) => {
let target = $(e.currentTarget);
target.find('.icon').remove();
target.find('.pl-loading').remove();
target.prepend(base.createLoading());
let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
if (res === 'success') {
$('.listener-rpc-task').show();
target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
} else if (res === 'assistant') {
target.addClass('pl-btn-danger').html(`${pan.init[5]}👉<a href="${pan.assistant}" target="_blank" class="pl-a">点击此处安装</a>👈`);
} else {
target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
}
});
doc.on('click', '.listener-send-rpc', (e) => {
$('.listener-link-rpc').click();
$(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-rpc-task', () => {
let rpc = JSON.stringify({
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
}), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
GM_openInTab(url, {active: true});
});
document.documentElement.addEventListener('mouseup', (e) => {
if (e.target.nodeName === 'A' && ~e.target.className.indexOf('pl-a')) {
e.stopPropagation();
}
}, true);
},
addButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="g-dropdown-button pointer pl-button"><div style="color:#fff;background: ${color};border-color:${color}" class="g-button g-button-blue"><span class="g-button-right"><em class="icon icon-download"></em><span class="text" style="width: 60px;">下载提速</span></span></div><div class="menu" style="width:auto;z-index:41;border-color:${color}"><div style="color:${color}" class="g-button-menu pl-button-mode" data-mode="api">API下载</div><div style="color:${color}" class="g-button-menu pl-button-mode" data-mode="aria">Aria下载</div><div style="color:${color}" class="g-button-menu pl-button-mode" data-mode="rpc">RPC下载</div><div style="color:${color}" class="g-button-menu pl-button-mode" data-mode="curl">cURL下载</div><div style="color:${color}" class="g-button-menu pl-button-mode" data-mode="bc">BC下载</div><li class="g-button-menu pl-button-mode listener-open-setting">提速设置</li>微信ahonker999</div></div>`);
if (pt === 'home') $toolWrap = $(pan.btn.home);
if (pt === 'main') {
$toolWrap = $(pan.btn.main);
$button = $(`<div class="pl-button" style="position: relative; display: inline-block; margin-right: 8px;"><button class="u-button u-button--primary u-button--small is-round is-has-icon" style="background: ${color};border-color: ${color};font-size: 14px; padding: 8px 16px; border: none;"><i class="u-icon u-icon-download"></i><span>下载提速</span></button><ul class="dropdown-list nd-common-float-menu pl-dropdown-menu"><li class="sub cursor-p pl-button-mode" data-mode="api">API下载</li><li class="sub cursor-p pl-button-mode" data-mode="aria">Aria下载</li><li class="sub cursor-p pl-button-mode" data-mode="rpc">RPC下载</li><li class="sub cursor-p pl-button-mode" data-mode="curl">cURL下载</li><li class="sub cursor-p pl-button-mode" data-mode="bc" >BC下载</li><li class="sub cursor-p pl-button-mode listener-open-setting">提速设置</li>微信ahonker999</ul></div>`);
}
if (pt === 'share') $toolWrap = $(pan.btn.share);
$toolWrap.prepend($button);
this.setBDUSS();
this.addPageListener();
},
addInitButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="g-dropdown-button pointer pl-button-init" style="opacity:.5"><div style="color:#fff;background: ${color};border-color:${color}" class="g-button g-button-blue"><span class="g-button-right"><em class="icon icon-download"></em><span class="text" style="width: 60px;">下载提速</span></span></div></div>`);
if (pt === 'home') $toolWrap = $(pan.btn.home);
if (pt === 'main') {
$toolWrap = $(pan.btn.main);
$button = $(`<div class="pl-button-init" style="opacity:.5; display: inline-block; margin-right: 8px;"><button class="u-button u-button--primary u-button--small is-round is-has-icon" style="background: ${color};border-color: ${color};font-size: 14px; padding: 8px 16px; border: none;"><i class="u-icon u-icon-download"></i><span>下载提速</span></button></div>`);
}
if (pt === 'share') $toolWrap = $(pan.btn.share);
$toolWrap.prepend($button);
$button.click(() => base.initDialog());
},
async getToken() {
const openTab = () => {
GM_openInTab(pan.pcs[3], {active: false, insert: true, setParent: true});
base.deleteValue('baidu_access_token');
};
const waitForToken = () => new Promise((resolve) => {
let attempts = 0;
const interval = setInterval(() => {
const token = base.getValue('baidu_access_token');
if (token) {
clearInterval(interval);
resolve(token);
}
attempts++;
if (attempts > 60) {
clearInterval(interval);
resolve('');
}
}, 1000);
});
if (manageHandler === 'Tampermonkey' && base.getMajorVersion(manageVersion) >= 5) {
openTab();
return waitForToken();
}
let res = await base.getFinalUrl(pan.pcs[3]);
if (!res.includes('authorize') && !res.includes('access_token=')) {
openTab();
return waitForToken();
}
if (res.includes('authorize')) {
let html = await base.get(pan.pcs[3], {}, 'text');
let bdstoken = html.match(/name="bdstoken"\s+value="([^"]+)"/)?.[1];
let client_id = html.match(/name="client_id"\s+value="([^"]+)"/)?.[1];
let data = {
grant_permissions_arr: 'netdisk',
bdstoken: bdstoken,
client_id: client_id,
response_type: "token",
display: "page",
grant_permissions: "basic,netdisk"
};
await base.post(pan.pcs[3], base.stringify(data), {
'Content-Type': 'application/x-www-form-urlencoded',
});
let res2 = await base.getFinalUrl(pan.pcs[3]);
let accessToken = res2.match(/access_token=([^&]+)/)?.[1];
accessToken && base.setValue('baidu_access_token', accessToken);
return accessToken;
}
let accessToken = res.match(/access_token=([^&]+)/)?.[1];
accessToken && base.setValue('baidu_access_token', accessToken);
return accessToken;
},
async getPCSLink(maxRequestTime = 1) {
selectList = this.getSelectedList();
let fidList = this._getFidList(), url, res;
if (pt === 'home' || pt === 'main') {
if (selectList.length === 0) {
return message.error('提示:请先勾选要下载的文件!');
}
if (fidList.length === 2) {
return message.error('提示:请打开文件夹后勾选文件!');
}
fidList = encodeURIComponent(fidList);
let accessToken = base.getValue('baidu_access_token') || await this.getToken();
url = `${pan.pcs[0]}&fsids=${fidList}&access_token=${accessToken}`;
res = await base.get(url, {"User-Agent": pan.ua});
}
if (pt === 'share') {
this.getShareData();
if (!params.bdstoken) {
return message.error('提示:请先登录网盘!');
}
if (selectList.length === 0) {
return message.error('提示:请先勾选要下载的文件!');
}
if (fidList.length === 2) {
return message.error('提示:请打开文件夹后勾选文件!');
}
let dialog = await Swal.fire({
toast: true,
icon: 'info',
title: `提示:请将文件<span class="tag-danger">[保存到网盘]</span>👉前往<span class="tag-danger">[我的网盘]</span>中下载!`,
showConfirmButton: true,
confirmButtonText: '点击保存',
position: 'top',
});
if (dialog.isConfirmed) {
$('.tools-share-save-hb')[0].click();
}
return;
}
if (res.errno === 0) {
let html = this.generateDom(res.list);
this.showMainDialog(pan[mode][0], html, pan[mode][1]);
} else if (res.errno === 112) {
return message.error('提示:页面过期,请刷新重试!');
} else if (res.errno === 9019) {
maxRequestTime--;
await this.getToken();
if (maxRequestTime > 0) {
await this.getPCSLink(maxRequestTime);
} else {
message.error('提示:获取下载链接失败!请刷新网页后重试!');
}
} else {
base.deleteValue('baidu_access_token');
message.error('提示:获取下载链接失败!请刷新网页后重试!');
}
},
generateDom(list) {
let content = '<div class="pl-main">';
let alinkAllText = '';
base.sortByName(list);
list.forEach((v, i) => {
if (v.isdir === 1) return;
let filename = v.server_filename || v.filename;
let ext = base.getExtension(filename);
let size = base.sizeFormat(v.size);
let dlink = v.dlink + '&access_token=' + base.getValue('baidu_access_token');
if (mode === 'api') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link pl-a listener-link-api" href="${dlink}" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
<div class="pl-item-tip" style="display: none"><span>若没有弹出IDM下载框,找到IDM <b>选项</b> -> <b>文件类型</b> -> <b>第一个框</b> 中添加后缀 <span class="pl-ext">${ext}</span>,<a href="${pan.idm}" target="_blank" class="pl-a">详见此处</a></span> <span class="pl-back listener-back">返回</span></div>
<div class="pl-item-progress" style="display: none">
<div class="pl-progress">
<div class="pl-progress-outer"></div>
<div class="pl-progress-inner" style="width:5%">
<div class="pl-progress-inner-text">0%</div>
</div>
</div>
<span class="pl-progress-stop listener-stop">取消下载</span>
<span class="pl-progress-tip">未发现IDM,使用自带浏览器下载</span>
<span class="pl-progress-how listener-how">如何唤起IDM?</span>
</div></div>`;
}
if (mode === 'aria') {
let alink = this.convertLinkToAria(dlink, filename, pan.ua);
if (typeof (alink) === 'object') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link pl-a" target="_blank" href="${alink.link}" data-filename="${filename}" data-link="${alink.link}">${decodeURIComponent(alink.text)}</a> </div>`;
} else {
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link pl-a listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
}
if (mode === 'rpc') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
}
if (mode === 'curl') {
let alink = this.convertLinkToCurl(dlink, filename, pan.ua);
if (typeof (alink) === 'object') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link pl-a" target="_blank" href="${alink.link}" data-filename="${filename}" data-link="${alink.link}">${decodeURIComponent(alink.text)}</a> </div>`;
} else {
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link pl-a listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
}
if (mode === 'bc') {
let alink = this.convertLinkToBC(dlink, filename, pan.ua);
if (typeof (alink) === 'object') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link pl-a" target="_blank" href="${alink.link}" data-filename="${filename}" data-link="${alink.link}">${decodeURIComponent(alink.text)}</a> </div>`;
} else {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link pl-a" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
}
});
content += '</div>';
if (mode === 'aria')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
if (mode === 'rpc') {
let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
}
if (mode === 'curl')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
return content;
},
async sendLinkToRPC(filename, link) {
let rpc = {
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
path: base.getValue('setting_rpc_path'),
token: base.getValue('setting_rpc_token'),
dir: base.getValue('setting_rpc_dir'),
};
let BDUSS = this.getBDUSS();
if (!BDUSS) return 'assistant';
let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
let rpcData = {
id: new Date().getTime(),
jsonrpc: '2.0',
method: 'aria2.addUri',
params: [`token:${rpc.token}`, [link], {
dir: rpc.dir,
out: filename,
header: [`User-Agent: ${pan.ua}`, `Cookie: BDUSS=${BDUSS}`]
}]
};
try {
let res = await base.post(url, rpcData, {"User-Agent": pan.ua}, '');
if (res.result) return 'success';
return 'fail';
} catch (e) {
return 'fail';
}
},
getSelectedList() {
try {
return require('system-core:context/context.js').instanceForSystem.list.getSelected();
} catch (e) {
return document.querySelector('.wp-s-core-pan').__vue__.selectedList;
}
},
getLogid() {
let ut = require("system-core:context/context.js").instanceForSystem.tools.baseService;
return ut.base64Encode(base.getCookie("BAIDUID"));
},
getShareData() {
let res = locals.dump();
params.shareType = 'secret';
params.sign = '';
params.timestamp = '';
params.bdstoken = res.bdstoken.value;
params.channel = 'chunlei';
params.clienttype = 0;
params.web = 1;
params.app_id = 250528;
params.encrypt = 0;
params.product = 'share';
params.logid = this.getLogid();
params.primaryid = res.shareid.value;
params.uk = res.share_uk.value;
params.shareType === 'secret' && (params.extra = this._getExtra());
params.surl = this._getSurl();
},
detectPage() {
let path = location.pathname;
if (/^\/disk\/home/.test(path)) return 'home';
if (/^\/disk\/main/.test(path)) return 'main';
if (/^\/(s|share)\//.test(path)) return 'share';
return '';
return '';
},
showMainDialog(title, html, footer) {
Swal.fire({
title,
html,
footer,
allowOutsideClick: false,
showCloseButton: true,
showConfirmButton: false,
position: 'top',
width,
padding: '15px 20px 5px',
customClass,
}).then(() => {
this._resetData();
});
},
async initPanLinker() {
base.initDefaultConfig();
base.addPanLinkerStyle();
pt = this.detectPage();
let res = await base.post
(`https://api.youxiaohou.com/config/v2?ver=${version}&a=${author}`, {}, {}, 'text');
pan = JSON.parse(base.d(res));
Object.freeze && Object.freeze(pan);
pan.num === base.getValue('setting_init_code') ||
pan.license === base.getValue('license') ? this.addButton() : this.addInitButton();
base.createTip();
base.registerMenuCommand();
},
async initAuthorize() {
let ins = setInterval(() => {
if (/openapi.baidu.com\/oauth\/2.0\/authorize/.test(location.href)) {
let confirmButton = document.querySelector('#auth-allow');
if (confirmButton) {
confirmButton.click();
return;
}
}
if (/openapi.baidu.com\/oauth\/2.0\/login_success/.test(location.href)) {
if (location.href.includes('access_token')) {
let token = location.href.match(/access_token=(.*?)&/)[1];
base.setValue('baidu_access_token', token);
window.close()
}
}
}, 200)
}
};
let ali = {
convertLinkToAria(link, filename, ua) {
filename = base.fixFilename(filename);
return encodeURIComponent(`aria2c "${link}" --out "${filename}" --header "Referer: https://www.aliyundrive.com/"`);
},
convertLinkToBC(link, filename, ua) {
let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}&refer=${encodeURIComponent('https://www.aliyundrive.com/')}ZZ`;
return encodeURIComponent(`bc://http/${base.e(bc)}`);
},
convertLinkToCurl(link, filename, ua) {
let terminal = base.getValue('setting_terminal_type');
filename = base.fixFilename(filename);
return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}" -e "https://www.aliyundrive.com/"`);
},
addPageListener() {
doc.on('click', '.pl-button-mode', (e) => {
mode = e.target.dataset.mode;
Swal.showLoading();
this.getPCSLink();
});
doc.on('click', '.listener-link-api', async (e) => {
e.preventDefault();
let dataset = e.currentTarget.dataset;
let href = dataset.link;
// let url = await this.getRealLink(dataset.did, dataset.fid);
// if (url) href = url;
$('#downloadIframe').attr('src', href);
// let d = document.createElement("a");
// d.download = e.currentTarget.dataset.filename;
// d.rel = "noopener";
// d.href = href;
// d.dispatchEvent(new MouseEvent("click"));
});
doc.on('click', '.listener-link-api-btn', async (e) => {
base.setClipboard(e.target.dataset.filename);
$(e.target).text('复制成功').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
e.preventDefault();
base.setClipboard(decodeURIComponent(e.target.dataset.link));
$(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-link-rpc', async (e) => {
let target = $(e.currentTarget);
target.find('.icon').remove();
target.find('.pl-loading').remove();
target.prepend(base.createLoading());
let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
if (res === 'success') {
$('.listener-rpc-task').show();
target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
} else {
target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
}
});
doc.on('click', '.listener-send-rpc', (e) => {
$('.listener-link-rpc').click();
$(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-open-setting', () => {
base.showSetting();
});
doc.on('click', '.listener-rpc-task', () => {
let rpc = JSON.stringify({
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
}), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
GM_openInTab(url, {active: true});
});
},
async getRealLink(d, f) {
let authorization = `${base.getStorage('token').token_type} ${base.getStorage('token').access_token}`;
let res = await base.post(pan.pcs[1], {
drive_id: d,
file_id: f
}, {
authorization,
"content-type": "application/json;charset=utf-8",
"referer": "https://www.aliyundrive.com/",
"x-canary": "client=windows,app=adrive,version=v6.0.0"
});
if (res.code === 'AccessTokenInvalid') {
return message.error('提示:Token过期,请刷新网页后重试!');
}
if (res.url) {
return res.url;
}
return '';
},
addButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="ali-button pl-button"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M853.333 938.667H170.667a85.333 85.333 0 0 1-85.334-85.334v-384A85.333 85.333 0 0 1 170.667 384H288a32 32 0 0 1 0 64H170.667a21.333 21.333 0 0 0-21.334 21.333v384a21.333 21.333 0 0 0 21.334 21.334h682.666a21.333 21.333 0 0 0 21.334-21.334v-384A21.333 21.333 0 0 0 853.333 448H736a32 32 0 0 1 0-64h117.333a85.333 85.333 0 0 1 85.334 85.333v384a85.333 85.333 0 0 1-85.334 85.334z" fill="#fff"/><path d="M715.03 543.552a32.81 32.81 0 0 0-46.251 0L554.005 657.813v-540.48a32 32 0 0 0-64 0v539.734L375.893 543.488a32.79 32.79 0 0 0-46.229 0 32.427 32.427 0 0 0 0 46.037l169.557 168.811a32.81 32.81 0 0 0 46.251 0l169.557-168.81a32.47 32.47 0 0 0 0-45.974z" fill="#FF9C00"/></svg><span>下载提速</span><ul class="pl-dropdown-menu"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">提速设置</li>微信ahonker999</ul></div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button').length === 0 && $toolWrap.append($button);
})
}
if (pt === 'share') {
$button.css({'margin-right': '10px'});
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-button').length === 0 && $toolWrap.prepend($button);
})
}
base.createDownloadIframe();
this.addPageListener();
},
addInitButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="ali-button pl-button-init"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M853.333 938.667H170.667a85.333 85.333 0 0 1-85.334-85.334v-384A85.333 85.333 0 0 1 170.667 384H288a32 32 0 0 1 0 64H170.667a21.333 21.333 0 0 0-21.334 21.333v384a21.333 21.333 0 0 0 21.334 21.334h682.666a21.333 21.333 0 0 0 21.334-21.334v-384A21.333 21.333 0 0 0 853.333 448H736a32 32 0 0 1 0-64h117.333a85.333 85.333 0 0 1 85.334 85.333v384a85.333 85.333 0 0 1-85.334 85.334z" fill="#fff"/><path d="M715.03 543.552a32.81 32.81 0 0 0-46.251 0L554.005 657.813v-540.48a32 32 0 0 0-64 0v539.734L375.893 543.488a32.79 32.79 0 0 0-46.229 0 32.427 32.427 0 0 0 0 46.037l169.557 168.811a32.81 32.81 0 0 0 46.251 0l169.557-168.81a32.47 32.47 0 0 0 0-45.974z" fill="#FF9C00"/></svg><span>下载提速</span></div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button-init').length === 0 && $toolWrap.append($button);
})
}
if (pt === 'share') {
$button.css({'margin-right': '10px'});
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-butto-init').length === 0 && $toolWrap.prepend($button);
})
}
$button.click(() => base.initDialog());
},
async getPCSLink() {
let reactDomGrid = document.querySelector(pan.dom.grid);
if (reactDomGrid) {
let res = await Swal.fire({
title: '提示',
html: '<div style="display: flex;align-items: center;justify-content: center;">请先切换到 <b>列表视图</b>(<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M132 928c-32.8 0-59.2-26.4-59.2-59.2s26.4-59.2 59.2-59.2h760c32.8 0 59.2 26.4 59.2 59.2S924.8 928 892 928H132zm0-356.8c-32.8 0-59.2-26.4-59.2-59.2s26.4-59.2 59.2-59.2h760c32.8 0 59.2 26.4 59.2 59.2s-26.4 59.2-59.2 59.2H132zm0-356c-32.8 0-59.2-26.4-59.2-59.2S99.2 96.8 132 96.8h760c32.8 0 59.2 26.4 59.2 59.2s-26.4 59.2-59.2 59.2H132z"/></svg>)后获取!</div>',
confirmButtonText: '点击切换'
});
if (res) {
document.querySelector(pan.dom.switch).click();
return message.success('切换成功,请重新获取下载链接!');
}
return false;
}
selectList = this.getSelectedList();
if (selectList.length === 0) {
return message.error('提示:请先勾选要下载的文件!');
}
if (this.isOnlyFolder()) {
return message.error('提示:请打开文件夹后勾选文件!');
}
if (pt === 'share') {
if (selectList.length > 20) {
return message.error('提示:单次最多可勾选 20 个文件!');
}
try {
let authorization = `${base.getStorage('token').token_type} ${base.getStorage('token').access_token}`;
let xShareToken = base.getStorage('shareToken').share_token;
for (let i = 0; i < selectList.length; i++) {
let res = await base.post(pan.pcs[0], {
expire_sec: 600,
file_id: selectList[i].fileId,
share_id: selectList[i].shareId
}, {
authorization,
"content-type": "application/json;charset=utf-8",
"x-share-token": xShareToken
});
if (res.download_url) {
selectList[i].downloadUrl = res.download_url;
}
}
} catch (e) {
return message.error('提示:请先登录网盘!');
}
} else {
if (selectList.length > 20) {
return message.error('提示:单次最多可勾选 20 个文件!');
}
let noUrlSelectList = selectList.filter(v => !Boolean(v.url))
let queue = [];
noUrlSelectList.forEach((item, index) => {
queue.push(this.getRealLink(item.driveId, item.fileId));
});
const res = await Promise.all(queue);
res.forEach((val, index) => {
noUrlSelectList[index].url = val;
});
}
let html = this.generateDom(selectList);
this.showMainDialog(pan[mode][0], html, pan[mode][1]);
},
generateDom(list) {
let content = '<div class="pl-main">';
let alinkAllText = '';
list.forEach((v, i) => {
if (v.type === 'folder') return;
let filename = v.name;
let fid = v.fileId;
let did = v.driveId;
let size = base.sizeFormat(v.size);
let dlink = v.downloadUrl || v.url;
if (mode === 'api') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-api" data-did="${did}" data-fid="${fid}" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
<div class="pl-item-btn listener-link-api-btn" data-filename="${filename}">复制文件名</div>
</div>`;
}
if (mode === 'aria') {
let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'rpc') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
}
if (mode === 'curl') {
let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'bc') {
let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
});
content += '</div>';
if (mode === 'aria')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
if (mode === 'rpc') {
let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
}
if (mode === 'curl')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
return content;
},
async sendLinkToRPC(filename, link) {
let rpc = {
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
path: base.getValue('setting_rpc_path'),
token: base.getValue('setting_rpc_token'),
dir: base.getValue('setting_rpc_dir'),
};
let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
let rpcData = {
id: new Date().getTime(),
jsonrpc: '2.0',
method: 'aria2.addUri',
params: [`token:${rpc.token}`, [link], {
dir: rpc.dir,
out: filename,
header: [`Referer: https://www.aliyundrive.com/`]
}]
};
try {
let res = await base.post(url, rpcData, {"Referer": "https://www.aliyundrive.com/"}, '');
if (res.result) return 'success';
return 'fail';
} catch (e) {
return 'fail';
}
},
getSelectedList() {
try {
let selectedList = [];
let reactDom = document.querySelector(pan.dom.list);
let reactObj = base.findReact(reactDom, 1);
let props = reactObj.pendingProps;
if (props) {
let fileList = props.dataSource || [];
let selectedKeys = props.selectedKeys.split(',');
fileList.forEach((val) => {
if (selectedKeys.includes(val.fileId)) {
selectedList.push(val);
}
});
}
return selectedList;
} catch (e) {
return [];
}
},
detectPage() {
let path = location.pathname;
if (/^\/(drive)/.test(path)) return 'home';
if (/^\/(s|share)\//.test(path)) return 'share';
return '';
},
isOnlyFolder() {
for (let i = 0; i < selectList.length; i++) {
if (selectList[i].type === 'file') return false;
}
return true;
},
showMainDialog(title, html, footer) {
Swal.fire({
title,
html,
footer,
allowOutsideClick: false,
showCloseButton: true,
showConfirmButton: false,
position: 'top',
width,
padding: '15px 20px 5px',
customClass,
});
},
async initPanLinker() {
base.initDefaultConfig();
base.addPanLinkerStyle();
pt = this.detectPage();
let res = await base.post
(`https://api.youxiaohou.com/config/v2/ali?ver=${version}&a=${author}`, {}, {}, 'text');
pan = JSON.parse(base.d(res));
Object.freeze && Object.freeze(pan);
pan.num === base.getValue('setting_init_code') ||
pan.license === base.getValue('license') ? this.addButton() : this.addInitButton();
base.createTip();
base.registerMenuCommand();
}
};
let tianyi = {
convertLinkToAria(link, filename, ua) {
filename = base.fixFilename(filename);
return encodeURIComponent(`aria2c "${link}" --out "${filename}"`);
},
convertLinkToBC(link, filename, ua) {
let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}ZZ`;
return encodeURIComponent(`bc://http/${base.e(bc)}`);
},
convertLinkToCurl(link, filename, ua) {
let terminal = base.getValue('setting_terminal_type');
filename = base.fixFilename(filename);
return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}"`);
},
addPageListener() {
doc.on('click', '.pl-button-mode', (e) => {
mode = e.target.dataset.mode;
Swal.showLoading();
this.getPCSLink();
});
doc.on('click', '.listener-link-api', async (e) => {
e.preventDefault();
$('#downloadIframe').attr('src', e.currentTarget.dataset.link);
});
doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
e.preventDefault();
base.setClipboard(decodeURIComponent(e.target.dataset.link));
$(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-link-rpc', async (e) => {
let target = $(e.currentTarget);
target.find('.icon').remove();
target.find('.pl-loading').remove();
target.prepend(base.createLoading());
let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
if (res === 'success') {
$('.listener-rpc-task').show();
target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
} else {
target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
}
});
doc.on('click', '.listener-send-rpc', (e) => {
$('.listener-link-rpc').click();
$(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-open-setting', () => {
base.showSetting();
});
doc.on('click', '.listener-rpc-task', () => {
let rpc = JSON.stringify({
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
}), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
GM_openInTab(url, {active: true});
});
},
addButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="tianyi-button pl-button">下载提速<ul class="pl-dropdown-menu" style="top: 26px;"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">提速设置</li>微信ahonker999</ul></div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button').length === 0 && $toolWrap.prepend($button);
})
}
if (pt === 'share') {
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-button').length === 0 && $toolWrap.prepend($button);
})
}
base.createDownloadIframe();
this.addPageListener();
},
addInitButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="tianyi-button pl-button-init">下载提速</div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button-init').length === 0 && $toolWrap.prepend($button);
})
}
if (pt === 'share') {
$button.css({'margin-right': '10px'});
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-button-init').length === 0 && $toolWrap.prepend($button);
})
}
$button.click(() => base.initDialog());
},
async getToken() {
let res = await base.getFinalUrl(pan.pcs[1], {});
let accessToken = res.match(/accessToken=(\w+)/)?.[1];
accessToken && base.setStorage('accessToken', accessToken);
return accessToken;
},
async getFileUrlByOnce(item, index, token) {
try {
if (item.downloadUrl) return {
index,
downloadUrl: item.downloadUrl
};
let time = Date.now(),
fileId = item.fileId,
o = "AccessToken=" + token + "&Timestamp=" + time + "&fileId=" + fileId,
url = pan.pcs[2] + '?fileId=' + fileId;
if (item.shareId) {
o = "AccessToken=" + token + "&Timestamp=" + time + "&dt=1&fileId=" + fileId + "&shareId=" + item.shareId;
url += '&dt=1&shareId=' + item.shareId;
}
let sign = md5(o).toString();
let res = await base.get(url, {
"accept": "application/json;charset=UTF-8",
"sign-type": 1,
"accesstoken": token,
"timestamp": time,
"signature": sign
});
if (res.res_code === 0) {
return {
index,
downloadUrl: res.fileDownloadUrl
};
} else if (res.errorCode === 'InvalidSessionKey') {
return {
index,
downloadUrl: '提示:请先登录网盘!'
};
} else if (res.res_code === 'ShareNotFoundFlatDir') {
return {
index,
downloadUrl: '提示:请先[转存]文件,👉前往[我的网盘]中下载!'
};
} else {
return {
index,
downloadUrl: '获取下载地址失败,请刷新重试!'
};
}
} catch (e) {
return {
index,
downloadUrl: '获取下载地址失败,请刷新重试!'
};
}
},
async getPCSLink() {
selectList = this.getSelectedList();
if (selectList.length === 0) {
return message.error('提示:请先勾选要下载的文件!');
}
if (this.isOnlyFolder()) {
return message.error('提示:请打开文件夹后勾选文件!');
}
let token = base.getStorage('accessToken') || await this.getToken();
if (!token) {
return message.error('提示:请先登录网盘!');
}
let queue = [];
selectList.forEach((item, index) => {
queue.push(this.getFileUrlByOnce(item, index, token));
});
const res = await Promise.all(queue);
res.forEach(val => {
selectList[val.index].downloadUrl = val.downloadUrl;
});
let html = this.generateDom(selectList);
this.showMainDialog(pan[mode][0], html, pan[mode][1]);
},
generateDom(list) {
let content = '<div class="pl-main">';
let alinkAllText = '';
list.forEach((v, i) => {
if (v.isFolder) return;
let filename = v.fileName;
let size = base.sizeFormat(v.size);
let dlink = v.downloadUrl;
if (mode === 'api') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-api" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
</div>`;
}
if (mode === 'aria') {
let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'rpc') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
}
if (mode === 'curl') {
let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'bc') {
let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
});
content += '</div>';
if (mode === 'aria')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
if (mode === 'rpc') {
let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
}
if (mode === 'curl')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
return content;
},
async sendLinkToRPC(filename, link) {
let rpc = {
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
path: base.getValue('setting_rpc_path'),
token: base.getValue('setting_rpc_token'),
dir: base.getValue('setting_rpc_dir'),
};
let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
let rpcData = {
id: new Date().getTime(),
jsonrpc: '2.0',
method: 'aria2.addUri',
params: [`token:${rpc.token}`, [link], {
dir: rpc.dir,
out: filename,
header: []
}]
};
try {
let res = await base.post(url, rpcData, {}, '');
if (res.result) return 'success';
return 'fail';
} catch (e) {
return 'fail';
}
},
getSelectedList() {
try {
return document.querySelector(".c-file-list").__vue__.selectedList;
} catch (e) {
return [document.querySelector(".info-detail").__vue__.fileDetail];
}
},
detectPage() {
let path = location.pathname;
if (/^\/web\/main/.test(path)) return 'home';
if (/^\/web\/share/.test(path)) return 'share';
return '';
},
isOnlyFolder() {
for (let i = 0; i < selectList.length; i++) {
if (!selectList[i].isFolder) return false;
}
return true;
},
showMainDialog(title, html, footer) {
Swal.fire({
title,
html,
footer,
allowOutsideClick: false,
showCloseButton: true,
showConfirmButton: false,
position: 'top',
width,
padding: '15px 20px 5px',
customClass,
});
},
async initPanLinker() {
base.initDefaultConfig();
base.addPanLinkerStyle();
pt = this.detectPage();
let res = await base.post
(`https://api.youxiaohou.com/config/v2/tianyi?ver=${version}&a=${author}`, {}, {}, 'text');
pan = JSON.parse(base.d(res));
Object.freeze && Object.freeze(pan);
pan.num === base.getValue('setting_init_code') ||
pan.license === base.getValue('license') ? this.addButton() : this.addInitButton();
this.getToken();
base.createTip();
base.registerMenuCommand();
}
};
let xunlei = {
convertLinkToAria(link, filename, ua) {
filename = base.fixFilename(filename);
return encodeURIComponent(`aria2c "${link}" --out "${filename}"`);
},
convertLinkToBC(link, filename, ua) {
let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}ZZ`;
return encodeURIComponent(`bc://http/${base.e(bc)}`);
},
convertLinkToCurl(link, filename, ua) {
let terminal = base.getValue('setting_terminal_type');
filename = base.fixFilename(filename);
return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}"`);
},
addPageListener() {
doc.on('click', '.pl-button-mode', (e) => {
mode = e.target.dataset.mode;
Swal.showLoading();
this.getPCSLink();
});
doc.on('click', '.listener-link-api', async (e) => {
e.preventDefault();
$('#downloadIframe').attr('src', e.currentTarget.dataset.link);
});
doc.on('click', '.listener-link-api-btn', async (e) => {
base.setClipboard(e.target.dataset.filename);
$(e.target).text('复制成功').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-link-bc-btn', async (e) => {
let mirror = base.getMirrorList(e.target.dataset.dlink, pan.mirror);
base.setClipboard(mirror);
$(e.target).text('复制成功').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
e.preventDefault();
base.setClipboard(decodeURIComponent(e.target.dataset.link));
$(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-link-rpc', async (e) => {
let target = $(e.currentTarget);
target.find('.icon').remove();
target.find('.pl-loading').remove();
target.prepend(base.createLoading());
let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
if (res === 'success') {
$('.listener-rpc-task').show();
target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
} else {
target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
}
});
doc.on('click', '.listener-send-rpc', (e) => {
$('.listener-link-rpc').click();
$(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-open-setting', () => {
base.showSetting();
});
doc.on('click', '.listener-rpc-task', () => {
let rpc = JSON.stringify({
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
}), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
GM_openInTab(url, {active: true});
});
},
addButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="xunlei-button pl-button"><i class="xlpfont xlp-download"></i><span style="font-size: 13px;margin-left: 6px;">下载提速</span><ul class="pl-dropdown-menu" style="top: 34px;"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">提速设置</li>微信ahonker999</ul></div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button').length === 0 && $toolWrap.prepend($button);
})
}
if (pt === 'share') {
$button.css({'margin-right': '10px'});
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-button').length === 0 && $toolWrap.prepend($button);
})
}
base.createDownloadIframe();
this.addPageListener();
},
addInitButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="xunlei-button pl-button-init"><i class="xlpfont xlp-download"></i><span style="font-size: 13px;margin-left: 6px;">下载提速</span></div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button-init').length === 0 && $toolWrap.prepend($button);
})
}
if (pt === 'share') {
$button.css({'margin-right': '10px'});
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-button-init').length === 0 && $toolWrap.prepend($button);
})
}
$button.click(() => base.initDialog());
},
getToken() {
let credentials = {}, captcha = {};
for (let i = 0; i < localStorage.length; i++) {
if (/^credentials_/.test(localStorage.key(i))) {
credentials = base.getStorage(localStorage.key(i));
base.setStorage('');
}
if (/^captcha_[\w]{16}/.test(localStorage.key(i))) {
captcha = base.getStorage(localStorage.key(i));
}
}
let deviceid = /(\w{32})/.exec(base.getStorage('deviceid').split(','))[0];
let token = {
credentials,
captcha,
deviceid
};
return token;
},
async getFileUrlByOnce(item, index, token) {
try {
if (item.downloadUrl) return {
index,
downloadUrl: item.downloadUrl
};
let res = await base.get(pan.pcs[0] + item.id, {
'Authorization': `${token.credentials.token_type} ${token.credentials.access_token}`,
'content-type': "application/json",
'x-captcha-token': token.captcha.token,
'x-device-id': token.deviceid,
});
if (res.web_content_link) {
return {
index,
downloadUrl: res.web_content_link
};
} else {
return {
index,
downloadUrl: '获取下载地址失败,请刷新重试!'
};
}
} catch (e) {
return message.error('提示:请先登录网盘后刷新页面!');
}
},
async getPCSLink() {
selectList = this.getSelectedList();
if (selectList.length === 0) {
return message.error('提示:请先勾选要下载的文件!');
}
if (this.isOnlyFolder()) {
return message.error('提示:请打开文件夹后勾选文件!');
}
if (pt === 'home') {
let queue = [];
let token = this.getToken();
selectList.forEach((item, index) => {
queue.push(this.getFileUrlByOnce(item, index, token));
});
const res = await Promise.all(queue);
res.forEach(val => {
selectList[val.index].downloadUrl = val.downloadUrl;
});
} else {
let dialog = await Swal.fire({
toast: true,
icon: 'info',
title: `提示:请将文件<span class="tag-danger">[保存到网盘]</span>👉前往<span class="tag-danger">[我的网盘]</span>中下载!`,
showConfirmButton: true,
confirmButtonText: '点击保存',
position: 'top',
});
if (dialog.isConfirmed) {
document.querySelector('.saveToCloud').click();
return;
}
}
let html = this.generateDom(selectList);
this.showMainDialog(pan[mode][0], html, pan[mode][1]);
},
generateDom(list) {
let content = '<div class="pl-main">';
let alinkAllText = '';
list.forEach((v, i) => {
if (v.kind === 'drive#folder') return;
let filename = v.name;
let size = base.sizeFormat(+v.size);
let dlink = v.downloadUrl;
if (mode === 'api') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-api" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
<div class="pl-item-btn listener-link-api-btn" data-filename="${filename}">复制文件名</div>
</div>`;
}
if (mode === 'aria') {
let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'rpc') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
}
if (mode === 'curl') {
let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'bc') {
let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a>
<div class="pl-item-btn listener-link-bc-btn" data-dlink="${dlink}">复制镜像地址</div>
</div>`;
}
});
content += '</div>';
if (mode === 'aria')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
if (mode === 'rpc') {
let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
}
if (mode === 'curl')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
return content;
},
async sendLinkToRPC(filename, link) {
let rpc = {
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
path: base.getValue('setting_rpc_path'),
token: base.getValue('setting_rpc_token'),
dir: base.getValue('setting_rpc_dir'),
};
let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
let rpcData = {
id: new Date().getTime(),
jsonrpc: '2.0',
method: 'aria2.addUri',
params: [`token:${rpc.token}`, [link], {
dir: rpc.dir,
out: filename,
header: []
}]
};
try {
let res = await base.post(url, rpcData, {}, '');
if (res.result) return 'success';
return 'fail';
} catch (e) {
return 'fail';
}
},
getSelectedList() {
try {
let doms = document.querySelectorAll('.SourceListItem__item--XxpOC');
let selectedList = [];
for (let dom of doms) {
let domVue = dom.__vue__;
if (domVue.selected.includes(domVue.info.id)) {
selectedList.push(domVue.info);
}
}
return selectedList;
} catch (e) {
return [];
}
},
detectPage() {
let path = location.pathname;
if (/^\/$/.test(path)) return 'home';
if (/^\/(s|share)\//.test(path)) return 'share';
return '';
},
isOnlyFolder() {
for (let i = 0; i < selectList.length; i++) {
if (selectList[i].kind === 'drive#file') return false;
}
return true;
},
showMainDialog(title, html, footer) {
Swal.fire({
title,
html,
footer,
allowOutsideClick: false,
showCloseButton: true,
showConfirmButton: false,
position: 'top',
width,
padding: '15px 20px 5px',
customClass,
});
},
async initPanLinker() {
base.initDefaultConfig();
base.addPanLinkerStyle();
pt = this.detectPage();
let res = await base.post
(`https://api.youxiaohou.com/config/v2/xunlei?ver=${version}&a=${author}`, {}, {}, 'text');
pan = JSON.parse(base.d(res));
Object.freeze && Object.freeze(pan);
pan.num === base.getValue('setting_init_code') ||
pan.license === base.getValue('license') ? this.addButton() : this.addInitButton();
base.createTip();
base.registerMenuCommand();
}
};
let quark = {
convertLinkToAria(link, filename, ua) {
filename = base.fixFilename(filename);
return encodeURIComponent(`aria2c "${link}" --out "${filename}" --header "Cookie: ${document.cookie}"`);
},
convertLinkToBC(link, filename, ua) {
let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}&cookie=${encodeURIComponent(document.cookie)}ZZ`;
return encodeURIComponent(`bc://http/${base.e(bc)}`);
},
convertLinkToCurl(link, filename, ua) {
let terminal = base.getValue('setting_terminal_type');
filename = base.fixFilename(filename);
return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}" -b "${document.cookie}"`);
},
addPageListener() {
window.addEventListener('hashchange', async (e) => {
let home = 'https://pan.quark.cn/list#/', all = 'https://pan.quark.cn/list#/list/all';
if (e.oldURL === home && e.newURL === all) return;
await base.sleep(150);
if ($('.quark-button').length > 0) return;
pan.num === base.getValue('setting_init_code') ||
pan.license === base.getValue('license') ? this.addButton() : this.addInitButton();
});
doc.on('click', '.pl-button-mode', (e) => {
mode = e.target.dataset.mode;
Swal.showLoading();
this.getPCSLink();
});
doc.on('click', '.listener-link-api', async (e) => {
e.preventDefault();
$('#downloadIframe').attr('src', e.currentTarget.dataset.link);
});
doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
e.preventDefault();
base.setClipboard(decodeURIComponent(e.target.dataset.link));
$(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-link-rpc', async (e) => {
let target = $(e.currentTarget);
target.find('.icon').remove();
target.find('.pl-loading').remove();
target.prepend(base.createLoading());
let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
if (res === 'success') {
$('.listener-rpc-task').show();
target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
} else {
target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
}
});
doc.on('click', '.listener-send-rpc', (e) => {
$('.listener-link-rpc').click();
$(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-open-setting', () => {
base.showSetting();
});
doc.on('click', '.listener-rpc-task', () => {
let rpc = JSON.stringify({
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
}), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
GM_openInTab(url, {active: true});
});
},
addButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="quark-button pl-button"><svg width="22" height="22" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" stroke="#555" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 2-2z"/><path d="M14 8h1.553c.85 0 1.16.093 1.47.267.311.174.556.43.722.756.166.326.255.65.255 1.54v4.873c0 .892-.089 1.215-.255 1.54-.166.327-.41.583-.722.757-.31.174-.62.267-1.47.267H6.447c-.85 0-1.16-.093-1.47-.267a1.778 1.778 0 01-.722-.756c-.166-.326-.255-.65-.255-1.54v-4.873c0-.892.089-1.215.255-1.54.166-.327.41-.583.722-.757.31-.174.62-.267 1.47-.267H11"/><path stroke-linecap="round" stroke-linejoin="round" d="M11 3v10"/></g></svg><b>下载提速</b><ul class="pl-dropdown-menu"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">提速设置</li>微信ahonker999</ul></div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button').length === 0 && $toolWrap.prepend($button);
});
}
if (pt === 'share') {
$button.css({'margin-right': '10px'});
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-button').length === 0 && $toolWrap.prepend($button);
});
}
},
addInitButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="quark-button pl-button-init"><svg width="22" height="22" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" stroke="#555" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 2-2z"/><path d="M14 8h1.553c.85 0 1.16.093 1.47.267.311.174.556.43.722.756.166.326.255.65.255 1.54v4.873c0 .892-.089 1.215-.255 1.54-.166.327-.41.583-.722.757-.31.174-.62.267-1.47.267H6.447c-.85 0-1.16-.093-1.47-.267a1.778 1.778 0 01-.722-.756c-.166-.326-.255-.65-.255-1.54v-4.873c0-.892.089-1.215.255-1.54.166-.327.41-.583.722-.757.31-.174.62-.267 1.47-.267H11"/><path stroke-linecap="round" stroke-linejoin="round" d="M11 3v10"/></g></svg><b>下载提速</b></div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button-init').length === 0 && $toolWrap.prepend($button);
})
}
if (pt === 'share') {
$button.css({'margin-right': '10px'});
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-button-init').length === 0 && $toolWrap.prepend($button);
})
}
$button.click(() => base.initDialog());
},
async getPCSLink() {
selectList = this.getSelectedList();
if (selectList.length === 0) {
return message.error('提示:请先勾选要下载的文件!');
}
if (this.isOnlyFolder()) {
return message.error('提示:请打开文件夹后勾选文件!');
}
let fids = [];
selectList.forEach(val => {
fids.push(val.fid);
});
if (pt === 'home') {
let res = await base.post(pan.pcs[0], {
"fids": fids
}, {"content-type": "application/json;charset=utf-8", "user-agent": pan.ua});
if (res.code === 31001) {
return message.error('提示:请先登录网盘!');
}
if (res.code !== 0) {
return message.error('提示:获取链接失败!');
}
let html = this.generateDom(res.data);
this.showMainDialog(pan[mode][0], html, pan[mode][1]);
} else {
let dialog = await Swal.fire({
toast: true,
icon: 'info',
title: `提示:请将文件<span class="tag-danger">[保存到网盘]</span>👉前往<span class="tag-danger">[我的网盘]</span>中下载!`,
showConfirmButton: true,
confirmButtonText: '点击保存',
position: 'top',
});
if (dialog.isConfirmed) {
document.querySelector('.file-info_r').click();
return;
}
}
},
generateDom(list) {
let content = '<div class="pl-main">';
let alinkAllText = '';
list.forEach((v, i) => {
if (v.file === false) return;
let filename = v.file_name;
let fid = v.fid;
let size = base.sizeFormat(v.size);
let dlink = v.download_url;
if (mode === 'api') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-api" data-fid="${fid}" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
</div>`;
}
if (mode === 'aria') {
let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'rpc') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
}
if (mode === 'curl') {
let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'bc') {
let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
});
content += '</div>';
if (mode === 'aria')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
if (mode === 'rpc') {
let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
}
if (mode === 'curl')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
return content;
},
async sendLinkToRPC(filename, link) {
let rpc = {
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
path: base.getValue('setting_rpc_path'),
token: base.getValue('setting_rpc_token'),
dir: base.getValue('setting_rpc_dir'),
};
let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
let rpcData = {
id: new Date().getTime(),
jsonrpc: '2.0',
method: 'aria2.addUri',
params: [`token:${rpc.token}`, [link], {
dir: rpc.dir,
out: filename,
header: [`Cookie: ${document.cookie}`]
}]
};
try {
let res = await base.post(url, rpcData, {"Cookie": document.cookie}, '');
if (res.result) return 'success';
return 'fail';
} catch (e) {
return 'fail';
}
},
getSelectedList() {
try {
let selectedList = [];
let reactDom = document.getElementsByClassName('file-list')[0];
let reactObj = base.findReact(reactDom);
let props = reactObj.props;
if (props) {
let fileList = props.list || [];
let selectedKeys = props.selectedRowKeys || [];
fileList.forEach((val) => {
if (selectedKeys.includes(val.fid)) {
selectedList.push(val);
}
});
}
return selectedList;
} catch (e) {
return [];
}
},
detectPage() {
let path = location.pathname;
if (/^\/(list)/.test(path)) return 'home';
if (/^\/(s|share)\//.test(path)) return 'share';
return '';
},
isOnlyFolder() {
for (let i = 0; i < selectList.length; i++) {
if (selectList[i].file) return false;
}
return true;
},
showMainDialog(title, html, footer) {
Swal.fire({
title,
html,
footer,
allowOutsideClick: false,
showCloseButton: true,
showConfirmButton: false,
position: 'top',
width,
padding: '15px 20px 5px',
customClass,
});
},
async initPanLinker() {
base.initDefaultConfig();
base.addPanLinkerStyle();
pt = this.detectPage();
let res = await base.post
(`https://api.youxiaohou.com/config/v2/quark?ver=${version}&a=${author}`, {}, {}, 'text');
pan = JSON.parse(base.d(res));
Object.freeze && Object.freeze(pan);
pan.num === base.getValue('setting_init_code') ||
pan.license === base.getValue('license') ? this.addButton() : this.addInitButton();
this.addPageListener();
base.createTip();
base.createDownloadIframe();
base.registerMenuCommand();
}
};
let yidong = {
convertLinkToAria(link, filename, ua) {
filename = base.fixFilename(filename);
return encodeURIComponent(`aria2c "${link}" --out "${filename}"`);
},
convertLinkToBC(link, filename, ua) {
let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}ZZ`;
return encodeURIComponent(`bc://http/${base.e(bc)}`);
},
convertLinkToCurl(link, filename, ua) {
let terminal = base.getValue('setting_terminal_type');
filename = base.fixFilename(filename);
return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}"`);
},
addPageListener() {
doc.on('click', '.pl-button-mode', (e) => {
mode = e.target.dataset.mode;
Swal.showLoading();
this.getPCSLink();
});
doc.on('click', '.listener-link-api', async (e) => {
e.preventDefault();
$('#downloadIframe').attr('src', e.currentTarget.dataset.link);
});
doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
e.preventDefault();
base.setClipboard(decodeURIComponent(e.target.dataset.link));
$(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-link-rpc', async (e) => {
let target = $(e.currentTarget);
target.find('.icon').remove();
target.find('.pl-loading').remove();
target.prepend(base.createLoading());
let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
if (res === 'success') {
$('.listener-rpc-task').show();
target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
} else {
target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
}
});
doc.on('click', '.listener-send-rpc', (e) => {
$('.listener-link-rpc').click();
$(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
});
doc.on('click', '.listener-open-setting', () => {
base.showSetting();
});
doc.on('click', '.listener-rpc-task', () => {
let rpc = JSON.stringify({
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
}), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
GM_openInTab(url, {active: true});
});
},
addButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="yidong-button pl-button">下载提速<ul class="pl-dropdown-menu" style="top: 36px;"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">提速设置</li>微信ahonker999</ul></div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button').length === 0 && $toolWrap.prepend($button);
})
}
if (pt === 'share') {
$button.removeClass('yidong-button').addClass('yidong-share-button');
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-button').length === 0 && $toolWrap.prepend($button);
})
}
base.createDownloadIframe();
this.addPageListener();
},
addInitButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`<div class="yidong-button pl-button-init">下载提速</div>`);
if (pt === 'home') {
base.listenElement(pan.btn.home, () => {
$toolWrap = $(pan.btn.home);
$('.pl-button-init').length === 0 && $toolWrap.prepend($button);
})
}
if (pt === 'share') {
$button.removeClass('yidong-button').addClass('yidong-share-button');
base.listenElement(pan.btn.share, () => {
$toolWrap = $(pan.btn.share);
$('.pl-button-init').length === 0 && $toolWrap.prepend($button);
})
}
$button.click(() => base.initDialog());
},
getRandomString(len) {
len = len || 16;
let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
let maxPos = $chars.length;
let pwd = '';
for (let i = 0; i < len; i++) {
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
},
utob(str) {
const u = String.fromCharCode;
return str.replace(/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g, (t) => {
if (t.length < 2) {
let e = t.charCodeAt(0);
return e < 128 ? t : e < 2048 ? u(192 | e >>> 6) + u(128 | 63 & e) : u(224 | e >>> 12 & 15) + u(128 | e >>> 6 & 63) + u(128 | 63 & e);
}
e = 65536 + 1024 * (t.charCodeAt(0) - 55296) + (t.charCodeAt(1) - 56320);
return u(240 | e >>> 18 & 7) + u(128 | e >>> 12 & 63) + u(128 | e >>> 6 & 63) + u(128 | 63 & e);
});
},
getSign(e, t, a, n) {
let r = "",
i = "";
if (t) {
let s = Object.assign({}, t);
i = JSON.stringify(s),
i = i.replace(/\s*/g, ""),
i = encodeURIComponent(i);
let c = i.split(""),
u = c.sort();
i = u.join("");
}
let A = md5(base.e(this.utob(i)));
let l = md5(a + ":" + n);
return md5(A + l).toUpperCase();
},
async getFileUrlByOnce(item, index) {
try {
if (item.downloadUrl) return {
index,
downloadUrl: item.downloadUrl
};
if (this.detectPage() === 'home') {
let body = {
"contentID": item.contentID,
"commonAccountInfo": {"account": item.owner, "accountType": 1},
"operation": "0",
"inline": "0",
"extInfo": {"isReturnCdnDownloadUrl": "1"}
};
let time = new Date(+new Date() + 8 * 3600 * 1000).toJSON().substr(0, 19).replace('T', ' ');
let key = this.getRandomString(16);
let sign = this.getSign(undefined, body, time, key);
let res = await base.post(pan.pcs[0], body, {
'authorization': base.getCookie('authorization'),
'x-huawei-channelSrc': '10000034',
'x-inner-ntwk': '2',
'mcloud-channel': '1000101',
'mcloud-client': '10701',
'mcloud-sign': time + "," + key + "," + sign,
'content-type': "application/json;charset=UTF-8",
'caller': 'web',
'CMS-DEVICE': 'default',
'x-DeviceInfo': '||9|7.12.0|chrome|118.0.0.0||windows 10||zh-CN|||',
'x-SvcType': '1',
});
if (res.success) {
return {
index,
downloadUrl: res.data.downloadURL
};
} else {
return {
index,
downloadUrl: '获取下载地址失败,请刷新重试!'
};
}
}
if (this.detectPage() === 'share') {
let vueDom = document.querySelector(".main_file_list").__vue__;
let res = await base.post(pan.pcs[1], `linkId=${vueDom.linkID}&contentIds=${item.path}&catalogIds=`, {
'Content-Type': 'application/x-www-form-urlencoded',
});
if (res.code === 0) {
return {
index,
downloadUrl: res.data.redrUrl
};
} else {
return {
index,
downloadUrl: '获取下载地址失败,请刷新重试!'
};
}
}
} catch (e) {
return {
index,
downloadUrl: '获取下载地址失败,请刷新重试!'
};
}
},
async getPCSLink() {
selectList = this.getSelectedList();
if (selectList.length === 0) {
return message.error('提示:请先勾选要下载的文件!');
}
if (this.isOnlyFolder()) {
return message.error('提示:请打开文件夹后勾选文件!');
}
let queue = [];
selectList.forEach((item, index) => {
queue.push(this.getFileUrlByOnce(item, index));
});
const res = await Promise.all(queue);
res.forEach(val => {
selectList[val.index].downloadUrl = val.downloadUrl;
});
let html = this.generateDom(selectList);
this.showMainDialog(pan[mode][0], html, pan[mode][1]);
},
generateDom(list) {
let content = '<div class="pl-main">';
let alinkAllText = '';
list.forEach((v, i) => {
if (v.dirEtag || v.caName) return;
let filename = v.contentName || v.coName;
let size = base.sizeFormat(v.contentSize || v.coSize);
let dlink = v.downloadUrl;
if (mode === 'api') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-api" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
</div>`;
}
if (mode === 'aria') {
let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'rpc') {
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
}
if (mode === 'curl') {
let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
if (mode === 'bc') {
let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
content += `<div class="pl-item">
<div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
<a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
}
});
content += '</div>';
if (mode === 'aria')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
if (mode === 'rpc') {
let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
}
if (mode === 'curl')
content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
return content;
},
async sendLinkToRPC(filename, link) {
let rpc = {
domain: base.getValue('setting_rpc_domain'),
port: base.getValue('setting_rpc_port'),
path: base.getValue('setting_rpc_path'),
token: base.getValue('setting_rpc_token'),
dir: base.getValue('setting_rpc_dir'),
};
let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
let rpcData = {
id: new Date().getTime(),
jsonrpc: '2.0',
method: 'aria2.addUri',
params: [`token:${rpc.token}`, [link], {
dir: rpc.dir,
out: filename,
header: []
}]
};
try {
let res = await base.post(url, rpcData, {}, '');
if (res.result) return 'success';
return 'fail';
} catch (e) {
return 'fail';
}
},
getSelectedList() {
try {
return document.querySelector(".main_file_list").__vue__.selectList.map(val => val.item);
} catch (e) {
let vueDom = document.querySelector(".home-page").__vue__;
let fileList = vueDom._computedWatchers.fileList.value;
let dirList = vueDom._computedWatchers.dirList.value;
let selectedFileIndex = vueDom.selectedFile;
let selectedDirIndex = vueDom.selectedDir;
let selectFileList = fileList.filter((v, i) => {
return selectedFileIndex.includes(i);
});
let selectDirList = dirList.filter((v, i) => {
return selectedDirIndex.includes(i);
});
return [...selectFileList, ...selectDirList];
}
},
detectPage() {
let path = location.pathname;
if (/^\/w/.test(path)) return 'home';
if (/^\/link|shareweb/.test(path)) return 'share';
return '';
},
isOnlyFolder() {
for (let i = 0; i < selectList.length; i++) {
if (selectList[i].fileEtag || selectList[i].coName) return false;
}
return true;
},
showMainDialog(title, html, footer) {
Swal.fire({
title,
html,
footer,
allowOutsideClick: false,
showCloseButton: true,
showConfirmButton: false,
position: 'top',
width,
padding: '15px 20px 5px',
customClass,
});
},
async initPanLinker() {
base.initDefaultConfig();
base.addPanLinkerStyle();
pt = this.detectPage();
let res = await base.post
(`https://api.youxiaohou.com/config/v2/yidong?ver=${version}&a=${author}`, {}, {}, 'text');
pan = JSON.parse(base.d(res));
Object.freeze && Object.freeze(pan);
pan.num === base.getValue('setting_init_code') ||
pan.license === base.getValue('license') ? this.addButton() : this.addInitButton();
base.createTip();
base.registerMenuCommand();
}
};
let main = {
init() {
if (/(pan|yun).baidu.com/.test(location.host)) {
baidu.initPanLinker();
}
if (/openapi.baidu.com\/oauth/.test(location.href)) {
baidu.initAuthorize()
}
if (/www.(aliyundrive|alipan).com/.test(location.host)) {
ali.initPanLinker();
}
if (/cloud.189.cn/.test(location.host)) {
tianyi.initPanLinker();
}
if (/pan.xunlei.com/.test(location.host)) {
xunlei.initPanLinker();
}
if (/pan.quark.cn/.test(location.host)) {
quark.initPanLinker();
}
if (/(yun|caiyun).139.com/.test(location.host)) {
yidong.initPanLinker();
}
}
};
main.init();
})();