// ==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 = "<div class=\"panel-body\" style=\"height: 220px;\">\r\n <div class=\"mzf_updateInfo\">\r\n <p>更新日志:</p>\r\n <dl>\r\n <dt>3.1.5</dt>\r\n <dd>改善错误信息</dd>\r\n <dd></dd>\r\n\r\n <dt>3.1.4</dt>\r\n <dd>改用unpkg cdn</dd>\r\n <dd></dd>\r\n\r\n <dt>3.1.3</dt>\r\n <dd>转存全失败时不添加打开目录按钮</dd>\r\n <dd>外部库切换为使用CDN</dd>\r\n <dd>更正代码内元数据</dd>\r\n <dd></dd>\r\n\r\n <dt>3.1.2</dt>\r\n <dd>(只改名)</dd>\r\n <dd></dd>\r\n\r\n <dt>3.1.1</dt>\r\n <dd>修正移动版保存路径无效问题</dd>\r\n <dd></dd>\r\n\r\n <dt>3.0.9</dt>\r\n <dd>有限度支持移动端界面</dd>\r\n <dd>提醒20G及短链不支持 (256K以内支持)</dd>\r\n <dd></dd>\r\n\r\n <dt>3.0.8</dt>\r\n <dd>修正生成重试时小BUG</dd>\r\n <dd></dd>\r\n\r\n <dt>3.0.7</dt>\r\n <dd>优化秒传生成稳定性</dd>\r\n <dd></dd>\r\n \r\n <dt>3.0.6</dt>\r\n <dd>秒传支持空目录 (文件夹结构使用时)</dd>\r\n <dd>增加随机大小写尝试次数</dd>\r\n <dd></dd>\r\n \r\n <dt>3.0.5</dt>\r\n <dd>提高旧秒传兼容性</dd>\r\n <dd></dd>\r\n \r\n <dt>3.0.4</dt>\r\n <dd>(没有发布)</dd>\r\n <dd></dd>\r\n \r\n <dt>3.0.3</dt>\r\n <dd>改用rapidupload接口</dd>\r\n <dd></dd>\r\n \r\n <dt>3.0.2</dt>\r\n <dd>3.0.2 修正404时正确报错</dd>\r\n <dd></dd>\r\n \r\n <dt>3.0.1</dt>\r\n <dd>拒绝短秒传输入</dd>\r\n <dd></dd>\r\n \r\n <dt>3.0.0</dt>\r\n <dd>挽救秒传功能</dd>\r\n <dd></dd>\r\n </dl>\r\n </div>\r\n</div>" /***/ }), /***/ 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 = "<p class=\"mzf_text\">\u79D2\u4F20\u65E0\u6548,\u9632\u548C\u8C10\u7B49 \u53EF\u53C2\u8003\u79D2\u4F20\u6587\u6863<a href=\"" + doc2.shareDoc + "\" " + btnStyle + "><span class=\"text\" style=\"width: auto;\">\u8F7D\u70B9</span></a></p>"; var htmlAboutBdlink = "\u4EC0\u4E48\u662F\u4E00\u952E\u79D2\u4F20?: <a href=\"" + doc2.bdlinkDoc + "\" " + linkStyle + ">\u6587\u6863\u8F7D\u70B9</a>"; var copyFailList = '<a id="copy_fail_list" class="mzf_btn2">复制列表</a>'; var copyFailBranchList = '<a id="copy_fail_branch_list" class="mzf_btn2">复制列表</a>'; var copySuccessList = '<a id="copy_success_list" class="mzf_btn2">复制列表</a>'; ;// 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: "<textarea id=\"mzf-rapid-input\" class=\"swal2-textarea\" placeholder=\"\u00B7 \u652F\u6301\u6279\u91CF\u8F6C\u5B58\u591A\u6761\u79D2\u4F20(\u6362\u884C\u5206\u9694)\n\u00B7 \u652F\u6301PanDL/\u6E38\u4FA0/\u6807\u51C6\u7801/PCS-GO\u683C\u5F0F\n\u00B7 \u652F\u6301\u8F93\u5165\u4E00\u952E\u79D2\u4F20(\u81EA\u52A8\u8F6C\u6362\u4E3A\u666E\u901A\u79D2\u4F20)\n\u00B7 \u53EF\u5728\u8BBE\u7F6E\u9875\u5F00\u542F\u76D1\u542C\u526A\u8D34\u677F,\u81EA\u52A8\u7C98\u8D34\u79D2\u4F20\n\u00B7 \u8F93\u5165set\u6253\u5F00\u8BBE\u7F6E, gen\u8FDB\u5165\u751F\u6210\u9875\n\u00B7 info\u663E\u793A\u7248\u672C\u4FE1\u606F\" style=\"display: flex;padding: 0.4em;\"></textarea>\n <input id=\"mzf-path-input\" class=\"swal2-input\" placeholder=\"\u4FDD\u5B58\u8DEF\u5F84, \u793A\u4F8B: /GTA5/, \u7559\u7A7A\u4FDD\u5B58\u5728\u5F53\u524D\u76EE\u5F55\" style=\"display: flex;margin-top: 10px;\">", 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: "<label for=\"mzf-theme\" class=\"swal2-input-label\" style=\"margin-top: 0px\" >\u4E3B\u9898\u8BBE\u7F6E</label > <select class=\"swal2-select\" id=\"mzf-theme\" style=\" display: flex; border-width: 1px; border-style: solid; text-align-last: center; \" > <option value=\"Default\">Default \u767D\u8272\u4E3B\u9898(\u9ED8\u8BA4)</option> <option value=\"Bulma\">Bulma \u767D\u8272\u7B80\u7EA6</option> <option value=\"Bootstrap 4\">Bootstrap4 \u767D\u8272\u7B80\u7EA6</option> <option value=\"Material UI\">MaterialUI \u767D\u8272\u4E3B\u9898</option> <option value=\"Dark\">Dark \u9ED1\u8272\u4E3B\u9898</option> <option value=\"WordPress Admin\">WordPressAdmin \u7070\u8272\u4E3B\u9898</option> </select> <label for=\"mzf-pathType\" class=\"swal2-input-label\" >\u751F\u6210\u79D2\u4F20\u5BFC\u51FA\u8DEF\u5F84\u8BBE\u7F6E</label > <select class=\"swal2-select\" id=\"mzf-pathType\" style=\" display: flex; border-width: 1px; border-style: solid; text-align-last: center; \" > <option value=\"relative\">\u5BFC\u51FA\u76F8\u5BF9\u8DEF\u5F84</option> <option value=\"absolute\">\u5BFC\u51FA\u7EDD\u5BF9\u8DEF\u5F84</option> </select> <label for=\"mzf-listen-clipboard\" class=\"swal2-checkbox\" style=\"display: flex\" ><span class=\"swal2-label\">\u76D1\u542C\u526A\u8D34\u677F (\u9700\u8981\u5141\u8BB8\u526A\u8D34\u677F\u6743\u9650)</span ><input class=\"mzf_check_ori\" type=\"checkbox\" value=\"1\" id=\"mzf-listen-clipboard\" /><span class=\"mzf_check\"></span ></label>", }, 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("<p>\u672A\u8BC6\u522B\u5230\u6B63\u786E\u7684\u94FE\u63A5 <a href=\"" + doc2.linkTypeDoc + "\" " + linkStyle + ">\u67E5\u770B\u652F\u6301\u683C\u5F0F</a></p>"); return false; } } catch (e) { external_Swal_default().showValidationMessage("<p>" + ('' + e) + "</p>"); 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 ? "<p>正在生成第 <file_num>0</file_num> 个</p><p><gen_prog>正在获取文件列表...</gen_prog></p>" : "正在转存第 <file_num>0</file_num> 个", 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 ? "<br>" : "") + parseResult.htmlInfo; // 添加失败列表, 生成模式下添加顶部空行分隔 var htmlFooter = ""; if (htmlFooter) htmlFooter = "<br>" + 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 += "<p>" + item.path + "</p>"; 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 += "<p>" + item.path + "</p>"; }); failedInfo += "<details class=\"mzf_details mzf_details_branch\"><summary><svg class=\"mzf_arrow\" width=\"16\" height=\"7\"><polyline points=\"0,0 8,7 16,0\"/></svg><b>" + baiduErrno(Number(failCode)) + " (#" + Number(failCode) + "):</b>" + copyFailBranchList + "</summary></details><div class=\"mzf_content\">" + failBranchInfo + "</div>"; }; for (var failCode in failCodeDic) { _loop_1(failCode); } if (failedInfo) failedInfo = "<details class=\"mzf_details\"><summary><svg class=\"mzf_arrow\" width=\"16\" height=\"7\"><polyline points=\"0,0 8,7 16,0\"/></svg><b>\u5931\u8D25\u6587\u4EF6\u5217\u8868(\u70B9\u8FD9\u91CC\u770B\u5931\u8D25\u539F\u56E0):</b>" + copyFailList + "</summary></details><div class=\"mzf_content\">" + failedInfo + "</div>"; if (successInfo) successInfo = "<details class=\"mzf_details\"><summary><svg class=\"mzf_arrow\" width=\"16\" height=\"7\"><polyline points=\"0,0 8,7 16,0\"/></svg><b>\u6210\u529F\u6587\u4EF6\u5217\u8868(\u70B9\u51FB\u5C55\u5F00):</b>" + copySuccessList + "</summary></details><div class=\"mzf_content\">" + successInfo + "</div>"; bdcode = bdcode.trim(); return { htmlInfo: successInfo && failedInfo ? successInfo + "<p><br /></p>" + 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元素 '<button id="bdlink_btn" class="mzf_new_btn"></i><span>秒传</span></button>'; var htmlBtnGenNew = // 新版界面秒传生成按钮的html元素 '<button id="gen_bdlink_btn" class="mzf_new_btn"></i><span>生成秒传</span></button>'; 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元素 '<a class="g-button g-button-blue" id="bdlink_btn" title="秒传链接" style="display: inline-block;""><span class="g-button-right"><em class="icon icon-disk" title="秒传链接提取"></em><span class="text" style="width: auto;">秒传链接</span></span></a>'; var htmlBtnGenLegacy = // 旧版界面秒传生成按钮的html元素 '<a class="g-button" id="gen_bdlink_btn"><span class="g-button-right"><em class="icon icon-share"></em><span class="text" style="width: auto;">生成秒传</span></span></a>'; 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 = '<button id="bdlink_btn" type="button" class="u-button is-round is-has-icon" style="background: #06a7ff;color: #fff;"><span><i class="iconfont icon-copy"></i><span class=" nd-file-list-toolbar-action-item-text">秒传</span></span></button>'; // const htmlBtnGenNew = // '<button id="gen_bdlink_btn" type="button" class="u-button is-round is-has-icon" style="margin-left: 8px;background: #06a7ff;color: #fff;"><span><i class="iconfont icon-copy"></i><span class=" nd-file-list-toolbar-action-item-text">生成秒传</span></span></button>'; 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元素 '<a id="gen_bdlink_btn_sharePage" title="生成秒传" class="g-button g-button-blue-large" style="margin-right: 5px;margin-left: 5px;"> <span class="g-button-right"> <em class="icon icon-share" style="color:#ffffff" title="生成秒传"></em> <span class="text" style="width: auto;">生成秒传</span> </span> </a>'; 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元素 '<button id="bdlink_btn" class="mzf_new_btn"></i><span>秒传</span></button>'; 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('<span id="gen_bdlink_btn" class="wapfont none-pointer"><span>'); 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('<span id="gen_bdlink_btn" class="wapfont none-pointer mobile-share-page"><span>'); setTimeout(mobileSharePage_loader_addBtn, 500); } ;// CONCATENATED MODULE: ./src/baidu/loader.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 主函数入口 */ function loaderBaidu() { var load = function () { if (locUrl.includes(baiduNewPage)) { installNew(); } else if (locUrl.includes(baiduSharePage)) { if (isMobileVer()) { installMobileShare(); } else { installShare(); } } else if (locUrl.includes(baiduSyncPage)) { installSync(); } else if (isMobileVer() && locUrl.includes(baiduMobilePage)) { installMobile(); } else { installLegacy(); } // 进入页面后的弹窗任务 var bdlink = parseQueryLink(locUrl); // 解析url中的秒传链接 if (bdlink) { // 解析到秒传链接, 弹出转存窗口 swalInstance.inputView(bdlink); } else if (!GM_getValue(updateInfoVer + "_no_first")) // 检查是否首次运行, 若是则弹出更新信息窗口 swalInstance.updateInfo(function () { GM_setValue(updateInfoVer + "_no_first", true); }); // 预先绑定好按钮事件 $(document).on("click", "#copy_fail_list", function (btn) { var listText = ""; for (var _i = 0, _a = swalInstance.parseResult.failList; _i < _a.length; _i++) { var item = _a[_i]; listText += item.path + "\n"; } GM_setClipboard(listText); btn.target.innerText = "复制成功"; }); // 失败文件列表复制 $(document).on("click", "#copy_success_list", function (btn) { var listText = ""; for (var _i = 0, _a = swalInstance.parseResult.successList; _i < _a.length; _i++) { var item = _a[_i]; listText += item.path + "\n"; } GM_setClipboard(listText); btn.target.innerText = "复制成功"; }); // 成功文件列表复制 $(document).on("click", "#copy_fail_branch_list", function (btn) { var ele = $(btn.target); GM_setClipboard(ele .parents("details.mzf_details_branch") .next()[0] .innerText.replace(/\n\n/g, "\n")); btn.target.innerText = "复制成功"; }); // 失败文件分支列表复制 try { // 添加油猴插件菜单按钮 GM_registerMenuCommand("🕮 版本信息", function () { swalInstance.updateInfo(function () { }); }); GM_registerMenuCommand("⚙ 工具设置", function () { swalInstance.settingView(); }); GM_registerMenuCommand("⚡生成秒传(输入文件路径)", function () { swalInstance.genView(); }); } catch (_) { console.info("%s version: %s 插件菜单添加失败, 使用的插件不支持GM_registerMenuCommand", TAG, version); } }; // 绑定入口函数到dom事件 var giveUpTime = Date.now() + 30000; function tryLoad() { if (["interactive", "complete"].includes(document.readyState)) { load(); } else if (giveUpTime > Date.now()) { setTimeout(tryLoad, 100); } else { console.warn('插件添加失败'); } } tryLoad(); } ;// CONCATENATED MODULE: ./src/common/injectStyle.tsx /* * @Author: mengzonefire * @LastEditors: tousakasp * @Description: 样式注入模块 */ /** * @description: 注入脚本样式 */ function injectStyle() { // 注入自定义样式 GM_addStyle((app_default())); GM_addStyle((css_app_default())); if (isMobileVer()) { GM_addStyle((mobile_app_default())); } var swalThemes = GM_getValue("swalThemes") || "Default"; // sweetAlert的主题(css), 默认为Default var ThemesCss = GM_getValue("" + swalCssVer + swalThemes); // 从缓存获取非默认主题的css代码 if (ThemesCss) { GM_addStyle(ThemesCss); } else { getThemesCss(swalThemes); // 未找到缓存, fallback到下载css代码 return; } loaderBaidu(); } /** * @description: 下载并注入对应主题的css样式代码, 会将css代码缓存本地 * @param {string} swalThemes 主题包名 */ function getThemesCss(swalThemes) { ajax({ url: extCssUrl[swalThemes], method: "GET", }, function (data) { var ThemesCss = data.responseText; if (ThemesCss.length < 100) { showAlert(appError.SwalCssInvalid + ("\n\u9519\u8BEF\u6570\u636E:" + swalThemes + " InvalidCss:\n" + ThemesCss)); GM_setValue("swalThemes", "Default"); loaderBaidu(); return; } // 返回data数据长度过小, 判定为无效样式代码 GM_setValue("" + swalCssVer + swalThemes, ThemesCss); // 缓存css代码 GM_addStyle(ThemesCss); // 注入css loaderBaidu(); }, function (statusCode) { showAlert(appError.SwalCssErrReq + ("#" + statusCode)); GM_setValue("swalThemes", "Default"); loaderBaidu(); }); } ;// CONCATENATED MODULE: external "Base64" const external_Base64_namespaceObject = Base64; ;// CONCATENATED MODULE: ./src/app.tsx /** * @description: 主函数入口 */ function app_app() { external_Base64_namespaceObject.Base64.extendString(); injectStyle(); } // 广告拦截插件会导致脚本报错跳出, 网页卡死, 故加入异常处理 try { app_app(); } catch (error) { console.log(error); } })(); /******/ })() ;