// ==UserScript== // @name 百度网盘秒传转存助手 支持PC及移动端 永久无广告绿色版 // @version 3.1.5 // @author tousakasp // @description 百度网盘秒传链接转存及生成 永久无广告绿色版 支持移动端界面 -- 再次感谢初代大佬伟大贡献 // @match *://pan.baidu.com/disk/home* // @match *://pan.baidu.com/disk/main* // @match *://pan.baidu.com/disk/synchronization* // @match *://pan.baidu.com/s/* // @match *://yun.baidu.com/disk/home* // @match *://yun.baidu.com/disk/main* // @match *://yun.baidu.com/disk/synchronization* // @match *://yun.baidu.com/s/* // @match *://wangpan.baidu.com/disk/home* // @match *://wangpan.baidu.com/disk/main* // @match *://wangpan.baidu.com/disk/synchronization* // @match *://wangpan.baidu.com/s/* // @match *://pan.baidu.com/wap/home* // @license GPLv3 // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABBUlEQVR4AZTTJRBUURTH4TtDwXuPdPrgbhHXiksf3CPucRNScHd3d3d3uO9bKeu7b79+fun8Q17CNHyMMUqaiPE4fEyYVjjGNKnNwQ4lpgV8lManEfwfosLHEGPU1N3ZnAv4qlT+NiQ56uPWSjKBrztUSnIaB66sY1vgxgxoMXB5NbsCB9rxcB5fN2M5/16nCFxeS6YTezpzsB1Pu/C2O7/78/99eYBYHXh+gqdHObGIK4GHgevjVIt1AgAnhvE4cGe8euoHbizgYuD2RGgx8O0RpwIPRmsmJDGqcrANd3pLo/qVr03hUlcpfSwf0/vD3JwkPdPK5/zhkOz+/f1FIDv/RcnOAEjywH/DhgADAAAAAElFTkSuQmCC // @namespace com.github.tousakasp // @homepageURL // @description:en input bdlink to get files or get bdlink for Baidu™ WebDisk. // @compatible firefox Violentmonkey // @compatible firefox Tampermonkey // @compatible chrome Violentmonkey // @compatible chrome Tampermonkey // @compatible edge Violentmonkey // @compatible edge Tampermonkey // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_setClipboard // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @grant unsafeWindow // @run-at document-body // @connect baidu.com // @connect baidupcs.com // @connect unpkg.com // @connect * // @downloadURL https://raw.githubusercontent.com/tousakasp/rapid-upload-userscript-rinsp/main/dist/%E7%A7%92%E4%BC%A0%E8%BD%AC%E5%AD%98%E5%8A%A9%E6%89%8B.user.js // @updateURL https://cdn.jsdelivr.net/gh/tousakasp/rapid-upload-userscript-rinsp@main/dist/%E7%A7%92%E4%BC%A0%E8%BD%AC%E5%AD%98%E5%8A%A9%E6%89%8B.user.js // @require https://unpkg.com/jquery@3.7.0/dist/jquery.min.js // @require https://unpkg.com/js-base64@3.7.5/base64.js // @require https://unpkg.com/sweetalert2@11.4.8/dist/sweetalert2.min.js // @require https://unpkg.com/spark-md5@3.0.2/spark-md5.min.js // ==/UserScript== /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ 65: /***/ ((module) => { module.exports = ".mzf_btn{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}.mzf_btn2{text-align:center;color:#09aaff;margin-left:5px;cursor:pointer}.mzf_link{font-family:inherit;color:#09aaff;text-decoration:none;vertical-align:baseline}.mzf_text{font-feature-settings:\"lnum\";-webkit-font-smoothing:antialiased;font-family:inherit;color:#545454;font-weight:400;word-break:break-word;-webkit-tap-highlight-color:transparent;margin:0;padding:0;width:100%;height:34px;display:block;line-height:34px;text-align:center;white-space:nowrap}.mzf_arrow{margin-right:5px;transform:rotate(180deg);transition:transform .2s;fill:none;stroke:gray}.mzf_details{cursor:pointer}.mzf_details summary{white-space:nowrap}.mzf_content{max-height:0;margin:0;transition:max-height .5s;overflow:hidden}.mzf_details[open]>summary>svg{transform:rotate(0deg)}.mzf_details[open]+.mzf_content{max-height:100%}.mzf_html_container{grid-template-columns:minmax(0, 100%);align-self:center;justify-self:center;width:32em;max-width:100%}.mzf_updateInfo{border:1px #000;width:100%;margin:0 auto;text-align:left}.mzf_updateInfo dl{display:flex;flex-wrap:wrap;line-height:26px}.mzf_updateInfo dl>dt{font-family:monospace;font-size:.9em;color:#186a8c;flex-basis:3em;flex-grow:0;flex-shrink:0}.mzf_updateInfo dl>dt~dt,.mzf_updateInfo dl>dt~dt+dd{margin-top:.3em;border-top:1px solid #ccc}.mzf_updateInfo dl>dd{flex:1}.mzf_updateInfo dl>dd+dd{padding-left:3em;flex-basis:100%}.mzf_updateInfo span{vertical-align:baseline}" /***/ }), /***/ 184: /***/ ((module) => { module.exports = "
\r\n
\r\n

更新日志:

