百度云直链获取优化版

// ==UserScript==
// @name         百度网盘简易下载助手(直链下载复活版)
// @namespace    http://bd.softxm.cn/bd/
// @version      1.3.3
// @antifeature  membership
// @description  ████ 20210813满速接口依然可用 ████一个纯净好用的直链下载助手,绝无多余附加功能。免SVIP会员,免安装浏览器扩展,无视黑号。只要你有个IDM或Aria2,就能享受极速下载的快感!👍👍👍👍👍 热烈庆祝评论过千 👍👍👍👍👍
// @icon         data:image/jpeg;base64,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b3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDktMDhUMjM6MDI6NTErMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjAtMDktMDlUMDA6Mjc6NTYrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTA5LTA5VDAwOjI3OjU2KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NmJlYzRkZTMtODVhZC02NzQwLWE1OWUtOTk2Yjk0OTRjYTkxIiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ODAzOWVhMzMtMTQ3NS00YTRiLWIzODAtODNlNjdlNjY0NDEwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6YjI4Yzk0ZGUtNjEyOS02YjRiLTg0YWMtYmUyN2Q3MjFhN2M3IiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMjhjOTRkZS02MTI5LTZiNGItODRhYy1iZTI3ZDcyMWE3YzciIHN0RXZ0OndoZW49IjIwMjAtMDktMDhUMjM6MDI6NTErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTJiMTMwODYtNTAzZC03YjRmLTg5MDItMDk4MzVlYmE4MTU5IiBzdEV2dDp3aGVuPSIyMDIwLTA5LTA4VDIzOjUxOjM3KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjZmMWFmODcwLTk0YjktZjU0MS05NTU3LTRjY2VmZWE5ZGE1YyIgc3RFdnQ6d2hlbj0iMjAyMC0wOS0wOVQwMDoyNzo1NiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjZiZWM0ZGUzLTg1YWQtNjc0MC1hNTllLTk5NmI5NDk0Y2E5MSIgc3RFdnQ6d2hlbj0iMjAyMC0wOS0wOVQwMDoyNzo1NiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2ZjFhZjg3MC05NGI5LWY1NDEtOTU1Ny00Y2NlZmVhOWRhNWMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6YjI4Yzk0ZGUtNjEyOS02YjRiLTg0YWMtYmUyN2Q3MjFhN2M3IiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6YjI4Yzk0ZGUtNjEyOS02YjRiLTg0YWMtYmUyN2Q3MjFhN2M3Ii8+IDxwaG90b3Nob3A6VGV4dExheWVycz4gPHJkZjpCYWc+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0i6L2v5Lu25bCP5aa5IiBwaG90b3Nob3A6TGF5ZXJUZXh0PSLova/ku7blsI/lprkiLz4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpUZXh0TGF5ZXJzPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjBmYWUzMDg5LTcyYTItMTM0My05YTVjLTQyNmQ5NWEyNzY1MTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6YmNmNTQ5ODItOTViNy01ZjQwLTg1NTQtY2FlMTE5ZjAyODVkPC9yZGY6bGk+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9InciPz7/7R8sUGhvdG9zaG9wIDMuMAA4QklNBCUAAAAAABAAAAAAAAAA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
// @author       软件小妹
// @match        *://pan.baidu.com/*
// @match        *://yun.baidu.com/*
// @match        *://*.vaptcha.com/*
// @require      https://cdn.jsdelivr.net/npm/sweetalert@2.1.2/dist/sweetalert.min.js
// @require      https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js
// @require      https://cdn.jsdelivr.net/npm/load-vaptcha-sdk@1.0.0/loadvaptcha.min.js
// @run-at       document-idle
// @grant        unsafeWindow
// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_deleteValue
// @grant        GM_listValues
// @grant        GM_openInTab
// @grant        GM_notification
// @grant        GM_xmlhttpRequest
// @connect      localhost
// @connect      127.0.0.1
// @connect      yyxxs.cn
// @connect      42.193.51.61
// @connect      119.28.33.23
// @connect      119.28.139.214
// @connect      49.234.47.193
// @connect      82.156.65.179
// @connect      42.193.127.85
// @connect      81.70.253.99
// @connect      49.232.252.126
// @connect      82.156.15.149
// @connect      59.110.224.13
// @connect      59.110.225.22
// @connect      59.110.226.3
// @connect      baidu.com
// ==/UserScript==

