百度网盘秒传链接提取(最新可维护版本)

用于提取和生成百度网盘秒传链接

// ==UserScript==
// @name            百度网盘秒传链接提取(最新可维护版本)
// @namespace       taobao.idey.cn/index
// @version         2.4.1
// @description     用于提取和生成百度网盘秒传链接
// @author          免费王子
// @license           MIT
// @match           *://pan.baidu.com/disk/main*
// @match           *://yun.baidu.com/disk/main*
// @match           *://pan.baidu.com/disk/home*
// @match           *://yun.baidu.com/disk/home*
// @connect     idey.cn
// @connect     baidu.com
// @connect      baidupcs.com
// @require      https://cdn.staticfile.org/jquery/1.12.4/jquery.min.js
// @require https://cdn.bootcdn.net/ajax/libs/jquery.qrcode/1.0/jquery.qrcode.min.js
// @require         https://cdn.staticfile.org/spark-md5/3.0.0/spark-md5.min.js
// @require https://unpkg.com/js-base64@3.7.5/base64.js
// @grant           GM_setValue
// @grant           GM_getValue
// @grant           GM_deleteValue
// @grant           GM_setClipboard
// @grant           GM_xmlhttpRequest
// @grant           GM_info
// @grant           GM_getResourceText
// @grant           GM_addStyle
// @run-at          document-start
// @connect         *
// @antifeature referral-link 此提示为GreasyFork代码规范要求含有查券功能的脚本必须添加,脚本描述也有说明,请知悉。
// ==/UserScript==
! function() {
	'use strict';
	var index_num = 0;
	var $ = $ || window.$;
	var item = [];
	var urls = [];
	var selectorList = [];
	var obj = {};
	var failed = 0;
	var bdstoken;
	var checkFileList;
	var fileList=[];
	var dirList=[];
	var hosturl = 'https://wk.idey.cn/red.html?url=';
	var inputSavePathHTML =
		'<input id="inputSavePathId" class="swal2-input" placeholder="保存路径, 示例:/BDLIST, 默认保存在BDLIST目录" style="display: flex;margin-top: 10px;font-size:0.95em">';
	var inputSavePath = "";
	var linkList = [];
	var errList='';
	var defaultPath='/BDLIST';
	var requestData = {};
	var reqstr = '/api/create';
	var reqfile='/rest/2.0/xpan/multimedia?method=listall&order=name&limit=10000&path=';
	var reqold = "https://pcs.baidu.com/rest/2.0/pcs/file?app_id=778750&method=download";
    var reqmetas='/api/filemetas?dlink=1&fsids=';
	var updateApi='https://jh.idey.cn/update.php';
	var upresponse='';
	var btnRespConf = {
		id: "btn-resp",
		text: "秒传",
		html: function(type) {
			if (type == "main") {
				return `<button><span>${this.text}</span></button>`
			}else if(type=="home"){
				return `<button><span>${this.text}</span></button>`
			}
		}
	}
	var btnCreateConf = {
		id: "btn-create",
		text: "生成秒传",
		html: function(type) {
			if (type == "main") {
				return `<button><span>${this.text}</span></button>`
			}else if(type=="home"){
				return `<button><span>${this.text}</span></button>`
			}
		}
	}
 
	var tool = {
		sleep: (time) => {return new Promise((resolve) => setTimeout(resolve, time));},get: async (url, headers, type, extra) => {
			return new Promise((resolve, reject) => {
				let req = GM_xmlhttpRequest({
					method: "GET",
					url,
					headers,
					responseType: type || 'json',
					onload: (res) => {
						if (res.status === 204) {
							req.abort();
						}
						if(type==='arraybuffer'){
							resolve(res);
						} else {
							resolve(res.response || res.responseText);
						}
					},
					onerror: (err) => {
						reject(err);
					}
				});
			})
		},post: async (url, data, headers) => {
			return new Promise((resolve, reject) => {
                 let query = "";
                 for (var key in data)
                     query += "&" + key + "=" + encodeURIComponent(data[key]);
				data = query;
				let req = GM_xmlhttpRequest({
					method: "POST",
					url,
					headers: headers,
					responseType: 'json',
					data: data,
					onload: (res) => {
						resolve(res.response || res.responseText);
					},
					onerror: (err) => {
						reject(err);
					}
				});
			})
		},request:(obj)=>{
			var method=obj.method || 'GET',headers=obj.headers|| {},data=obj.data || {}, url=obj.url || '';
			var xhr=new XMLHttpRequest();
			xhr.onreadystatechange=function(){
				if(xhr.readyState==4){
					if((xhr.status>=200 && xhr.readyState<300) || xhr.status==304){
						obj.callback && obj.callback(xhr.responseText)
					}
				}
			}
			if((obj.method).toUpperCase()=='GET'){
				for(var key in data){
					url+=(url.indexOf("?")==-1 ? '?' :'&');
					url+=encodeURIComponent(key)+ "=" +encodeURIComponent(data['key']);
				}
			}
			xhr.open(method,url,true);
			if((obj.method).toUpperCase()=='GET'){
				xhr.send(null);
			}else{
				xhr.send(JSON.stringify(data));
			}
		},charRecoveStr:(str)=>{
			  var newStr = "";
			    for (var i = 0; i < str.length; i++) {
			        var reverseChar = void 0;
			        if (str.charAt(i) >= "a")
			            reverseChar = str.charAt(i).toUpperCase();
			        else if (str.charAt(i) >= "A")
			            reverseChar = str.charAt(i).toLowerCase();
			        else
			            reverseChar = str.charAt(i);
			        newStr += reverseChar;
			    }
			    return newStr;
 
		},queryUrlPath:()=>{
			let path=location.href.match(/path=(.+?)(?:&|$)/);
			if (path)
                 return decodeURIComponent(path[1]);
            else
                return "";
		},changePath:(p)=>{
			let fix = p.substring(p.lastIndexOf(".") + 1); // 获取后缀
			return p.substring(0, p.length - fix.length) + tool.charRecoveStr(fix);
		},loadAlert:async()=>{
			let url='https://unpkg.com/sweetalert2@10.16.6/dist/sweetalert2.all.min.js';
			var head = document.getElementsByTagName('head')[0];
			var script = document.createElement('script');
			script.type = 'text/javascript';
			script.src = url;
			head.appendChild(script);
		},timeStamp:()=>{
			 let time = new Date().getTime();
			 return time;
		},parse: (link) => {
            try {
                let arrays = link.split('\n').map(function(list) {
                    return list.trim().match(/([\dA-Fa-f]{32})#([\dA-Fa-f]{32})#([\d]{1,20})#([\s\S]+)/);
                }).map(function(info) {
                    return {md5: info[1],md5s:info[2],size: info[3],path: info[4]};
                });
                return arrays;
            }
            catch (e) {	return false;}
		},parse1:(link)=>{
              try {
                let arrays = link.split('\n').map(function(list) {
                    return list.trim().match(/([\dA-Fa-f]{32})#([\d]{1,20})#([\s\S]+)/);
                }).map(function(info) {
                    return {md5: info[1],size: info[2],path: info[3]};
                });
                  return arrays;
            }
            catch (e) {	return false;}
 
        },baiduClass:()=>{
			if (
				location.href.indexOf("//pan.baidu.com/disk/main") > 0 || location.href.indexOf("//yun.baidu.com/disk/main")>0
			) {
				return 'main';
			} else if (
				location.href.indexOf("//pan.baidu.com/s/") > 0
			) {
				return 'share';
			} else if (
				location.href.indexOf("//pan.baidu.com/disk/synchronization") > 0
			) {
				return 'synch';
			}else if (
				location.href.indexOf("//pan.baidu.com/disk/home") > 0 || location.href.indexOf("//yun.baidu.com/disk/home")>0
			) {
				return 'home';
			}
		},inputUserValue:(row = '')=>{
			Swal.fire({
				input: 'textarea',
				title: '请输入秒传',
				inputValue: row,
                allowOutsideClick: false,
				showCancelButton: true,
				inputPlaceholder: '格式:MD5#MD5s#大小#文件名\nMD5#大小#文件名格式 无法转存',
				cancelButtonText: '取消',
				confirmButtonText: '确定',
				onBeforeOpen: function onBeforeOpen() {
					let d = document.createElement('div');
					d.innerHTML += inputSavePathHTML;
					Swal.getContent().appendChild(d);
					let p=tool.queryUrlPath();
					if(p) document.getElementById('inputSavePathId').value=p;
 
				},
				inputValidator: function inputValidator(inputRow) {
					if (!inputRow) {
						return '不能为空';
					}
					linkList = tool.parse(inputRow);
 
                    if (!linkList.length) {
						linkList = tool.parse1(inputRow);
						if(linkList.length){
							return '抱歉,MD5#大小#文件名格式由于百度接口问题无法转存!其它所有脚本都是无法转存的!!!';
						}
					}
 
 
					if (!linkList.length) {
						return '抱歉,链接无法识别哦';
					}
 
 
					inputSavePath = document.getElementById('inputSavePathId').value;
					if(!inputSavePath) inputSavePath=defaultPath;
 
 
				}
			}).then(function(res) {
				if (!res.dismiss) {
						Swal.fire({
						title: "文件转存中",
						html: "正在转存文件<index>0</index>",
						allowOutsideClick: false,
                        showCloseButton: false,
                            showConfirmButton:false,
						onBeforeOpen: function() {
							Swal.showLoading();
							savePathList(0, 0);
						}
					});
				}
			});
		},cookie:(n)=>{
			  let arrays = unsafeWindow.document.cookie.replace(/\s/g, "").split(";");
				for (var i = 0, l = arrays.length; i < l; i++) {
					var t = arrays[i].split("=");
					if (t[0] === n) {
						return decodeURIComponent(t[1]);
					}
				}
				return "";
		},getCheckFile:(type)=>{
			if(type=="home"){
				return require('system-core:context/context.js').instanceForSystem.list.getSelected();
			}else{
				return document.querySelector(".nd-main-list, .nd-new-main-list").__vue__
				    .selectedList;
			}
 
		},reqAjax:(f,n,num)=>{
			if(num>=4){
				f.errno=2;
                tool.signMd5(n+1,0);
				return;
			}
			tool.getOtherMd5Step1(f,n,0);
			// $.ajax({
			// 	url: `${reqstr}&bdstoken=${bdstoken}`,
			// 	type: 'POST',
			// 	dataType:'json',
			// 	data: {
			// 		block_list: JSON.stringify([f.md5.toLowerCase()]),
			// 		path: f.path,
			// 		size: f.size,
			// 		isdir: 0,
			// 		rtype: 3,
			// 		is_revision: 1
			// 	},
			// 	success:function(res){
			// 		console.log('res',res);
			// 		if(res.errno===2){
			// 			tool.reqAjax(f,n,++num)
			// 		}else if(res.errno===0){
			// 			tool.signMd5(n+1,0);
			// 		}else if(res.errno===31190){
			// 			tool.getOtherMd5Step1(f,n,0);
			// 		}else{
 
   //                      tool.getOtherMd5Step1(f,n,0);
			// 		}
			// 	},
			// 	error:function(code){
			// 		f.errno=code;
			// 		tool.signMd5(n+1);
			// 	}
 
			// })
		},getOtherMd5Step1:(f,n,flag)=>{
            let fsid=JSON.stringify([String(f.fs_id)]);
			tool.get(`${reqmetas}${fsid}`,{"User-Agent":"netdisk;"},'json').then((res)=>{
				tool.getOtherMd5Step2(f,n,flag,res.info[0].dlink);
			}).catch((err)=>{
				f.errno=err;
				tool.signMd5(n+1,0);
			})
 
        },getOtherMd5Step2:(f,n,flag,downfile)=>{
            let bufferSize=f.size< 262144 ? 1 : 262143;
			tool.get(downfile,{Range:"bytes=0-"+bufferSize,"User-Agent":"netdisk;"},'arraybuffer').then((res)=>{
				if(res.finalUrl.includes("issuecdn.baidupcs.com")){
					f.errno=1919;tool.signMd5(n+1,0);
					return;
				}
				let newMd5=res.responseHeaders.match(/content-md5: ([\da-f]{32})/i);
				if(newMd5){ f.md5=newMd5[1].toLowerCase();
                           if(bufferSize==1){
                               f.md5s=f.md5;
                           }else{
                                let sparkmd5=new SparkMD5.ArrayBuffer();
                               sparkmd5.append(res.response);
                               f.md5s=sparkmd5.end();
 
                           }
                            tool.signMd5(n+1,0);
 
                }
				else{
					tool.getOtherMd5Step3(f,n,flag,`${reqold}&path=${encodeURIComponent(f.path)}`);
				}
			}).catch((err)=>{
				f.errno=err;
				tool.signMd5(n+1,0);
			})
        },getOtherMd5Step3:(f,n,flag,downfile)=>{
            let bufferSize=f.size< 262144 ? 1 : 262143;
			tool.get(downfile,{Range:"bytes=0-"+bufferSize,"User-Agent":"netdisk;"},'arraybuffer').then((res)=>{
				if(res.finalUrl.includes("issuecdn.baidupcs.com")){
					f.errno=1919;tool.signMd5(n+1,0);
					return;
				}
				let newMd5=res.responseHeaders.match(/content-md5: ([\da-f]{32})/i);
				if(newMd5){ f.md5=newMd5[1].toLowerCase();
                           if(bufferSize==1){
                               f.md5s=f.md5;
                           }else{
                                let sparkmd5=new SparkMD5.ArrayBuffer();
                               sparkmd5.append(res.response);
                               f.md5s=sparkmd5.end();
 
                           }
                            tool.signMd5(n+1,0);
 
                }
				else{
					f.errno=996;tool.signMd5(n+1,0);
				}
			}).catch((err)=>{
				f.errno=err;
				tool.signMd5(n+1,0);
			})
        },randMd5:(str)=>{
            let t = [];
            for (let _i = 0, chars = str; _i < chars.length; _i++) {
                var i = chars[_i];
                if (!Math.round(Math.random())) {
                    t.push(i.toLowerCase());
                }
                else {
                    t.push(i.toUpperCase());
                }
            }
            return t.join("");
        },encodeMd5:(md5)=>{
			if (!((parseInt(md5[9]) >= 0 && parseInt(md5[9]) <= 9) ||
			        (md5[9] >= "a" && md5[9] <= "f")))
			        return decrypt(md5);
			    else
			        return md5;
			    function decrypt(encryptMd5) {
			        var key = (encryptMd5[9].charCodeAt(0) - "g".charCodeAt(0)).toString(16);
			        var key2 = encryptMd5.slice(0, 9) + key + encryptMd5.slice(10);
			        var key3 = "";
			        for (var a = 0; a < key2.length; a++)
			            key3 += (parseInt(key2[a], 16) ^ (15 & a)).toString(16);
			        var md5 = key3.slice(8, 16) +
			            key3.slice(0, 8) +
			            key3.slice(24, 32) +
			            key3.slice(16, 24);
			        return md5;
			    }
		},signMd5:(n,flag)=>{
			if(n>=fileList.length){
				tool.showOverSwal();
				return;
			}
			let f=fileList[n];
			if(f.errno && f.isdir==1){
				tool.signMd5(n+1);
				return;
			}
			Swal.getHtmlContainer().querySelector("index").textContent=n+1+"/"+fileList.length;
			tool.reqAjax(f,n,0);
		},forEachListFile:(n,flag)=>{
			if(n>=dirList.length){
				tool.signMd5(0,0);
				return;
			}
			let dirItem=encodeURIComponent(dirList[n]);
			$.ajax({
				url: `${reqfile}${dirItem}&recursion=1&start=${flag}`,
				type: 'GET',
				dataType:'json',
				success:function(res){
					if(!res.errno){
						if(!res.list.length){
							tool.forEachListFile(n+1,0);
						}else{
							res.list.forEach(function(i){
								if(i.isdir){
 
								}else{
									fileList.push({
										path:i.path,
										size:i.size,
										fs_id:i.fs_id,
										md5:tool.encodeMd5(i.md5.toLowerCase())
									})
 
								}
							})
							tool.forEachListFile(n,flag+10000);
						}
					}else{
						fileList.push({
							path:dirList[n],
							isdir: 1,
							errno: res.errno,
						})
						tool.forEachListFile(n+1,0);
					}
				},
				error:function(code){
					fileList.push({
						path: dirList[n],
						isdir: 1,
						errno: res.errno,
					})
					tool.forEachListFile(n+1,0);
				}
			})
		},showSwalCreate:()=>{
			Swal.fire({
				title: "秒传生成中",
				html:"<p>正在生成第 <index>0</index> 个</p>",
				showCloseButton: false,
                allowOutsideClick: false,
                showConfirmButton:false,
				onBeforeOpen: function() {
					Swal.showLoading();
				}
			})
 
 
		},responseErrnoInfo:(err)=>{
			 switch (err) {
			        case 31045:
			        case -6:
			            return "身份验证失败,退出帐户,重新登陆";
			        case -7:
			            return "转存路径含有非法字符";
			        case -8:
			            return "路径下存在同名文件";
			        case -9:
			            return "验证已过期, 请刷新页面";
			        case 400:
			            return "请求错误";
			        case 9019:
			        case 403:
			            return "接口限制访问";
			        case 404:
			            return "原始文件不存在秒传未生效";
			        case 114:
			            return "秒传失败";
			        case 514:
			            return "请求失败";
			        case 1919:
			            return "文件已被和谐";
			        case 996:
			            return "md5获取失败";
			        case 2:
			            return "参数错误";
			        case -10:
			            return "网盘容量已满";
			        case 500:
			        case 502:
			        case 503:
					case 31039:
			            return "服务器错误";
			        case 31066:
			        case 909:
			            return "路径不存在/云端文件已损坏";
			        case 900:
			            return "路径为文件夹, 不支持生成秒传";
			        case 110:
			            return "请先登录百度账号";
			        case 9013:
			            return "账号被限制, 尝试 更换账号 或 等待一段时间再重试";
			        default:
			            return "未知错误";
			    }
		},createErrFileList:(err,flag)=>{
			let html='<div class="createBox" style="height:auto; max-height:200px;overflow:auto;background:#FFFFFF;">';
			if(err>0){
				if(flag){
					html+=`<div><summary ><b class="showErrBtn" style="cursor:pointer">失败文件列表(点这里看失败原因):</b><a  class="mCopyList">复制列表</a></summary></div>`;
					html+=`<div style="display:none" class="errBox">`;
					for (let i=0;i<fileList.length;i++) {
						let f=fileList[i];
                        if(f.errno !=undefined && f.errno !='' && f.errno !=0){
                            errList+=`${f.path}(${f.errno})${tool.responseErrnoInfo(f.errno)}\n`;
                            html+='<p style="font-size:12px;line-height:22px">'+f.path+'<span class="redLink">('+f.errno+')'+tool.responseErrnoInfo(f.errno)+'</span></p>'
                        }
					}
					html+=`</div>`;
				}else{
					html+=`<div><summary ><b class="showErrBtn" style="cursor:pointer">失败文件列表(点这里看失败原因):</b><a  class="mCopyList">复制重新转存</a></summary></div>`;
					html+=`<div style="display:none" class="errBox">`;
					for (let i=0;i< linkList.length;i++) {
						let f=linkList[i];
                          if(f.errno !=undefined && f.errno !='' && f.errno !=0){
                            errList+=`${f.md5}#${f.md5s}#${f.size}#${f.path}\n`;
                            html+='<p style="font-size:12px;line-height:22px">'+f.path+'<span class="redLink">('+f.errno+')'+tool.responseErrnoInfo(f.errno)+'</span></p>'
                        }
 
					}
					html+=`</div>`;
				}
 
			}
			html+=`<br/>`;
			if(upresponse && upresponse.result){
				html+=upresponse.result;
			}
			if(flag){
				html+=`<p>快去复制秒传代码吧!!!</p></div>`
			}else{
				html+=`<p>快去刷新页面查看文件吧!!!</p></div>`
			}
 
			return html;
		},showOverSwal:()=>{
			let err=0,success='',ucode='',ecode='https://pan.baidu.com/#bdlink=';
			for (let i=0;i<fileList.length;i++) {
				let f=fileList[i];
				if(f.errno || f.isdir==1){
					err++;
				}else{
					success+='<p>'+f.path+'</p>';
                    if(f.md5s){
                        ucode+=`${f.md5}#${f.md5s}#${f.size}#${f.path}\n`;
                    }else{
                        ucode+=`${f.md5}#${f.size}#${f.path}\n`;
                    }
				}
			}
			let title="生成完成 共"+fileList.length+"个,失败"+err+"个";
			let html=tool.createErrFileList(err,true);
			Swal.fire({
				title: title,
				html:html,
                allowOutsideClick: false,
				showCloseButton: true,
				showConfirmButton:true,
				confirmButtonText:"复制秒传代码",
				showDenyButton:true,
				denyButtonText:"提取一键秒传代码",
				preDeny:function(){
					let newCode=ucode.replace(/(#\/.+\/)|(#\/)/g, "#");
					GM_setClipboard(ecode+Base64.encode(newCode));
					Swal.getDenyButton().innerText="一键秒传提取成功";
					return false;
				},
				preConfirm:function(){
					GM_setClipboard(ucode.replace(/(#\/.+\/)|(#\/)/g, "#"));
					Swal.getConfirmButton().innerText="复制成功";
					return false;
				}
 
			})
			fileList=[];dirList=[];
			tool.removeBtn();
			//添加事件
			tool.addEventBtn();
		},removeBtn:()=>{
			let mbtn1=GM_getValue('MBTN1');
			let mbtn2=GM_getValue('MBTN2');
			let mbtn3=GM_getValue('MBTN3');
			try{
				if(mbtn1) $(".mPbox1").remove();
				if(mbtn2) $(".mPbox2").remove();
				if(mbtn3) $(".mPbox3").remove();
			}catch(e){
				//TODO handle the exception
			}
 
 
		},addEventBtn:()=>{
			try{
				$(".mbtn1").click(function(){
					GM_setValue('MBTN1',1);
					$(".mPbox1").remove();
				})
				$(".mbtn2").click(function(){
					GM_setValue('MBTN2',1);
					$(".mPbox2").remove();
				})
				$(".mbtn3").click(function(){
					GM_setValue('MBTN3',1);
					$(".mPbox3").remove();
				})
				$(".showErrBtn").click(function(){
					if($(".errBox").is(':visible')){
						$(".errBox").hide();
					}else{
						$(".errBox").show();
					}
				})
				$(".mCopyList").click(function(){
					GM_setClipboard(errList);
					$(this).html('已复制');
				})
			}catch(e){
				//TODO handle the exception
			}
		},updateInfo:(data)=>{
			Swal.fire({
				title: "百度网盘秒传链接提取 v" + GM_info.script.version,
				showCloseButton: true,
				allowOutsideClick: false,
				confirmButtonText: "知道了",
				html:data
			}).then(function(res) {
				GM_setValue('BAIDUWPUPDATEINFO',tool.timeStamp());
			});
		}
	}
	function init(){
		//检查是否一键秒传代码
		 let base64code = location.href.match(/#bdlink=([\da-zA-Z+/=]+)/);
		 if(base64code) base64code=base64code[1];
		 if(base64code){
			GM_setValue('BASE64CODELINK',base64code);
		 }
		if (["interactive", "complete"].includes(document.readyState)){
			main();
		}
		else{
			window.addEventListener("DOMContentLoaded", main);
		}
 
 
	}
 
 
 
	function main() {
		GM_addStyle(
			`#btn-resp button,#btn-create button{line-height: 1;white-space: nowrap;cursor: pointer;outline: 0; margin: 0; transition: 0.1s;color: #fff; background-color: #06a7ff;font-weight: 700; padding: 8px 16px;height: 32px;font-size: 14px; border-radius: 16px;margin-left: 8px;    border: none;} .createBox p{line-height: 35px;} .myDidplayBtn{text-align: center;font-size: .85em;color: #09aaff;border: 2px solid #c3eaff;border-radius: 4px;margin-left: 5px;padding: 10px;padding-top: 5px;padding-bottom: 5px;cursor: pointer;} .redLink{color:red}`
			)
		 tool.loadAlert();
		let baiduCla = tool.baiduClass();
		if (baiduCla == "main" || baiduCla=="home") {
			// 创建按钮 START
			let btnResp = document.createElement('a');
			btnResp.id = btnRespConf.id;
			btnResp.title = btnRespConf.text;
			btnResp.innerHTML = btnRespConf.html(baiduCla);
			btnResp.addEventListener('click', function(e) {
				tool.inputUserValue();
				e.preventDefault();
			});
			bdstoken =baiduCla=='home' ? locals.get('bdstoken') : unsafeWindow.locals.userInfo.bdstoken;
			let btnCreate = document.createElement('a');
			btnCreate.id = btnCreateConf.id;
			btnCreate.title = btnCreateConf.text;
			btnCreate.innerHTML = btnCreateConf.html(baiduCla);
			btnCreate.addEventListener('click', function(e) {
                checkFileList=tool.getCheckFile(baiduCla);
				if(checkFileList.length<=0){
					Swal.fire({
					title: "错误提醒",
					html:"请勾选要生成秒传的文件/文件夹",
					confirmButtonText: '确定',
					showCloseButton: true
					})
					return '';
				}
				for (let i=0;i<checkFileList.length;i++) {
					if(checkFileList[i].isdir){
						dirList.push(checkFileList[i].path);
					}else{
						fileList.push({
							path:checkFileList[i].path,
							size:checkFileList[i].size,
							fs_id:checkFileList[i].fs_id,
							md5:tool.encodeMd5(checkFileList[i].md5.toLowerCase())
						})
					}
				}
				if(dirList.length>0){
					Swal.fire({
					 icon: "info",
					        title: "包含文件夹, 是否递归生成?",
					        text: "若选是, 将同时生成各级子文件夹下的文件",
					        allowOutsideClick: false,
					        focusCancel: true,
					        showCancelButton: true,
					        reverseButtons: true,
					        showCloseButton: true,
					        confirmButtonText: "是",
					        cancelButtonText: "否",
					}).then(function(res) {
						if (!res.dismiss) {
							tool.forEachListFile(0,0);
							tool.showSwalCreate();
 
 
						}
					});
				}else{
					tool.showSwalCreate();
                    tool.signMd5(0,0);
				}
 
				e.preventDefault();
			});
 
			if(baiduCla=="home"){
				tool.sleep(800).then(()=>{
					let parent = null;
					let btnUpload = document.querySelector('[node-type=upload]'); // 管理页面:【上传】
                    btnUpload.style.maxWidth = '80px';
                    btnUpload.style.display = 'inline-block';
					parent = btnUpload.parentNode;
					parent.insertBefore(btnResp, parent.childNodes[1]);
					parent.insertBefore(btnCreate, parent.childNodes[1]);
				})
 
 
			}else{
				let btnUpload;
				btnUpload = document.querySelector(
					"[class='nd-file-list-toolbar nd-file-list-toolbar__actions inline-block-v-middle']");
				if (btnUpload) {
					btnResp.style.cssText = 'margin-right: 5px;';
					btnCreate.style.cssText = 'margin-right: 5px;';
 
					btnUpload.insertBefore(btnResp, btnUpload.childNodes[0]);
					btnUpload.insertBefore(btnCreate, btnUpload.childNodes[0]);
				} else {
					btnUpload = document.querySelector(
						"[class='wp-s-agile-tool-bar__header  is-default-skin is-header-tool']");
					if (!btnUpload) {
						btnUpload = document.querySelector("[class='wp-s-agile-tool-bar__header  is-header-tool']");
					}
					let parentDiv = document.createElement('div');
					parentDiv.className = 'wp-s-agile-tool-bar__h-action is-need-left-sep is-list';
					parentDiv.style.cssText = 'margin-right: 10px;';
					parentDiv.insertBefore(btnResp, parentDiv.childNodes[0]);
					parentDiv.insertBefore(btnCreate, parentDiv.childNodes[0]);
					btnUpload.insertBefore(parentDiv, btnUpload.childNodes[0]);
				}
			}
 
			let base64code=GM_getValue('BASE64CODELINK');
			if(base64code){
				base64code=Base64.decode(base64code);
				if(typeof swal === 'undefined'){
					tool.sleep(1000).then(()=>{
						tool.inputUserValue(base64code);
						GM_setValue('BASE64CODELINK','');
						updateVersion(true);
					})
				}else{
					tool.inputUserValue(base64code);
				    GM_setValue('BASE64CODELINK','');
				    updateVersion(true);
				}
 
 
			}else{
				updateVersion(false);
			}
 
 
		}
	}
 
	function updateVersion(flag){
		//判断是否更新
		var isUpdateInfo= GM_getValue('BAIDUWPUPDATEINFO') || 0;
		tool.get(`${updateApi}?version=`+GM_info.script.version).then((res)=>{
			try{
				upresponse=res;
				if(!flag){
					let nowTime=tool.timeStamp();
					let isdiff=isUpdateInfo+60*24*1000;
					if(res.code==1 && nowTime>isdiff){
						tool.updateInfo(res.data);
						tool.removeBtn();
						//添加事件
						tool.addEventBtn();
					}else if(res.code==2 && nowTime>(isUpdateInfo+24*60*5*1000)){
						tool.updateInfo(res.data);
						tool.removeBtn();
						//添加事件
						tool.addEventBtn();
					}
				}
			}catch(e){
				//TODO handle the exception
			}
		})
	}
 
 
 
	function savePathList(i, labFig) {
		if (i >= linkList.length) {
			let html=tool.createErrFileList(failed,false);
			Swal.fire({
				title: "".concat('文件转存').concat(linkList.length, '个,').concat(failed, "个失败!"),
				confirmButtonText: '确定',
                allowOutsideClick: false,
                showCloseButton: true,
				html:html
			})
			failed = 0;
			linkList=[];
			tool.removeBtn();
			//添加事件
			tool.addEventBtn();
			return;
		}
 
		var f = linkList[i];
		Swal.getHtmlContainer().querySelector("index").textContent=i+1+"/"+linkList.length;
        f.path.replace(/["\\\:*?<>|]/, "");
 
        if(f.md5s){
             tool.post(`https://pan.baidu.com/api/rapidupload?bdstoken=${bdstoken}`,{
                rtype:0,
				path: inputSavePath + '/' + f.path,
                "content-md5": f.md5,
                "slice-md5": f.md5s.toLowerCase(),
                "content-length": f.size,
			},{"User-Agent":"netdisk;2.2.51.6;netdisk;10.0.63;PC;android-android;QTP/1.0.32.2"}).then((res)=>{
                 if(res.errno===0){
					f.errno = 0;
					savePathList(i+1,0);
				 }else{
					if (res.errno === 404 && labFig < 2) {
						 if(labFig==1){
							  f.md5=tool.randMd5(f.md5);
						 }else{
							  f.md5=tool.charRecoveStr(f.md5);
						 }
						 savePathList(i, labFig + 1);
					}else if (res.errno === 31039 && labFig < 2) {
						 f.path=tool.changePath(f.path);
						 savePathList(i, labFig + 1);
					}else{
					   failed++;
					   f.errno=res.errno;
					   savePathList(i+1,0);
					}
					 
				 }
             
        })
        }else{
            $.ajax({
			url: `${reqstr}&bdstoken=${bdstoken}`,
			type: 'POST',
			data: {
				block_list: JSON.stringify([f.md5.toLowerCase()]),
				path: inputSavePath + '/' + f.path,
				size: f.size,
				isdir: 0,
				rtype: 0,
				is_revision: 0
			}
		}).success(function(r) {
                f.errno = r.errno;
 
		}).fail(function(r) {
			linkList[i].errno = 115;
		}).always(function() {
			if (linkList[i].errno === -8 && labFig < 1) {
                 f.path='copy_'+f.path;
				savePathList(i, labFig + 1);
				return;
			} else if (linkList[i].errno) {
				failed++;
			}
			savePathList(i + 1, 0);
		});
        }
 
 
 
	}
 
 
		 // 绑定入口函数到dom事件
        try {
		    init();
        }catch (err) {
            console.log('脚本冲突或者被拦截',err);
        }
	
 
}();