\r\n
\r\n
3.1.5
\r\n
改善错误信息
\r\n
\r\n\r\n
3.1.4
\r\n
改用unpkg cdn
\r\n
\r\n\r\n
3.1.3
\r\n
转存全失败时不添加打开目录按钮
\r\n
外部库切换为使用CDN
\r\n
更正代码内元数据
\r\n
\r\n\r\n
3.1.2
\r\n
(只改名)
\r\n
\r\n\r\n
3.1.1
\r\n
修正移动版保存路径无效问题
\r\n
\r\n\r\n
3.0.9
\r\n
有限度支持移动端界面
\r\n
提醒20G及短链不支持 (256K以内支持)
\r\n
\r\n\r\n
3.0.8
\r\n
修正生成重试时小BUG
\r\n
\r\n\r\n
3.0.7
\r\n
优化秒传生成稳定性
\r\n
\r\n \r\n
3.0.6
\r\n
秒传支持空目录 (文件夹结构使用时)
\r\n
增加随机大小写尝试次数
\r\n
\r\n \r\n
3.0.5
\r\n
提高旧秒传兼容性
\r\n
\r\n \r\n
3.0.4
\r\n
(没有发布)
\r\n
\r\n \r\n
3.0.3
\r\n
改用rapidupload接口
\r\n
\r\n \r\n
3.0.2
\r\n
3.0.2 修正404时正确报错
\r\n
\r\n \r\n
3.0.1
\r\n
拒绝短秒传输入
\r\n
\r\n \r\n
3.0.0
\r\n
挽救秒传功能
\r\n
\r\n
\r\n
\r\n
" /***/ }), /***/ 149: /***/ ((module) => { module.exports = "/*自定义单选框样式*/\r\n.mzf_check {\r\n display: inline-block;\r\n background-color: white;\r\n border-radius: 5px;\r\n border: 1px solid #d3d3d3;\r\n width: 20px;\r\n height: 20px;\r\n text-align: center;\r\n vertical-align: middle;\r\n line-height: 20px;\r\n margin-left: 10px;\r\n}\r\n.mzf_check_ori:checked + .mzf_check {\r\n background-color: #eee;\r\n}\r\n.mzf_check_ori:checked + .mzf_check::after {\r\n content: \"✓\";\r\n}\r\n.mzf_check_ori {\r\n display: none;\r\n}\r\n\r\n/*新版度盘页面的按钮样式(直接拷贝)*/\r\n.mzf_new_btn {\r\n -webkit-text-size-adjust: 100%;\r\n -webkit-font-smoothing: antialiased;\r\n -webkit-tap-highlight-color: transparent;\r\n vertical-align: middle;\r\n font: inherit;\r\n overflow: visible;\r\n text-transform: none;\r\n font-family: SFUIText, PingFangSC-Regular, Helvetica Neue, Helvetica, Arial,\r\n sans-serif;\r\n display: inline-block;\r\n line-height: 1;\r\n white-space: nowrap;\r\n cursor: pointer;\r\n background: #fff;\r\n text-align: center;\r\n box-sizing: border-box;\r\n outline: 0;\r\n margin: 0;\r\n transition: 0.1s;\r\n color: #fff;\r\n background-color: #06a7ff;\r\n font-weight: 700;\r\n padding: 8px 24px;\r\n height: 32px;\r\n font-size: 14px;\r\n border-radius: 16px;\r\n border: none;\r\n margin-left: 8px;\r\n}\r\n#mzf-rapid-input.swal2-textarea {\r\n height: 10em;\r\n}" /***/ }), /***/ 825: /***/ ((module) => { module.exports = "#gen_bdlink_btn {\r\n display: none;\r\n font-size: .28rem;\r\n padding: 0.3em;\r\n color: #a57406;\r\n}\r\nheader[style=\"display: none;\"] ~ #gen_bdlink_btn {\r\n display: inline-block;\r\n position: fixed;\r\n top: 0.4em;\r\n left: 3.5em;\r\n z-index: 99999;\r\n}\r\n#gen_bdlink_btn.mobile-share-page {\r\n display: inline-block;\r\n position: fixed;\r\n top: 0.7em;\r\n right: 1.3em;\r\n z-index: 99999;\r\n}\r\n#gen_bdlink_btn:after {\r\n content: \"\\26A1生成\";\r\n}\r\nhtml.swal2-shown {\r\n font-size: 16px !important;\r\n}\r\n.mzf_new_btn {\r\n padding: 3px 9px;\r\n}\r\n.swal2-title {\r\n font-size: 1.5rem;\r\n}\r\n.mzf_updateInfo {\r\n font-size: 1rem;\r\n}" /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be in strict mode. (() => { "use strict"; // EXTERNAL MODULE: ./src/css/app.css var app = __webpack_require__(149); var app_default = /*#__PURE__*/__webpack_require__.n(app); // EXTERNAL MODULE: ./src/css/mobile-app.css var mobile_app = __webpack_require__(825); var mobile_app_default = /*#__PURE__*/__webpack_require__.n(mobile_app); // EXTERNAL MODULE: ./src/css/app.scss var css_app = __webpack_require__(65); var css_app_default = /*#__PURE__*/__webpack_require__.n(css_app); ;// CONCATENATED MODULE: ./src/common/const.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 存放各种全局常量对象 */ var version = "3.1.5"; // 当前版本号 var updateDate = "23.6.25"; // 更新弹窗显示的日期 var updateInfoVer = "3.1.4"; // 更新弹窗的版本, 没必要提示的非功能性更新就不弹窗了 var swalCssVer = "3.1.3"; // 由于其他主题的Css代码会缓存到本地, 故更新主题包版本(url)时, 需要同时更新该字段以刷新缓存 var locUrl = location.href; var baiduMobilePage = "baidu.com/wap/home"; var baiduNewPage = "baidu.com/disk/main"; // 匹配新版度盘界面 var baiduSyncPage = "baidu.com/disk/synchronization"; // 匹配同步空间 var baiduSharePage = "baidu.com/s/"; // 匹配分享页 var TAG = "[秒传转存助手 mod by tousakasp]"; var ajaxError = 514; // 自定义ajax请求失败时的错误码(不能与http statusCode冲突) var bdlinkPrefix = "https://pan.baidu.com/#bdlink="; // 一键秒传链接的前缀 var commandList = ["set", "gen", "info"]; // 转存输入框内支持输入的命令 var UA = "netdisk;"; // 自定义User-Agent var extCssUrl = { Default: "https://unpkg.com/@sweetalert2/theme-default@5.0.15/default.min.css", Dark: "https://unpkg.com/@sweetalert2/theme-dark@5.0.15/dark.min.css", "WordPress Admin": "https://unpkg.com/@sweetalert2/theme-wordpress-admin@5.0.15/wordpress-admin.min.css", "Material UI": "https://unpkg.com/@sweetalert2/theme-material-ui@5.0.15/material-ui.min.css", Bulma: "https://unpkg.com/@sweetalert2/theme-bulma@5.0.15/bulma.min.css", "Bootstrap 4": "https://unpkg.com/@sweetalert2/theme-bootstrap-4@5.0.15/bootstrap-4.min.css", }; // 各主题包对应的url var appError = { SwalCssInvalid: "\u6837\u5F0F\u5305\u6570\u636E\u9519\u8BEF, \u81EA\u52A8\u4F7F\u7528\u5185\u7F6E\u6837\u5F0F (\u8BF7\u70B9\u786E\u5B9A)", SwalCssErrReq: "\u6837\u5F0F\u5305\u52A0\u8F7D\u5931\u8D25, \u81EA\u52A8\u4F7F\u7528\u5185\u7F6E\u6837\u5F0F (\u8BF7\u70B9\u786E\u5B9A), \u9519\u8BEF\u4EE3\u7801: ", ClipboardPremissionErr: '使用 "监听剪贴板" 功能需要允许剪贴板权限!\n该功能只支持Chrome系/Edge/Opera浏览器, 不支持Firefox, 同时注意使用https访问页面 (http访问会导致浏览器直接禁止剪贴板权限)', }; // 主程序异常 var docPrefix2 = "https://xtsat.github.io/rapid-upload-userscript-doc/document"; var doc2 = { shareDoc: docPrefix2 + "/FAQ/\u9519\u8BEF\u4EE3\u7801", linkTypeDoc: docPrefix2 + "/Info/\u79D2\u4F20\u683C\u5F0F", bdlinkDoc: docPrefix2 + "/\u79D2\u4F20\u94FE\u63A5\u751F\u6210/\u4E00\u952E\u79D2\u4F20", }; // 文档载点2 var linkStyle = 'class="mzf_link" rel="noopener noreferrer" target="_blank"'; var btnStyle = 'class="mzf_btn" rel="noopener noreferrer" target="_blank"'; var bdlinkPattern = /#bdlink=([\da-zA-Z+/=]+)/; // b64可能出现的字符: 大小写字母a-zA-Z, 数字0-9, +, /, = (=用于末尾补位) var htmlDocument = "

\u79D2\u4F20\u65E0\u6548,\u9632\u548C\u8C10\u7B49 \u53EF\u53C2\u8003\u79D2\u4F20\u6587\u6863\u8F7D\u70B9

"; var htmlAboutBdlink = "\u4EC0\u4E48\u662F\u4E00\u952E\u79D2\u4F20?: \u6587\u6863\u8F7D\u70B9"; var copyFailList = '复制列表'; var copyFailBranchList = '复制列表'; var copySuccessList = '复制列表'; ;// CONCATENATED MODULE: ./src/common/duParser.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 各种解析器 */ /** * @description: 从url中解析秒传链接 */ function parseQueryLink(url) { var bdlinkB64 = url.match(bdlinkPattern); return bdlinkB64 ? bdlinkB64[1].fromBase64() : ""; } /** * @description: 秒传链接解析器 */ function DuParser() { } DuParser.parse = function generalDuCodeParse(szUrl) { var r; if (szUrl.indexOf("bdpan") === 0) { r = DuParser.parseDu_v1(szUrl); r.ver = "PanDL"; } else if (szUrl.indexOf("BaiduPCS-Go") === 0) { r = DuParser.parseDu_v2(szUrl); r.ver = "PCS-Go"; } else if (szUrl.indexOf("BDLINK") === 0) { r = DuParser.parseDu_v3(szUrl); r.ver = "游侠 v1"; } else { r = DuParser.parseDu_v4(szUrl); r.ver = "梦姬标准"; } return r; }; DuParser.parseDu_v1 = function parseDu_v1(szUrl) { return szUrl .replace(/\s*bdpan:\/\//g, " ") .trim() .split(" ") .map(function (z) { return z .trim() .fromBase64() .match(/([\s\S]+)\|([\d]{1,20})\|([\da-f]{32})\|([\da-f]{32})/i); }) .filter(function (z) { return z; }) .map(function (info) { return { md5: info[3], md5s: info[4], size: Number.parseInt(info[2]), path: info[1], }; }); }; DuParser.parseDu_v2 = function parseDu_v2(szUrl) { return szUrl .split("\n") .map(function (z) { // unsigned long long: 0~18446744073709551615 return z .trim() .match(/-length=([\d]{1,20}) -md5=([\da-f]{32}) -slicemd5=([\da-f]{32})[\s\S]+"([\s\S]+)"/i); }) .filter(function (z) { return z; }) .map(function (info) { return { md5: info[2], md5s: info[3], size: Number.parseInt(info[1]), path: info[4], }; }); }; DuParser.parseDu_v3 = function parseDu_v3(szUrl) { var raw = atob(szUrl.slice(6).replace(/\s/g, "")); if (raw.slice(0, 5) !== "BDFS\x00") { return null; } var buf = new SimpleBuffer(raw); var ptr = 9; var arrFiles = []; var fileInfo, nameSize; var total = buf.readUInt(5); var i; for (i = 0; i < total; i++) { // 大小 (8 bytes) // MD5 + MD5S (0x20) // nameSize (4 bytes) // Name (unicode) fileInfo = {}; fileInfo.size = buf.readULong(ptr + 0); fileInfo.md5 = buf.readHex(ptr + 8, 0x10); fileInfo.md5s = buf.readHex(ptr + 0x18, 0x10); nameSize = buf.readUInt(ptr + 0x28) << 1; fileInfo.nameSize = nameSize; ptr += 0x2c; fileInfo.path = buf.readUnicode(ptr, nameSize); arrFiles.push(fileInfo); ptr += nameSize; } return arrFiles; }; DuParser.parseDu_v4 = function parseDu_v3(szUrl) { var err_20g = []; var err_short = []; var list = szUrl .split("\n") .map(function (z) { return z .trim() .match(/^([\da-f]{9}[\da-z][\da-f]{22})(?:#([\da-f]{9}[\da-z][\da-f]{22}))?#([\d]{1,20})#([\s\S]+)/i); // 22.8.29新增支持第10位为g-z的加密md5, 输入后自动解密转存 }) .filter(function (z) { return z; }) .map(function (info, i) { var md5 = decryptMd5(info[1].toLowerCase()); var md5s = info[2] ? decryptMd5(info[2].toLowerCase()) : null; var fs = Number.parseInt(info[3]); if (md5s == null) { // 256KiB means md5s = md5 if (fs <= 262144) { md5s = md5; } else { err_short.push(i); return null; } } if (fs > 21474836480) { // over 20GiB not supported err_20g.push(i); return null; } return { // 标准码 / 短版标准码(无md5s) md5: md5, md5s: md5s, size: fs, path: info[4], }; }); if (err_short.length > 0) { throw "百度不再支持秒传短链"; } else if (err_20g.length > 0) { throw "百度不再支持超过20G单的文件"; } return list; }; /** * 一个简单的类似于 NodeJS Buffer 的实现. * 用于解析游侠度娘提取码。 * @param {SimpleBuffer} */ function SimpleBuffer(str) { this.fromString(str); } SimpleBuffer.toStdHex = function toStdHex(n) { return ("0" + n.toString(16)).slice(-2); }; SimpleBuffer.prototype.fromString = function fromString(str) { var len = str.length; this.buf = new Uint8Array(len); for (var i = 0; i < len; i++) { this.buf[i] = str.charCodeAt(i); } }; SimpleBuffer.prototype.readUnicode = function readUnicode(index, size) { if (size & 1) { size++; } var bufText = Array.prototype.slice .call(this.buf, index, index + size) .map(SimpleBuffer.toStdHex); var buf = [""]; for (var i = 0; i < size; i += 2) { buf.push(bufText[i + 1] + bufText[i]); } return JSON.parse('"' + buf.join("\\u") + '"'); }; SimpleBuffer.prototype.readNumber = function readNumber(index, size) { var ret = 0; for (var i = index + size; i > index;) { ret = this.buf[--i] + ret * 256; } return ret; }; SimpleBuffer.prototype.readUInt = function readUInt(index) { return this.readNumber(index, 4); }; SimpleBuffer.prototype.readULong = function readULong(index) { return this.readNumber(index, 8); }; SimpleBuffer.prototype.readHex = function readHex(index, size) { return Array.prototype.slice .call(this.buf, index, index + size) .map(SimpleBuffer.toStdHex) .join(""); }; // EXTERNAL MODULE: ./src/components/updateInfo.html var updateInfo = __webpack_require__(184); var updateInfo_default = /*#__PURE__*/__webpack_require__.n(updateInfo); ;// CONCATENATED MODULE: ./src/common/swalConfig.tsx /* * @Author: mengzonefire * @Date: 2021-08-26 12:16:57 * @LastEditTime: 2023-02-18 21:27:36 * @LastEditors: mengzonefire * @Description: 存放各Swal弹窗的固定参数配置 */ var SwalConfig = { inputView: { title: "请输入秒传&保存路径", showCancelButton: true, html: "\n ", confirmButtonText: "确定", cancelButtonText: "取消", customClass: { htmlContainer: "mzf_html_container" }, }, processView: { showCloseButton: true, showConfirmButton: false, allowOutsideClick: false, }, finishView: { showCloseButton: true, allowOutsideClick: false, }, genUnfinish: { title: "检测到上次未完成的秒传任务", text: "是否继续该任务?", showCancelButton: true, allowOutsideClick: false, confirmButtonText: "是", cancelButtonText: "否", }, genUnfinish2: { title: "检测到上次未正常退出的秒传任务", text: "是否恢复该任务?", showCancelButton: true, allowOutsideClick: false, confirmButtonText: "是", cancelButtonText: "否", }, genView: { title: "请输入需要生成的文件路径", input: "textarea", showCancelButton: true, showCloseButton: true, inputPlaceholder: "[支持批量(换行分隔)]", confirmButtonText: "确定", cancelButtonText: "取消", inputValidator: function (value) { if (!value) { return "文件路径不能为空"; } }, }, updateInfo: { title: "\u79D2\u4F20\u94FE\u63A5\u63D0\u53D6 v" + version + " (" + updateDate + ")", showCloseButton: true, allowOutsideClick: false, confirmButtonText: "知道了", html: (updateInfo_default()), }, checkRecursive: { icon: "info", title: "包含文件夹, 是否递归生成?", text: "若选是, 将同时生成各级子文件夹下的文件", allowOutsideClick: false, focusCancel: true, showCancelButton: true, reverseButtons: true, showCloseButton: true, confirmButtonText: "是", cancelButtonText: "否", }, settingView: { title: "秒传链接提取 设置页", showCloseButton: true, showCancelButton: true, confirmButtonText: "确定", cancelButtonText: "取消", allowOutsideClick: false, html: " ", }, settingWarning: { title: "设置成功 刷新页面生效", showCloseButton: true, allowOutsideClick: false, confirmButtonText: "知道了", }, selectNoFileWarning: { title: "请勾选要生成秒传的文件/文件夹", icon: "error", showCloseButton: true, confirmButtonText: "知道了", }, }; ;// CONCATENATED MODULE: external "Swal" const external_Swal_namespaceObject = Swal; var external_Swal_default = /*#__PURE__*/__webpack_require__.n(external_Swal_namespaceObject); ;// CONCATENATED MODULE: ./src/common/swalBase.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 定义全套的前台弹窗逻辑, 在Swal的回调函数内调用***Task类内定义的任务代码 */ var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (undefined && undefined.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from) { for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) to[j] = from[i]; return to; }; var Swalbase = /** @class */ (function () { function Swalbase(rapiduploadTask, generatebdlinkTask) { this.rapiduploadTask = rapiduploadTask; this.generatebdlinkTask = generatebdlinkTask; } // 合并swal参数 Swalbase.prototype.mergeArg = function () { var inputArgs = []; for (var _i = 0; _i < arguments.length; _i++) { inputArgs[_i] = arguments[_i]; } var output = {}; var swalCfgArgs = { // 禁用backdrop动画, 阻止多次弹窗时的屏闪 showClass: { backdrop: "swal2-noanimation" }, hideClass: { backdrop: "swal2-noanimation" }, }; $.extend.apply($, __spreadArray([output, this.swalGlobalArgs, swalCfgArgs], inputArgs)); return output; }; // 点击 "秒传链接" 后显示的弹窗 Swalbase.prototype.inputView = function (inputValue) { if (inputValue === void 0) { inputValue = ""; } return __awaiter(this, void 0, void 0, function () { var pathValue, preConfirm, willOpen; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!(GM_getValue("listen-clipboard") && !inputValue)) return [3 /*break*/, 2]; return [4 /*yield*/, parseClipboard()]; case 1: // 标志位true 且 inputValue为空(非一键秒传进入时) 从剪贴板读取有效的秒传链接 inputValue = _a.sent(); _a.label = 2; case 2: pathValue = GM_getValue("last_dir") || ""; preConfirm = function () { // 手动读取Multiple inputs内的数据, 由于未设置input参数, 原生Validator不生效, 自行添加Validator逻辑 inputValue = $("#mzf-rapid-input")[0].value; pathValue = $("#mzf-path-input")[0] .value.trim() .replace(/(\s+)?\/(\s+)?/g, "/"); // 修正不合规的路径(空白开头/结尾) if (!inputValue) { external_Swal_default().showValidationMessage("秒传不能为空"); return false; } if (commandList.includes(inputValue.trim())) { // 输入支持的命令, 跳出检查 inputValue = inputValue.trim(); return; } try { if (!DuParser.parse(inputValue).length) { external_Swal_default().showValidationMessage("

\u672A\u8BC6\u522B\u5230\u6B63\u786E\u7684\u94FE\u63A5 \u67E5\u770B\u652F\u6301\u683C\u5F0F

"); return false; } } catch (e) { external_Swal_default().showValidationMessage("

" + ('' + e) + "

"); return false; } if (pathValue.match(illegalPathPattern)) { external_Swal_default().showValidationMessage('保存路径不能含有字符\\":*?<>|, 示例:/GTA5/'); return false; } }; willOpen = function () { $("#swal2-html-container") .css("font-size", "1rem") .css("display", "grid") .css("margin", "0"); $("#mzf-rapid-input")[0].value = inputValue; $("#mzf-path-input")[0].value = pathValue; $("#mzf-rapid-input").on("input", function (event) { var result = parseQueryLink(event.target.value); if (DuParser.parse(result).length) event.target.value = result; }); // 绑定输入框事件, 输入一键秒传后尝试转换为普通秒传 }; external_Swal_default().fire(this.mergeArg(SwalConfig.inputView, { preConfirm: preConfirm, willOpen: willOpen, })).then(function (result) { if (result.isConfirmed) { if (inputValue === "set") _this.settingView(); else if (inputValue === "gen") _this.genView(); else if (inputValue === "info") _this.updateInfo(function () { }); else { _this.rapiduploadTask.reset(); _this.rapiduploadTask.fileInfoList = DuParser.parse(inputValue); GM_setValue("last_dir", pathValue); if (!pathValue) { // 路径留空 _this.rapiduploadTask.isDefaultPath = true; var nowPath = location.href.match(/path=(.+?)(?:&|$)/); if (nowPath) { pathValue = decodeURIComponent(nowPath[1]); } else { nowPath = location.href.match(/\/\/pan\.baidu\.com\/wap\/home#\/dir\/(.+?)(?:&|$)/); if (nowPath) { pathValue = decodeURIComponent(nowPath[1]); } else { pathValue = "/"; } } } if (pathValue.charAt(0) !== "/") pathValue = "/" + pathValue; // 补齐路径前缀斜杠 if (pathValue.charAt(pathValue.length - 1) !== "/") pathValue += "/"; // 补全路径结尾的斜杠 if (locUrl.includes(baiduSyncPage) && !pathValue.includes(syncPathPrefix)) pathValue = syncPathPrefix + pathValue; // 补全同步页路径前缀 console.log("\u79D2\u4F20\u6587\u4EF6\u4FDD\u5B58\u5230: " + pathValue); // debug _this.rapiduploadTask.savePath = pathValue; _this.processView(false); } } }); return [2 /*return*/]; } }); }); }; // 转存/生成过程中的弹窗 Swalbase.prototype.processView = function (isGen) { var _this = this; var swalArg = { title: isGen ? "秒传生成中" : "文件转存中", html: isGen ? "

正在生成第 0

正在获取文件列表...

" : "正在转存第 0 个", willOpen: function () { external_Swal_default().showLoading(); isGen || _this.saveFileWork(); }, }; external_Swal_default().fire(this.mergeArg(SwalConfig.processView, swalArg)); }; // 转存/生成秒传完成的弹窗 Swalbase.prototype.finishView = function (isGen) { var _this = this; var action = isGen ? "生成" : "转存"; var fileInfoList = isGen ? this.generatebdlinkTask.fileInfoList : this.rapiduploadTask.fileInfoList; var parseResult = parsefileInfo(fileInfoList); this.parseResult = parseResult; var checkboxArg = { input: "checkbox", inputValue: GM_getValue("with_path"), inputPlaceholder: "导出文件夹目录结构", }; // 全部失败不显示此checkbox, 22.5.22: 全部失败也显示 var html = (isGen ? htmlDocument : "") + // 生成模式下添加文档入口 (parseResult.htmlInfo && isGen ? "
" : "") + parseResult.htmlInfo; // 添加失败列表, 生成模式下添加顶部空行分隔 var htmlFooter = ""; if (htmlFooter) htmlFooter = "
" + htmlFooter; // 添加底部空行分隔 var successAny = fileInfoList.length - parseResult.failList.length > 0; var swalArg = __assign(__assign({ title: action + "\u5B8C\u6BD5 \u5171" + fileInfoList.length + "\u4E2A, \u5931\u8D25" + parseResult.failList.length + "\u4E2A!", confirmButtonText: isGen ? "复制秒传代码" : "确认", showDenyButton: isGen, denyButtonText: "复制一键秒传", denyButtonColor: "#ecae3c", reverseButtons: true, html: html + htmlFooter }, (isGen && checkboxArg)), { willOpen: function () { if (isGen) { GM_setValue("unClose", true); // 生成模式设置结果窗口未关闭的标记 } else if (successAny) { _this.addOpenDirBtn(); // 转存模式时添加 "打开目录" 按钮 } }, // 秒传生成的 "复制一键秒传" 按钮回调 preDeny: function () { var with_path = $("#swal2-checkbox")[0].checked; GM_setValue("with_path", with_path); if (!with_path) GM_setClipboard(bdlinkPrefix + parseResult.bdcode.replace(/0+#0+#0#.*\/(?:\n|$)/, '').replace(/\/.+\//g, "").toBase64()); // 去除目录结构, 并转换为一键秒传 else GM_setClipboard(bdlinkPrefix + parseResult.bdcode.toBase64()); // 转换为一键秒传 external_Swal_default().getDenyButton().innerText = "复制成功,点击右上关闭"; var footer = external_Swal_default().getFooter(); footer.innerHTML = htmlAboutBdlink; footer.style.display = "flex"; return false; }, preConfirm: function () { if (isGen) { // 生成模式, "复制秒传代码"按钮 var with_path = $("#swal2-checkbox")[0].checked; GM_setValue("with_path", with_path); if (!with_path) GM_setClipboard(parseResult.bdcode.replace(/0+#0+#0#.*\/(?:\n|$)/, '').replace(/(#\/.+\/)|(#\/)/g, "#")); // 去除秒传链接中的目录结构(仅保留文件名) else { var pathType = GM_getValue("pathType") === undefined ? "relative" : GM_getValue("pathType"); if ("absolute" === pathType) GM_setClipboard(parseResult.bdcode); // 保留完整的文件路径(绝对路径) else if ("relative" === pathType) { // 去除前置的路径以及路径开头的'/', 将绝对路径转换为相对路径 (默认执行) var localPathPrefix = ""; var nowPath = location.href.match(/path=(.+?)(?:&|$)/); if (nowPath) localPathPrefix = decodeURIComponent(nowPath[1]); GM_setClipboard(parseResult.bdcode.replace(new RegExp("(#" + localPathPrefix + "/)|(#/)", "g"), "#")); } } external_Swal_default().getConfirmButton().innerText = "复制成功,点击右上关闭"; return false; } else { // 转存模式, "确定" 按钮 refreshList(); // 调用刷新文件列表的方法 return undefined; } } }); external_Swal_default().fire(this.mergeArg(SwalConfig.finishView, swalArg)).then(function (result) { if (result.isDismissed || result.dismiss === (external_Swal_default()).DismissReason.close) { GM_deleteValue("unfinish"); // 点击了右上角的关闭按钮, 清除任务进度数据 GM_setValue("unClose", false); } }); }; // 生成文件夹秒传, 是否递归生成提示 Swalbase.prototype.checkRecursive = function () { var _this = this; external_Swal_default().fire(this.mergeArg(SwalConfig.checkRecursive)).then(function (result) { if (result.isConfirmed) { _this.generatebdlinkTask.recursive = true; } else if (result.dismiss === (external_Swal_default()).DismissReason.cancel) _this.generatebdlinkTask.recursive = false; else return; _this.processView(true); _this.generatebdlinkTask.scanFile(0); }); }; // 设置页 Swalbase.prototype.settingView = function () { var _this = this; var willOpen = function () { $("#swal2-html-container") .css("font-size", "1rem") .css("display", "grid") .css("margin", "0"); $("#mzf-theme")[0].value = GM_getValue("swalThemes") || "Default"; $("#mzf-pathType")[0].value = GM_getValue("pathType") || "relative"; $("#mzf-listen-clipboard")[0].checked = Boolean(GM_getValue("listen-clipboard")); }; var preConfirm = function () { return __awaiter(_this, void 0, void 0, function () { var error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: // 设置主题 GM_setValue("swalThemes", $("#mzf-theme")[0].value); // 设置生成秒传导出路径(相对/绝对) GM_setValue("pathType", $("#mzf-pathType")[0].value); if (!$("#mzf-listen-clipboard")[0].checked) return [3 /*break*/, 4]; _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, navigator.clipboard.readText()]; case 2: _a.sent(); GM_setValue("listen-clipboard", $("#mzf-listen-clipboard")[0].checked); return [3 /*break*/, 4]; case 3: error_1 = _a.sent(); showAlert(appError.ClipboardPremissionErr); return [2 /*return*/]; case 4: return [2 /*return*/]; } }); }); }; external_Swal_default().fire(this.mergeArg(SwalConfig.settingView, { willOpen: willOpen, preConfirm: preConfirm, })).then(function (result) { if (result.isConfirmed) external_Swal_default().fire(_this.mergeArg(SwalConfig.settingWarning)); }); }; // 生成页 (输入路径列表进行秒传生成) Swalbase.prototype.genView = function () { var _this = this; external_Swal_default().fire(this.mergeArg(SwalConfig.genView)).then(function (result) { if (result.isConfirmed) { _this.generatebdlinkTask.reset(); result.value.split("\n").forEach(function (filePath) { if (filePath.charAt(0) !== "/") filePath = "/" + filePath; // 补齐路径前缀斜杠 if (locUrl.includes(baiduSyncPage) && !filePath.includes(syncPathPrefix)) filePath = syncPathPrefix + filePath; // 补全同步页路径前缀 _this.generatebdlinkTask.fileInfoList.push({ path: filePath, }); }); _this.processView(true); // 显示进度弹窗 _this.genFileWork(false, true); // 跳过获取选择文件列表和扫描文件夹的步骤 _this.generatebdlinkTask.generateBdlink(0); // 开始生成任务 } }); }; // 生成秒传未完成任务提示 Swalbase.prototype.genUnfinish = function (onConfirm, onCancel) { external_Swal_default().fire(this.mergeArg(GM_getValue("unClose") ? SwalConfig.genUnfinish2 : SwalConfig.genUnfinish)).then(function (result) { if (result.isConfirmed) onConfirm(); else if (result.dismiss === (external_Swal_default()).DismissReason.cancel) onCancel(); }); }; // 生成秒传, 未选择任何文件的提示 Swalbase.prototype.selectNoFileWarning = function () { external_Swal_default().fire(this.mergeArg(SwalConfig.selectNoFileWarning)); }; // 更新信息页 Swalbase.prototype.updateInfo = function (onConfirm) { external_Swal_default().fire(this.mergeArg(SwalConfig.updateInfo)).then(function (result) { if (result.isConfirmed) onConfirm(); }); }; // 以下的方法都是任务操作逻辑, 不是弹窗逻辑 Swalbase.prototype.saveFileWork = function () { var _this = this; this.rapiduploadTask.onFinish = function () { return _this.finishView(false); }; this.rapiduploadTask.onProcess = function (i, fileInfoList) { external_Swal_default().getHtmlContainer().querySelector("file_num").textContent = i + 1 + " / " + fileInfoList.length; }; this.rapiduploadTask.start(); // 开始转存任务 }; Swalbase.prototype.genFileWork = function (isUnfinish, isGenView) { var _this = this; if (this.generatebdlinkTask.isSharePage) this.generatebdlinkTask.selectList = getShareFileList(); else if (!isGenView) this.generatebdlinkTask.selectList = getSelectedFileList(); if ( // 未选择文件 + 无未完成的生成任务 + 不在生成页 -> 弹出未选择生成文件的警告弹出 !this.generatebdlinkTask.selectList.length && !isGenView && !isUnfinish) { this.selectNoFileWarning(); return; } this.generatebdlinkTask.onProcess = function (i, fileInfoList) { external_Swal_default().getHtmlContainer().querySelector("file_num").textContent = i + 1 + " / " + fileInfoList.length; external_Swal_default().getHtmlContainer().querySelector("gen_prog").textContent = "0%"; }; this.generatebdlinkTask.onProgress = function (e, text) { if (text === void 0) { text = ""; } if (text) { // 显示自定义文本 external_Swal_default().getHtmlContainer().querySelector("gen_prog").textContent = text; return; } if (!e || typeof e.total !== "number") return; // 参数数据不正确 跳过 external_Swal_default().getHtmlContainer().querySelector("gen_prog").textContent = ((e.loaded / e.total) * 100).toFixed(0) + "%"; }; if (this.generatebdlinkTask.isSharePage) { this.generatebdlinkTask.onHasNoDir = function () { _this.processView(true); _this.generatebdlinkTask.scanShareFile(0); }; } else { this.generatebdlinkTask.onHasNoDir = function () { _this.processView(true); _this.generatebdlinkTask.generateBdlink(0); }; this.generatebdlinkTask.onHasDir = function () { return _this.checkRecursive(); }; } this.generatebdlinkTask.onFinish = function () { return _this.finishView(true); }; if (!isUnfinish && !isGenView) this.generatebdlinkTask.start(); // 执行新任务初始化 }; Swalbase.prototype.checkUnfinish = function () { var _this = this; if (GM_getValue("unfinish")) { this.genUnfinish(function () { _this.processView(true); _this.genFileWork(true, false); var unfinishInfo = GM_getValue("unfinish"); _this.generatebdlinkTask.fileInfoList = unfinishInfo.file_info_list; unfinishInfo.isCheckMd5 ? _this.generatebdlinkTask.checkMd5(unfinishInfo.file_id) : _this.generatebdlinkTask.generateBdlink(unfinishInfo.file_id); }, // 确认继续未完成任务 function () { GM_deleteValue("unfinish"); _this.genFileWork(false, false); } // 不继续未完成任务, 清除数据, 开启新任务 ); } else { this.genFileWork(false, false); } // 没有未完成任务, 直接开启新任务 }; // 添加 "打开目录" 按钮 Swalbase.prototype.addOpenDirBtn = function () { if (this.rapiduploadTask.isDefaultPath) return; // 转存路径留空, 跳出 var _dir = (this.rapiduploadTask.savePath || "").replace(/\/$/, ""); // 去除路径结尾的"/" if (_dir.charAt(0) !== "/") _dir = "/" + _dir; // 补齐路径开头的"/" var cBtn = external_Swal_default().getConfirmButton(); var btn = cBtn.cloneNode(); btn.textContent = "打开目录"; btn.style.backgroundColor = "#ecae3c"; var nowPath = location.href.match(/(path=(.+?))(?:&|$)/); btn.onclick = function () { if (nowPath) { location.href = location.href.replace( // 仅替换path参数, 不修改其他参数 nowPath[1], "path=" + encodeURIComponent(_dir)); } else { var connectChar = location.href.includes("?") ? "&" : "?"; // 确定参数的连接符 location.href += connectChar + "path=" + encodeURIComponent(_dir); } // 没有找到path参数, 直接添加 external_Swal_default().close(); }; if ((nowPath ? nowPath[2] : "%2F") != encodeURIComponent(_dir)) // 当前已在转存目录时不添加按钮 cBtn.before(btn); }; return Swalbase; }()); /* harmony default export */ const swalBase = (Swalbase); ;// CONCATENATED MODULE: ./src/common/ajax.tsx /* * @Author: mengzonefire * @Date: 2021-08-27 14:48:24 * @LastEditTime: 2023-02-14 04:10:09 * @LastEditors: mengzonefire * @Description: 自封装JQ ajax方法 */ var ajax_assign = (undefined && undefined.__assign) || function () { ajax_assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return ajax_assign.apply(this, arguments); }; var DEBUG = false; function ajax(config, callback, failback) { GM_xmlhttpRequest(ajax_assign(ajax_assign({}, config), { onload: function (r) { // console.log(r); // debug if (Math.floor(r.status / 100) === 2) { if (DEBUG) { console.info("%s version: %s 接口返回: %s", TAG, version, JSON.stringify(r.response)); // user debug } callback(r); } else failback(r.status); }, onerror: function () { failback(ajaxError); } })); } ;// CONCATENATED MODULE: external "SparkMD5" const external_SparkMD5_namespaceObject = SparkMD5; var external_SparkMD5_default = /*#__PURE__*/__webpack_require__.n(external_SparkMD5_namespaceObject); ;// CONCATENATED MODULE: ./src/baidu/common/rapiduploadTask.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 百度网盘 秒传转存任务实现 */ var RapiduploadTask = /** @class */ (function () { function RapiduploadTask() { } RapiduploadTask.prototype.reset = function () { this.bdstoken = getBdstoken(); console.log("bdstoken\u72B6\u6001: " + (this.bdstoken ? "获取成功" : "获取失败")); // debug this.fileInfoList = []; this.savePath = ""; this.isDefaultPath = false; this.onFinish = function () { }; this.onProcess = function () { }; }; RapiduploadTask.prototype.start = function () { this.saveFileV2(0); }; /** * @description: 转存秒传 接口2 * @param {number} i */ RapiduploadTask.prototype.saveFileV2 = function (i) { var _this = this; if (i >= this.fileInfoList.length) { this.onFinish(this.fileInfoList); return; } this.onProcess(i, this.fileInfoList); var file = this.fileInfoList[i]; var onFailed = function (statusCode) { file.errno = statusCode; _this.saveFileV2(i + 1); }; if (file.path.endsWith("/") && file.size === 0) { createDir.call(this, file.path.replace(/\/+$/, ''), function (data) { data = data.response; file.errno = data.errno; _this.saveFileV2(i + 1); }, onFailed); return; } // 文件名为空 if (file.path === "/") { file.errno = -7; this.saveFileV2(i + 1); return; } rapiduploadCreateFile.call(this, file, function (data) { console.info(JSON.stringify(data)); data = data.response; file.errno = 2 === data.errno ? 114 : data.errno; file.errno = 31190 === file.errno ? 404 : file.errno; _this.saveFileV2(i + 1); }, onFailed); }; return RapiduploadTask; }()); /* harmony default export */ const rapiduploadTask = (RapiduploadTask); function createDir(path, onResponsed, onFailed) { ajax({ url: "" + create_url + (this.bdstoken ? "?bdstoken=" + this.bdstoken : ""), method: "POST", responseType: "json", data: convertData({ block_list: JSON.stringify([]), path: this.savePath + path, isdir: 1, rtype: 0, }), headers: { "User-Agent": UA, } }, function (data) { if (0 !== data.response.errno) { onFailed(data.response.errno); } else { onResponsed(data); } }, onFailed); } var defaultRetryDelay = 200; var retryDelayIncrement = 100; var randomCaseRetryCount = 5; function generateRandomInt(max) { return Math.floor(Math.random() * (max + 1)); } function transformCase(str, mask) { var next = mask; return str.toLowerCase().split('').map(function (c) { if (c >= 'a' && c <= 'z') { if (next % 2 === 1) { c = c.toUpperCase(); } next = next >> 1; } return c; }) .join(''); } function rapiduploadCreateFile(file, onResponsed, onFailed) { var charCount = file.md5.toLowerCase().split('').filter(function (c) { return c >= 'a' && c <= 'z'; }).length; var maxCombination = 1 << charCount; var attempts = [ 0, maxCombination - 1, // 大写 ]; var gen = randomCaseRetryCount; while (attempts.length < maxCombination && gen > 0) { var n = void 0; do { n = generateRandomInt(maxCombination - 1); } while (attempts.includes(n)); attempts.push(n); gen--; } tryRapiduploadCreateFile.call(this, file, onResponsed, onFailed, attempts, 0, defaultRetryDelay); } // 此接口测试结果如下: 错误md5->返回"errno": 31190, 正确md5+错误size->返回"errno": 2 // 此外, 即使md5和size均正确, 连续请求时依旧有小概率返回"errno": 2, 故建议加入retry策略 function tryRapiduploadCreateFile(file, onResponsed, onFailed, attempts, attemptIndex, retryDelay) { var _this = this; if (retryDelay === void 0) { retryDelay = 0; } var contentMd5 = transformCase(file.md5, attempts[attemptIndex]); var sliceMd5 = file.md5s.toLowerCase(); ajax({ url: "" + rapidupload_url + (this.bdstoken ? "?bdstoken=" + this.bdstoken : ""), method: "POST", responseType: "json", data: convertData({ path: this.savePath + file.path.replace(illegalPathPattern, "_"), "content-length": file.size, "content-md5": contentMd5, "slice-md5": sliceMd5, rtype: 0, // rtype=3覆盖文件, rtype=0则返回报错, 不覆盖文件, 默认为rtype=1 (自动重命名, 1和2是两种不同的重命名策略) }), headers: { "User-Agent": UA, } }, function (data) { // console.log(data.response); // debug if (31039 === data.response.errno && 31039 != file.errno) { file.errno = 31039; file.path = suffixChange(file.path); tryRapiduploadCreateFile.call(_this, file, onResponsed, onFailed, attempts, attemptIndex); } else if (404 === data.response.errno && attempts.length > attemptIndex + 1) { //console.log(`转存接口错误, 重试${retry + 1}次: ${file.path}`); // debug setTimeout(function () { tryRapiduploadCreateFile.call(_this, file, onResponsed, onFailed, attempts, attemptIndex + 1, retryDelay + retryDelayIncrement); }, retryDelay); } else if (0 !== data.response.errno) { onFailed(data.response.errno); } else onResponsed(data); }, onFailed); } ;// CONCATENATED MODULE: ./src/baidu/common/generatebdlinkTask.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 百度网盘 秒传生成任务实现 */ // import { createFileV2 } from "./rapiduploadTask"; var listMinDelayMsec = 1000; var retryDelaySec = 30; // 普通生成: var GeneratebdlinkTask = /** @class */ (function () { function GeneratebdlinkTask() { } GeneratebdlinkTask.prototype.reset = function () { this.isGenView = false; this.isSharePage = false; this.recursive = false; this.savePath = ""; this.bdstoken = getBdstoken(); // 此处bdstoken不可删除, 会在下方createFileV2方法调用 this.dirList = []; this.selectList = []; this.fileInfoList = []; this.onFinish = function () { }; this.onProcess = function () { }; this.onProgress = function () { }; this.onHasDir = function () { }; this.onHasNoDir = function () { }; }; /** * @description: 执行新任务的初始化步骤 扫描选择的文件列表 */ GeneratebdlinkTask.prototype.start = function () { if (this.isSharePage) { this.logid = getLogid(); this.surl = getSurl(); if (!this.surl) { showAlert("surl获取失败"); return; } this.parseShareFileList(); this.onHasNoDir(); } else { this.parseMainFileList(); if (this.dirList.length) this.onHasDir(); else this.onHasNoDir(); } }; GeneratebdlinkTask.prototype.scanShareFile = function (i, page, retryAllowed) { var _this = this; if (page === void 0) { page = 1; } if (retryAllowed === void 0) { retryAllowed = 5; } if (i >= this.dirList.length) { this.generateBdlink(0); return; } this.onProgress(false, "\u6B63\u5728\u83B7\u53D6\u6587\u4EF6\u5217\u8868, \u7B2C" + (i + 1) + "\u4E2A"); var shareid = unsafeWindow.yunData ? unsafeWindow.yunData.shareid : unsafeWindow.locals.shareid; var uk = unsafeWindow.yunData ? unsafeWindow.yunData.share_uk : unsafeWindow.locals.share_uk; ajax({ url: sharelist_url + "&dir=" + encodeURIComponent(this.dirList[i]) + "&logid=" + this.logid + "&shareid=" + shareid + "&uk=" + uk + "&page=" + page, method: "GET", responseType: "json", }, function (data) { data = data.response; if (!data.errno) { if (!data.list.length) { // 返回列表为空, 即此文件夹文件全部扫描完成 if (page === 1) { _this.fileInfoList.push({ path: _this.dirList[i] + '/', size: 0, fs_id: '', md5: '00000000000000000000000000000000', md5s: '00000000000000000000000000000000', }); } setTimeout(function () { _this.scanShareFile(i + 1); }, listMinDelayMsec); } else { _this.parseShareFileList(data.list); if (data.list.length >= listLimit) { setTimeout(function () { _this.scanShareFile(i, page + 1); // 下一页 }, listMinDelayMsec); } else { setTimeout(function () { _this.scanShareFile(i + 1); }, listMinDelayMsec); } } } else { _this.fileInfoList.push({ path: _this.dirList[i], isdir: 1, errno: data.errno, }); // list接口访问失败, 添加失败信息 setTimeout(function () { _this.scanShareFile(i + 1); }, listMinDelayMsec); } }, function (statusCode) { if (statusCode === 400 && retryAllowed > 0) { // rate limit _this.onProgress(false, retryDelaySec + "\u79D2\u540E\u91CD\u8BD5 ..."); setTimeout(function () { _this.scanShareFile(i, page, retryAllowed - 1); }, listMinDelayMsec + retryDelaySec * 1000); } else { _this.fileInfoList.push({ path: _this.dirList[i], errno: statusCode, }); setTimeout(function () { _this.scanShareFile(i + 1); }, listMinDelayMsec); } }); }; /** * @description: 选择的列表包含文件夹, 获取文件夹下的子文件 * @param {number} i 条目index * @param {number} start 列表接口检索起点(即翻页参数) */ GeneratebdlinkTask.prototype.scanFile = function (i, start, retryAllowed) { var _this = this; if (start === void 0) { start = 0; } if (retryAllowed === void 0) { retryAllowed = 5; } if (i >= this.dirList.length) { this.generateBdlink(0); return; } ajax({ url: "" + list_url + encodeURIComponent(this.dirList[i]) + "&recursion=" + (this.recursive ? 1 : 0) + "&start=" + start, method: "GET", responseType: "json", }, // list接口自带递归参数recursion function (data) { data = data.response; if (!data.errno) { if (!data.list.length) { // 返回列表为空, 即此文件夹文件全部扫描完成 if (start === 0) { _this.fileInfoList.push({ path: _this.dirList[i] + '/', size: 0, fs_id: '', md5: '00000000000000000000000000000000', md5s: '00000000000000000000000000000000', }); } setTimeout(function () { _this.scanFile(i + 1); }, listMinDelayMsec); } else { data.list.forEach(function (item) { if (!item.isdir) { _this.fileInfoList.push({ path: item.path, size: item.size, fs_id: item.fs_id, md5: "", md5s: "", }); // 筛选文件(isdir=0) } }); if (data.has_more) { setTimeout(function () { _this.scanFile(i, start + listLimit); // 从下一个起点继续检索列表 }, listMinDelayMsec); } else { setTimeout(function () { _this.scanFile(i + 1); }, listMinDelayMsec); } } } else { _this.fileInfoList.push({ path: _this.dirList[i], isdir: 1, errno: data.errno, }); // list接口访问失败, 添加失败信息 setTimeout(function () { _this.scanFile(i + 1); }, listMinDelayMsec); } }, function (statusCode) { if (statusCode === 400 && retryAllowed > 0) { // rate limit _this.onProgress(false, retryDelaySec + "\u79D2\u540E\u91CD\u8BD5 ..."); setTimeout(function () { _this.scanFile(i, start, retryAllowed - 1); }, listMinDelayMsec + retryDelaySec * 1000); } else { _this.fileInfoList.push({ path: _this.dirList[i], errno: statusCode, }); setTimeout(function () { _this.scanFile(i + 1); }, listMinDelayMsec); } }); }; /** * @description: 顺序执行生成任务 * @param {number} i */ GeneratebdlinkTask.prototype.generateBdlink = function (i) { // 保存任务进度数据, 分享页生成不保存 if (!this.isSharePage) GM_setValue("unfinish", { file_info_list: this.fileInfoList, file_id: i, }); // 生成完成 if (i >= this.fileInfoList.length) { this.onFinish(this.fileInfoList); return; } var file = this.fileInfoList[i]; if (file.fs_id === '') { this.generateBdlink(i + 1); } else { // 刷新弹窗内的任务进度 this.onProcess(i, this.fileInfoList); // 跳过扫描失败的目录路径 if (file.errno && file.isdir) { this.generateBdlink(i + 1); return; } // 普通生成步骤 this.isSharePage ? this.getShareDlink(i) : this.getDlink(i); } }; /** * @description: 获取文件信息: size, md5(可能错误), fs_id * @param {number} i */ GeneratebdlinkTask.prototype.getFileInfo = function (i) { var _this = this; var file = this.fileInfoList[i]; ajax({ url: meta_url + encodeURIComponent(file.path), responseType: "json", method: "GET", }, function (data) { data = data.response; if (!data.error_code) { if (data.list[0].isdir) { console.log(1111); file.isdir = 1; file.errno = 900; _this.generateBdlink(i + 1); return; } file.size = data.list[0].size; file.fs_id = data.list[0].fs_id; // 已开启极速生成, 直接取meta内的md5 file.md5 = ""; file.md5s = ""; _this.getDlink(i); } else { file.errno = data.error_code; _this.generateBdlink(i + 1); } }, function (statusCode) { file.errno = statusCode === 404 ? 909 : statusCode; _this.generateBdlink(i + 1); }); }; /** * @description: 获取分享页的文件dlink(下载直链) * @param {number} i */ GeneratebdlinkTask.prototype.getShareDlink = function (i) { var _this = this; var sign, timestamp, file = this.fileInfoList[i], onFailed = function (errno) { file.errno = errno; _this.checkMd5(i + 1); // md5为空只在分享单个文件时出现, 故无需考虑获取多文件md5(跳转generateBdlink), 直接跳转checkMd5即可 }; function getTplconfig(file) { var _this = this; ajax({ url: tpl_url + "&surl=" + this.surl + "&logid=" + this.logid, responseType: "json", method: "GET", }, function (data) { data = data.response; // 请求正常 if (!data.errno) { sign = data.data.sign; timestamp = data.data.timestamp; getDlink.call(_this, file); return; } // 请求报错 onFailed(data.errno); }, onFailed); } function getDlink(file) { var _this = this; ajax({ url: sharedownload_url + "&sign=" + sign + "×tamp=" + timestamp, responseType: "json", method: "POST", data: convertData({ extra: getExtra(), logid: this.logid, fid_list: JSON.stringify([file.fs_id]), primaryid: unsafeWindow.yunData ? unsafeWindow.yunData.shareid : unsafeWindow.locals.shareid, uk: unsafeWindow.yunData ? unsafeWindow.yunData.share_uk : unsafeWindow.locals.share_uk, product: "share", encrypt: 0, }), }, function (data) { data = data.response; // 请求正常 if (!data.errno) { _this.downloadFileData(i, data.list[0].dlink); return; } // 请求报错 onFailed(data.errno); }, onFailed); } getTplconfig.call(this, file); }; /** * @description: 获取文件dlink(下载直链) * @param {number} i */ GeneratebdlinkTask.prototype.getDlink = function (i) { var _this = this; var file = this.fileInfoList[i]; // 使用生成页时仅有path没有fs_id, 跳转到获取fs_id if (!file.fs_id) { this.getFileInfo(i); return; } ajax({ url: meta_url2 + JSON.stringify([String(file.fs_id)]), responseType: "json", method: "GET", headers: { "User-Agent": UA }, }, function (data) { data = data.response; // 请求正常 if (!data.errno) { _this.downloadFileData(i, data.info[0].dlink); return; } // 请求报错 file.errno = data.errno; _this.generateBdlink(i + 1); }, function (statusCode) { file.errno = statusCode; _this.generateBdlink(i + 1); }); }; /** * @description: 调用下载直链 * @param {number} i * @param {string} dlink */ GeneratebdlinkTask.prototype.downloadFileData = function (i, dlink) { var _this = this; var file = this.fileInfoList[i]; var dlSize = file.size < 262144 ? 1 : 262143; //slice-md5: 文件前256KiB的md5, size<256KiB则直接取md5即可, 无需下载文件数据 ajax({ url: dlink, method: "GET", responseType: "arraybuffer", headers: { Range: "bytes=0-" + dlSize, "User-Agent": UA, }, onprogress: this.onProgress, }, function (data) { _this.onProgress({ loaded: 100, total: 100 }); // 100% _this.parseDownloadData(i, data); }, function (statusCode) { if (statusCode === 404) file.errno = 909; else file.errno = statusCode; _this.generateBdlink(i + 1); }); }; /** * @description: 解析直链请求返回的数据 * @param {number} i * @param {any} data */ GeneratebdlinkTask.prototype.parseDownloadData = function (i, data) { var _this = this; var file = this.fileInfoList[i]; console.log("dl_url: " + data.finalUrl); // debug // 下载直链重定向到此域名, 判定为文件和谐 if (data.finalUrl.includes("issuecdn.baidupcs.com")) { file.errno = 1919; this.generateBdlink(i + 1); return; } // 从下载接口获取md5, 此步骤可确保获取到正确md5 var fileMd5 = data.responseHeaders.match(/content-md5: ([\da-f]{32})/i); if (fileMd5) file.md5 = fileMd5[1]; else if (file.size <= 3900000000 && !file.retry_996 && !this.isSharePage) { // 默认下载接口未拿到md5, 尝试使用旧下载接口, 旧接口请求文件size大于3.9G会返回403 // 分享页的生成任务不要调用旧接口 file.retry_996 = true; this.downloadFileData(i, pcs_url + ("&path=" + encodeURIComponent(file.path))); return; } else { // 两个下载接口均未拿到md5, 失败跳出 file.errno = 996; this.generateBdlink(i + 1); return; } // 获取md5s, "极速生成" 跳过此步 if (file.size < 262144) file.md5s = file.md5; // 此时md5s=md5 else { // 计算md5s var spark = new (external_SparkMD5_default()).ArrayBuffer(); spark.append(data.response); var sliceMd5 = spark.end(); file.md5s = sliceMd5; } var interval = this.fileInfoList.length > 1 ? 2000 : 1000; setTimeout(function () { _this.generateBdlink(i + 1); }, interval); }; /** * @description: "极速生成" 可能得到错误md5, 故执行验证步骤, 若验证不通过则执行普通生成 * @param {number} i */ GeneratebdlinkTask.prototype.checkMd5 = function (i) { var _this = this; if (i >= this.fileInfoList.length) { this.onFinish(this.fileInfoList); return; } var file = this.fileInfoList[i]; // 跳过扫描失败的目录路径 if (file.errno && file.isdir) { this.checkMd5(i + 1); return; } this.onProcess(i, this.fileInfoList); this.onProgress(false, "极速生成中..."); // this.isSharePage ? this.getShareDlink(i) : this.getDlink(i); // 23.4.27: 错误md5在文件上传者账号使用此接口正常转存, 在其他账号则报错#404(#31190), 导致生成秒传完全无法验证, 故弃用meta内的md5 // 23.5.4: 发现错误md5只要改成大写, 在上传者账号就能正常返回#31190, 而正确md5则大小写都能正常转存, 故重新启用此验证过程 // 主要是因为频繁请求直链接口获取正确md5会导致#9019错误(即账号被限制), 对大批量生成秒传有很大影响, 极速生成功能使用此验证则可以节约请求以避免此问题 // 为避免百度后面又改接口导致生成错误秒传问题, 这个接口特性我会写个定时脚本每天测试一次, 出了问题就能即使更新 // 目前发现是通过秒传拿到的文件再生成秒传不会有这问题, 上传的文件或通过分享转存的别人上传的文件则会有 rapiduploadCreateFile.call(this, file, function (data) { data = data.response; if (0 === data.errno) _this.checkMd5(i + 1); // md5验证成功 else if (31190 === data.errno) { // md5验证失败, 执行普通生成, 仅在此处保存任务进度, 生成页不保存进度 if (!_this.isSharePage) GM_setValue("unfinish", { file_info_list: _this.fileInfoList, file_id: i, isCheckMd5: true, }); _this.isSharePage ? _this.getShareDlink(i) : _this.getDlink(i); } else { // 接口访问失败 file.errno = data.errno; _this.checkMd5(i + 1); } }, function (statusCode) { file.errno = statusCode; _this.checkMd5(i + 1); }, 0, true); }; /** * @description: 用于解析度盘主页的文件列表数据 */ GeneratebdlinkTask.prototype.parseMainFileList = function () { for (var _i = 0, _a = this.selectList; _i < _a.length; _i++) { var item = _a[_i]; if (item.isdir) this.dirList.push(item.path); else this.fileInfoList.push({ path: item.path, size: item.size, fs_id: item.fs_id, // 已开启极速生成, 直接取meta内的md5 md5: "", md5s: "", }); } }; /** * @description: 用于解析分享页的文件列表数据 */ GeneratebdlinkTask.prototype.parseShareFileList = function (list) { if (list === void 0) { list = this.selectList; } for (var _i = 0, list_1 = list; _i < list_1.length; _i++) { var item = list_1[_i]; var path = void 0; if ("app_id" in item) path = item.isdir ? item.path : item.server_filename; else path = item.path; if ("/" !== path.charAt(0)) path = "/" + path; // 补齐路径开头的斜杠 if (item.isdir) this.dirList.push(path); else this.fileInfoList.push({ path: path, size: item.size, fs_id: item.fs_id, md5: item.md5 && decryptMd5(item.md5.toLowerCase()), md5s: item.md5s && decryptMd5(item.md5s.toLowerCase()), }); } }; return GeneratebdlinkTask; }()); /* harmony default export */ const generatebdlinkTask = (GeneratebdlinkTask); ;// CONCATENATED MODULE: ./src/baidu/common/const.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 存放各种全局常量对象 */ var host = location.host; var listLimit = 10000; var syncPathPrefix = "/_pcs_.workspace"; var create_url = "https://" + host + "/api/create"; var precreate_url = "https://" + host + "/api/precreate"; var rapidupload_url = "https://" + host + "/api/rapidupload"; var list_url = "https://" + host + "/rest/2.0/xpan/multimedia?method=listall&order=name&limit=" + listLimit + "&path="; var meta_url = "https://pcs.baidu.com/rest/2.0/pcs/file?app_id=778750&method=meta&path="; var meta_url2 = "https://" + host + "/api/filemetas?dlink=1&fsids="; var tpl_url = "https://" + host + "/share/tplconfig?fields=sign,timestamp&channel=chunlei&web=1&app_id=250528&clienttype=0"; var sharedownload_url = "https://" + host + "/api/sharedownload?channel=chunlei&clienttype=12&web=1&app_id=250528"; var sharelist_url = "https://" + host + "/share/list?showempty=0&num=" + listLimit + "&channel=chunlei&web=1&app_id=250528&clienttype=0"; var syncdownload_url = "https://" + host + "/api/download"; var pcs_url = "https://pcs.baidu.com/rest/2.0/pcs/file?app_id=778750&method=download"; var illegalPathPattern = /[\\":*?<>|]/g; // 匹配路径中的非法字符 var getBdstoken; // 获取bdstoken的实现 function setGetBdstoken(func) { getBdstoken = func; } var refreshList; // 刷新文件列表的实现 function setRefreshList(func) { refreshList = func; } var getSelectedFileList; // 获取选中的文件列表的实现 function setGetSelectedFileList(func) { getSelectedFileList = func; } var getShareFileList; function setGetShareFileList(func) { getShareFileList = func; } var swalInstance = new swalBase(new rapiduploadTask(), new generatebdlinkTask()); function baiduErrno(errno) { switch (errno) { 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 "转存失败, 接口可能限制了IP, 请改IP重试, VPN海外IP更佳"; case -10: return "网盘容量已满"; case 500: case 502: case 503: return "服务器错误, 请稍后重试"; case 31066: case 909: return "路径不存在/云端文件已损坏"; case 900: return "路径为文件夹, 不支持生成秒传"; case 31039: return "转存失败, 秒传文件名冲突"; case 110: return "请先登录百度账号"; case 9013: return "账号被限制, 尝试 更换账号 或 等待一段时间再重试"; default: return "不明错误"; } } // 自定义百度api返回errno的报错 ;// CONCATENATED MODULE: ./src/common/utils.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 存放工具函数 */ var utils_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var utils_generator = (undefined && undefined.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; /** * @description: 弹出一个文本提示框 * @param {string} text */ function showAlert(text) { alert(TAG + ":\n" + text); } /** * @description: 解析文件信息, 返回转存结果列表html, 秒传链接, 失败文件个数, 成功的文件信息列表, 失败的文件信息列表 * @param {Array} fileInfoList 文件信息数据列表 */ function parsefileInfo(fileInfoList) { var bdcode = ""; var successInfo = ""; var failedInfo = ""; var successList = []; var failList = []; var failCodeDic = {}; fileInfoList.forEach(function (item) { item.path = item.path.replace(syncPathPrefix, ""); // 移除同步页前缀 // 成功文件 if (0 === item.errno || undefined === item.errno) { successInfo += "

" + item.path + "

"; bdcode += "" + item.md5 + (item.md5s && "#" + item.md5s) + "#" + item.size + "#" + item.path + "\n"; successList.push(item); } // 失败文件 else { failList.push(item); if (String(item.errno) in failCodeDic) failCodeDic[String(item.errno)].push(item); else failCodeDic[String(item.errno)] = [item]; } }); var _loop_1 = function (failCode) { var failBranchInfo = ""; var failBranchList = failCodeDic[failCode]; failBranchList.forEach(function (item) { failBranchInfo += "

" + item.path + "

"; }); failedInfo += "
" + baiduErrno(Number(failCode)) + " (#" + Number(failCode) + "):" + copyFailBranchList + "
" + failBranchInfo + "
"; }; for (var failCode in failCodeDic) { _loop_1(failCode); } if (failedInfo) failedInfo = "
\u5931\u8D25\u6587\u4EF6\u5217\u8868(\u70B9\u8FD9\u91CC\u770B\u5931\u8D25\u539F\u56E0):" + copyFailList + "
" + failedInfo + "
"; if (successInfo) successInfo = "
\u6210\u529F\u6587\u4EF6\u5217\u8868(\u70B9\u51FB\u5C55\u5F00):" + copySuccessList + "
" + successInfo + "
"; bdcode = bdcode.trim(); return { htmlInfo: successInfo && failedInfo ? successInfo + "


" + failedInfo : successInfo + failedInfo, bdcode: bdcode, successList: successList, failList: failList, }; } /** * @description: 获取分享页的文件列表 */ function utils_getShareFileList() { var bdListInstance = unsafeWindow.require("system-core:context/context.js") .instanceForSystem.list; var selectList = bdListInstance.getSelected(); if (!selectList.length) selectList = bdListInstance.getCurrentList(); return selectList; } /** * @description: 获取选择的文件列表(旧版界面) */ function getSelectedFileListLegacy() { return unsafeWindow .require("system-core:context/context.js") .instanceForSystem.list.getSelected(); } /** * @description: 获取选择的文件列表(新版界面) * 我从这里抄的, 谢谢你: https://greasyfork.org/zh-CN/scripts/436446 */ function getSelectedFileListNew() { return document.querySelector(".nd-main-list, .nd-new-main-list").__vue__ .selectedList; } /** * @description: 将data键值对转换为query字符串 * @param {any} data * @return {string} query */ function convertData(data) { var query = ""; for (var key in data) query += "&" + key + "=" + encodeURIComponent(data[key]); return query; } /** * @description: 从剪贴板获取字符串数据 * @return {string} bdlink */ function parseClipboard() { return utils_awaiter(this, void 0, void 0, function () { var bdlink, error_1; return utils_generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, navigator.clipboard.readText()]; case 1: bdlink = _a.sent(); if (!DuParser.parse(bdlink).length) return [2 /*return*/, ""]; return [2 /*return*/, bdlink]; case 2: error_1 = _a.sent(); showAlert(appError.ClipboardPremissionErr); return [2 /*return*/, ""]; case 3: return [2 /*return*/]; } }); }); } /** * @description: 解密已加密的md5 * @param {string} md5 (加密) * @return {string} md5 (解密) */ function decryptMd5(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; } } /** * @description: 用于解决#31039报错 * @param {string} path 原文件路径 * @return {string} 修改文件后缀的路径 */ function suffixChange(path) { var suffix = path.substring(path.lastIndexOf(".") + 1); // 获取后缀 return path.substring(0, path.length - suffix.length) + reverseStr(suffix); } /** * @description: 随机大小写 * @param {string} str * @return {string} */ function randomStringTransform(str) { var tempString = []; for (var _i = 0, str_1 = str; _i < str_1.length; _i++) { var i = str_1[_i]; if (!Math.round(Math.random())) { tempString.push(i.toLowerCase()); } else { tempString.push(i.toUpperCase()); } } return tempString.join(""); } /** * @description: 交替大小写 * @param {string} str * @return {string} */ function alternateCaseTransform(str) { var tempString = []; var low = false; for (var _i = 0, str_2 = str; _i < str_2.length; _i++) { var i = str_2[_i]; if (i >= 'a' && i <= 'z' || i >= 'A' && i <= 'Z') { tempString.push(low ? i.toLowerCase() : i.toUpperCase()); low = !low; } else { tempString.push(i); } } return tempString.join(""); } /** * @description: 逆转字符串大小写 * @param {string} str 输入字符串 * @return {string} 处理后的字符串 */ function reverseStr(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; } // 下方四个function用于分享页生成秒传 // 依旧是从这里抄的: https://greasyfork.org/zh-CN/scripts/436446 function getCookie(name) { var arr = document.cookie.replace(/\s/g, "").split(";"); for (var i = 0, l = arr.length; i < l; i++) { var tempArr = arr[i].split("="); if (tempArr[0] === name) { return decodeURIComponent(tempArr[1]); } } return ""; } function getLogid() { return btoa(getCookie("BAIDUID")); // BAIDUID is asciii } function getSurl() { var reg = /(s\/|surl=)([a-zA-Z0-9_-]+)/; if (reg.test(location.href)) { return location.href.match(reg)[2]; } return ""; } function getExtra() { var seKey = decodeURIComponent(getCookie("BDCLND")); return "{" + '"sekey":"' + seKey + '"' + "}"; } function isMobileVer() { return document.location.pathname === '/wap/home' || document.querySelector('script[src^="https://hm.baidu.com/h.js"]:not([async])') != null; } ;// CONCATENATED MODULE: ./src/baidu/newPage/loader.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 新版度盘界面loader入口: https://pan.baidu.com/disk/main */ var htmlTagNew = "div.nd-file-list-toolbar__actions"; // 新版界面秒传按钮的html父对象 var htmlTagNew2 = "div.wp-s-agile-tool-bar__header"; // 22.5.24: 新版界面新增的一个父对象 var htmlBtnRapidNew = // 新版界面秒传按钮的html元素 ''; var htmlBtnGenNew = // 新版界面秒传生成按钮的html元素 ''; function installNew() { console.info("%s version: %s DOM方式安装 (new-ui)", TAG, version); swalInstance.swalGlobalArgs = { heightAuto: false, scrollbarPadding: false, }; // 添加swal参数以防止新版界面下的body样式突变 setRefreshList(function () { document .querySelector(".nd-main-list, .nd-new-main-list") .__vue__.reloadList(); }); setGetShareFileList(utils_getShareFileList); setGetSelectedFileList(getSelectedFileListNew); setGetBdstoken(function () { return document.querySelector(".nd-main-list, .nd-new-main-list").__vue__.yunData .bdstoken; }); $(document).on("click", "#bdlink_btn", function () { swalInstance.inputView(); }); // 绑定转存秒传按钮事件 $(document).on("click", "#gen_bdlink_btn", function () { swalInstance.generatebdlinkTask.reset(); swalInstance.checkUnfinish(); }); // 绑定生成秒传按钮事件 addBtn(); } function addBtn() { // 轮询添加按钮, 防止新版页面重复init时, 将按钮覆盖 var target = $(htmlTagNew); if (!target.length) target = $(htmlTagNew2); if (target.length && !$("#bdlink_btn").length) target.append(htmlBtnRapidNew, htmlBtnGenNew); setTimeout(addBtn, 500); } ;// CONCATENATED MODULE: ./src/baidu/legacyPage/loader.tsx /* * @Author: mengzonefire * @Date: 2022-10-20 10:36:43 * @LastEditTime: 2022-12-24 10:57:23 * @LastEditors: mengzonefire * @Description: 旧版度盘界面loader入口: https://pan.baidu.com/disk/home?stayAtHome=true */ var htmlTagLegacy = "div.tcuLAu"; // 旧版界面秒传按钮的html父对象 var htmlBtnRapidLegacy = // 旧版界面秒传按钮的html元素 '秒传链接'; var htmlBtnGenLegacy = // 旧版界面秒传生成按钮的html元素 '生成秒传'; function installLegacy() { console.info("%s version: %s DOM方式安装", TAG, version); setRefreshList(function () { // 旧版界面, 调用原生方法刷新文件列表, 无需重新加载页面 unsafeWindow .require("system-core:system/baseService/message/message.js") .trigger("system-refresh"); }); setGetShareFileList(utils_getShareFileList); setGetSelectedFileList(getSelectedFileListLegacy); setGetBdstoken(function () { return unsafeWindow.locals.get("bdstoken"); }); loader_addBtn(); // DOM添加秒传按钮 addGenBtn(); // DOM添加生成按钮 $(document).on("click", "#bdlink_btn", function () { swalInstance.inputView(); }); // 绑定秒传按钮事件 $(document).on("click", "#gen_bdlink_btn", function () { swalInstance.generatebdlinkTask.reset(); swalInstance.checkUnfinish(); }); // 绑定生成按钮事件 } function getSystemContext() { return unsafeWindow.require("system-core:context/context.js") .instanceForSystem; } function addGenBtn() { var listTools = getSystemContext().Broker.getButtonBroker("listTools"); if (listTools && listTools.$box) $(listTools.$box).children("div").after(htmlBtnGenLegacy); else setTimeout(addGenBtn, 300); } function loader_addBtn() { if ($(htmlTagLegacy).length) $(htmlTagLegacy).append(htmlBtnRapidLegacy); else setTimeout(loader_addBtn, 100); } ;// CONCATENATED MODULE: ./src/baidu/syncPage/loader.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 同步空间loader入口: https://pan.baidu.com/disk/synchronization# */ var loader_htmlTagNew = "div.nd-btn-group > span"; var loader_htmlBtnRapidNew = ''; // const htmlBtnGenNew = // ''; function installSync() { console.info("%s version: %s DOM方式安装", TAG, version); swalInstance.swalGlobalArgs = { heightAuto: false, scrollbarPadding: false, }; setRefreshList(function () { document .querySelector(".nd-main-list, .nd-new-main-list") .__vue__.reloadList(); }); setGetShareFileList(utils_getShareFileList); setGetSelectedFileList(getSelectedFileListNew); setGetBdstoken(function () { return document.querySelector(".nd-main-list, .nd-new-main-list").__vue__.yunData .bdstoken; }); $(document).on("click", "#bdlink_btn", function () { swalInstance.inputView(); }); // 绑定转存秒传按钮事件 $(document).on("click", "#gen_bdlink_btn", function () { swalInstance.generatebdlinkTask.reset(); swalInstance.checkUnfinish(); }); // 绑定生成秒传按钮事件 syncPage_loader_addBtn(); } function syncPage_loader_addBtn() { // 轮询添加按钮, 防止新版页面重复init时, 将按钮覆盖 var target = $(loader_htmlTagNew); if (target.length && !$("#bdlink_btn").length) target.append(loader_htmlBtnRapidNew); // target.append(htmlBtnRapidNew, htmlBtnGenNew); // 同步页中的文件使用另一种的接口获取dlink, 故暂不添加生成功能 setTimeout(syncPage_loader_addBtn, 500); } ;// CONCATENATED MODULE: ./src/baidu/sharePage/loader.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 文件分享页loader入口: https://pan.baidu.com/s/xxx */ var htmlBtnGenShare = // 分享页的秒传生成按钮html元素 ' 生成秒传 '; var htmlTagSahre = "[node-type=qrCode]"; function installShare() { console.info("%s version: %s DOM方式安装", TAG, version); setGetBdstoken(function () { return unsafeWindow.locals.get("bdstoken"); }); setGetShareFileList(utils_getShareFileList); sharePage_loader_addBtn(); $(document).on("click", "#gen_bdlink_btn_sharePage", function () { swalInstance.generatebdlinkTask.reset(); swalInstance.generatebdlinkTask.isSharePage = true; swalInstance.genFileWork(false, false); }); // 绑定生成按钮事件 } function sharePage_loader_addBtn() { if ($(htmlTagSahre).length) $(htmlTagSahre).before(htmlBtnGenShare); else setTimeout(sharePage_loader_addBtn, 100); } ;// CONCATENATED MODULE: ./src/baidu/mobilePage/loader.tsx var mobilePage_loader_htmlBtnRapidNew = // 新版界面秒传按钮的html元素 ''; function installMobile() { console.info("%s version: %s MobileVer方式安装", TAG, version); swalInstance.swalGlobalArgs = { heightAuto: false, scrollbarPadding: false, }; // 添加swal参数以防止新版界面下的body样式突变 setRefreshList(function () { return document.location.reload(); }); setGetShareFileList(utils_getShareFileList); setGetSelectedFileList(function () { var fileList = $('.main-container > .multifile > .file-list')[0].__vue__.allFileList; return fileList.filter(function (item) { return !!item.selected; }); }); setGetBdstoken(function () { return unsafeWindow.locals.bdstoken; }); $(document).on("click", "#bdlink_btn", function () { swalInstance.inputView(); }); // 绑定转存秒传按钮事件 $(document).on("click", "#gen_bdlink_btn", function () { swalInstance.generatebdlinkTask.reset(); swalInstance.checkUnfinish(); }); // 绑定生成秒传按钮事件 mobilePage_loader_addBtn(); } function mobilePage_loader_addBtn() { // 轮询添加按钮, 防止新版页面重复init时, 将按钮覆盖 var target = $(".main-container > header"); if (target.length && !$("#bdlink_btn").length) target.append(mobilePage_loader_htmlBtnRapidNew); var target2 = $(".main-container"); if (target2.length && !$("#gen_bdlink_btn").length) target2.append(''); setTimeout(mobilePage_loader_addBtn, 500); } ;// CONCATENATED MODULE: ./src/baidu/mobileSharePage/loader.tsx function installMobileShare() { console.info("%s version: %s MobileVer方式安装", TAG, version); swalInstance.swalGlobalArgs = { heightAuto: false, scrollbarPadding: false, }; // 添加swal参数以防止新版界面下的body样式突变 setRefreshList(function () { return document.location.reload(); }); setGetShareFileList(function () { var fileList = $('.main-container > .multifile > .file-list')[0].__vue__.allFileList; return Array.from(fileList).map(function (item) { return Object.assign({}, item, { category: item.category * 1, fs_id: item.fs_id * 1, isdir: item.isdir * 1, local_ctime: item.local_ctime * 1, local_mtime: item.local_mtime * 1, server_ctime: item.server_ctime * 1, server_mtime: item.server_mtime * 1, size: item.size * 1, }); }); }); setGetBdstoken(function () { return unsafeWindow.locals.bdstoken; }); $(document).on("click", "#gen_bdlink_btn", function () { swalInstance.generatebdlinkTask.reset(); swalInstance.generatebdlinkTask.isSharePage = true; swalInstance.checkUnfinish(); }); // 绑定生成秒传按钮事件 mobileSharePage_loader_addBtn(); } function mobileSharePage_loader_addBtn() { // 轮询添加按钮, 防止新版页面重复init时, 将按钮覆盖 var target = $(".main-container"); if (target.length && !$("#gen_bdlink_btn").length) target.append('