(function() {
		'use strict';

		let globalData = {
			scriptVersion: '1.3.3',
			domain: 'http://82.156.65.179',
			domainB: 'http://bd.yyxxs.cn',
			domainC: 'http://82.156.15.149',
			domainD: 'http://42.193.51.61',
			domainE: 'http://81.70.253.99',
			domainF: 'http://119.28.139.214',
			domainG: 'http://49.234.47.193',
			// domainH: 'http://localhost:48818',
			cos: false,
			param: '',
			downloading: 0,
			sending: 0,
			storageNamePrefix: 'softxm_storageName', // 本地储存名称前缀
			paramDomain: `https://softxm.lanzoui.com`, // 教程跳转地址
			paramDomain2: `https://z3.ax1x.com`, // 教程跳转地址
		}

		let getAppSettingData = function() {
			return {
				scriptVersion: globalData.scriptVersion,
				param: globalData.param,
				storageNamePrefix: globalData.storageNamePrefix,
				getDownloadUrl: `/bd/getDownloadUrl2.php`,
				// paramUrl: `${globalData.paramDomain}/params.data.localhost`, // 教程跳转地址
				// paramUrl: `${globalData.paramDomain}/b01nqc7yj`, // 教程跳转地址
				aria2DownloadUrl: `${globalData.paramDomain}/b01nqc7yj`, // Aria2软件下载地址
				aria2CourseUrl: `https://www.cnblogs.com/softxmm/p/13972678.html#aria2`, // Aria2教程地址
				idmDownloadUrl: `https://www.cnblogs.com/softxmm/p/13972678.html#idm`, // idm教程地址
			}
		}

		let tmpData = [{
			response: '',
			pwd: '',
			fs_id: '',
			token: '',
		}];

		let bdyDownloadUrl = "";

		let configDefault = {
			savePath: 'D:\\__easyHelper__',
			jsonRpc: 'http://localhost:6800/jsonrpc',
			token: '',
			mine: '',
			code: '',
		};
		let getConfig = function() {
			// 上次使用 > 应用配置 > 代码默认
			return {
				savePath: getStorage.getLastUse('savePath') || getStorage.getAppConfig('savePath') || configDefault
					.savePath,
				jsonRpc: getStorage.getLastUse('jsonRpc') || getStorage.getAppConfig('jsonRpc') || configDefault
					.jsonRpc,
				token: getStorage.getLastUse('token') || getStorage.getAppConfig('token') || configDefault.token,
				mine: getStorage.getLastUse('mine') || getStorage.getAppConfig('mine') || configDefault.mine,
				code: getStorage.getLastUse('code') || configDefault.code,
			}
		}
		let getStorage = {
			getAppConfig: (key) => {
				return GM_getValue(getAppSettingData().storageNamePrefix + '_app_' + key) || '';
			},
			setAppConfig: (key, value) => {
				GM_setValue(getAppSettingData().storageNamePrefix + '_app_' + key, value || '');
			},
			getLastUse: (key) => {
				return GM_getValue(getAppSettingData().storageNamePrefix + '_last_' + key) || '';
			},
			setLastUse: (key, value) => {
				GM_setValue(getAppSettingData().storageNamePrefix + '_last_' + key, value || '');
			},
			getCommonValue: (key) => {
				return GM_getValue(getAppSettingData().storageNamePrefix + '_common_' + key) || '';
			},
			setCommonValue: (key, value) => {
				GM_setValue(getAppSettingData().storageNamePrefix + '_common_' + key, value || '');
			}
		}

		let btnDownload = {
			id: 'btnEasyHelper',
			text: '简易下载助手',
			title: '使用百度网盘简易下载助手进行下载',
			html: function() {
				return `
                <span class="g-button-right">
                    <em class="icon icon-download" style="color:#ffffff" title="${this.text}"></em>
                    <span class="text" style="width: auto;">${this.text}</span>
                </span>
            `
			}
		}

		let isHomePage = function() {
			let url = location.href;
			if (url.indexOf(".baidu.com/disk") > 0) {
				return true;
			} else {
				return false;
			}
		};

		let getSelectedFileList = function() {
			if (isHomePage()) {
				return getSelectedFileListHome();
			} else {
				return getSelectedFileListShare();
			}
		};
		let getSelectedFileListHome = function() {
			return require('system-core:context/context.js').instanceForSystem.list.getSelected();
		};
		let getSelectedFileListShare = function() {
			return require('system-core:context/context.js').instanceForSystem.list.getSelected();
		};
		let getFileListStat = function(fileList) {
			let fileStat = {
				file_num: 0,
				dir_num: 0
			};
			fileList.forEach(function(item) {
				if (item.isdir == 0) {
					fileStat.file_num++;
				} else {
					fileStat.dir_num++;
				}
			});
			return fileStat;
		};

		let initButtonEvent = function() {
			console.log('initButtonEvent初始化按钮事件');
			let yunData = getYunData();
			let isHome = isHomePage();
			if (yunData || isHome) {
				//暂时限制只能在管理页面中使用
				if (!isHome) {
					showTipErrorSwal('必须先转存到自己网盘中,然后进入网盘进行下载!');
					showShareSave();
				} else {
					let fileList = getSelectedFileList();
					let fileStat = getFileListStat(fileList);
					if (fileList.length) {
						// if (fileStat.file_num > 1 || fileStat.dir_num > 0) {
						//     showTipError('请选择一个文件进行下载(暂时不支持文件夹和多文件批量下载)')
						// }
						// if (fileStat.dir_num == 0 && fileStat.file_num == 1) {
						showDownloadDialog(fileList, fileStat);
						setShareCompleteState();
						//自动下载
						// getJquery()("#dialogBtnGetUrl").click();
						// }
					} else {
						showTipErrorSwal('请选择一个文件进行下载');
					}
				}
			} else {
				showLogin();
			}
		};

		let getYunData = function() {
			return unsafeWindow.yunData;
		};

		let showTipErrorSwal = function(err) {
			showSwal(err, {
				icon: 'error'
			});
		}
		let showTipError = function(err) {
			// showSwal(err,{icon: 'error'});
			alert(err);
		}
		let showTipInfo = function(info) {
			getJquery()("#dialogOpTips").show().html(info);
		}
		let showTipInfoAria = function(info) {
			getJquery()("#dialogOpTipsAria").show().html(info);
		}
		let showTipInfoIdm = function(info) {
			getJquery()("#dialogOpTipsIdm").show().html(info);
		}

		let showSwal = function(content, option) {
			divTips.innerHTML = content;
			option.content = divTips;
			if (!option.hasOwnProperty('button')) {
				option.button = '朕 知 道 了'
			}
			swal(option);
		}

		let showLogin = function() {
			getJquery()("[node-type='header-login-btn']").click();
		};
		let showShareSave = function() {
			getJquery()("[node-type='shareSave']").click();
		};
		let getJquery = function() {
			return require("base:widget/libs/jquerypacket.js");
		};

		//下载面板
		let showDownloadDialog = function(fileList, fileStat) {
			let theFile = fileList[0];
			// console.log(theFile);
			let content = `
            <div id="downloadDialog">
                <div id="dialogTop">
                    请点击下方按钮,开始下载 <span id="dialogFileName">${CutString(theFile.server_filename, 40)}</span>
                </div>
                <div id="dialogMiddle">
                    <div id="dialogLeft">
                        <div id="dialogLeftTips">
                            <div id="dialogLeftTips1">
                                <strong>【方式1】</strong>IDM 必须设置4线程及修改UA为 <strong>softxm;netdisk</strong>
                                <div class="dialogLeftTipsLink">
                                    <a href="${getAppSettingData().idmDownloadUrl}" target="_blank">【IDM配置教程】</a>
                                </div>
                            </div>
                            <div id="dialogLeftTips2">
                                <strong>【方式2】</strong>Aria2 无需配置即可使用
                                <div class="dialogLeftTipsLink">
                                    <a href="${getAppSettingData().aria2DownloadUrl}" target="_blank">【点击下载】</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="${getAppSettingData().aria2CourseUrl}" target="_blank">【使用教程】</a>
                                </div>
                            </div>
                        </div>
                        <div id="dialogQr">
                            <img id="dialogQrImg" src="https://z3.ax1x.com/2021/05/06/gliG1f.gif" />
                        </div>
                    </div>
                    <div id="dialogRight">
                        <div id="dialogContent">
                            <input id="dialogBtnGetUrl" type="button" value="点击获取直链地址" class="btnInterface" />
                            <div id="dialogRemark">
                                <!--
                                 IDM下载速度<strong>6M/s</strong>左右,Aria2下载速度可以<strong>跑满带宽</strong>
                                <br />
                                -->
                                 下载速度<strong>因人而异</strong>,特别是共享网络(例如 校园网)
                            </div>
                            <div id="dialogOpTips"></div>
                            <div id="dialogVaptchaCode">
                                <div id="dialogVaptchaCodeInput">
                                    <span id="dialogVaptchaCodeTips"></span>
                                    <input id="dialogCode" type="text" value="${getConfig().code}" />
                                </div>
                                <div id="dialogCodeRemark"></div>
                            </div>
                            <div id="dialogOpButtons">
                                <input id="dialogBtnIdm" type="button" data-clipboard-text="" value="复制直链地址" class="btnInterface btnGreen" />
                                <div id="dialogOpTipsIdm"></div>
                                <input id="dialogBtnAria" type="button" value="发送至Aria2" class="btnInterface btnGreen" />
                                <div id="dialogOpTipsAria"></div>
                                <div id="dialogDivSavePath">
                                    保存路径:<input type="text" id="dialogTxtSavePath" value="${getConfig().savePath}" style="width: 170px;" />
                                    <span id="dialogAriaConfigClick">配置Aria2>></span>
                                    <div id="dialogAriaConfig">
                                        <input type="text" id="dialogAriaRPC" value="${getConfig().jsonRpc}" title="RPC地址" placeholder="RPC地址" style="width: 240px;" />
                                        <input type="text" id="dialogAriaToken" value="${getConfig().token}" title="token" placeholder="token" style="width: 77px;" />
                                        <br />
                                        <input type="checkbox" id="dialogAriaMine" value="checked" ${getConfig().mine}> 我使用自己的Aria2(如不懂,勿勾选)
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <div id="dialogClear"></div>
                <div id="dialogBottom">众所周知的原因,脚本不可能常在,但作者常在,关注才能不迷路!!!</div>
            </div>
        `;
			showSwal(content, {
				button: '关 闭',
				closeOnClickOutside: false
			});

			//分享(入口 )
			let dialogBtnClick = function() {
				if (globalData.downloading === 1) {
					return false;
					}
					//初始化下载链接
					bdyDownloadUrl = "";
					setShareStartState();
					//判断是否已分享过该文件(不重复分享,仅限于当前窗口的上一次分享)
					let tData = getTmpData();
					
					for (let i = 0; i < fileList.length; i++) {
						let selectFile = fileList[i];
						let isGetDownloadUrl = false;
						for (let x = 0; x < tData.length; x++) {
							let t = tData[x];
							if (t.response && t.fs_id == selectFile.fs_id) {
								console.warn('已分享过此文件,不再重复分享');
								getDownloadUrl(t.response, t.pwd, t.fs_id, '');
								isGetDownloadUrl = true;
								continue;
							}
						}
						if(isGetDownloadUrl){
							continue;
						}
						console.info('未分享过此文件,开始分享');
						//获取数据
						let bdstoken = unsafeWindow.locals.get('bdstoken');
						let pwd = getRndPwd(4);
						console.log('请求参数'+`fid_list=[${selectFile.fs_id}]&schannel=4&channel_list=[]&period=1&pwd=${pwd}`);
						//+===================================
						//分享
						let details = {
							method: 'POST',
							responseType: 'json',
							timeout: 10000, // 10秒超时
							url: `/share/set?channel=chunlei&clienttype=0&web=1&channel=chunlei&web=1&app_id=250528&bdstoken=${bdstoken}&clienttype=0`,
							data: `fid_list=[${selectFile.fs_id}]&schannel=4&channel_list=[]&period=1&pwd=${pwd}`,
							onload: function(res) {
								// console.log('分享文件时,百度返回:', res);
								if (res.status === 200) {
									switch (res.response.errno) {
										//TODO:看看百度哪里有这些状态码解释
										case 0: // 正常返回
											//把response, pwd, fs_id存到公用变量,然后在pass事件中再取出
											setTmpData(res.response, pwd, selectFile.fs_id, '');
											getDownloadUrl(res.response, pwd, selectFile.fs_id, '');
											break;
										case 110:
											showTipInfo('发生错误!')
											showTipError('百度说:您今天分享太多了,24小时后再试吧!\n百度返回状态码:' + res
												.response
												.errno);
											setShareCompleteState();
											console.error(res);
											break;
										case 115:
											showTipInfo('发生错误!')
											showTipError('百度说:该文件禁止分享!\n百度返回状态码:' + res.response.errno);
											setShareCompleteState();
											console.error(res);
											break;
										case -6:
											showTipInfo('发生错误!')
											showTipError('百度说:请重新登录!\n百度返回状态码:' + res.response.errno);
											setShareCompleteState();
											console.error(res);
											break;
										default: // 其它错误
											showTipInfo('发生错误!')
											showTipError('分享文件失败,请重试!\n百度返回状态码:' + res.response.errno +
												'\n使用百度分享按钮试试,就知道具体原因了。');
											setShareCompleteState();
											console.error(res);
											break;
									}
								} else {
									showTipInfo('发生错误!')
									showTipError('分享文件失败,导致无法获取直链下载地址!\n百度返回:' + res.responseText);
									setShareCompleteState();
									console.error(res);
								}
							},
							ontimeout: (res) => {
								showTipInfo('发生错误!')
								showTipError('分享文件时连接百度接口超时,请重试!');
								setShareCompleteState();
								console.error(res);
							},
							onerror: (res) => {
								showTipInfo('发生错误!')
								showTipError('分享文件时发生错误,请重试!');
								setShareCompleteState();
								console.error(res);
							}
						};
						try {
							GM_xmlhttpRequest(details);
						} catch (error) {
							showTipInfo('发生错误!')
							showTipError('未知错误,请重试!');
							setShareCompleteState();
							console.error(error);
						}
					};
				}
				//绑定按钮点击(点击获取直链地址)
				getJquery()("#dialogBtnGetUrl").click(function() {
					dialogBtnClick()
				});
				//点击配置Aria2
				getJquery()("#dialogAriaConfigClick").click(function() {
					showAriaConfig()
				});
				// 绑定点击复制事件
				copyUrl2Clipboard();
			};

			//请求备用参数
			let getParams = function() {
				let hkUrl = "https://pan.baidu.com/pcloud/user/getinfo?query_uk=2942844742";
				// let hkUrl = "http://localhost:48818/bd/getinfo.php?query_uk=2942844742";
				let details = {
					method: 'GET',
					timeout: 10000, // 10秒超时
					url: hkUrl + '&' + new Date().getTime(),
					responseType: 'json',
					onload: function(res) {
						if (res.status === 200) {
							globalData.domainB = res.response.user_info.intro;
							// console.info("domainB:" + globalData.domainB);
						} else {
							console.error(res);
						}
					}
				};
				try {
					GM_xmlhttpRequest(details);
				} catch (error) {
					console.error(error);
				}
			}
			//弃用
			let setAppSettingData = function(paramData) {
				let filename = getMidStr(paramData, '<span id="filename">', '</span>');
				let j = getJquery().parseJSON(decodeURIComponent(filename));
				// console.log('setAppSettingData');
				// console.log(j);
				if (j.err) {
					showTipErrorSwal(j.err);
				} else {
					j['cos'] = true;
					getJquery().extend(globalData, j);
					//console.log(globalData);
				}
			}

			let setShareStartState = function() {
				globalData.downloading = 1;
				showTipInfo('正在分享文件...')
				//保存用户输入的数据
				saveLastUseData();
				getJquery()('#dialogVaptchaCode').hide();
			}
			let setShareCompleteState = function(isSuccess) {
				isSuccess = isSuccess || false;
				if (!isSuccess) {
					//失败之后,允许重复点击按钮
					globalData.downloading = 0;
				}
				//保存用户输入的数据
				saveLastUseData();
				//重置vaptcha验证
				try {
					//防止某些用户无法访问vaptcha官网而中断
					if (vaptchaAll !== null && vaptchaAll.hasOwnProperty("reset")) {
						vaptchaAll.reset();
					} else {
						console.warn("vaptchaAll is undefined");
					}
				} catch (error) {
					console.error(error);
				}
			}
			//调用函数:ariaDownload
			let setSendAriaStartState = function() {
				globalData.sending = 1;
				showTipInfoAria('正在发送至Aria2...');
				// getJquery()("#dialogBtnAria").val('正在发送至Aria2...');
				//保存用户输入的数据
				saveLastUseData();
			}
			let setSendAriaCompleteState = function(isSuccess) {
				globalData.sending = 0;
				if (isSuccess) {
					getJquery()("#dialogBtnAria").val('Aria2已经开始下载了');
					// showTipInfoAria('Aria2已经开始下载了');
				} else {
					getJquery()("#dialogBtnAria").val('发送至Aria2');
					// showTipInfoAria('Aria2已经开始下载了,切换过去看看吧~');
				}
				//保存用户输入的数据
				saveLastUseData();
			}

			let showAriaConfig = function() {
				let t = getJquery()("#dialogAriaConfig");
				if (t.css("display") == "none") {
					t.show();
				} else {
					t.hide();
				}
			}

			//分享成功后,开始手势验证
			let vaptchaValidate = function() {
				vaptchaAll.validate();
			}

			let setTmpData = function(response, pwd, fs_id, token) {
				var data = {
					response: response,
					pwd: pwd,
					fs_id: fs_id,
					token: token,
				}
				tmpData.push(data);
				window.localStorage.setItem("tmpDataObject",JSON.stringify(tmpData));
			};
			let initTmpData = function() {
				let sTmpData= window.localStorage.getItem("tmpDataObject");
				console.log(sTmpData);
				if(typeof sTmpData == "undefined" || sTmpData == null || sTmpData == ""){
					return;
				}
				tmpData = JSON.parse(sTmpData);
				return tmpData;
			}
			let getTmpData = function() {
				return tmpData;
			}
			//手势验证成功后,服务器获取直链地址
			let getDownloadUrlReal = function(domain, response, pwd, fsid, token) {
				// console.log('分享成功后返回:', response);
				// let au = getJquery()('#dialogQrImg').attr('src');
				//看看能不能去除验证码
				let au = "";
				let shorturl = response.shorturl;
				let surl = shorturl.substring(shorturl.lastIndexOf('/') + 1, shorturl.length);
				let downloadUrl =
					`${getAppSettingData().getDownloadUrl}?version=${getAppSettingData().scriptVersion}&t=8888` +
					new Date().getTime();
				downloadUrl = domain + downloadUrl + getAppSettingData().param;

				let params = new FormData();
				params.append('surl', surl);
				params.append('pwd', pwd);
				params.append('shareid', response.shareid);
				params.append('from', unsafeWindow.locals.get('uk'));
				params.append('fsidlist', `[${fsid}]`);
				params.append('start', getStorage.getCommonValue('start'));
				params.append('code', getJquery()('#dialogCode').val().trim());
				params.append('u', getJquery()('.user-name').html()+getRndPwd(4));
				params.append('fn', getSelectedFileList()[0].server_filename);
				params.append('token', token);
				params.append('au', au.indexOf(globalData.paramDomain2) == 0 ? '' : au);
				
				console.log("参数开始")
				console.log('surl:' + surl);
				console.log('pwd:'+ pwd);
				console.log('shareid:'+ response.shareid);
				console.log('from:'+ unsafeWindow.locals.get('uk'));
				console.log('fsidlist:'+ `[${fsid}]`);
				console.log('start:'+ getStorage.getCommonValue('start'));
				console.log('code:'+ getJquery()('#dialogCode').val().trim());
				console.log('u:'+ getJquery()('.user-name').html());
				console.log('fn:'+ getSelectedFileList()[0].server_filename);
				console.log('token:'+ token);
				console.log('au:'+ au.indexOf(globalData.paramDomain2) == 0 ? '' : au);
				//远程请求直链下载地址
				let details = {
					method: 'POST',
					responseType: 'json',
					timeout: 30000, // 30秒超时
					url: downloadUrl,
					// data: `surl=${surl}&pwd=${pwd}`, --php端收不到数据
					data: params,
					onloadstart: function() {
						let tmpTips = '正在远程请求直链地址...';
						if (domain == globalData.domainB) tmpTips = '快好了,再耐心等一下下...';
						if (token) tmpTips = '人机验证通过~ ' + tmpTips;
						showTipInfo(tmpTips)
					},
					onload: function(res) {
						// console.log('请求参数:');
						// params.forEach((value, key) => {
						//      console.log("%s --> %s", key, value);
						// })
						console.log('远程请求直链地址,返回:', res);
						if (res.status === 200) {
							switch (res.response.errno) {
								case 0: // 正常返回
								case 103: // aria2 only
									setShareCompleteState(true);
									changeClickEvent(res.response);
									saveStartState();
									showQrTips(res.response);
									break;
								case 100: // 版本太旧
									setShareCompleteState();
									showTipErrorSwal(res.response.err);
									break;
								case 101: // vaptcha验证不成功
									setShareCompleteState();
									showTipInfo(res.response.err);
									getJquery()('#dialogVaptchaCode').show();
									showQrTips(res.response);
									break;
								case 102: // 慢速直链
									setShareCompleteState();
									showTipInfo(res.response.err);
									break;
								case 104: // 需要手势验证
									showTipInfo(res.response.err);
									setShareCompleteState();
									vaptchaValidate();
									break;
								default: // 其它错误
									showTipInfo('发生错误!')
									showTipError(res.response.err);
									setShareCompleteState();
									break;
							}
						} else {
							showTipInfo('发生错误!')
							showTipError('请求直链下载地址失败!服务器返回:' + res.status);
							setShareCompleteState();
							console.error(res);
						}
					},
					ontimeout: (res) => {
						console.error(res);
						if (domain == globalData.domainB) {
							showTipInfo('发生错误!')
							showTipError('请求直链下载地址时连接服务器接口超时,请重试!');
							setShareCompleteState();
						} else {
							//非备用接口请求时,就继续使用备用接口再请求1次
							getDownloadUrlReal(globalData.domainB, response, pwd, fsid, token);
						}
					},
					onerror: (res) => {
						console.error(res);
						if (domain == globalData.domainB) {
							showTipInfo('发生错误!')
							showTipError('请求直链下载地址时连接服务器接口出错,请重试!');
							setShareCompleteState();
						} else {
							//非备用接口请求时,就继续使用备用接口再请求1次
							getDownloadUrlReal(globalData.domainB, response, pwd, fsid, token);
						}
					}
				};
				try {
					GM_xmlhttpRequest(details);
				} catch (error) {
					showTipInfo('发生错误!')
					showTipError('远程请求未知错误,请重试!');
					setShareCompleteState();
					console.error(error);
				}
			}

			//查询接口地址-->发起服务器请求
			let getDownloadUrl = function(response, pwd, fsid, token) {
				let bdUrl = "https://pan.baidu.com/pcloud/user/getinfo?query_uk=477485340";
				// let bdUrl = "http://localhost:48818/bd/getinfo.php?query_uk=477485340";
				let details = {
					method: 'GET',
					timeout: 10000, // 10秒超时
					url: bdUrl + '&' + new Date().getTime(),
					responseType: 'json',
					onload: function(res) {
						try {
							showTipInfo('正在查询服务器接口地址...');
							// console.log(res);
							if (res.status === 200) {
								// console.info(res);
								if (res.response.errno == 0) {
									let ifDomain = res.response.user_info.intro;
									// console.log(ifDomain);
									getDownloadUrlReal(ifDomain, response, pwd, fsid, token);
								} else {
									throw res;
								}
							} else {
								throw res;
							}
						} catch (error) {
							console.error(error);
							getDownloadUrlReal(globalData.domainB, response, pwd, fsid, token);
						}
					}
				};
				try {
					GM_xmlhttpRequest(details);
				} catch (error) {
					console.error(error);
					getDownloadUrlReal(globalData.domainB, response, pwd, fsid, token);
				}
			}

			//请求直链成功后,改变按钮点击事件
			let changeClickEvent = function(res) {
				//显示操作按钮
				getJquery()("#dialogOpButtons").show();
				if (res.errno == 0) {
					//正常返回:复制直链下载地址
					showTipInfo('获取直链成功,请在下方选择下载方式。');
					let url = res.aria2info.params[1][0];
					bdyDownloadUrl = bdyDownloadUrl + "\n" + url;
					getJquery()("#dialogBtnIdm").attr("data-clipboard-text", bdyDownloadUrl);
				} else {
					//Aria2 下载提示(隐藏idm下载按钮)
					showTipInfo(res.err);
					getJquery()("#dialogBtnIdm").hide();
					getJquery()("#dialogOpTipsIdm").hide();
				}
				//发送至Aria2
				let btnAria2 = getJquery()("#dialogBtnAria");
				btnAria2.unbind();
				btnAria2.click(function() {
					ariaDownload(res);
				});
			}
			//请求直链成功后,tips
			let showQrTips = function(res) {
				let qrImg = getJquery().trim(res.qrImg);
				let qrTips = getJquery().trim(res.qrTips);
				let codeTips = getJquery().trim(res.codeTips);
				let codeRemark = getJquery().trim(res.codeRemark);
				//console.log(qrImg, qrTips);
				if (qrImg.length > 0) {
					getJquery()("#dialogQrImg").attr('src', qrImg);
				}
				if (qrTips.length > 0) {
					getJquery()("#dialogBottom").html(qrTips);
				}
				if (codeTips.length > 0) {
					getJquery()("#dialogVaptchaCodeTips").html(codeTips).show();
				}
				if (codeRemark.length > 0) {
					getJquery()("#dialogCodeRemark").html(codeRemark).show();
				}
			}
			//请求直链成功后,xxxx
			let saveStartState = function(res) {
				let start = getStorage.getCommonValue('start');
				if (start) return;
				start = new Date().getTime();
				getStorage.setCommonValue('start', start);
			}
			//发送至aria2
			let ariaDownload = function(response) {
				let rpcDir = (getJquery()("#dialogTxtSavePath").val()).replace(/\\/g, '/');
				let rpcUrl = getJquery()("#dialogAriaRPC").val();
				let rpcToken = getJquery()("#dialogAriaToken").val();
				//使用自己的Aria2
				if (getConfig().mine == "checked") {
					if (response.errno == 0) {
						//正常返回
						delete response.aria2info.params[2].dir;
						delete response.aria2info.params[2]['max-connection-per-server'];
						delete response.aria2info.params[2].split;
						delete response.aria2info.params[2]['piece-length'];
					} else {
						//Aria2 only
						delete response.aria2info.params[0][0].params[2].dir;
						delete response.aria2info.params[0][0].params[2]['max-connection-per-server'];
						delete response.aria2info.params[0][0].params[2].split;
						delete response.aria2info.params[0][0].params[2]['piece-length'];
					}
				}
				let data = JSON.stringify(response.aria2info);
				data = data.replace('{{{rpcDir}}}', rpcDir).replace('{{{rpcToken}}}', rpcToken);
				//发送至aria2
				let details = {
					method: 'POST',
					responseType: 'json',
					timeout: 3000, // 3秒超时
					url: rpcUrl,
					data: data,
					onloadstart: function() {
						setSendAriaStartState();
					},
					onload: function(res) {
						console.log('发送至Aria2,返回:', res);
						if (res.status === 200) {
							if (res.response.result) {
								// 正常返回
								setSendAriaCompleteState(true);
								showTipInfoAria('Aria2已经开始下载了,切换过去看看吧~');
							} else {
								// 其它错误
								showTipInfoAria('发生错误!')
								showTipError(res.response.message);
								setSendAriaCompleteState(false);
							}
						} else {
							showTipInfoAria('发生错误!')
							showTipError('发送至Aria2失败!<br />服务器返回:' + res.responseText);
							setSendAriaCompleteState(false);
							console.error(res);
						}
					},
					ontimeout: (res) => {
						showTipInfoAria('发生错误!')
						showTipError('连接到RPC服务器超时:请检查Aria2是否已连接,RPC配置是否正确!');
						setSendAriaCompleteState(false);
						console.error(res);
					},
					onerror: (res) => {
						showTipInfoAria('发生错误!')
						showTipError('发送至Aria2时发生错误,请重试!');
						setSendAriaCompleteState(false);
						console.error(res);
					}
				};
				try {
					GM_xmlhttpRequest(details);
				} catch (error) {
					showTipInfoAria('发生错误!')
					showTipError('发送至Aria2时发生未知错误,请重试!');
					setSendAriaCompleteState(false);
					console.error(error);
				}
			}
			//保存用户输入的数据(下次当默认值使用)
			let saveLastUseData = function() {
				getStorage.setLastUse('savePath', getJquery()("#dialogTxtSavePath").val());
				getStorage.setLastUse('jsonRpc', getJquery()("#dialogAriaRPC").val());
				getStorage.setLastUse('token', getJquery()("#dialogAriaToken").val());
				let mine = "";
				if (getJquery()("#dialogAriaMine").prop("checked") == true) {
					mine = "checked";
				}
				getStorage.setLastUse('mine', mine);
				getStorage.setLastUse('code', getJquery()("#dialogCode").val());
			}

			//复制直链下载地址
			let copyUrl2Clipboard = function() {
				let copyBtn = new ClipboardJS('#dialogBtnIdm')
				copyBtn.on("success", function(e) {
					// 复制成功(右键下载不好使,别再尝试了)
					showTipInfoIdm(`直链下载地址复制成功!`)
				});
			}

			//========================================= 公共函数
			function CutString(str, len, suffix) {
				if (!str) return "";
				if (len <= 0) return "";
				if (!suffix) suffix = "...";
				let templen = 0;
				for (let i = 0; i < str.length; i++) {
					if (str.charCodeAt(i) > 255) {
						templen += 2;
					} else {
						templen++
					}
					if (templen == len) {
						return str.substring(0, i + 1) + suffix;
					} else if (templen > len) {
						return str.substring(0, i) + suffix;
					}
				}
				return str;
			}

			function getRndPwd(len) {
				len = len || 4;
				let $chars = 'AEJPTZaejptz258';
				let maxPos = $chars.length;
				let pwd = '';
				for (let i = 0; i < len; i++) {
					pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
				}
				return pwd;
			}

			function checkVsite() {
				let vDomain = document.domain.split('.').slice(-2).join('.');
				if (vDomain == 'vaptcha.com') return true;
				return false;
			}

			// 延迟执行,否则找不到对应的按钮
			let sleep = function(time) {
				return new Promise((resolve) => setTimeout(resolve, time));
			};

			/**
			 * 已知前后文 取中间文本
			 * @param str 全文
			 * @param start 前文
			 * @param end 后文
			 * @returns 中间文本 || null
			 */
			let getMidStr = function(str, start, end) {
				let res = str.match(new RegExp(`${start}(.*?)${end}`))
				return res ? res[1] : null
			}

			//========================================= css
			GM_addStyle(`
        .swal-modal {
            width: auto;
            min-width: 730px;
        }
        #downloadDialog{
            width: 730px;
            font-size:14px;
        }

        #dialogTop{
            margin: 20px 0;
        }
        #dialogFileName{
            color: blue;
            text-decoration:underline;
        }

        #dialogMiddle{}
        #dialogLeftTips{
            text-align: left;
            margin: 0 0 10px 0px;
            color: #4c4433;
            font-size: 13px;
        }
        #dialogLeftTips1,#dialogLeftTips2{
            margin-bottom: 5px;
            background: #f4c758;
            padding: 5px 0 5px 0;
            border-radius: 4px;
        }
        .dialogLeftTipsLink{
            text-align: center;
        }
        #dialogRight{
            width: 50%;
            float: left;
            margin-left: 15px;
        }
        #dialogContent input{
            vertical-align: middle;
        }
        #dialogRemark{
            text-align: left;
            font-size: 12px;
            margin-top: 5px;
        }
        #dialogVaptchaCode{
            display: none;
            text-align: left;
            margin-top: 5px;
            font-size: 12px;
            border: 2px solid #EDD;
        }
        #dialogVaptchaCodeInput{
            font-size: 14px;
        }
        #dialogCode{
            width: 50%;
        }
        #dialogCodeRemark{}
        #dialogQr{
            width: 265px;
            height: 265px;
            text-align: center;
        }
        #dialogQr img{
            width: 100%;
            margin-left: 27px;
        }
        #dialogClear{
            clear: both;
        }
        #dialogBottom{
            text-align: left;
            margin: 15px -20px 0 -20px;
            background: #f4c758;
            padding: 10px 0 10px 25px;
            color: #4c4433;
        }
        .btnInterface {
            width: 100%;
            height: 50px;
            background: #f00 !important;
            border-radius: 4px;
            transition: .3s;
            font-size: 25px !important;
            border: 0;
            color: #fff;
            cursor: pointer;
            text-decoration: none;
            font-family: Microsoft YaHei,SimHei,Tahoma;
            font-weight: 100;
            letter-spacing: 2px;
        }
        .btnGreen {
            background: #5cb85c !important;
        }

        #dialogDivSavePath{
            margin-top: 2px;
            text-align: left;
        }
        #dialogOpTips, #dialogOpTipsAria, #dialogOpTipsIdm{
            display: none;
            background: #f4c758;
            padding: 3px 14px;
            color: #4c4433;
            border-radius: 2px;
            font-weight: bold;
            text-align: left;
            margin-top: 2px;
        }
        #dialogOpButtons{
            display: none;
        }
        #dialogBtnIdm, #dialogBtnAria{
            margin-top: 15px;
        }
        #dialogAriaConfig{
            display: none;
            margin-top: 2px;
        }
        #dialogAriaConfigClick{
            color: #0098EA;
            text-decoration: underline;
            cursor:pointer;
            font-size: 12px;
            padding-left: 6px;
        }
        #dialogAriaConfig{
            font-size: 12px;
        }
        #dialogLeft{
            float: left;
            width: 47%;
        }
        .swal-footer{
            margin-top: 5px;
        }
    `);
			// ==================================== 逻辑代码开始
			console.log('脚本开始');
			getParams();
			initTmpData();
			const divTips = document.createElement('div');
			divTips.id = "divTips";

			let isLogin = document.querySelector('.login-main'); // 登录页面
			let isVsite = checkVsite();

			//载入vaptcha
			let vaptchaAll = null;
			if (!isLogin && !isVsite) {
				loadVaptchaSdk(function() {
					vaptcha({
						vid: "5fc5252656181ea89f9ead2e", // 验证单元id
						type: "invisible", // 显示类型 隐藏式
						scene: 1, // 场景值 默认0
						offline_server: "", //离线模式服务端地址,若尚未配置离线模式,请填写任意地址即可。
					}).then(function(vaptchaObj) {
						vaptchaAll = vaptchaObj; //将VAPTCHA验证实例保存到全局变量中
						console.log(vaptchaAll);

						//验证通过时触发
						vaptchaAll.listen("pass", function() {
							// 验证成功进行后续操作
							let token = vaptchaAll.getToken();
							console.log(token);
							let tData = getTmpData();
							for (let x = 0; x < tData.length; x++) {
								let t = tData[x];
								if (t.response && t.fs_id == selectFile.fs_id) {
									console.warn('已分享过此文件,不再重复分享');
									getDownloadUrl(t.response, t.pwd, t.fs_id, token);
									return;
								} else {
									console.info('未分享过此文件,开始分享');
								}
							}
						});

						//关闭验证弹窗时触发
						vaptchaAll.listen("close", function() {
							showTipInfo('通过验证才可以取直链!点击上面按钮重新开始。');
							setShareCompleteState()
						});
					});
				});
			}

			let start = function() { //迭代调用
				if (isVsite) return;
				let btnUpload = document.querySelector('[node-type=upload]'); // 管理页面:【上传】
				let btnQrCode = document.querySelector('[node-type=qrCode]'); // 分享页面:【保存到手机】
				if (!btnUpload && !btnQrCode) {
					console.log('找不到【上传】或【保存到手机】,1秒后将重新查找!');
					sleep(500).then(() => {
						start();
					})
					return;
				}

				// 创建按钮 START
				let btn = document.createElement('a');
				btn.id = btnDownload.id;
				btn.title = btnDownload.title;
				btn.innerHTML = btnDownload.html();
				btn.style.cssText = 'margin: 0px;';
				btn.className = 'g-button g-button-red-large';
				btn.addEventListener('click', function(e) {
					initButtonEvent();
					e.preventDefault();
				});
				// 创建按钮 END

				// 添加按钮 START
				let parent = null;
				if (btnUpload) {
					parent = btnUpload.parentNode;
					parent.insertBefore(btn, btnUpload.nextElementSibling);
				} else if (btnQrCode) {
					parent = btnQrCode.parentNode;
					parent.insertBefore(btn, btnQrCode);
				}
				// 添加按钮 END

				// 修改搜索框宽度,否则在小显示器上,元素会重叠
				document.querySelectorAll('span').forEach((e) => {
					if (e.textContent.includes('搜索您的文件')) {
						let divP = e.parentNode.parentNode.parentNode
						divP.style.maxWidth = '200px';
					}
				});
			}

			sleep(500).then(() => {
				start();
			})
		})();
	//###############################

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值