(改)网盘直链下载助手

可以获取网盘文件真实下载地址。现已支持百度阿里天翼迅雷夸克移动六大网盘,基于【网盘直链下载助手】修改自6.0.4版本,自用,去推广,修原有BUG,修改界面,甚至比原版还好用!

目前为 2023-06-07 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name (改)网盘直链下载助手
  3. // @namespace https://github.com/syhyz1990/baiduyun
  4. // @version 1.0.6.6
  5. // @author Hmjz100、油小猴
  6. // @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNMTAzLjYgMTA3LjRjMy41LTIuMiA4LjktNi4xIDEzLjgtMTIuNXM3LjMtMTIuNSA4LjUtMTYuNWMuNS0xLjcgMi4yLTcuNSAyLjItMTQuNyAwLTEwLjEtMy4zLTI1LjEtMTUuNC0zNi44LTE0LjUtMTQtMzIuMS0xNC4zLTM1LjctMTQuMy04IDAtMTUuNyAxLjktMjIuNiA1LjJDNDQgMjMgMzUuNyAzMS40IDMwLjggNDEuN2MtMS4zIDIuOC00IDQuNy03LjEgNS00IC4zLTcuNSA0LjQtOC45IDkuNi0uNSAxLjktMS42IDMuNS0zLjEgNC43QzQuNCA2Ni44IDAgNzUuNyAwIDg1YzAgNi44IDIuMyAxMy4xIDYuMSAxOC4yIDUuNSA3LjQgMTQuMiAxMi4yIDI0IDEyLjJoNDcuMWM0LjQgMCAxMS0uNSAxOC4zLTMuNSAzLjItMS40IDUuOS0zIDguMS00LjV6IiBmaWxsPSIjNDQ0Ii8+PHBhdGggZD0iTTExOS44IDY0LjNjLjEtMTcuMS0xMC40LTI4LTEyLjUtMzAuMUM5NSAyMi4xIDc5LjkgMjEuOCA3Ni45IDIxLjhjLTE3LjYgMC0zMy4zIDEwLjUtMzkuOSAyNi43LS42IDEuMy0xLjggMi4zLTMuNCAyLjNoLS40Yy01LjggMC0xMC42IDQuOC0xMC42IDEwLjd2LjVjMCAxLjQtLjggMi42LTEuOSAzLjNDMTMuNCA2OSA4LjggNzYuOCA4LjggODVjMCAxMi4yIDkuOSAyMi4zIDIyLjIgMjIuM2g0NS4yYzMuNi0uMSAxNy42LS45IDI5LjYtMTIgMi45LTIuOCAxMy45LTEzLjcgMTQtMzF6IiBmaWxsPSIjMTM5N2Q4Ii8+PHBhdGggZD0iTTExMC44IDU3LjRsLjIgMy4zYzAgMS4zLTEuMSAyLjQtMi4zIDIuNC0xLjMgMC0yLjMtMS4xLTIuMy0yLjRsLS4xLTIuOHYtLjNjMC0xLjIuOS0yLjIgMi4xLTIuM2guM2MuNyAwIDEuMy4zIDEuNy43LS4yLjEuMy41LjQgMS40em0tMy4zLTEwLjNjMCAxLjItMSAyLjMtMi4yIDIuM2gtLjFjLS44IDAtMS42LS41LTItMS4yLTQuNi04LjMtMTMuMy0xMy41LTIyLjgtMTMuNS0xLjIgMC0yLjMtMS0yLjMtMi4ydi0uMWMwLTEuMiAxLTIuMyAyLjItMi4zaC4xYTMwLjM3IDMwLjM3IDAgMCAxIDE1LjggNC40YzQuNiAyLjggOC40IDYuOCAxMS4xIDExLjUuMS4zLjIuNy4yIDEuMXpNODguMyA3My44TDczLjUgOTMuMmMtMS41IDEuOS0zLjUgMy4xLTUuNyAzLjVoLS4yYy0uNC4xLS44LjEtMS4yLjEtLjYgMC0xLjEtLjEtMS42LS4yLTIuMi0uNC00LjItMS43LTUuNi0zLjVMNDQuMyA3My45Yy0yLTIuNi0yLjUtNS40LTEuNC03LjcuMS0uMS4xLS4yLjItLjIgMS4yLTIgMy41LTMuMiA2LjQtMy4yaDYuNnYtNS43YzAtNi44IDQuNy0xMiAxMC45LTEyIDQuOCAwIDguNSAyLjYgMTAuMyA3LjIuNSAxLjMtLjIgMi43LTEuNSAzLjJzLTIuOC0uMS0zLjMtMS40Yy0xLjEtMi43LTIuOS00LTUuNS00LTMuNSAwLTYgMy02IDd2OC4xYzAgLjUtLjIgMS0uNiAxLjQtLjYuNy0xLjcgMS4xLTIuNiAxLjFoLTguNGMtMS4zIDAtMiAuNC0yLjEuNy0uMi40IDAgMS4zLjkgMi40TDYzLjEgOTBjLjkgMS4yIDIuMSAxLjggMy4zIDEuOHMyLjMtLjYgMy4xLTEuN2wxNC44LTE5LjNjLjktMS4xIDEuMS0yIC45LTIuNC0uMi0uMy0uOS0uNy0yLjEtLjdoLTcuNmMtLjkgMC0xLjctLjUtMi4xLTEuMi0uMy0uNC0uNC0uOC0uNC0xLjMgMC0xLjQgMS4xLTIuNSAyLjUtMi41aDcuNmMzLjEgMCA1LjUgMS4zIDYuNiAzLjVsLjMuN2MuNyAyLjEuMSA0LjYtMS43IDYuOXoiIGZpbGw9IiM0NDQiLz48L3N2Zz4=
  7. // @description 可以获取网盘文件真实下载地址。现已支持百度阿里天翼迅雷夸克移动六大网盘,基于【网盘直链下载助手】修改自6.0.4版本,自用,去推广,修原有BUG,修改界面,甚至比原版还好用!
  8. // @license MIT
  9. // @homepage https://github.com/hmjz100/Online-disk-direct-link-download-assistant/
  10. // @supportURL https://github.com/hmjz100/Online-disk-direct-link-download-assistant/issues
  11. // @match *://pan.baidu.com/disk/home*
  12. // @match *://yun.baidu.com/disk/home*
  13. // @match *://pan.baidu.com/disk/main*
  14. // @match *://yun.baidu.com/disk/main*
  15. // @match *://pan.baidu.com/s/*
  16. // @match *://yun.baidu.com/s/*
  17. // @match *://pan.baidu.com/share/*
  18. // @match *://yun.baidu.com/share/*
  19. // @match *://www.aliyundrive.com/s/*
  20. // @match *://www.aliyundrive.com/drive*
  21. // @match *://cloud.189.cn/web/*
  22. // @match *://pan.xunlei.com/*
  23. // @match *://pan.quark.cn/*
  24. // @match *://yun.139.com/*
  25. // @match *://caiyun.139.com/*
  26. // @match *://*.youxiaohou.com/*
  27. // @require https://unpkg.com/jquery@3.6.0/dist/jquery.min.js
  28. // @require https://unpkg.com/sweetalert2@11/dist/sweetalert2.js
  29. // @require https://unpkg.com/js-md5@0.7.3/build/md5.min.js
  30. // @connect baidu.com
  31. // @connect baidupcs.com
  32. // @connect aliyundrive.com
  33. // @connect 189.cn
  34. // @connect xunlei.com
  35. // @connect quark.cn
  36. // @connect youxiaohou.com
  37. // @connect localhost
  38. // @connect *
  39. // @run-at document-idle
  40. // @compatible Chrome
  41. // @compatible Edge
  42. // @compatible Firefox
  43. // @compatible Safari
  44. // @compatible Opera
  45. // @grant unsafeWindow
  46. // @grant GM_xmlhttpRequest
  47. // @grant GM_setClipboard
  48. // @grant GM_setValue
  49. // @grant GM_getValue
  50. // @grant GM_openInTab
  51. // @grant GM_info
  52. // @grant GM_registerMenuCommand
  53. // @grant GM_cookie
  54. // @grant GM_addStyle
  55. // @grant GM_getResourceText
  56. // ==/UserScript==
  57.  
  58. (function () {
  59. 'use strict';
  60. /*--- waitForKeyElements(): A utility function, for Greasemonkey scripts,
  61. that detects and handles AJAXed content.
  62. Usage example:
  63. waitForKeyElements (
  64. "div.comments"
  65. , commentCallbackFunction
  66. );
  67. //--- Page-specific function to do what we want when the node is found.
  68. function commentCallbackFunction (jNode) {
  69. jNode.text ("This comment changed by waitForKeyElements().");
  70. }
  71. IMPORTANT: This function requires your script to have loaded jQuery.
  72. */
  73. function waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
  74. var targetNodes, btargetsFound;
  75.  
  76. if (typeof iframeSelector == "undefined")
  77. targetNodes = $(selectorTxt);
  78. else
  79. targetNodes = $(iframeSelector).contents()
  80. .find(selectorTxt);
  81.  
  82. if (targetNodes && targetNodes.length > 0) {
  83. btargetsFound = true;
  84. targetNodes.each(function () {
  85. var jThis = $(this);
  86. var alreadyFound = jThis.data('alreadyFound') || false;
  87.  
  88. if (!alreadyFound) {
  89. //--- Call the payload function.
  90. var cancelFound = actionFunction(jThis);
  91. if (cancelFound) btargetsFound = false;
  92. else jThis.data('alreadyFound', true);
  93. }
  94. });
  95. } else {
  96. btargetsFound = false;
  97. }
  98.  
  99. //--- Get the timer-control variable for this selector.
  100. var controlObj = waitForKeyElements.controlObj || {};
  101. var controlKey = selectorTxt.replace(/[^\w]/g, "_");
  102. var timeControl = controlObj[controlKey];
  103.  
  104. //--- Now set or clear the timer as appropriate.
  105. if (btargetsFound && bWaitOnce && timeControl) {
  106. //--- The only condition where we need to clear the timer.
  107. clearInterval(timeControl);
  108. delete controlObj[controlKey]
  109. } else {
  110. //--- Set a timer, if needed.
  111. if (!timeControl) {
  112. timeControl = setInterval(function () {
  113. waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector);
  114. }, 300);
  115. controlObj[controlKey] = timeControl;
  116. }
  117. }
  118. waitForKeyElements.controlObj = controlObj;
  119. }
  120. let pt = '', selectList = [], params = {}, mode = '', width = 800, pan = {}, color = '',
  121. doc = $(document), progress = {}, request = {}, ins = {}, idm = {};
  122.  
  123.  
  124. const customClass = {
  125. popup: 'pl-popup',
  126. header: 'pl-header',
  127. title: 'pl-title',
  128. closeButton: 'pl-close',
  129. content: 'pl-content',
  130. input: 'pl-input',
  131. footer: 'pl-footer'
  132. };//准备好要用到的元素
  133.  
  134.  
  135. //准备好Shell类型(用于curl下载)
  136. const terminalType = {
  137. wc: "Microsoft Windows 命令提示符",
  138. wp: "Microsoft Windows PowerShell",
  139. lt: "Linux 终端",
  140. ls: "Linux Shell",
  141. mt: "Apple MacOS 终端",
  142. };
  143.  
  144. //准备好信息界面的*假隐私设置*(实际上油小猴是通过自己服务器获取的“暗号”)
  145. const getuserinfo = {
  146. yes: "允许",
  147. };
  148. const hideidm = {
  149. yes: "隐藏",
  150. no: "显示"
  151. };
  152.  
  153. //准备好右上角的Toast提示
  154. let toast = Swal.mixin({
  155. toast: true,
  156. position: 'top-end',
  157. showConfirmButton: false,
  158. timer: 3500,
  159. timerProgressBar: true,
  160. showCloseButton: true,
  161. didOpen: (toast) => {
  162. toast.addEventListener('mouseenter', Swal.stopTimer);
  163. toast.addEventListener('mouseleave', Swal.resumeTimer);
  164. }
  165. });
  166.  
  167. //提示的信息内容
  168. const message = {
  169. success: (text) => {
  170. toast.fire({title: text, icon: 'success'});
  171. },
  172. error: (text) => {
  173. toast.fire({title: text, icon: 'error'});
  174. },
  175. warning: (text) => {
  176. toast.fire({title: text, icon: 'warning'});
  177. },
  178. info: (text) => {
  179. toast.fire({title: text, icon: 'info'});
  180. },
  181. question: (text) => {
  182. toast.fire({title: text, icon: 'question'});
  183. }
  184. };
  185.  
  186. let base = {
  187. //脚本正常情况下默认加载的菜单
  188. registerMenuCommand() {
  189. GM_registerMenuCommand('⚙️ 设置', () => {
  190. base.showSetting();
  191. });
  192. GM_registerMenuCommand('更新日志', () => {
  193. base.showUpdateLog();
  194. });
  195. GM_registerMenuCommand('分析信息', () => {
  196. base.showInfo();
  197. });
  198. GM_registerMenuCommand('取消点亮按钮', () => {
  199. base.registerSetting();
  200. });
  201. },
  202.  
  203. registerPanMenuCommand() {
  204. GM_registerMenuCommand('⚙️ 设置', () => {
  205. base.showSetting();
  206. });
  207. GM_registerMenuCommand('更新日志', () => {
  208. base.showUpdateLog();
  209. });
  210. GM_registerMenuCommand('分析信息', () => {
  211. base.showPanInfo();
  212. });
  213. },
  214.  
  215. //取消点亮按钮按下后运行的
  216. registerSetting() {
  217. console.log("正在注入取消点亮按钮设置项目...");
  218. message.warning("正在注入取消点亮按钮设置项目...(您可以再次点亮按钮)");
  219. base.setValue('setting_init_code', 111111);
  220. history.go(0)
  221. },
  222.  
  223. //获取网页Cookie
  224. getCookie(name) {
  225. let arr = document.cookie.replace(/\s/g, "").split(';');
  226. for (let i = 0, l = arr.length; i < l; i++) {
  227. let tempArr = arr[i].split('=');
  228. if (tempArr[0] === name) {
  229. return decodeURIComponent(tempArr[1]);
  230. }
  231. }
  232. return '';
  233. },
  234.  
  235. isType(obj) {
  236. return Object.prototype.toString.call(obj).replace(/^\[object (.+)\]$/, '$1').toLowerCase();
  237. },
  238.  
  239. getValue(name) {
  240. return GM_getValue(name);
  241. },
  242.  
  243. setValue(name, value) {
  244. GM_setValue(name, value);
  245. },
  246.  
  247. getStorage(key) {
  248. try {
  249. return JSON.parse(localStorage.getItem(key));
  250. } catch (e) {
  251. return localStorage.getItem(key);
  252. }
  253. },
  254.  
  255. setStorage(key, value) {
  256. if (this.isType(value) === 'object' || this.isType(value) === 'array') {
  257. return localStorage.setItem(key, JSON.stringify(value));
  258. }
  259. return localStorage.setItem(key, value);
  260. },
  261.  
  262. setClipboard(text) {
  263. GM_setClipboard(text, 'text');
  264. },
  265.  
  266. e(str) {
  267. return btoa(unescape(encodeURIComponent(str)));
  268. },
  269.  
  270. d(str) {
  271. return decodeURIComponent(escape(atob(str)));
  272. },
  273.  
  274. getExtension(name) {
  275. const reg = /(?!\.)\w+$/;
  276. if (reg.test(name)) {
  277. let match = name.match(reg);
  278. return match[0].toUpperCase();
  279. }
  280. return '';
  281. },
  282.  
  283. sizeFormat(value) {
  284. if (value === +value) {
  285. let unit = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
  286. let index = Math.floor(Math.log(value) / Math.log(1024));
  287. let size = value / Math.pow(1024, index);
  288. size = size.toFixed(1);
  289. return size + unit[index];
  290. }
  291. return '';
  292. },
  293.  
  294. sortByName(arr) {
  295. const handle = () => {
  296. return (a, b) => {
  297. const p1 = a.filename ? a.filename : a.server_filename;
  298. const p2 = b.filename ? b.filename : b.server_filename;
  299. return p1.localeCompare(p2, "zh-CN");
  300. };
  301. };
  302. arr.sort(handle());
  303. },
  304.  
  305. fixFilename(name) {
  306. return name.replace(/[!?&|`"'*\/:<>\\]/g, '_');
  307. },
  308.  
  309. blobDownload(blob, filename) {
  310. if (blob instanceof Blob) {
  311. const url = URL.createObjectURL(blob);
  312. const a = document.createElement('a');
  313. a.href = url;
  314. a.download = filename;
  315. a.click();
  316. URL.revokeObjectURL(url);
  317. }
  318. },
  319.  
  320. post(url, data, headers, type) {
  321. if (this.isType(data) === 'object') {
  322. data = JSON.stringify(data);
  323. }
  324. return new Promise((resolve, reject) => {
  325. GM_xmlhttpRequest({
  326. method: "POST", url, headers, data,
  327. responseType: type || 'json',
  328. onload: (res) => {
  329. type === 'blob' ? resolve(res) : resolve(res.response || res.responseText);
  330. },
  331. onerror: (err) => {
  332. reject(err);
  333. },
  334. });
  335. });
  336. },
  337.  
  338. get(url, headers, type, extra) {
  339. return new Promise((resolve, reject) => {
  340. let requestObj = GM_xmlhttpRequest({
  341. method: "GET", url, headers,
  342. responseType: type || 'json',
  343. onload: (res) => {
  344. if (res.status === 204) {
  345. requestObj.abort();
  346. idm[extra.index] = true;
  347. }
  348. if (type === 'blob') {
  349. res.status === 200 && base.blobDownload(res.response, extra.filename);
  350. resolve(res);
  351. } else {
  352. resolve(res.response || res.responseText);
  353. }
  354. },
  355. onprogress: (res) => {
  356. if (extra && extra.filename && extra.index) {
  357. res.total > 0 ? progress[extra.index] = (res.loaded * 100 / res.total).toFixed(2) : progress[extra.index] = 0.00;
  358. }
  359. },
  360. onloadstart() {
  361. extra && extra.filename && extra.index && (request[extra.index] = requestObj);
  362. },
  363. onerror: (err) => {
  364. reject(err);
  365. },
  366. });
  367. });
  368. },
  369.  
  370. getFinalUrl(url, headers) {
  371. return new Promise((resolve, reject) => {
  372. let requestObj = GM_xmlhttpRequest({
  373. method: "GET", url, headers,
  374. onload: (res) => {
  375. resolve(res.finalUrl);
  376. },
  377. onerror: (err) => {
  378. reject(err);
  379. },
  380. });
  381. });
  382. },
  383.  
  384. stringify(obj) {
  385. let str = '';
  386. for (var key in obj) {
  387. if (obj.hasOwnProperty(key)) {
  388. var value = obj[key];
  389. if (Array.isArray(value)) {
  390. for (var i = 0; i < value.length; i++) {
  391. str += encodeURIComponent(key) + '=' + encodeURIComponent(value[i]) + '&';
  392. }
  393. } else {
  394. str += encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&';
  395. }
  396. }
  397. }
  398. return str.slice(0, -1); // 去掉末尾的 "&"
  399. },
  400.  
  401. addStyle(id, tag, css) {
  402. tag = tag || 'style';
  403. let doc = document, styleDom = doc.getElementById(id);
  404. if (styleDom) return;
  405. let style = doc.createElement(tag);
  406. style.rel = 'stylesheet';
  407. style.id = id;
  408. tag === 'style' ? style.innerHTML = css : style.href = css;
  409. doc.getElementsByTagName('head')[0].appendChild(style);
  410. },
  411.  
  412. sleep(time) {
  413. return new Promise(resolve => setTimeout(resolve, time));
  414. },
  415.  
  416. findReact(dom, traverseUp = 0) {
  417. const key = Object.keys(dom).find(key => {
  418. return key.startsWith("__reactFiber$")
  419. || key.startsWith("__reactInternalInstance$");
  420. });
  421. const domFiber = dom[key];
  422. if (domFiber == null) return null;
  423.  
  424. if (domFiber._currentElement) {
  425. let compFiber = domFiber._currentElement._owner;
  426. for (let i = 0; i < traverseUp; i++) {
  427. compFiber = compFiber._currentElement._owner;
  428. }
  429. return compFiber._instance;
  430. }
  431.  
  432. const GetCompFiber = fiber => {
  433. let parentFiber = fiber.return;
  434. while (typeof parentFiber.type == "string") {
  435. parentFiber = parentFiber.return;
  436. }
  437. return parentFiber;
  438. };
  439. let compFiber = GetCompFiber(domFiber);
  440. for (let i = 0; i < traverseUp; i++) {
  441. compFiber = GetCompFiber(compFiber);
  442. }
  443. return compFiber.stateNode || compFiber;
  444. },
  445.  
  446. //注册(不可用)默认设置
  447. initDefaultConfig() {
  448. let value = [{
  449. name: 'setting_rpc_domain',
  450. value: 'http://localhost'
  451. }, {
  452. name: 'setting_rpc_port',
  453. value: '16800'
  454. }, {
  455. name: 'setting_rpc_path',
  456. value: '/jsonrpc'
  457. }, {
  458. name: 'setting_rpc_token',
  459. value: ''
  460. }, {
  461. name: 'setting_rpc_dir',
  462. value: 'D:'
  463. }, {
  464. name: 'setting_terminal_type',
  465. value: 'wc'
  466. }, {
  467. name: 'setting_theme_color',
  468. value: '#574ab8'
  469. }, {
  470. name: 'setting_init_code',
  471. value: ''
  472. }, {
  473. name: 'setting_getuser_info',
  474. value: 'yes'
  475. }, {
  476. name: 'setting_hide_idm',
  477. value: 'no'
  478. }];
  479.  
  480. value.forEach((v) => {
  481. base.getValue(v.name) === undefined && base.setValue(v.name, v.value);
  482. });
  483. },
  484.  
  485. showSetting() {
  486. let dom = '', btn = '',
  487. colorList = ['#09AAFF', '#cc3235', '#526efa', '#518c17', '#ed944b', '#f969a5', '#bca280', '#574ab8', '#F8D800', '#0396FF', '#32CCBC', '#F6416C', '#2271b1', '#59524c', '#1d2327', '#18a497', '#10171d', '#2828ff'];
  488. dom += `<label class="pl-setting-label"><div class="pl-label">RPC主机</div><input type="text" placeholder="主机地址,需带上http(s)://" class="pl-input listener-domain" value="${base.getValue('setting_rpc_domain')}"></label>`;
  489. dom += `<label class="pl-setting-label"><div class="pl-label">RPC端口</div><input type="text" placeholder="端口号,例如:Motrix为16800" class="pl-input listener-port" value="${base.getValue('setting_rpc_port')}"></label>`;
  490. dom += `<label class="pl-setting-label"><div class="pl-label">RPC路径</div><input type="text" placeholder="路径,默认为/jsonrpc" class="pl-input listener-path" value="${base.getValue('setting_rpc_path')}"></label>`;
  491. dom += `<label class="pl-setting-label"><div class="pl-label">RPC密钥</div><input type="text" placeholder="无密钥无需填写" class="pl-input listener-token" value="${base.getValue('setting_rpc_token')}"></label>`;
  492. dom += `<label class="pl-setting-label"><div class="pl-label">保存路径</div><input type="text" placeholder="文件下载后保存路径,例如:D:" class="pl-input listener-dir" value="${base.getValue('setting_rpc_dir')}"></label>`;
  493.  
  494. colorList.forEach((v) => {
  495. btn += `<div data-color="${v}" style="background: ${v};border: 1px solid ${v}" class="pl-color-box listener-color ${v === base.getValue('setting_theme_color') ? 'checked' : ''}"></div>`;
  496. });
  497.  
  498. dom += `<label class="pl-setting-label"><div class="pl-label">终端类型</div><select class="pl-input listener-terminal">`;
  499. Object.keys(terminalType).forEach(k => {
  500. dom += `<option value="${k}" ${base.getValue('setting_terminal_type') === k ? 'selected' : ''}>${terminalType[k]}</option>`;
  501. });
  502. dom += `</select></label>`;
  503.  
  504. dom +=`<label class="pl-setting-label"><div class="pl-label">未找到IDM提示</div><select class="pl-input hide_idm">`;
  505. Object.keys(hideidm).forEach(value2 => {dom += `<option value="${value2}" ${base.getValue('setting_hide_idm') === value2 ? 'selected' : ''}>${hideidm[value2]}</option>`;});
  506. dom += `</select></label>`;
  507.  
  508. dom += `<label class="pl-setting-label"><div class="pl-label">主题颜色</div> <div class="pl-color">${btn}<div></label>`;
  509. dom = '<div>' + dom + '</div>';
  510.  
  511. Swal.fire({
  512. title: '助手设置',
  513. html: dom,
  514. icon: 'info',
  515. showCloseButton: true,
  516. showConfirmButton: false,
  517. footer: pan.footer,
  518. }).then(() => {
  519. message.success('设置成功!');
  520. history.go(0);
  521. });
  522.  
  523. doc.on('click', '.listener-color', async (e) => {
  524. base.setValue('setting_theme_color', e.target.dataset.color);
  525. message.success('主题色设置成功!');
  526. setTimeout(function(){
  527. history.go(0);
  528. },1000)
  529. });
  530. doc.on('input', '.listener-domain', async (e) => {
  531. base.setValue('setting_rpc_domain', e.target.value);
  532. });
  533. doc.on('input', '.listener-port', async (e) => {
  534. base.setValue('setting_rpc_port', e.target.value);
  535. });
  536. doc.on('input', '.listener-path', async (e) => {
  537. base.setValue('setting_rpc_path', e.target.value);
  538. });
  539. doc.on('input', '.listener-token', async (e) => {
  540. base.setValue('setting_rpc_token', e.target.value);
  541. });
  542. doc.on('input', '.listener-dir', async (e) => {
  543. base.setValue('setting_rpc_dir', e.target.value);
  544. });
  545. doc.on('change', '.listener-terminal', async (e) => {
  546. base.setValue('setting_terminal_type', e.target.value);
  547. });
  548. doc.on('change', '.hide_idm', async (e) => {
  549. base.setValue('setting_hide_idm', e.target.value);
  550. });
  551. },
  552.  
  553. showInfo() {
  554. let hideinfo='';
  555. hideinfo +=`<span>以下内容都是脚本自己检测到的信息<br>本页面仅作为调试使用<span>`;
  556. hideinfo +=`<label class="pl-setting-label"><div class="pl-label">版本</div>${realversion}</label>`;
  557. hideinfo +=`<label class="pl-setting-label"><div class="pl-label">虚假版本</div>${version}</label>`;
  558. hideinfo +=`<label class="pl-setting-label"><div class="pl-label">脚本作者</div>${realauthor}</label>`;
  559. hideinfo +=`<label class="pl-setting-label"><div class="pl-label">虚假作者</div>${author}</label>`;
  560. hideinfo += `<label class="pl-setting-label"><div class="pl-label">初始化暗号</div>${pan.num}</label>`;
  561. hideinfo += `<label class="pl-setting-label"><div class="pl-label">UA代理</div>${pan.ua}</label>`;
  562. hideinfo += `<label class="pl-setting-label"><div class="pl-label">公众号地址</div>${pan.img}</label>`;
  563. hideinfo += `<label class="pl-setting-label"><div class="pl-label">网盘万能助手</div>${pan.assistant}</label>`;
  564. hideinfo += `<label class="pl-setting-label"><div class="pl-label">网盘镜像</div>${pan.mirror}</label>`;
  565. hideinfo += `<label class="pl-setting-label"><div class="pl-label">RPC管理</div>${pan.d}</label>`;
  566. hideinfo += `<label class="pl-setting-label"><div class="pl-label">IDM介绍</div>${pan.idm}</label>`;
  567. hideinfo += `<label class="pl-setting-label"><div class="pl-label">提示文本</div>0、${pan.init[0]}<br>1、${pan.init[1]}<br>2、${pan.init[2]}<br>3、${pan.init[3]}<br>4、${pan.init[4]}<br>5、${pan.init[5]}</label>`;
  568. hideinfo += `<label class="pl-setting-label"><div class="pl-label">页脚</div>${pan.fotter}</label>`;
  569. hideinfo +=`<label class="pl-setting-label"><div class="pl-label">允许油小猴在线收集作者名称与获取暗号(没有用)</div><select class="pl-input getuser_info">`;
  570. Object.keys(getuserinfo).forEach(value1 => {hideinfo += `<option value="${value1}" ${base.getValue('setting_getuser_info') === value1 ? 'selected' : ''}>${getuserinfo[value1]}</option></select></label>`;});
  571. hideinfo = '<div>' + hideinfo + '</div>';
  572.  
  573. Swal.fire({
  574. icon: 'info',
  575. title: '脚本分析信息',
  576. html: hideinfo,
  577. allowOutsideClick: false,
  578. showCloseButton: true,
  579. confirmButtonText: '保存配置(关闭)'
  580. });
  581.  
  582. doc.on('change', '.getuser_info', async (e) => {
  583. base.setValue('setting_getuser_info', e.target.value);
  584. });
  585. },
  586.  
  587. showPanInfo() {
  588. let hideinfo='';
  589. hideinfo +=`<span>本页面仅作为调试使用<span>`;
  590. hideinfo +=`<label class="pl-setting-label"><div class="pl-label">版本</div>${realversion}</label>`;
  591. hideinfo +=`<label class="pl-setting-label"><div class="pl-label">作者</div>${realauthor}</label>`;
  592. hideinfo += `<label class="pl-setting-label"><div class="pl-label">初始化暗号</div>${pan.num}</label>`;
  593. hideinfo += `<label class="pl-setting-label"><div class="pl-label">公众号地址</div>${pan.img}</label>`;
  594. hideinfo += `<label class="pl-setting-label"><div class="pl-label">网盘万能助手</div>${pan.assistant}</label>`;
  595. hideinfo += `<label class="pl-setting-label"><div class="pl-label">RPC管理</div>${pan.d}</label>`;
  596. hideinfo += `<label class="pl-setting-label"><div class="pl-label">IDM介绍</div>${pan.idm}</label>`;
  597. hideinfo = '<div>' + hideinfo + '</div>';
  598.  
  599. Swal.fire({
  600. icon: 'info',
  601. title: '脚本分析信息',
  602. html: hideinfo,
  603. allowOutsideClick: false,
  604. showCloseButton: true,
  605. confirmButtonText: '关闭'
  606. });
  607. },
  608.  
  609. showUpdateLog() {
  610. Swal.fire({
  611. icon: 'info',
  612. title: '更新日志(关闭按钮在下面哦)',
  613. html: '<span>V.0.6.6<br>1、修复暗号错误。<br><br>V1.0.6.5<br>1、修复即使输入正确暗号也不能成功点亮按钮的服务器错误。<br><br>V1.0.6.4<br>1、跟进官方V6.1.1版本,修复阿里云盘获取下载链接时的问题。<br><br>V1.0.6.3<br>1、照顾小屏幕用户,将始终显示复制全部链接的按钮;<br>2、增加取消下载时的动画。<br><br>V1.0.6.2<br>1、修复部分界面错位,实现CSS内置;<br>2、百度网盘界面将变得更加简洁。<br><br>V1.0.6.1<br>1、新增百度云盘API下载支持复制链接;<br>2、为了照顾手机浏览器用户,增大项目之间间隙,新增隐藏IDM提示选项,可在助手设置中启用;<br>3、修改CSS,界面会出现更多的主题色;<br>4、支持在游小猴官网查看暗号;<br>5、修复部分语法错误。<br><br>V1.0.6<br>1、修复了打开阿里云盘分享连接时因下载移动端广告导致只能点击API下载;<br>2、跟进官方6.0.4版本,修复夸克网盘获取下载链接失效、支持移动云盘。<br><br>V1.0.5.5<br>1、感谢<a href="https://github.com/Night-stars-1">Night-stars-1</a>的帮助,修复因为原作者服务器导致的初始化暗号识别错误;<br>2、修改一些文本以及提供给服务器的信息。<br><br>V1.0.5.4<br>1、小修小改css,让主题色出现在更多地方;<br>2、修改下载链接获取失败的提示;<br>3、增加更多的主题色,可在助手设置查看;<br>4、homo彩蛋被删去力(悲)。<br><br>V1.0.5.3<br>1、修啦修啦,阿里云盘可以摸到下载菜单了。<br><br>V1.0.5.2<br>1、增加脚本信息菜单(没有用);<br>2、优化阿里云盘显示svg图片;<br>3、修改弹窗按钮颜色。<br><br>V1.0.5.1<br>1、修复在切换按钮主题后夸克网盘不能正常显示按钮。<br><br>V1.0.5<br>1、跟进官方V5.0.4版本;<br>2、小改动,照着官方版本更正文件名称检测;<br>3、保留彩蛋,但必须舍弃官方暗号。<br><br>V1.0.4<br>大改!<br>1、修复了原作者留下的夸克网盘切换文件夹就多一个“下载助手”按钮的大BUG;<br>2、终于来了,在下载菜单增加“助手设置”“更新日志”按钮;<br>【再也不用点进油猴管理再进设置了(保留油猴管理内设置)】<br>3、修改阿里云盘和夸克网盘下载助手按钮样式;<br>4、增加“取消点亮按钮”油猴菜单;<br>5、修改部分css,使其与选择的主题更贴切。<br><br>V1.0.3<br>1、增加一个小彩蛋; 提示:homo(需在未点亮按钮状态触发)<br>【需要重新恢复按钮为未点亮状态请进入 已安装脚本->编辑->开发者->重置到出厂->确定】<br>2、修改/增加默认主题色。<br><br>V1.0.2<br>1、修改并加宽界面,调整部分css,使Sweetalert2界面更美观,更与原版相近;<br>2、修改部分提示文字,使文字更容易复制。 <br><br>V1.0.1<br>1、去除更新提示;<br>2、更新Sweetalert2至11版本;<br>3、部分CDN节点更换为jsdelivr。<br><br>V1.0.0<br>1、增加“注入”功能(bushi);<br>2、去除广告。</span>',
  614. allowOutsideClick: false,
  615. showCloseButton: false,
  616. confirmButtonText: '我已阅',
  617. });
  618. },
  619.  
  620. createTip() {
  621. $('body').append('<div class="pl-tooltip"></div>');
  622.  
  623. doc.on('mouseenter mouseleave', '.listener-tip', (e) => {
  624. if (e.type === 'mouseenter') {
  625. let filename = e.currentTarget.innerText;
  626. let size = e.currentTarget.dataset.size;
  627. let tip = `${filename}<span style="margin-left: 10px;color: ${color}">${size}</span>`;
  628. $(e.currentTarget).css({opacity: '0.5'});
  629. $('.pl-tooltip').html(tip).css({
  630. 'left': e.pageX + 10 + 'px',
  631. 'top': e.pageY - e.currentTarget.offsetTop > 14 ? e.pageY + 'px' : e.pageY + 20 + 'px'
  632. }).show();
  633. } else {
  634. $(e.currentTarget).css({opacity: '1'});
  635. $('.pl-tooltip').hide(0);
  636. }
  637. });
  638. },
  639.  
  640. createLoading() {
  641. return $('<div class="pl-loading"><div class="pl-loading-box"><div><div></div><div></div></div></div></div>');
  642. },
  643.  
  644. createDownloadIframe() {
  645. let $div = $('<div style="padding:0;margin:0;display:block"></div>');
  646. let $iframe = $('<iframe src="javascript:;" id="downloadIframe" style="display:none"></iframe>');
  647. $div.append($iframe);
  648. $('body').append($div);
  649. },
  650.  
  651. getMirrorList(link, mirror, thread = 2) {
  652. let host = new URL(link).host;
  653. let mirrors = [];
  654. for (let i = 0; i < mirror.length; i++) {
  655. for (let j = 0; j < thread; j++) {
  656. let item = link.replace(host, mirror[i]) + '&'.repeat(j);
  657. mirrors.push(item);
  658. }
  659. }
  660. return mirrors.join('\n');
  661. },
  662.  
  663. addPanLinkerStyle() {
  664. color = base.getValue('setting_theme_color');
  665. let css = `
  666. body::-webkit-scrollbar { display: none }
  667. ::-webkit-scrollbar { width: 6px; height: 10px }
  668. ::-webkit-scrollbar-track { border-radius: 0; background: none }
  669. ::-webkit-scrollbar-thumb { background-color: rgba(85,85,85,.4) }
  670. ::-webkit-scrollbar-thumb,::-webkit-scrollbar-thumb:hover { border-radius: 5px; -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.2) }
  671. ::-webkit-scrollbar-thumb:hover { background-color: rgba(85,85,85,.3) }
  672. .swal2-popup { font-size: 16px !important; width: 550px;}
  673. .pl-popup { font-size: 12px !important; width: 90% !important;}
  674. .pl-popup a { color: ${color} !important; }
  675. .pl-header { padding: 0!important;align-items: flex-start!important; border-bottom: 1px solid #eee!important; margin: 0 0 10px!important; padding: 0 0 5px!important; }
  676. .pl-title { font-size: 16px!important; line-height: 1!important;white-space: nowrap!important; text-overflow: ellipsis!important;}
  677. .pl-content { padding: 0 !important; font-size: 12px!important; }
  678. .pl-main { background-color:${color}15 ;overflow:auto; border-radius: 5px; max-height:calc(${document.documentElement.clientHeight}px - 250px);}
  679. .pl-footer {font-size: 15px!important;justify-content: flex-start!important; margin: 10px 0 0!important; padding: 5px 0 0!important; color: #f56c6c!important; height:25px;}
  680. .pl-item { display: flex; align-items: center; line-height: 22px; height: 50px; background-color: ${color}30; border-radius: 5px; margin: 8px 6px; }
  681. .pl-item-name { flex: 0 0 170px; text-align: left;margin: 6px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; cursor:default; height: 30px;}
  682. .pl-item-link { flex: 1; text-align: left; white-space: nowrap; text-overflow: ellipsis;cursor:pointer; overflow: hidden; }
  683. .pl-item-btn { background: ${color}; border-radius: 3px; color: #ffffff; cursor: pointer; font-size: 12px; outline: none; display: flex; align-items: center; justify-content: center; margin: 6px 6px; padding: 0.625em 1.1em; }
  684. .pl-item-tip { display: flex; justify-content: space-between;flex: 1; }
  685. .pl-back { width: 70px; background: #ddd; border-radius: 3px; cursor:pointer; margin:1px 6px; }
  686. .pl-ext { display: inline-block; width: 44px; background: #999; color: #fff; height: 16px; line-height: 16px; font-size: 12px; border-radius: 3px;}
  687. .pl-retry {padding: 3px 10px; background: #cc3235; color: #fff; border-radius: 3px; cursor: pointer;}
  688. .pl-browserdownload { padding: 3px 10px; background: ${color}; color: #fff; border-radius: 3px; cursor: pointer;}
  689. .pl-item-progress { display:flex;flex: 1;align-items:center}
  690. .pl-progress { display: inline-block;vertical-align: middle;width: 100%; box-sizing: border-box;line-height: 1;position: relative;height:15px; flex: 1}
  691. .pl-progress-outer { height: 15px;border-radius: 100px;background-color: #c1c1c1;overflow: hidden;position: relative;vertical-align: middle;}
  692. .pl-progress-inner{ position: absolute;left: 0;top: 0;background-color: ${color};text-align: center;border-radius: 100px;line-height: 1;white-space: nowrap;transition: width .6s ease;}
  693. .pl-progress-inner-text { display: inline-block;vertical-align: middle;color: #ffffff;font-size: 12px;margin: 0 5px;height: 15px}
  694. .pl-progress-tip{ flex:1; text-align:right}
  695. .pl-progress-how{ flex: 0 0 100px; background: #ddd; border-radius: 3px; margin-left: 10px; cursor: pointer; text-align: center;}
  696. .pl-progress-stop{ flex: 0 0 80px; background: #cc3235; cursor: pointer; margin: 6px 6px 6px 10px; font-size: 12px; border: 0; border-radius: 4px; color: #ffffff; outline: none; display: flex; align-items: center; justify-content: center; padding: 0.625em 1.1em;}
  697. .pl-progress-inner-text:after { display: inline-block;content: "";height: 100%;vertical-align: middle;}
  698. .pl-btn-primary { background: ${color}; border: 0; border-radius: 4px; color: #ffffff; cursor: pointer; font-size: 12px; outline: none; display:flex; align-items: center; justify-content: center; margin: 6px 6px; padding: 0.625em 1.1em;transition: 0.3s opacity; }
  699. .pl-btn-primary:hover { opacity: 0.9;transition: 0.3s opacity; }
  700. .pl-btn-success { background: #55af28; animation: easeOpacity 1.2s 2; animation-fill-mode:forwards }
  701. .pl-btn-info { background: #606266; }
  702. .pl-btn-warning { background: #da9328; }
  703. .pl-btn-warning { background: #da9328; }
  704. .pl-btn-danger { background: #cc3235; }
  705. .ali-button {display: inline-flex;align-items: center;justify-content: center;border: 0 solid transparent;font-size: 14px;margin-left: 20px;padding: 1px 12px;position: relative;border: 0 solid transparent;font-size: 14px;margin-left: 20px;padding: 1px 12px;position: relative;width: 32px;height: 32px;background: linear-gradient(129.12deg, #446dff 0%, rgba(99, 125, 255, 0.75) 100%);border-radius: 100px;display: flex;align-items: center;justify-content: center;color: var(--basic_white);cursor: pointer;transition: all .3s ease;}
  706. .ali-button-big {display: inline-flex;align-items: center;justify-content: center;border: 0 solid transparent;border-radius: 5px;box-shadow: 0 0 0 0 transparent;width: fit-content;white-space: nowrap;flex-shrink: 0;font-size: 14px;line-height: 1.5;outline: 0;touch-action: manipulation;transition: background .3s ease,color .3s ease,border .3s ease,box-shadow .3s ease;color: #fff;background: ${color};margin-left: 20px;padding: 1px 12px;position: relative; cursor:pointer; height: 32px;}
  707. .ali-button:hover {background: rgb(122, 144, 255)}
  708. .tianyi-button {margin-right: 20px; padding: 4px 12px; border-radius: 4px; color: #fff; font-size: 12px; border: 1px solid ${color}; background: ${color}; cursor: pointer; position: relative;}
  709. .tianyi-button:hover {border-color: #a5a5a5; background: #a5a5a5;}
  710. .yidong-button {float: left; position: relative; margin: 20px 24px 20px 0; width: 98px; height: 36px; background: ${color}; border-radius: 2px; font-size: 14px; color: #fff; line-height: 39px; text-align: center; cursor: pointer;}
  711. .yidong-share-button {display: inline-block; position: relative; font-size: 14px; line-height: 36px; text-align: center; color: #fff; border: 1px solid ${color}; border-radius: 2px; padding: 0 24px; margin-left: 24px; background: ${color};}
  712. .yidong-button:hover {background: #a5a5a5;}
  713. .xunlei-button {display: inline-flex;align-items: center;justify-content: center;border: 0 solid transparent;border-radius: 5px;box-shadow: 0 0 0 0 transparent;width: fit-content;white-space: nowrap;flex-shrink: 0;font-size: 14px;line-height: 1.5;outline: 0;touch-action: manipulation;transition: background .3s ease,color .3s ease,border .3s ease,box-shadow .3s ease;color: #fff;background: ${color};margin-left: 12px;padding: 0px 12px;position: relative; cursor:pointer; height: 36px;}
  714. .xunlei-button:hover {background: #a5a5a5;}
  715. .quark-button {display: inline-flex; align-items: center; justify-content: center; border: 1px solid #ddd; border-radius: 8px; white-space: nowrap; flex-shrink: 0; font-size: 14px; line-height: 1.5; outline: 0; color: #fff; margin-right: 10px; padding: 0px 14px; position: relative; cursor: pointer; height: 36px;}
  716. .quark-button:hover { background: #a5a5a5;}
  717. .pl-dropdown-menu {position: absolute;right: 0;top: 25px;padding: 5px 0;color: ${color};background: #fff;z-index: 999;width: 102px;border-radius: 10px;box-shadow: 0 0 1px 1px rgb(28 28 32 / 5%), 0 8px 24px rgb(28 28 32 / 12%); text-align: center;}
  718. .pl-dropdown-menu-old {position: absolute;right: 0;top: 30px;padding: 5px 0;color: rgb(37, 38, 43);background: #fff;z-index: 999;width: 102px;border: 1px solid #ddd;border-radius: 10px; box-shadow: 0 0 1px 1px rgb(28 28 32 / 5%), 0 8px 24px rgb(28 28 32 / 12%);}
  719. .pl-dropdown-menu-item { height: 30px;display: flex;align-items: center;justify-content: center;color: ${color};}
  720. .pl-dropdown-menu-item:hover { background-color: rgba(132,133,141,0.08);}
  721. .pl-button .pl-dropdown-menu { display: none; }
  722. .pl-button-mode {padding: 0px !important;}
  723. .pl-button:hover .pl-dropdown-menu { display: block!important; }
  724. .pl-button-init { opacity: 0.5; animation: easeInitOpacity 1.2s 3; animation-fill-mode:forwards }
  725. @keyframes easeInitOpacity { from { opacity: 0.5; } 50% { opacity: 1 } to { opacity: 0.5; } }
  726. @keyframes easeOpacity { from { opacity: 1; } 50% { opacity: 0.35 } to { opacity: 1; } }
  727. .element-clicked { opacity: 0.5; }
  728. .pl-extra { margin-top: 10px;display:flex}
  729. .pl-extra button { flex: 1}
  730. .pointer { cursor:pointer }
  731. .pl-setting-label { display: flex;align-items: center;justify-content: space-between;padding-top: 10px; }
  732. .pl-label { flex: 0 0 100px;text-align:left; }
  733. .pl-input { flex: 1; padding: 8px 10px; border: 1px solid #c2c2c2; border-radius: 5px; font-size: 14px }
  734. .pl-color { flex: 1;display: flex;flex-wrap: wrap}
  735. .pl-color-box { width: 35px;height: 35px;margin:10px 10px 0 0;; box-sizing: border-box;border:1px solid #fff;cursor:pointer }
  736. .pl-color-box.checked { border:3px dashed #111!important }
  737. .pl-close:focus { outline: 0; box-shadow: none; }
  738. .tag-danger {color:#cc3235;margin: 0 5px;}
  739. .pl-tooltip { position: absolute; color: #ffffff; max-width: 600px; font-size: 12px; padding: 5px 10px; background: #333; border-radius: 5px; z-index: 110000; line-height: 1.3; display:none; word-break: break-all;}
  740. @keyframes load { 0% { transform: rotate(0deg) } 100% { transform: rotate(360deg) } }
  741. .pl-loading-box > div > div { position: absolute;border-radius: 50%;}
  742. .pl-loading-box > div > div:nth-child(1) { top: 9px;left: 9px;width: 82px;height: 82px;background: #ffffff;}
  743. .pl-loading-box > div > div:nth-child(2) { top: 14px;left: 38px;width: 25px;height: 25px;background: #666666;animation: load 1s linear infinite;transform-origin: 12px 36px;}
  744. .pl-loading { width: 16px;height: 16px;display: inline-block;overflow: hidden;background: none;}
  745. .pl-loading-box { width: 100%;height: 100%;position: relative;transform: translateZ(0) scale(0.16);backface-visibility: hidden;transform-origin: 0 0;}
  746. .pl-loading-box div { box-sizing: content-box; }
  747. .swal2-container { z-index:100000!important; }
  748. body.swal2-height-auto { height: inherit!important; }
  749. `;
  750. this.addStyle('panlinker-style', 'style', css);
  751.  
  752. let swalcss = `
  753. .swal2-popup.swal2-toast {
  754. box-sizing:border-box;
  755. grid-column:1/4!important;
  756. grid-row:1/4!important;
  757. grid-template-columns:1fr 99fr 1fr;
  758. padding:1em;
  759. overflow-y:hidden;
  760. background:#fff;
  761. box-shadow:0 0 1px hsla(0deg,0%,0%,.075),0 1px 2px hsla(0deg,0%,0%,.075),1px 2px 4px hsla(0deg,0%,0%,.075),1px 3px 8px hsla(0deg,0%,0%,.075),2px 4px 16px hsla(0deg,0%,0%,.075);
  762. pointer-events:all
  763. }
  764. .swal2-popup.swal2-toast>* {
  765. grid-column:2
  766. }
  767. .swal2-popup.swal2-toast .swal2-title {
  768. margin:.5em 1em;
  769. padding:0;
  770. font-size:1em;
  771. text-align:initial
  772. }
  773. .swal2-popup.swal2-toast .swal2-loading {
  774. justify-content:center
  775. }
  776. .swal2-popup.swal2-toast .swal2-input {
  777. height:2em;
  778. margin:.5em;
  779. font-size:1em
  780. }
  781. .swal2-popup.swal2-toast .swal2-validation-message {
  782. font-size:1em
  783. }
  784. .swal2-popup.swal2-toast .swal2-footer {
  785. margin:.5em 0 0;
  786. padding:.5em 0 0;
  787. font-size:.8em
  788. }
  789. .swal2-popup.swal2-toast .swal2-close {
  790. grid-column:3/3;
  791. grid-row:1/99;
  792. align-self:center;
  793. width:.8em;
  794. height:.8em;
  795. margin:0;
  796. font-size:2em
  797. }
  798. .swal2-popup.swal2-toast .swal2-html-container {
  799. margin:.5em 1em;
  800. padding:0;
  801. overflow:initial;
  802. font-size:1em;
  803. text-align:initial
  804. }
  805. .swal2-popup.swal2-toast .swal2-html-container:empty {
  806. padding:0
  807. }
  808. .swal2-popup.swal2-toast .swal2-loader {
  809. grid-column:1;
  810. grid-row:1/99;
  811. align-self:center;
  812. width:2em;
  813. height:2em;
  814. margin:.25em
  815. }
  816. .swal2-popup.swal2-toast .swal2-icon {
  817. grid-column:1;
  818. grid-row:1/99;
  819. align-self:center;
  820. width:2em;
  821. min-width:2em;
  822. height:2em;
  823. margin:0 .5em 0 0
  824. }
  825. .swal2-popup.swal2-toast .swal2-icon .swal2-icon-content {
  826. display:flex;
  827. align-items:center;
  828. font-size:1.8em;
  829. font-weight:700
  830. }
  831. .swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring {
  832. width:2em;
  833. height:2em
  834. }
  835. .swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line] {
  836. top:.875em;
  837. width:1.375em
  838. }
  839. .swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left] {
  840. left:.3125em
  841. }
  842. .swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right] {
  843. right:.3125em
  844. }
  845. .swal2-popup.swal2-toast .swal2-actions {
  846. justify-content:flex-start;
  847. height:auto;
  848. margin:0;
  849. margin-top:.5em;
  850. padding:0 .5em
  851. }
  852. .swal2-popup.swal2-toast .swal2-styled {
  853. margin:.25em .5em;
  854. padding:.4em .6em;
  855. font-size:1em
  856. }
  857. .swal2-popup.swal2-toast .swal2-success {
  858. border-color:#a5dc86
  859. }
  860. .swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line] {
  861. position:absolute;
  862. width:1.6em;
  863. height:3em;
  864. transform:rotate(45deg);
  865. border-radius:50%
  866. }
  867. .swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left] {
  868. top:-.8em;
  869. left:-.5em;
  870. transform:rotate(-45deg);
  871. transform-origin:2em 2em;
  872. border-radius:4em 0 0 4em
  873. }
  874. .swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right] {
  875. top:-.25em;
  876. left:.9375em;
  877. transform-origin:0 1.5em;
  878. border-radius:0 4em 4em 0
  879. }
  880. .swal2-popup.swal2-toast .swal2-success .swal2-success-ring {
  881. width:2em;
  882. height:2em
  883. }
  884. .swal2-popup.swal2-toast .swal2-success .swal2-success-fix {
  885. top:0;
  886. left:.4375em;
  887. width:.4375em;
  888. height:2.6875em
  889. }
  890. .swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line] {
  891. height:.3125em
  892. }
  893. .swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip] {
  894. top:1.125em;
  895. left:.1875em;
  896. width:.75em
  897. }
  898. .swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long] {
  899. top:.9375em;
  900. right:.1875em;
  901. width:1.375em
  902. }
  903. .swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip {
  904. -webkit-animation:swal2-toast-animate-success-line-tip .75s;
  905. animation:swal2-toast-animate-success-line-tip .75s
  906. }
  907. .swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long {
  908. -webkit-animation:swal2-toast-animate-success-line-long .75s;
  909. animation:swal2-toast-animate-success-line-long .75s
  910. }
  911. .swal2-popup.swal2-toast.swal2-show {
  912. -webkit-animation:swal2-toast-show .5s;
  913. animation:swal2-toast-show .5s
  914. }
  915. .swal2-popup.swal2-toast.swal2-hide {
  916. -webkit-animation:swal2-toast-hide .1s forwards;
  917. animation:swal2-toast-hide .1s forwards
  918. }
  919. .swal2-container {
  920. display:grid;
  921. position:fixed;
  922. z-index:1060;
  923. top:0;
  924. right:0;
  925. bottom:0;
  926. left:0;
  927. box-sizing:border-box;
  928. grid-template-areas:"top-start top top-end" "center-start center center-end" "bottom-start bottom-center bottom-end";
  929. grid-template-rows:minmax(-webkit-min-content,auto) minmax(-webkit-min-content,auto) minmax(-webkit-min-content,auto);
  930. grid-template-rows:minmax(min-content,auto) minmax(min-content,auto) minmax(min-content,auto);
  931. height:100%;
  932. padding:.625em;
  933. overflow-x:hidden;
  934. transition:background-color .1s;
  935. -webkit-overflow-scrolling:touch
  936. }
  937. .swal2-container.swal2-backdrop-show,.swal2-container.swal2-noanimation {
  938. background:${color}66 !important
  939. }
  940. .swal2-container.swal2-backdrop-hide {
  941. background:0 0!important
  942. }
  943. .swal2-container.swal2-bottom-start,.swal2-container.swal2-center-start,.swal2-container.swal2-top-start {
  944. grid-template-columns:minmax(0,1fr) auto auto
  945. }
  946. .swal2-container.swal2-bottom,.swal2-container.swal2-center,.swal2-container.swal2-top {
  947. grid-template-columns:auto minmax(0,1fr) auto
  948. }
  949. .swal2-container.swal2-bottom-end,.swal2-container.swal2-center-end,.swal2-container.swal2-top-end {
  950. grid-template-columns:auto auto minmax(0,1fr)
  951. }
  952. .swal2-container.swal2-top-start>.swal2-popup {
  953. align-self:start
  954. }
  955. .swal2-container.swal2-top>.swal2-popup {
  956. grid-column:2;
  957. align-self:start;
  958. justify-self:center
  959. }
  960. .swal2-container.swal2-top-end>.swal2-popup,.swal2-container.swal2-top-right>.swal2-popup {
  961. grid-column:3;
  962. align-self:start;
  963. justify-self:end
  964. }
  965. .swal2-container.swal2-center-left>.swal2-popup,.swal2-container.swal2-center-start>.swal2-popup {
  966. grid-row:2;
  967. align-self:center
  968. }
  969. .swal2-container.swal2-center>.swal2-popup {
  970. grid-column:2;
  971. grid-row:2;
  972. align-self:center;
  973. justify-self:center
  974. }
  975. .swal2-container.swal2-center-end>.swal2-popup,.swal2-container.swal2-center-right>.swal2-popup {
  976. grid-column:3;
  977. grid-row:2;
  978. align-self:center;
  979. justify-self:end
  980. }
  981. .swal2-container.swal2-bottom-left>.swal2-popup,.swal2-container.swal2-bottom-start>.swal2-popup {
  982. grid-column:1;
  983. grid-row:3;
  984. align-self:end
  985. }
  986. .swal2-container.swal2-bottom>.swal2-popup {
  987. grid-column:2;
  988. grid-row:3;
  989. justify-self:center;
  990. align-self:end
  991. }
  992. .swal2-container.swal2-bottom-end>.swal2-popup,.swal2-container.swal2-bottom-right>.swal2-popup {
  993. grid-column:3;
  994. grid-row:3;
  995. align-self:end;
  996. justify-self:end
  997. }
  998. .swal2-container.swal2-grow-fullscreen>.swal2-popup,.swal2-container.swal2-grow-row>.swal2-popup {
  999. grid-column:1/4;
  1000. width:100%
  1001. }
  1002. .swal2-container.swal2-grow-column>.swal2-popup,.swal2-container.swal2-grow-fullscreen>.swal2-popup {
  1003. grid-row:1/4;
  1004. align-self:stretch
  1005. }
  1006. .swal2-container.swal2-no-transition {
  1007. transition:none!important
  1008. }
  1009. .swal2-popup {
  1010. display:none;
  1011. position:relative;
  1012. box-sizing:border-box;
  1013. grid-template-columns:minmax(0,100%);
  1014. width:32em;
  1015. max-width:100%;
  1016. padding:0 0 1.25em;
  1017. border:none;
  1018. border-radius:5px;
  1019. background:#fff;
  1020. color:#545454;
  1021. font-family:inherit;
  1022. font-size:1rem
  1023. }
  1024. .swal2-popup:focus {
  1025. outline:0
  1026. }
  1027. .swal2-popup.swal2-loading {
  1028. overflow-y:hidden
  1029. }
  1030. .swal2-title {
  1031. position:relative;
  1032. max-width:100%;
  1033. margin:0;
  1034. padding:.8em 1em 0;
  1035. color:inherit;
  1036. font-size:1.875em;
  1037. font-weight:600;
  1038. text-align:center;
  1039. text-transform:none;
  1040. word-wrap:break-word
  1041. }
  1042. .swal2-actions {
  1043. display:flex;
  1044. z-index:1;
  1045. box-sizing:border-box;
  1046. flex-wrap:wrap;
  1047. align-items:center;
  1048. justify-content:center;
  1049. width:auto;
  1050. margin:1.25em auto 0;
  1051. padding:0
  1052. }
  1053. .swal2-actions:not(.swal2-loading) .swal2-styled[disabled] {
  1054. opacity:.4
  1055. }
  1056. .swal2-actions:not(.swal2-loading) .swal2-styled:hover {
  1057. background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))
  1058. }
  1059. .swal2-actions:not(.swal2-loading) .swal2-styled:active {
  1060. background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))
  1061. }
  1062. .swal2-loader {
  1063. display:none;
  1064. align-items:center;
  1065. justify-content:center;
  1066. width:2.2em;
  1067. height:2.2em;
  1068. margin:0 1.875em;
  1069. -webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;
  1070. animation:swal2-rotate-loading 1.5s linear 0s infinite normal;
  1071. border-width:.25em;
  1072. border-style:solid;
  1073. border-radius:100%;
  1074. border-color:${color} transparent ${color} transparent !important
  1075. }
  1076. .swal2-styled {
  1077. margin:.3125em;
  1078. padding:.625em 1.1em;
  1079. transition:box-shadow .1s;
  1080. box-shadow:0 0 0 3px transparent;
  1081. font-weight:500
  1082. }
  1083. .swal2-styled:not([disabled]) {
  1084. cursor:pointer
  1085. }
  1086. .swal2-styled.swal2-confirm {
  1087. border:0;
  1088. border-radius:.25em;
  1089. background:initial;
  1090. background-color:${color} !important;
  1091. color:#fff;
  1092. font-size:1em
  1093. }
  1094. .swal2-styled.swal2-confirm:focus {
  1095. box-shadow:0 0 0 3px ${color}80 !important
  1096. }
  1097. .swal2-styled.swal2-deny {
  1098. border:0;
  1099. border-radius:.25em;
  1100. background:initial;
  1101. background-color:#dc3741;
  1102. color:#fff;
  1103. font-size:1em
  1104. }
  1105. .swal2-styled.swal2-deny:focus {
  1106. box-shadow:0 0 0 3px rgba(220,55,65,.5)
  1107. }
  1108. .swal2-styled.swal2-cancel {
  1109. border:0;
  1110. border-radius:.25em;
  1111. background:initial;
  1112. background-color:#dd3333;
  1113. color:#fff;
  1114. font-size:1em
  1115. }
  1116. .swal2-styled.swal2-cancel:focus {
  1117. box-shadow:0 0 0 3px rgba(110,120,129,.5)
  1118. }
  1119. .swal2-styled.swal2-default-outline:focus {
  1120. box-shadow:0 0 0 3px rgba(100,150,200,.5)
  1121. }
  1122. .swal2-styled:focus {
  1123. outline:0
  1124. }
  1125. .swal2-styled::-moz-focus-inner {
  1126. border:0
  1127. }
  1128. .swal2-footer {
  1129. justify-content:center;
  1130. margin:1em 0 0;
  1131. padding:1em 1em 0;
  1132. border-top:1px solid #eee;
  1133. color:inherit;
  1134. font-size:1em
  1135. }
  1136. .swal2-timer-progress-bar-container {
  1137. position:absolute;
  1138. right:0;
  1139. bottom:0;
  1140. left:0;
  1141. grid-column:auto!important;
  1142. overflow:hidden;
  1143. border-bottom-right-radius:5px;
  1144. border-bottom-left-radius:5px
  1145. }
  1146. .swal2-timer-progress-bar {
  1147. width:100%;
  1148. height:.25em;
  1149. background:rgba(0,0,0,.2)
  1150. }
  1151. .swal2-image {
  1152. max-width:100%;
  1153. margin:2em auto 1em
  1154. }
  1155. .swal2-close {
  1156. z-index:2;
  1157. align-items:center;
  1158. justify-content:center;
  1159. width:1.2em;
  1160. height:1.2em;
  1161. margin-top:0;
  1162. margin-right:0;
  1163. margin-bottom:-1.2em;
  1164. padding:0;
  1165. overflow:hidden;
  1166. transition:color .1s,box-shadow .1s;
  1167. border:none;
  1168. border-radius:5px;
  1169. background:0 0;
  1170. color:#ccc;
  1171. font-family:serif;
  1172. font-family:monospace;
  1173. font-size:2.5em;
  1174. cursor:pointer;
  1175. justify-self:end
  1176. }
  1177. .swal2-close:hover {
  1178. transform:none;
  1179. background:0 0;
  1180. color:#f27474
  1181. }
  1182. .swal2-close:focus {
  1183. outline:0;
  1184. box-shadow:inset 0 0 0 3px rgba(100,150,200,.5)
  1185. }
  1186. .swal2-close::-moz-focus-inner {
  1187. border:0
  1188. }
  1189. .swal2-html-container {
  1190. z-index:1;
  1191. justify-content:center;
  1192. margin:1em 1.6em .3em;
  1193. padding:0;
  1194. overflow:auto;
  1195. color:inherit;
  1196. font-size:1.125em;
  1197. font-weight:400;
  1198. line-height:normal;
  1199. text-align:center;
  1200. word-wrap:break-word;
  1201. word-break:break-word
  1202. }
  1203. .swal2-checkbox,.swal2-file,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea {
  1204. margin:1em 2em 3px
  1205. }
  1206. .swal2-file,.swal2-input,.swal2-textarea {
  1207. box-sizing:border-box;
  1208. width:auto;
  1209. transition:border-color .1s,box-shadow .1s;
  1210. border:1px solid #d9d9d9;
  1211. border-radius:.1875em;
  1212. background:0 0;
  1213. box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px transparent;
  1214. color:inherit;
  1215. font-size:1.125em
  1216. }
  1217. .swal2-file.swal2-inputerror,.swal2-input.swal2-inputerror,.swal2-textarea.swal2-inputerror {
  1218. border-color:#f27474!important;
  1219. box-shadow:0 0 2px #f27474!important
  1220. }
  1221. .swal2-file:focus,.swal2-input:focus,.swal2-textarea:focus {
  1222. border:1px solid #b4dbed;
  1223. outline:0;
  1224. box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(100,150,200,.5)
  1225. }
  1226. .swal2-file::-moz-placeholder,.swal2-input::-moz-placeholder,.swal2-textarea::-moz-placeholder {
  1227. color:#ccc
  1228. }
  1229. .swal2-file::placeholder,.swal2-input::placeholder,.swal2-textarea::placeholder {
  1230. color:#ccc
  1231. }
  1232. .swal2-range {
  1233. margin:1em 2em 3px;
  1234. background:#fff
  1235. }
  1236. .swal2-range input {
  1237. width:80%
  1238. }
  1239. .swal2-range output {
  1240. width:20%;
  1241. color:inherit;
  1242. font-weight:600;
  1243. text-align:center
  1244. }
  1245. .swal2-range input,.swal2-range output {
  1246. height:2.625em;
  1247. padding:0;
  1248. font-size:1.125em;
  1249. line-height:2.625em
  1250. }
  1251. .swal2-input {
  1252. height:2.625em;
  1253. padding:0 .75em
  1254. }
  1255. .swal2-file {
  1256. width:75%;
  1257. margin-right:auto;
  1258. margin-left:auto;
  1259. background:0 0;
  1260. font-size:1.125em
  1261. }
  1262. .swal2-textarea {
  1263. height:6.75em;
  1264. padding:.75em
  1265. }
  1266. .swal2-select {
  1267. min-width:50%;
  1268. max-width:100%;
  1269. padding:.375em .625em;
  1270. background:0 0;
  1271. color:inherit;
  1272. font-size:1.125em
  1273. }
  1274. .swal2-checkbox,.swal2-radio {
  1275. align-items:center;
  1276. justify-content:center;
  1277. background:#fff;
  1278. color:inherit
  1279. }
  1280. .swal2-checkbox label,.swal2-radio label {
  1281. margin:0 .6em;
  1282. font-size:1.125em
  1283. }
  1284. .swal2-checkbox input,.swal2-radio input {
  1285. flex-shrink:0;
  1286. margin:0 .4em
  1287. }
  1288. .swal2-input-label {
  1289. display:flex;
  1290. justify-content:center;
  1291. margin:1em auto 0
  1292. }
  1293. .swal2-validation-message {
  1294. align-items:center;
  1295. justify-content:center;
  1296. margin:1em 0 0;
  1297. padding:.625em;
  1298. overflow:hidden;
  1299. background:#f0f0f0;
  1300. color:#666;
  1301. font-size:1em;
  1302. font-weight:300
  1303. }
  1304. .swal2-validation-message::before {
  1305. content:"!";
  1306. display:inline-block;
  1307. width:1.5em;
  1308. min-width:1.5em;
  1309. height:1.5em;
  1310. margin:0 .625em;
  1311. border-radius:50%;
  1312. background-color:#f27474;
  1313. color:#fff;
  1314. font-weight:600;
  1315. line-height:1.5em;
  1316. text-align:center
  1317. }
  1318. .swal2-icon {
  1319. position:relative;
  1320. box-sizing:content-box;
  1321. justify-content:center;
  1322. width:5em;
  1323. height:5em;
  1324. margin:2.5em auto .6em;
  1325. border:.25em solid transparent;
  1326. border-radius:50%;
  1327. border-color:#000;
  1328. font-family:inherit;
  1329. line-height:5em;
  1330. cursor:default;
  1331. -webkit-user-select:none;
  1332. -moz-user-select:none;
  1333. user-select:none
  1334. }
  1335. .swal2-icon .swal2-icon-content {
  1336. display:flex;
  1337. align-items:center;
  1338. font-size:3.75em
  1339. }
  1340. .swal2-icon.swal2-error {
  1341. border-color:#f27474;
  1342. color:#f27474
  1343. }
  1344. .swal2-icon.swal2-error .swal2-x-mark {
  1345. position:relative;
  1346. flex-grow:1
  1347. }
  1348. .swal2-icon.swal2-error [class^=swal2-x-mark-line] {
  1349. display:block;
  1350. position:absolute;
  1351. top:2.3125em;
  1352. width:2.9375em;
  1353. height:.3125em;
  1354. border-radius:.125em;
  1355. background-color:#f27474
  1356. }
  1357. .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left] {
  1358. left:1.0625em;
  1359. transform:rotate(45deg)
  1360. }
  1361. .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right] {
  1362. right:1em;
  1363. transform:rotate(-45deg)
  1364. }
  1365. .swal2-icon.swal2-error.swal2-icon-show {
  1366. -webkit-animation:swal2-animate-error-icon .5s;
  1367. animation:swal2-animate-error-icon .5s
  1368. }
  1369. .swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark {
  1370. -webkit-animation:swal2-animate-error-x-mark .5s;
  1371. animation:swal2-animate-error-x-mark .5s
  1372. }
  1373. .swal2-icon.swal2-warning {
  1374. border-color:#facea8;
  1375. color:#f8bb86
  1376. }
  1377. .swal2-icon.swal2-warning.swal2-icon-show {
  1378. -webkit-animation:swal2-animate-error-icon .5s;
  1379. animation:swal2-animate-error-icon .5s
  1380. }
  1381. .swal2-icon.swal2-warning.swal2-icon-show .swal2-icon-content {
  1382. -webkit-animation:swal2-animate-i-mark .5s;
  1383. animation:swal2-animate-i-mark .5s
  1384. }
  1385. .swal2-icon.swal2-info {
  1386. border-color:#9de0f6;
  1387. color:#3fc3ee
  1388. }
  1389. .swal2-icon.swal2-info.swal2-icon-show {
  1390. -webkit-animation:swal2-animate-error-icon .5s;
  1391. animation:swal2-animate-error-icon .5s
  1392. }
  1393. .swal2-icon.swal2-info.swal2-icon-show .swal2-icon-content {
  1394. -webkit-animation:swal2-animate-i-mark .8s;
  1395. animation:swal2-animate-i-mark .8s
  1396. }
  1397. .swal2-icon.swal2-question {
  1398. border-color:#c9dae1;
  1399. color:#87adbd
  1400. }
  1401. .swal2-icon.swal2-question.swal2-icon-show {
  1402. -webkit-animation:swal2-animate-error-icon .5s;
  1403. animation:swal2-animate-error-icon .5s
  1404. }
  1405. .swal2-icon.swal2-question.swal2-icon-show .swal2-icon-content {
  1406. -webkit-animation:swal2-animate-question-mark .8s;
  1407. animation:swal2-animate-question-mark .8s
  1408. }
  1409. .swal2-icon.swal2-success {
  1410. border-color:#a5dc86;
  1411. color:#a5dc86
  1412. }
  1413. .swal2-icon.swal2-success [class^=swal2-success-circular-line] {
  1414. position:absolute;
  1415. width:3.75em;
  1416. height:7.5em;
  1417. transform:rotate(45deg);
  1418. border-radius:50%
  1419. }
  1420. .swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left] {
  1421. top:-.4375em;
  1422. left:-2.0635em;
  1423. transform:rotate(-45deg);
  1424. transform-origin:3.75em 3.75em;
  1425. border-radius:7.5em 0 0 7.5em
  1426. }
  1427. .swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right] {
  1428. top:-.6875em;
  1429. left:1.875em;
  1430. transform:rotate(-45deg);
  1431. transform-origin:0 3.75em;
  1432. border-radius:0 7.5em 7.5em 0
  1433. }
  1434. .swal2-icon.swal2-success .swal2-success-ring {
  1435. position:absolute;
  1436. z-index:2;
  1437. top:-.25em;
  1438. left:-.25em;
  1439. box-sizing:content-box;
  1440. width:100%;
  1441. height:100%;
  1442. border:.25em solid rgba(165,220,134,.3);
  1443. border-radius:50%
  1444. }
  1445. .swal2-icon.swal2-success .swal2-success-fix {
  1446. position:absolute;
  1447. z-index:1;
  1448. top:.5em;
  1449. left:1.625em;
  1450. width:.4375em;
  1451. height:5.625em;
  1452. transform:rotate(-45deg)
  1453. }
  1454. .swal2-icon.swal2-success [class^=swal2-success-line] {
  1455. display:block;
  1456. position:absolute;
  1457. z-index:2;
  1458. height:.3125em;
  1459. border-radius:.125em;
  1460. background-color:#a5dc86
  1461. }
  1462. .swal2-icon.swal2-success [class^=swal2-success-line][class$=tip] {
  1463. top:2.875em;
  1464. left:.8125em;
  1465. width:1.5625em;
  1466. transform:rotate(45deg)
  1467. }
  1468. .swal2-icon.swal2-success [class^=swal2-success-line][class$=long] {
  1469. top:2.375em;
  1470. right:.5em;
  1471. width:2.9375em;
  1472. transform:rotate(-45deg)
  1473. }
  1474. .swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip {
  1475. -webkit-animation:swal2-animate-success-line-tip .75s;
  1476. animation:swal2-animate-success-line-tip .75s
  1477. }
  1478. .swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long {
  1479. -webkit-animation:swal2-animate-success-line-long .75s;
  1480. animation:swal2-animate-success-line-long .75s
  1481. }
  1482. .swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right {
  1483. -webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;
  1484. animation:swal2-rotate-success-circular-line 4.25s ease-in
  1485. }
  1486. .swal2-progress-steps {
  1487. flex-wrap:wrap;
  1488. align-items:center;
  1489. max-width:100%;
  1490. margin:1.25em auto;
  1491. padding:0;
  1492. background:0 0;
  1493. font-weight:600
  1494. }
  1495. .swal2-progress-steps li {
  1496. display:inline-block;
  1497. position:relative
  1498. }
  1499. .swal2-progress-steps .swal2-progress-step {
  1500. z-index:20;
  1501. flex-shrink:0;
  1502. width:2em;
  1503. height:2em;
  1504. border-radius:2em;
  1505. background:${color} !important;
  1506. color:#fff;
  1507. line-height:2em;
  1508. text-align:center
  1509. }
  1510. .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step {
  1511. background:${color} !important
  1512. }
  1513. .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step {
  1514. background:#add8e6;
  1515. color:#fff
  1516. }
  1517. .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line {
  1518. background:#add8e6
  1519. }
  1520. .swal2-progress-steps .swal2-progress-step-line {
  1521. z-index:10;
  1522. flex-shrink:0;
  1523. width:2.5em;
  1524. height:.4em;
  1525. margin:0 -1px;
  1526. background:${color} !important
  1527. }
  1528. [class^=swal2] {
  1529. -webkit-tap-highlight-color:transparent
  1530. }
  1531. .swal2-show {
  1532. -webkit-animation:swal2-show .3s;
  1533. animation:swal2-show .3s
  1534. }
  1535. .swal2-hide {
  1536. -webkit-animation:swal2-hide .15s forwards;
  1537. animation:swal2-hide .15s forwards
  1538. }
  1539. .swal2-noanimation {
  1540. transition:none
  1541. }
  1542. .swal2-scrollbar-measure {
  1543. position:absolute;
  1544. top:-9999px;
  1545. width:50px;
  1546. height:50px;
  1547. overflow:scroll
  1548. }
  1549. .swal2-rtl .swal2-close {
  1550. margin-right:initial;
  1551. margin-left:0
  1552. }
  1553. .swal2-rtl .swal2-timer-progress-bar {
  1554. right:0;
  1555. left:auto
  1556. }
  1557. .leave-russia-now-and-apply-your-skills-to-the-world {
  1558. display:flex;
  1559. position:fixed;
  1560. z-index:1939;
  1561. top:0;
  1562. right:0;
  1563. bottom:0;
  1564. left:0;
  1565. flex-direction:column;
  1566. align-items:center;
  1567. justify-content:center;
  1568. padding:25px 0 20px;
  1569. background:#20232a;
  1570. color:#fff;
  1571. text-align:center
  1572. }
  1573. .leave-russia-now-and-apply-your-skills-to-the-world div {
  1574. max-width:560px;
  1575. margin:10px;
  1576. line-height:146%
  1577. }
  1578. .leave-russia-now-and-apply-your-skills-to-the-world iframe {
  1579. max-width:100%;
  1580. max-height:55.5555555556vmin;
  1581. margin:16px auto
  1582. }
  1583. .leave-russia-now-and-apply-your-skills-to-the-world strong {
  1584. border-bottom:2px dashed #fff
  1585. }
  1586. .leave-russia-now-and-apply-your-skills-to-the-world button {
  1587. display:flex;
  1588. position:fixed;
  1589. z-index:1940;
  1590. top:0;
  1591. right:0;
  1592. align-items:center;
  1593. justify-content:center;
  1594. width:48px;
  1595. height:48px;
  1596. margin-right:10px;
  1597. margin-bottom:-10px;
  1598. border:none;
  1599. background:0 0;
  1600. color:#aaa;
  1601. font-size:48px;
  1602. font-weight:700;
  1603. cursor:pointer
  1604. }
  1605. .leave-russia-now-and-apply-your-skills-to-the-world button:hover {
  1606. color:#fff
  1607. }
  1608. @-webkit-keyframes swal2-toast-show {
  1609. 0% {
  1610. transform:translateY(-.625em) rotateZ(2deg)
  1611. }
  1612. 33% {
  1613. transform:translateY(0) rotateZ(-2deg)
  1614. }
  1615. 66% {
  1616. transform:translateY(.3125em) rotateZ(2deg)
  1617. }
  1618. 100% {
  1619. transform:translateY(0) rotateZ(0)
  1620. }
  1621. }@keyframes swal2-toast-show {
  1622. 0% {
  1623. transform:translateY(-.625em) rotateZ(2deg)
  1624. }
  1625. 33% {
  1626. transform:translateY(0) rotateZ(-2deg)
  1627. }
  1628. 66% {
  1629. transform:translateY(.3125em) rotateZ(2deg)
  1630. }
  1631. 100% {
  1632. transform:translateY(0) rotateZ(0)
  1633. }
  1634. }@-webkit-keyframes swal2-toast-hide {
  1635. 100% {
  1636. transform:rotateZ(1deg);
  1637. opacity:0
  1638. }
  1639. }@keyframes swal2-toast-hide {
  1640. 100% {
  1641. transform:rotateZ(1deg);
  1642. opacity:0
  1643. }
  1644. }@-webkit-keyframes swal2-toast-animate-success-line-tip {
  1645. 0% {
  1646. top:.5625em;
  1647. left:.0625em;
  1648. width:0
  1649. }
  1650. 54% {
  1651. top:.125em;
  1652. left:.125em;
  1653. width:0
  1654. }
  1655. 70% {
  1656. top:.625em;
  1657. left:-.25em;
  1658. width:1.625em
  1659. }
  1660. 84% {
  1661. top:1.0625em;
  1662. left:.75em;
  1663. width:.5em
  1664. }
  1665. 100% {
  1666. top:1.125em;
  1667. left:.1875em;
  1668. width:.75em
  1669. }
  1670. }@keyframes swal2-toast-animate-success-line-tip {
  1671. 0% {
  1672. top:.5625em;
  1673. left:.0625em;
  1674. width:0
  1675. }
  1676. 54% {
  1677. top:.125em;
  1678. left:.125em;
  1679. width:0
  1680. }
  1681. 70% {
  1682. top:.625em;
  1683. left:-.25em;
  1684. width:1.625em
  1685. }
  1686. 84% {
  1687. top:1.0625em;
  1688. left:.75em;
  1689. width:.5em
  1690. }
  1691. 100% {
  1692. top:1.125em;
  1693. left:.1875em;
  1694. width:.75em
  1695. }
  1696. }@-webkit-keyframes swal2-toast-animate-success-line-long {
  1697. 0% {
  1698. top:1.625em;
  1699. right:1.375em;
  1700. width:0
  1701. }
  1702. 65% {
  1703. top:1.25em;
  1704. right:.9375em;
  1705. width:0
  1706. }
  1707. 84% {
  1708. top:.9375em;
  1709. right:0;
  1710. width:1.125em
  1711. }
  1712. 100% {
  1713. top:.9375em;
  1714. right:.1875em;
  1715. width:1.375em
  1716. }
  1717. }@keyframes swal2-toast-animate-success-line-long {
  1718. 0% {
  1719. top:1.625em;
  1720. right:1.375em;
  1721. width:0
  1722. }
  1723. 65% {
  1724. top:1.25em;
  1725. right:.9375em;
  1726. width:0
  1727. }
  1728. 84% {
  1729. top:.9375em;
  1730. right:0;
  1731. width:1.125em
  1732. }
  1733. 100% {
  1734. top:.9375em;
  1735. right:.1875em;
  1736. width:1.375em
  1737. }
  1738. }@-webkit-keyframes swal2-show {
  1739. 0% {
  1740. transform:scale(.7)
  1741. }
  1742. 45% {
  1743. transform:scale(1.05)
  1744. }
  1745. 80% {
  1746. transform:scale(.95)
  1747. }
  1748. 100% {
  1749. transform:scale(1)
  1750. }
  1751. }@keyframes swal2-show {
  1752. 0% {
  1753. transform:scale(.7)
  1754. }
  1755. 45% {
  1756. transform:scale(1.05)
  1757. }
  1758. 80% {
  1759. transform:scale(.95)
  1760. }
  1761. 100% {
  1762. transform:scale(1)
  1763. }
  1764. }@-webkit-keyframes swal2-hide {
  1765. 0% {
  1766. transform:scale(1);
  1767. opacity:1
  1768. }
  1769. 100% {
  1770. transform:scale(.5);
  1771. opacity:0
  1772. }
  1773. }@keyframes swal2-hide {
  1774. 0% {
  1775. transform:scale(1);
  1776. opacity:1
  1777. }
  1778. 100% {
  1779. transform:scale(.5);
  1780. opacity:0
  1781. }
  1782. }@-webkit-keyframes swal2-animate-success-line-tip {
  1783. 0% {
  1784. top:1.1875em;
  1785. left:.0625em;
  1786. width:0
  1787. }
  1788. 54% {
  1789. top:1.0625em;
  1790. left:.125em;
  1791. width:0
  1792. }
  1793. 70% {
  1794. top:2.1875em;
  1795. left:-.375em;
  1796. width:3.125em
  1797. }
  1798. 84% {
  1799. top:3em;
  1800. left:1.3125em;
  1801. width:1.0625em
  1802. }
  1803. 100% {
  1804. top:2.8125em;
  1805. left:.8125em;
  1806. width:1.5625em
  1807. }
  1808. }@keyframes swal2-animate-success-line-tip {
  1809. 0% {
  1810. top:1.1875em;
  1811. left:.0625em;
  1812. width:0
  1813. }
  1814. 54% {
  1815. top:1.0625em;
  1816. left:.125em;
  1817. width:0
  1818. }
  1819. 70% {
  1820. top:2.1875em;
  1821. left:-.375em;
  1822. width:3.125em
  1823. }
  1824. 84% {
  1825. top:3em;
  1826. left:1.3125em;
  1827. width:1.0625em
  1828. }
  1829. 100% {
  1830. top:2.8125em;
  1831. left:.8125em;
  1832. width:1.5625em
  1833. }
  1834. }@-webkit-keyframes swal2-animate-success-line-long {
  1835. 0% {
  1836. top:3.375em;
  1837. right:2.875em;
  1838. width:0
  1839. }
  1840. 65% {
  1841. top:3.375em;
  1842. right:2.875em;
  1843. width:0
  1844. }
  1845. 84% {
  1846. top:2.1875em;
  1847. right:0;
  1848. width:3.4375em
  1849. }
  1850. 100% {
  1851. top:2.375em;
  1852. right:.5em;
  1853. width:2.9375em
  1854. }
  1855. }@keyframes swal2-animate-success-line-long {
  1856. 0% {
  1857. top:3.375em;
  1858. right:2.875em;
  1859. width:0
  1860. }
  1861. 65% {
  1862. top:3.375em;
  1863. right:2.875em;
  1864. width:0
  1865. }
  1866. 84% {
  1867. top:2.1875em;
  1868. right:0;
  1869. width:3.4375em
  1870. }
  1871. 100% {
  1872. top:2.375em;
  1873. right:.5em;
  1874. width:2.9375em
  1875. }
  1876. }@-webkit-keyframes swal2-rotate-success-circular-line {
  1877. 0% {
  1878. transform:rotate(-45deg)
  1879. }
  1880. 5% {
  1881. transform:rotate(-45deg)
  1882. }
  1883. 12% {
  1884. transform:rotate(-405deg)
  1885. }
  1886. 100% {
  1887. transform:rotate(-405deg)
  1888. }
  1889. }@keyframes swal2-rotate-success-circular-line {
  1890. 0% {
  1891. transform:rotate(-45deg)
  1892. }
  1893. 5% {
  1894. transform:rotate(-45deg)
  1895. }
  1896. 12% {
  1897. transform:rotate(-405deg)
  1898. }
  1899. 100% {
  1900. transform:rotate(-405deg)
  1901. }
  1902. }@-webkit-keyframes swal2-animate-error-x-mark {
  1903. 0% {
  1904. margin-top:1.625em;
  1905. transform:scale(.4);
  1906. opacity:0
  1907. }
  1908. 50% {
  1909. margin-top:1.625em;
  1910. transform:scale(.4);
  1911. opacity:0
  1912. }
  1913. 80% {
  1914. margin-top:-.375em;
  1915. transform:scale(1.15)
  1916. }
  1917. 100% {
  1918. margin-top:0;
  1919. transform:scale(1);
  1920. opacity:1
  1921. }
  1922. }@keyframes swal2-animate-error-x-mark {
  1923. 0% {
  1924. margin-top:1.625em;
  1925. transform:scale(.4);
  1926. opacity:0
  1927. }
  1928. 50% {
  1929. margin-top:1.625em;
  1930. transform:scale(.4);
  1931. opacity:0
  1932. }
  1933. 80% {
  1934. margin-top:-.375em;
  1935. transform:scale(1.15)
  1936. }
  1937. 100% {
  1938. margin-top:0;
  1939. transform:scale(1);
  1940. opacity:1
  1941. }
  1942. }@-webkit-keyframes swal2-animate-error-icon {
  1943. 0% {
  1944. transform:rotateX(100deg);
  1945. opacity:0
  1946. }
  1947. 100% {
  1948. transform:rotateX(0);
  1949. opacity:1
  1950. }
  1951. }@keyframes swal2-animate-error-icon {
  1952. 0% {
  1953. transform:rotateX(100deg);
  1954. opacity:0
  1955. }
  1956. 100% {
  1957. transform:rotateX(0);
  1958. opacity:1
  1959. }
  1960. }@-webkit-keyframes swal2-rotate-loading {
  1961. 0% {
  1962. transform:rotate(0)
  1963. }
  1964. 100% {
  1965. transform:rotate(360deg)
  1966. }
  1967. }@keyframes swal2-rotate-loading {
  1968. 0% {
  1969. transform:rotate(0)
  1970. }
  1971. 100% {
  1972. transform:rotate(360deg)
  1973. }
  1974. }@-webkit-keyframes swal2-animate-question-mark {
  1975. 0% {
  1976. transform:rotateY(-360deg)
  1977. }
  1978. 100% {
  1979. transform:rotateY(0)
  1980. }
  1981. }@keyframes swal2-animate-question-mark {
  1982. 0% {
  1983. transform:rotateY(-360deg)
  1984. }
  1985. 100% {
  1986. transform:rotateY(0)
  1987. }
  1988. }@-webkit-keyframes swal2-animate-i-mark {
  1989. 0% {
  1990. transform:rotateZ(45deg);
  1991. opacity:0
  1992. }
  1993. 25% {
  1994. transform:rotateZ(-25deg);
  1995. opacity:.4
  1996. }
  1997. 50% {
  1998. transform:rotateZ(15deg);
  1999. opacity:.8
  2000. }
  2001. 75% {
  2002. transform:rotateZ(-5deg);
  2003. opacity:1
  2004. }
  2005. 100% {
  2006. transform:rotateX(0);
  2007. opacity:1
  2008. }
  2009. }@keyframes swal2-animate-i-mark {
  2010. 0% {
  2011. transform:rotateZ(45deg);
  2012. opacity:0
  2013. }
  2014. 25% {
  2015. transform:rotateZ(-25deg);
  2016. opacity:.4
  2017. }
  2018. 50% {
  2019. transform:rotateZ(15deg);
  2020. opacity:.8
  2021. }
  2022. 75% {
  2023. transform:rotateZ(-5deg);
  2024. opacity:1
  2025. }
  2026. 100% {
  2027. transform:rotateX(0);
  2028. opacity:1
  2029. }
  2030. }body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {
  2031. overflow:hidden
  2032. }
  2033. body.swal2-height-auto {
  2034. height:auto!important
  2035. }
  2036. body.swal2-no-backdrop .swal2-container {
  2037. background-color:transparent!important;
  2038. pointer-events:none
  2039. }
  2040. body.swal2-no-backdrop .swal2-container .swal2-popup {
  2041. pointer-events:all
  2042. }
  2043. body.swal2-no-backdrop .swal2-container .swal2-modal {
  2044. box-shadow:0 0 10px rgba(0,0,0,.4)
  2045. }
  2046. @media print {
  2047. body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {
  2048. overflow-y:scroll!important
  2049. }
  2050. body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true] {
  2051. display:none
  2052. }
  2053. body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container {
  2054. position:static!important
  2055. }
  2056. }body.swal2-toast-shown .swal2-container {
  2057. box-sizing:border-box;
  2058. width:360px;
  2059. max-width:100%;
  2060. background-color:transparent;
  2061. pointer-events:none
  2062. }
  2063. body.swal2-toast-shown .swal2-container.swal2-top {
  2064. top:0;
  2065. right:auto;
  2066. bottom:auto;
  2067. left:50%;
  2068. transform:translateX(-50%)
  2069. }
  2070. body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right {
  2071. top:0;
  2072. right:0;
  2073. bottom:auto;
  2074. left:auto
  2075. }
  2076. body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start {
  2077. top:0;
  2078. right:auto;
  2079. bottom:auto;
  2080. left:0
  2081. }
  2082. body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start {
  2083. top:50%;
  2084. right:auto;
  2085. bottom:auto;
  2086. left:0;
  2087. transform:translateY(-50%)
  2088. }
  2089. body.swal2-toast-shown .swal2-container.swal2-center {
  2090. top:50%;
  2091. right:auto;
  2092. bottom:auto;
  2093. left:50%;
  2094. transform:translate(-50%,-50%)
  2095. }
  2096. body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right {
  2097. top:50%;
  2098. right:0;
  2099. bottom:auto;
  2100. left:auto;
  2101. transform:translateY(-50%)
  2102. }
  2103. body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start {
  2104. top:auto;
  2105. right:auto;
  2106. bottom:0;
  2107. left:0
  2108. }
  2109. body.swal2-toast-shown .swal2-container.swal2-bottom {
  2110. top:auto;
  2111. right:auto;
  2112. bottom:0;
  2113. left:50%;
  2114. transform:translateX(-50%)
  2115. }
  2116. body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right {
  2117. top:auto;
  2118. right:0;
  2119. bottom:0;
  2120. left:auto
  2121. }
  2122. `;
  2123. this.addStyle('swal-style', 'style', swalcss);
  2124. },
  2125.  
  2126. async initDialog() {
  2127. let result = await Swal.fire({
  2128. title: pan.init[0],
  2129. allowOutsideClick: false,
  2130. showCloseButton: true,
  2131. showCancelButton: true,
  2132. confirmButtonText: '确定',
  2133. html: `<div><img style="width: 250px;margin-bottom: 10px;" src="${pan.img}" alt="${pan.img}"><input class="swal2-input" id="init" style="width:373;font-size:19px;" type="text" placeholder="${pan.init[1]}"><br><span>你可以选择“注入”立即点亮按钮,或者输入暗号再点亮。<br>暗号:“${pan.num}”。<br>你可以扫码支持一下原作者油小猴<br>或者来给这个改版点个<a href="https://github.com/hmjz100/Online-disk-direct-link-download-assistant/">Star</a>...</span></div>`,
  2134. cancelButtonText: '注入(点亮下载助手按钮)'
  2135. });
  2136. if (result.isDismissed && result.dismiss === 'close') {console.log("窗口关闭");return};
  2137. if (result.isDismissed && result.dismiss === 'cancel') {
  2138. console.log("注入暗号")
  2139. console.log("正在注入点亮按钮设置项目...");
  2140. message.warning("正在注入点亮按钮设置项目...");
  2141. setTimeout(() => {
  2142. base.setValue('setting_init_code', pan.num);
  2143. message.success("注入成功!");
  2144. setTimeout(() => {
  2145. message.success(pan.init[2]);
  2146. setTimeout(() => {
  2147. history.go(0);
  2148. }, 3000);
  2149. }, 3000);
  2150. }, 5000);
  2151. return;
  2152. };
  2153. if (pan.num === $('#init').val()) {
  2154. console.log("暗号正确")
  2155. message.success(pan.init[2]);
  2156. setTimeout(() => {
  2157. base.setValue('setting_init_code', pan.num);
  2158. history.go(0);
  2159. }, 3000)
  2160. return;
  2161. } else {
  2162. console.log("暗号错误")
  2163. await Swal.fire({
  2164. imageUrl: pan.img,
  2165. title: pan.init[3],
  2166. html: `<div><span>${pan.init[4]}<br>你可以在返回后选择“注入”立即点亮按钮,<br>或者在输入框键入以下暗号:“${pan.num}”。</span></div>`,
  2167. confirmButtonText: '重新输入(返回)',
  2168. });
  2169. await this.initDialog();
  2170. return;
  2171. };
  2172. /*---
  2173. homo彩蛋被删去力(悲),存下图片罢!
  2174. imageUrl: 'https://pic4.zhimg.com/80/v2-1b97a088e156c015108dec663bba8b04.jpg',
  2175. imageUrl: 'https://lh1.hetaousercontent.com/img/7d4c1c0b4adb0e95.jpg',
  2176. */
  2177. },
  2178. };
  2179.  
  2180. //百度网盘
  2181. let baidu = {
  2182.  
  2183. _getExtra() {
  2184. let seKey = decodeURIComponent(base.getCookie('BDCLND'));
  2185. return '{' + '"sekey":"' + seKey + '"' + "}";
  2186. },
  2187.  
  2188. _getSurl() {
  2189. let reg = /(?<=s\/|surl=)([a-zA-Z0-9_-]+)/g;
  2190. if (reg.test(location.href)) {
  2191. return location.href.match(reg)[0];
  2192. }
  2193. return '';
  2194. },
  2195.  
  2196. _getFidList() {
  2197. let fidlist = [];
  2198. selectList.forEach(v => {
  2199. if (+v.isdir === 1) return;
  2200. fidlist.push(v.fs_id);
  2201. });
  2202. return '[' + fidlist + ']';
  2203. },
  2204.  
  2205. _resetData() {
  2206. progress = {};
  2207. $.each(request, (key) => {
  2208. (request[key]).abort();
  2209. });
  2210. $.each(ins, (key) => {
  2211. clearInterval(ins[key]);
  2212. });
  2213. idm = {};
  2214. ins = {};
  2215. request = {};
  2216. },
  2217.  
  2218. setBDUSS() {
  2219. try {
  2220. GM_cookie && GM_cookie('list', {name: 'BDUSS'}, (cookies, error) => {
  2221. if (!error) {
  2222. base.setStorage("baiduyunPlugin_BDUSS", {BDUSS: cookies[0].value});
  2223. }
  2224. });
  2225. } catch (e) {
  2226. }
  2227. },
  2228.  
  2229. getBDUSS() {
  2230. let baiduyunPlugin_BDUSS = base.getStorage('baiduyunPlugin_BDUSS') ? base.getStorage('baiduyunPlugin_BDUSS') : '{"baiduyunPlugin_BDUSS":""}';
  2231. return baiduyunPlugin_BDUSS.BDUSS || '';
  2232. },
  2233.  
  2234. convertLinkToAria(link, filename, ua) {
  2235. let BDUSS = this.getBDUSS();
  2236. if (!!BDUSS) {
  2237. filename = base.fixFilename(filename);
  2238. return encodeURIComponent(`aria2c "${link}" --out "${filename}" --header "User-Agent: ${ua}" --header "Cookie: BDUSS=${BDUSS}"`);
  2239. }
  2240. return {
  2241. link: pan.assistant,
  2242. text: pan.init[5]
  2243. };
  2244. },
  2245.  
  2246. convertLinkToBC(link, filename, ua) {
  2247. let BDUSS = this.getBDUSS();
  2248. if (!!BDUSS) {
  2249. let cookie = `BDUSS=${BDUSS}`;
  2250. let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}&cookie=${encodeURIComponent(cookie)}&user_agent=${encodeURIComponent(ua)}ZZ`;
  2251. return encodeURIComponent(`bc://http/${base.e(bc)}`);
  2252. }
  2253. return {
  2254. link: pan.assistant,
  2255. text: pan.init[5]
  2256. };
  2257. },
  2258.  
  2259. convertLinkToCurl(link, filename, ua) {
  2260. let BDUSS = this.getBDUSS();
  2261. if (!!BDUSS) {
  2262. let terminal = base.getValue('setting_terminal_type');
  2263. filename = base.fixFilename(filename);
  2264. return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}" -A "${ua}" -b "BDUSS=${BDUSS}"`);
  2265. }
  2266. return {
  2267. link: pan.assistant,
  2268. text: pan.init[5]
  2269. };
  2270. },
  2271.  
  2272. addPageListener() {
  2273. function _factory(e) {
  2274. let target = $(e.target);
  2275. let item = target.parents('.pl-item');
  2276. let link = item.find('.pl-item-link');
  2277. let progress = item.find('.pl-item-progress');
  2278. let tip = item.find('.pl-item-tip');
  2279. let copy = item.find('.pl-item-copy');
  2280. let howidm = item.find('.pl-progress-how');
  2281. let back = item.find('.pl-progress-back');
  2282. let stop = item.find('.pl-progress-stop');
  2283. return {
  2284. item, link, progress, tip, copy, stop, howidm, back, target,
  2285. };
  2286. }
  2287.  
  2288. function _reset(i) {
  2289. ins[i] && clearInterval(ins[i]);
  2290. request[i] && request[i].abort();
  2291. progress[i] = 0;
  2292. idm[i] = false;
  2293. }
  2294.  
  2295. doc.on('mouseenter mouseleave click', '.pl-button.g-dropdown-button', (e) => {
  2296. if (e.type === 'mouseleave') {
  2297. $(e.currentTarget).removeClass('button-open');
  2298. } else {
  2299. $(e.currentTarget).addClass('button-open');
  2300. $(e.currentTarget).find('.pl-dropdown-menu').show();
  2301. }
  2302. });
  2303. doc.on('mouseleave', '.pl-button.g-dropdown-button .pl-dropdown-menu', (e) => {
  2304. $(e.currentTarget).hide();
  2305. });
  2306.  
  2307. doc.on('click', '.pl-button-mode', (e) => {
  2308. mode = e.target.dataset.mode;
  2309. Swal.showLoading();
  2310. this.getPCSLink();
  2311. });
  2312. doc.on('click', '.listener-link-api', async (e) => {
  2313. e.preventDefault();
  2314. let o = _factory(e);
  2315. let $width = o.item.find('.pl-progress-inner');
  2316. let $text = o.item.find('.pl-progress-inner-text');
  2317. let filename = o.link[0].dataset.filename;
  2318. let index = o.link[0].dataset.index;
  2319. _reset(index);
  2320. base.get(o.link[0].dataset.link, {"User-Agent": pan.ua}, 'blob', {filename, index});
  2321. ins[index] = setInterval(() => {
  2322. let prog = +progress[index] || 0;
  2323. let isIDM = idm[index] || false;
  2324. if (isIDM) {
  2325. o.tip.hide();
  2326. o.progress.hide();
  2327. o.copy.show();
  2328. o.link.text('已成功唤起IDM,请查看IDM下载框!').animate({opacity: '0.5'}, "slow").show();
  2329. clearInterval(ins[index]);
  2330. setTimeout(
  2331. function (){
  2332. o.link.text('重新下载').animate({opacity: '1'}, "slow");
  2333. },2000
  2334. )
  2335. idm[index] = false;
  2336. } else {
  2337. o.link.hide();
  2338. o.tip.hide();
  2339. o.stop.show();
  2340. o.copy.hide();
  2341. o.progress.show();
  2342. $width.css('width', prog + '%');
  2343. $text.text(prog + '%');
  2344. if (prog === 100) {
  2345. clearInterval(ins[index]);
  2346. progress[index] = 0;
  2347. o.item.find('.pl-progress-stop').hide();
  2348. o.howidm.hide();
  2349. $text.text('下载完成,正在弹出浏览器下载框!');
  2350. o.back.show()
  2351. setTimeout(
  2352. function (){
  2353. o.link.text('重新下载').animate({opacity: '1'}, "slow");
  2354. },3000
  2355. )
  2356. }
  2357. }
  2358. }, 500);
  2359. });
  2360. doc.on('click', '.listener-retry', async (e) => {
  2361. let o = _factory(e);
  2362. o.tip.hide();
  2363. o.link.show();
  2364. });
  2365. doc.on('click', '.listener-how', async (e) => {
  2366. let o = _factory(e);
  2367. let index = o.link[0].dataset.index;
  2368. if (request[index]) {
  2369. request[index].abort();
  2370. clearInterval(ins[index]);
  2371. o.progress.hide();
  2372. o.tip.show();
  2373. }
  2374.  
  2375. });
  2376. doc.on('click', '.listener-stop', async (e) => {
  2377. let o = _factory(e);
  2378. let index = o.link[0].dataset.index;
  2379. if (request[index]) {
  2380. request[index].abort();
  2381. clearInterval(ins[index]);
  2382. o.item.find('.pl-progress-inner-text').text('正在取消...');
  2383. o.item.find('.pl-progress-inner').css('width', 100 + '%');
  2384. setTimeout(function(){
  2385. o.tip.hide();
  2386. o.back.hide();
  2387. o.link.show(0);
  2388. o.copy.show();
  2389. o.progress.hide();
  2390. o.stop.hide();
  2391. },1050)
  2392. }
  2393. });
  2394. doc.on('click', '.listener-back', async (e) => {
  2395. let o = _factory(e);
  2396. o.progress.hide();
  2397. o.tip.hide();
  2398. o.link.show();
  2399. o.copy.show();
  2400. o.stop.hide();
  2401. o.back.hide();
  2402. });
  2403. doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
  2404. e.preventDefault();
  2405. if (!e.target.dataset.link) {
  2406. $(e.target).removeClass('listener-copy-all').addClass('pl-btn-danger').html(`${pan.init[5]}👉<a href="${pan.assistant}" target="_blank" class="pl-a">点击此处安装</a>👈`);
  2407. } else {
  2408. base.setClipboard(decodeURIComponent(e.target.dataset.link));
  2409. $(e.target).text('复制成功!').animate({opacity: '0.5'}, "slow");
  2410. setTimeout(
  2411. function (){
  2412. $(e.target).text('重新复制').animate({opacity: '1'}, "slow");
  2413. },2000
  2414. )
  2415. }
  2416. });
  2417. doc.on('click', '.listener-link-rpc', async (e) => {
  2418. let target = $(e.currentTarget);
  2419. target.find('.icon').remove();
  2420. target.find('.pl-loading').remove();
  2421. target.prepend(base.createLoading());
  2422. let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
  2423. if (res === 'success') {
  2424. $('.listener-rpc-task').show();
  2425. target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
  2426. } else if (res === 'assistant') {
  2427. target.addClass('pl-btn-danger').html(`${pan.init[5]}👉<a href="${pan.assistant}" target="_blank" class="pl-a">点击此处安装</a>👈`);
  2428. } else {
  2429. target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
  2430. }
  2431. });
  2432. doc.on('click', '.listener-send-rpc', (e) => {
  2433. $('.listener-link-rpc').click();
  2434. $(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
  2435. });
  2436. doc.on('click', '.listener-open-setting', () => {
  2437. base.showSetting();
  2438. });
  2439. doc.on('click', '.listener-open-updatelog', () => {
  2440. base.showUpdateLog();
  2441. });
  2442. doc.on('click', '.listener-rpc-task', () => {
  2443. let rpc = JSON.stringify({
  2444. domain: base.getValue('setting_rpc_domain'),
  2445. port: base.getValue('setting_rpc_port'),
  2446. }), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
  2447. GM_openInTab(url, {active: true});
  2448. });
  2449. document.documentElement.addEventListener('mouseup', (e) => {
  2450. if (e.target.nodeName === 'A' && ~e.target.className.indexOf('pl-a')) {
  2451. e.stopPropagation();
  2452. }
  2453. }, true);
  2454. },
  2455.  
  2456. addButton() {
  2457. waitForKeyElements(".wp-s-header__vip-btn-tip", function () {
  2458. let vip1 = document.getElementsByClassName("wp-s-header__vip-btn-tip")[0];
  2459. vip1.remove();
  2460. });
  2461. waitForKeyElements(".app-user-vip-center-tip", function () {
  2462. let vip2 = document.getElementsByClassName("app-user-vip-center-tip")[0];
  2463. vip2.remove();
  2464. });
  2465. waitForKeyElements(".web-header-text-s-45", function () {
  2466. let vip3 = document.getElementById("web-header-text-s-45");
  2467. vip3.remove();
  2468. });
  2469. waitForKeyElements(".wp-s-header__vip-btn", function () {
  2470. let vip4 = document.getElementsByClassName("wp-s-header__vip-btn")[0];
  2471. vip4.innerText = "会员中心";
  2472. });
  2473. waitForKeyElements(".KQcHyA", function () {
  2474. let vip5 = document.getElementsByClassName("KQcHyA")[0];
  2475. vip5.innerText = "会员中心";
  2476. });
  2477. waitForKeyElements(".gOIbzPb", function () {
  2478. let vip6 = document.getElementsByClassName("gOIbzPb")[0];
  2479. vip6.remove();
  2480. });
  2481. waitForKeyElements(".app-user-vip-center-box", function () {
  2482. let vip7 = document.getElementsByClassName("app-user-vip-center-box vip-center-type-2")[0];
  2483. vip7.remove();
  2484. });
  2485. waitForKeyElements(".u-popover", function () {
  2486. setInterval(function(){
  2487. let vip8 = document.getElementsByClassName("wp-s-header-user__vip-center")[0];
  2488. let arrow = document.getElementsByClassName("popper__arrow")[0];
  2489. if(vip8){
  2490. vip8.remove();
  2491. }
  2492. if(arrow){
  2493. arrow.remove();
  2494. };
  2495. },10)
  2496. });
  2497. waitForKeyElements(".wp-s-header-user__create-team-title", function () {
  2498. let ad1 = document.getElementsByClassName("wp-s-header-user__create-team-title")[0];
  2499. ad1.remove();
  2500. });
  2501. waitForKeyElements(".wp-side-options g-clearfix", function () {
  2502. let ad2 = document.getElementsByClassName("wp-side-options g-clearfix")[0];
  2503. ad2.remove();
  2504. });
  2505. waitForKeyElements(".web-header-ad-item", function () {
  2506. let ad3 = document.getElementsByClassName("web-header-ad-item wp-s-header__right-item")[0];
  2507. ad3.remove();
  2508. });
  2509. waitForKeyElements(".newIcon", function () {
  2510. let newicon1 = document.getElementsByClassName("newIcon")[0];
  2511. newicon1.remove();
  2512. });
  2513. waitForKeyElements(".u-badge__content", function () {
  2514. let newicon2 = document.getElementsByClassName("u-badge__content is-dot")[0];
  2515. if(newicon2) {
  2516. newicon2.remove();
  2517. }
  2518. });
  2519. waitForKeyElements(".wp-side-options-btn", function () {
  2520. let qiye1 = document.getElementsByClassName("wp-side-options g-clearfix")[0];
  2521. qiye1.remove();
  2522. });
  2523. waitForKeyElements(".app-download", function () {
  2524. let app1 = document.getElementsByClassName("app-download")[0];
  2525. app1.remove();
  2526. });
  2527. if (!pt) return;
  2528. let $toolWrap;
  2529. let $button = $(`<div class="g-dropdown-button pointer pl-button"><div style="color:#fff;background: ${color};border-color:${color}" class="g-button g-button-blue"><span class="g-button-right"><em class="icon icon-download"></em><span class="text" style="width: 60px;">下载助手</span></span></div><div class="menu" style="width:auto;z-index:41;border-color:${color}"><div class="g-button-menu pl-button-mode" data-mode="api" style="color:${color};">API下载</div><div class="g-button-menu pl-button-mode" data-mode="aria" style="color:${color};">Aria下载</div><div class="g-button-menu pl-button-mode" data-mode="rpc" style="color:${color};">RPC下载</div><div class="g-button-menu pl-button-mode" data-mode="curl" style="color:${color};">cURL下载</div><div class="g-button-menu pl-button-mode" data-mode="bc" style="color:${color};">BC下载</div><div class="g-button-menu pl-button-mode listener-open-setting" style="color:${color};">助手设置</div><div class="g-button-menu pl-button-mode listener-open-updatelog" style="color:${color};">更新日志</div></div></div>`);
  2530. if (pt === 'home') $toolWrap = $(pan.btn.home);
  2531. if (pt === 'main') {
  2532. $toolWrap = $(pan.btn.main);
  2533. $button = $(`<div class="pl-button" style="position: relative; display: inline-block; margin-right: 8px;"><button class="u-button u-button--primary u-button--small is-round is-has-icon" style="background: ${color};border-color: ${color};font-size: 14px; padding: 8px 16px; border: none;"><i class="u-icon u-icon-download"></i><span>下载助手</span></button><ul class="dropdown-list nd-common-float-menu pl-dropdown-menu"><li class="pl-button-mode sub cursor-p" data-mode="api">API下载</li><li class="pl-button-mode sub cursor-p" data-mode="aria">Aria下载</li><li class="pl-button-mode sub cursor-p" data-mode="rpc">RPC下载</li><li class="pl-button-mode sub cursor-p" data-mode="curl">cURL下载</li><li class="pl-button-mode sub cursor-p" data-mode="bc">BC下载</li><li class="pl-button-mode sub cursor-p listener-open-setting"">助手设置</li><li class="pl-button-mode sub cursor-p listener-open-updatelog">更新日志</li></ul></div>`);
  2534. }
  2535. if (pt === 'share') $toolWrap = $(pan.btn.share);
  2536. $toolWrap.prepend($button);
  2537. this.setBDUSS();
  2538. this.addPageListener();
  2539. },
  2540.  
  2541. addInitButton() {
  2542. if (!pt) return;
  2543. let $toolWrap;
  2544. let $button = $(`<div class="g-dropdown-button pointer pl-button-init" style="opacity:.5"><div style="color:#fff;background: ${color};border-color:${color}" class="g-button g-button-blue"><span class="g-button-right"><em class="icon icon-download"></em><span class="text" style="width: 60px;">下载助手(未点亮)</span></span></div></div>`);
  2545. if (pt === 'home') $toolWrap = $(pan.btn.home);
  2546. if (pt === 'main') {
  2547. $toolWrap = $(pan.btn.main);
  2548. $button = $(`<div class="pl-button-init" style="opacity:.5; display: inline-block; margin-right: 8px;"><button class="u-button u-button--primary u-button--small is-round is-has-icon" style="background: ${color};border-color: ${color};font-size: 14px; padding: 8px 16px; border: none;"><i class="u-icon u-icon-download"></i><span>下载助手(未点亮)</span></button></div>`);
  2549. }
  2550. if (pt === 'share') $toolWrap = $(pan.btn.share);
  2551. $toolWrap.prepend($button);
  2552. $button.click(() => base.initDialog());
  2553. },
  2554.  
  2555. async getToken() {
  2556. let res = await base.getFinalUrl(pan.pcs[3]);
  2557. if (res.indexOf('access_token') === -1) {
  2558. let html = await base.get(pan.pcs[3], {}, 'text');
  2559. let bdstoken = html.match(/name="bdstoken"\s+value="([^"]+)"/)?.[1];
  2560. let client_id = html.match(/name="client_id"\s+value="([^"]+)"/)?.[1];
  2561. let data = {
  2562. grant_permissions_arr: 'netdisk',
  2563. bdstoken: bdstoken,
  2564. client_id: client_id,
  2565. response_type: "token",
  2566. display: "page",
  2567. grant_permissions: "basic,netdisk"
  2568. }
  2569. await base.post(pan.pcs[3], base.stringify(data), {
  2570. 'Content-Type': 'application/x-www-form-urlencoded',
  2571. })
  2572. let res2 = await base.getFinalUrl(pan.pcs[3]);
  2573. let accessToken = res2.match(/access_token=([^&]+)/)?.[1];
  2574. accessToken && base.setStorage('accessToken', accessToken);
  2575. return accessToken;
  2576. }
  2577. let accessToken = res.match(/access_token=([^&]+)/)?.[1];
  2578. accessToken && base.setStorage('accessToken', accessToken);
  2579. return accessToken;
  2580. },
  2581.  
  2582. async getPCSLink(maxRequestTime = 2) {
  2583. selectList = this.getSelectedList();
  2584. let fidList = this._getFidList(), url, res;
  2585.  
  2586. if (pt === 'home' || pt === 'main') {
  2587. if (selectList.length === 0) {
  2588. return message.error('提示:请先勾选要下载的文件!');
  2589. }
  2590. if (fidList.length === 2) {
  2591. return message.error('提示:请打开文件夹后勾选文件!');
  2592. }
  2593. fidList = encodeURIComponent(fidList);
  2594. let accessToken = base.getStorage('accessToken') || await this.getToken();
  2595. url = `${pan.pcs[0]}&fsids=${fidList}&access_token=${accessToken}`;
  2596. res = await base.get(url, {"User-Agent": pan.ua});
  2597. }
  2598. if (pt === 'share') {
  2599. this.getShareData();
  2600. if (selectList.length === 0) {
  2601. return message.error('提示:请先勾选要下载的文件!');
  2602. }
  2603. if (fidList.length === 2) {
  2604. return message.error('提示:请打开文件夹后勾选文件!');
  2605. }
  2606. if (!params.sign) {
  2607. let url = `${pan.pcs[2]}&surl=${params.surl}&logid=${params.logid}`;
  2608. let r = await base.get(url);
  2609. if (r.errno === 0) {
  2610. params.sign = r.data.sign;
  2611. params.timestamp = r.data.timestamp;
  2612. } else {
  2613. let dialog = await Swal.fire({
  2614. toast: true,
  2615. icon: 'info',
  2616. title: `提示:请将文件<span class="tag-danger">[保存到网盘]</span>👉前往<span class="tag-danger">[我的网盘]</span>中下载!`,
  2617. showConfirmButton: true,
  2618. confirmButtonText: '点击保存',
  2619. position: 'top',
  2620. });
  2621. if (dialog.isConfirmed) {
  2622. $('.tools-share-save-hb')[0].click();
  2623. }
  2624. return;
  2625. }
  2626. }
  2627. if (!params.bdstoken) {
  2628. return message.error('提示:请先登录(不可用)网盘!');
  2629. }
  2630. let formData = new FormData();
  2631. formData.append('encrypt', params.encrypt);
  2632. formData.append('product', params.product);
  2633. formData.append('uk', params.uk);
  2634. formData.append('primaryid', params.primaryid);
  2635. formData.append('fid_list', fidList);
  2636. formData.append('logid', params.logid);
  2637. params.shareType === 'secret' ? formData.append('extra', params.extra) : '';
  2638. url = `${pan.pcs[1]}&sign=${params.sign}&timestamp=${params.timestamp}`;
  2639. res = await base.post(url, formData, {"User-Agent": pan.ua});
  2640. }
  2641. if (res.errno === 0) {
  2642. let html = this.generateDom(res.list);
  2643. this.showMainDialog(pan[mode][0], html, pan[mode][1]);
  2644. } else if (res.errno === 112) {
  2645. return message.error('提示:页面过期,请刷新重试!');
  2646. } else if (res.errno === 9019) {
  2647. maxRequestTime--;
  2648. await this.getToken();
  2649. if (maxRequestTime > 0) {
  2650. await this.getPCSLink(maxRequestTime);
  2651. } else {
  2652. message.error('提示:获取下载链接失败!请刷新网页后重试!');
  2653. }
  2654. } else {
  2655. message.error('提示:获取下载链接失败!请刷新网页后重试!(或者试试重新登录(不可用)网盘?)');
  2656. }
  2657. },
  2658.  
  2659. generateDom(list) {
  2660. let content = '<div class="pl-main">';
  2661. let alinkAllText = '';
  2662. base.sortByName(list);
  2663. list.forEach((v, i) => {
  2664. if (v.isdir === 1) return;
  2665. let filename = v.server_filename || v.filename;
  2666. let ext = base.getExtension(filename);
  2667. let size = base.sizeFormat(v.size);
  2668. let dlink = v.dlink;
  2669. if (mode === 'api') {
  2670. alinkAllText += dlink + '\r\n';
  2671. content += `<div class="pl-item">
  2672. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  2673. <a class="pl-item-link pl-a listener-link-api" href="${dlink}" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}<br>下载 ${filename}</a>
  2674. <!--<a class="pl-item-copy" target="_blank" href="${dlink}" title="点击使用浏览器下载" data-filename="${filename}" data-link="${dlink}">传统下载</a>-->
  2675. <button class="pl-item-copy pl-btn-primary listener-copy-all" href="${dlink}" title="点击复制链接" data-filename="${filename}" data-link="${dlink}">复制链接</button>
  2676. <div class="pl-item-tip" style="display: none"><span>若没有弹出IDM下载框,找到IDM <b>选项</b> -> <b>文件类型</b> -> <b>第一个框</b> 中添加后缀 <span class="pl-ext">${ext}</span>,<a href="${pan.idm}" target="_blank" class="pl-a">详见此处</a></span> <span class="pl-back listener-back">返回</span></div>
  2677. <div class="pl-item-progress" style="display: none">
  2678. <div class="pl-progress">
  2679. <div class="pl-progress-outer"></div>
  2680. <div class="pl-progress-inner" style="width:5%">
  2681. <div class="pl-progress-inner-text">正在加载进度...0%</div>
  2682. </div>
  2683. </div>
  2684. <span class="pl-progress-stop listener-stop">取消下载</span>
  2685. `;
  2686. if (base.getValue('setting_hide_idm') === 'no') {
  2687. content+=`<span class="pl-progress-tip" >未发现IDM,使用自带浏览器下载</span>
  2688. <span class="pl-progress-back pl-back listener-back" style="display: none">返回</span>
  2689. <span class="pl-progress-how listener-how">如何唤起IDM?</span>
  2690. `
  2691. } else {
  2692. content+=`<span class="pl-progress-tip" style="display: none" >未发现IDM,使用自带浏览器下载</span>
  2693. <span class="pl-progress-back pl-back listener-back" style="display: none">返回</span>
  2694. <span class="pl-progress-how listener-how" style="display: none">如何唤起IDM?</span>
  2695. `
  2696. };
  2697. content +=`</div></div>`
  2698. }
  2699. if (mode === 'aria') {
  2700. let alink = this.convertLinkToAria(dlink, filename, pan.ua);
  2701. if (typeof (alink) === 'object') {
  2702. content += `<div class="pl-item">
  2703. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  2704. <a class="pl-item-link pl-a" target="_blank" href="${alink.link}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink.link}">${decodeURIComponent(alink.text)}<br>复制 ${filename} 下载命令行</a> </div>`;
  2705. } else {
  2706. alinkAllText += alink + '\r\n';
  2707. content += `<div class="pl-item">
  2708. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  2709. <a class="pl-item-link pl-a listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}<br>复制 ${filename} 下载命令行</a> </div>`;
  2710. }
  2711. }
  2712. if (mode === 'rpc') {
  2713. content += `<div class="pl-item">
  2714. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  2715. <button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">将 ${filename} 推送到 RPC 下载器</span></button></div>`;
  2716. }
  2717. if (mode === 'curl') {
  2718. let alink = this.convertLinkToCurl(dlink, filename, pan.ua);
  2719. if (typeof (alink) === 'object') {
  2720. content += `<div class="pl-item">
  2721. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  2722. <a class="pl-item-link pl-a" target="_blank" href="${alink.link}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink.link}">${decodeURIComponent(alink.text)}<br>复制 ${filename} 下载命令行</a> </div>`;
  2723. } else {
  2724. alinkAllText += alink + '\r\n';
  2725. content += `<div class="pl-item">
  2726. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  2727. <a class="pl-item-link pl-a listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}<br>复制 ${filename} 下载命令行</a> </div>`;
  2728. }
  2729. }
  2730. if (mode === 'bc') {
  2731. let alink = this.convertLinkToBC(dlink, filename, pan.ua);
  2732. console.log(alink);
  2733. if (typeof (alink) === 'object') {
  2734. content += `<div class="pl-item">
  2735. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  2736. <a class="pl-item-link pl-a" href="${decodeURIComponent(alink.link)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink.text)}<br>下载 ${filename}</a> </div>`;
  2737. } else {
  2738. alinkAllText += alink + '\r\n';
  2739. content += `<div class="pl-item">
  2740. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  2741. <a class="pl-item-link pl-a" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}<br>下载 ${filename}</a> </div>`;
  2742. }
  2743. }
  2744. });
  2745.  
  2746. content += '</div>';
  2747.  
  2748. if (mode === 'api'){
  2749. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;}
  2750. if (mode === 'aria'){
  2751. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;}
  2752. if (mode === 'rpc') {
  2753. let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
  2754. content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
  2755. }
  2756. if (mode === 'curl'){
  2757. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;}
  2758. if (mode === 'bc'){
  2759. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;}
  2760.  
  2761. return content;
  2762. },
  2763.  
  2764. async sendLinkToRPC(filename, link) {
  2765. let rpc = {
  2766. domain: base.getValue('setting_rpc_domain'),
  2767. port: base.getValue('setting_rpc_port'),
  2768. path: base.getValue('setting_rpc_path'),
  2769. token: base.getValue('setting_rpc_token'),
  2770. dir: base.getValue('setting_rpc_dir'),
  2771. };
  2772. let BDUSS = this.getBDUSS();
  2773. if (!BDUSS) return 'assistant';
  2774.  
  2775. let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
  2776. let rpcData = {
  2777. id: new Date().getTime(),
  2778. jsonrpc: '2.0',
  2779. method: 'aria2.addUri',
  2780. params: [`token:${rpc.token}`, [link], {
  2781. dir: rpc.dir,
  2782. out: filename,
  2783. header: [`User-Agent: ${pan.ua}`, `Cookie: BDUSS=${BDUSS}`]
  2784. }]
  2785. };
  2786. try {
  2787. let res = await base.post(url, rpcData, {"User-Agent": pan.ua}, '');
  2788. if (res.result) return 'success';
  2789. return 'fail';
  2790. } catch (e) {
  2791. return 'fail';
  2792. }
  2793. },
  2794.  
  2795. getSelectedList() {
  2796. try {
  2797. return require('system-core:context/context.js').instanceForSystem.list.getSelected();
  2798. } catch (e) {
  2799. return document.querySelector('.wp-s-core-pan').__vue__.selectedList;
  2800. }
  2801. },
  2802.  
  2803. getLogid() {
  2804. let ut = require("system-core:context/context.js").instanceForSystem.tools.baseService;
  2805. return ut.base64Encode(base.getCookie("BAIDUID"));
  2806. },
  2807.  
  2808. getShareData() {
  2809. let res = locals.dump();
  2810. params.shareType = 'secret';
  2811. params.sign = '';
  2812. params.timestamp = '';
  2813. params.bdstoken = res.bdstoken.value;
  2814. params.channel = 'chunlei';
  2815. params.clienttype = 0;
  2816. params.web = 1;
  2817. params.app_id = 250528;
  2818. params.encrypt = 0;
  2819. params.product = 'share';
  2820. params.logid = this.getLogid();
  2821. params.primaryid = res.shareid.value;
  2822. params.uk = res.share_uk.value;
  2823. params.shareType === 'secret' && (params.extra = this._getExtra());
  2824. params.surl = this._getSurl();
  2825. },
  2826.  
  2827. detectPage() {
  2828. let path = location.pathname;
  2829. if (/^\/disk\/home/.test(path)) return 'home';
  2830. if (/^\/disk\/main/.test(path)) return 'main';
  2831. if (/^\/(s|share)\//.test(path)) return 'share';
  2832. return '';
  2833. return '';
  2834. },
  2835.  
  2836. showMainDialog(title, html, footer) { //下载窗口
  2837. Swal.fire({
  2838. title,
  2839. html,
  2840. footer,
  2841. allowOutsideClick: false,
  2842. showCloseButton: true,
  2843. confirmButtonText: '关闭',
  2844. position: 'top',
  2845. width: '1000px',
  2846. customClass,
  2847. }).then(() => {
  2848. this._resetData();
  2849. });
  2850. },
  2851.  
  2852. async initPanLinker() {
  2853. base.initDefaultConfig();
  2854. base.addPanLinkerStyle();
  2855. pt = this.detectPage();
  2856. if (base.getValue('setting_getuser_info') === 'yes') {
  2857. let res = await base.post
  2858. (`https://api.youxiaohou.com/config?ver=${version}&a=${author}`, {}, {}, 'text');
  2859. pan = JSON.parse(base.d(res));
  2860. };
  2861. Object.freeze && Object.freeze(pan);
  2862. pan.num === base.getValue('setting_init_code') ? this.addButton() : this.addInitButton();
  2863. base.createTip();
  2864. base.registerMenuCommand();
  2865. }
  2866. };
  2867.  
  2868. //阿里云盘
  2869. let ali = {
  2870.  
  2871. convertLinkToAria(link, filename, ua) {
  2872. filename = base.fixFilename(filename);
  2873. return encodeURIComponent(`aria2c "${link}" --out "${filename}" --header "Referer: https://www.aliyundrive.com/"`);
  2874. },
  2875.  
  2876. convertLinkToBC(link, filename, ua) {
  2877. let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}&refer=${encodeURIComponent('https://www.aliyundrive.com/')}ZZ`;
  2878. return encodeURIComponent(`bc://http/${base.e(bc)}`);
  2879. },
  2880.  
  2881. convertLinkToCurl(link, filename, ua) {
  2882. let terminal = base.getValue('setting_terminal_type');
  2883. filename = base.fixFilename(filename);
  2884. return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}" -e "https://www.aliyundrive.com/"`);
  2885. },
  2886.  
  2887. addPageListener() {
  2888. doc.on('click', '.pl-button-mode', (e) => {
  2889. mode = e.target.dataset.mode;
  2890. Swal.showLoading();
  2891. this.getPCSLink();
  2892. });
  2893. doc.on('click', '.listener-link-api', async (e) => {
  2894. e.preventDefault();
  2895. let dataset = e.currentTarget.dataset;
  2896. let href = dataset.link;
  2897. let url = await this.getRealLink(dataset.did, dataset.fid);
  2898. if (url) href = url;
  2899. let d = document.createElement("a");
  2900. d.download = e.currentTarget.dataset.filename;
  2901. d.rel = "noopener";
  2902. d.href = href;
  2903. d.dispatchEvent(new MouseEvent("click"));
  2904. });
  2905. doc.on('click', '.listener-link-api-btn', async (e) => {
  2906. base.setClipboard(e.target.dataset.filename);
  2907. $(e.target).text('复制成功').animate({opacity: '0.5'}, "slow");
  2908. setTimeout(
  2909. function (){
  2910. $(e.target).text('重新复制').animate({opacity: '1'}, "slow");
  2911. },2000
  2912. )
  2913. });
  2914. doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
  2915. e.preventDefault();
  2916. base.setClipboard(decodeURIComponent(e.target.dataset.link));
  2917. $(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
  2918. setTimeout(
  2919. function (){
  2920. $(e.target).text('重新复制').animate({opacity: '1'}, "slow");
  2921. },2000
  2922. )
  2923. });
  2924. doc.on('click', '.listener-link-rpc', async (e) => {
  2925. let target = $(e.currentTarget);
  2926. target.find('.icon').remove();
  2927. target.find('.pl-loading').remove();
  2928. target.prepend(base.createLoading());
  2929. let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
  2930. if (res === 'success') {
  2931. $('.listener-rpc-task').show();
  2932. target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
  2933. } else {
  2934. target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
  2935. }
  2936. });
  2937. doc.on('click', '.listener-send-rpc', (e) => {
  2938. $('.listener-link-rpc').click();
  2939. $(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
  2940. });
  2941. doc.on('click', '.listener-open-setting', () => {
  2942. base.showSetting();
  2943. });
  2944. doc.on('click', '.listener-open-updatelog', () => {
  2945. base.showUpdateLog();
  2946. });
  2947. doc.on('click', '.listener-rpc-task', () => {
  2948. let rpc = JSON.stringify({
  2949. domain: base.getValue('setting_rpc_domain'),
  2950. port: base.getValue('setting_rpc_port'),
  2951. }), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
  2952. GM_openInTab(url, {active: true});
  2953. });
  2954. },
  2955.  
  2956. async getRealLink(d, f) {
  2957. let authorization = `${base.getStorage('token').token_type} ${base.getStorage('token').access_token}`;
  2958. let res = await base.post(pan.pcs[1], {
  2959. drive_id: d,
  2960. file_id: f
  2961. }, {
  2962. authorization,
  2963. "content-type": "application/json;charset=utf-8",
  2964. });
  2965. if (res.url) {
  2966. return res.url;
  2967. }
  2968. return '';
  2969. },
  2970.  
  2971. addButton() {
  2972. waitForKeyElements(".share-list-banner--1E8Jr", function () {
  2973. let tip1 = document.getElementsByClassName("share-list-banner--1E8Jr")[0];
  2974. tip1.style.zIndex = 0;
  2975. });
  2976. waitForKeyElements(".to-app--DrlQQ", function () {
  2977. let tip2 = document.getElementsByClassName("to-app--DrlQQ")[0];
  2978. tip2.remove();
  2979. });
  2980. waitForKeyElements(".btn-mobile-save--2nXdf", function () {
  2981. let tip3 = document.getElementsByClassName("btn-mobile-save--2nXdf")[0];
  2982. tip3.remove();
  2983. });
  2984. if (!pt) return;
  2985. let $toolWrap;
  2986. let $button = $(`<div class="ali-button-big">下载助手<div class="button--3S7z9 ali-button pl-button"><span data-role="icon" data-render-as="svg" class="icon"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M853.333 938.667H170.667a85.333 85.333 0 0 1-85.334-85.334v-384A85.333 85.333 0 0 1 170.667 384H288a32 32 0 0 1 0 64H170.667a21.333 21.333 0 0 0-21.334 21.333v384a21.333 21.333 0 0 0 21.334 21.334h682.666a21.333 21.333 0 0 0 21.334-21.334v-384A21.333 21.333 0 0 0 853.333 448H736a32 32 0 0 1 0-64h117.333a85.333 85.333 0 0 1 85.334 85.333v384a85.333 85.333 0 0 1-85.334 85.334z" fill="#FFFFFF"></path><path d="M715.03 543.552a32.81 32.81 0 0 0-46.251 0L554.005 657.813v-540.48a32 32 0 0 0-64 0v539.734L375.893 543.488a32.79 32.79 0 0 0-46.229 0 32.427 32.427 0 0 0 0 46.037l169.557 168.811a32.81 32.81 0 0 0 46.251 0l169.557-168.81a32.47 32.47 0 0 0 0-45.974z" fill="#FFFFFF"></path></svg></span><ul class="pl-dropdown-menu"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">助手设置</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-updatelog">更新日志</li></ul></div></div>`);
  2987. if (pt === 'home') {
  2988. let ins = setInterval(() => {
  2989. $toolWrap = $(pan.btn.home);
  2990. if ($toolWrap.length > 0) {
  2991. $toolWrap.append($button);
  2992. clearInterval(ins);
  2993. }
  2994. }, 50);
  2995. }
  2996. if (pt === 'share') {
  2997. $button.css({'margin-right': '10px'});
  2998. let ins = setInterval(() => {
  2999. $toolWrap = $(pan.btn.share);
  3000. if ($toolWrap.length > 0) {
  3001. $toolWrap.prepend($button);
  3002. clearInterval(ins);
  3003. }
  3004. }, 50);
  3005. }
  3006. base.createDownloadIframe();
  3007. this.addPageListener();
  3008. },
  3009.  
  3010. addInitButton() {
  3011. if (!pt) return;
  3012. let $toolWrap;
  3013. let $button = $(`<div class="ali-button-big">下载助手(未点亮)<div class="button--3S7z9 ali-button pl-button-init"><span data-role="icon" data-render-as="svg" class="icon"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M853.333 938.667H170.667a85.333 85.333 0 0 1-85.334-85.334v-384A85.333 85.333 0 0 1 170.667 384H288a32 32 0 0 1 0 64H170.667a21.333 21.333 0 0 0-21.334 21.333v384a21.333 21.333 0 0 0 21.334 21.334h682.666a21.333 21.333 0 0 0 21.334-21.334v-384A21.333 21.333 0 0 0 853.333 448H736a32 32 0 0 1 0-64h117.333a85.333 85.333 0 0 1 85.334 85.333v384a85.333 85.333 0 0 1-85.334 85.334z" fill="#FFFFFF"></path><path d="M715.03 543.552a32.81 32.81 0 0 0-46.251 0L554.005 657.813v-540.48a32 32 0 0 0-64 0v539.734L375.893 543.488a32.79 32.79 0 0 0-46.229 0 32.427 32.427 0 0 0 0 46.037l169.557 168.811a32.81 32.81 0 0 0 46.251 0l169.557-168.81a32.47 32.47 0 0 0 0-45.974z" fill="#FFFFFF"></path></svg></span></div>`);
  3014. if (pt === 'home') {
  3015. let ins = setInterval(() => {
  3016. $toolWrap = $(pan.btn.home);
  3017. if ($toolWrap.length > 0) {
  3018. $toolWrap.append($button);
  3019. clearInterval(ins);
  3020. }
  3021. }, 50);
  3022. }
  3023. if (pt === 'share') {
  3024. $button.css({'margin-right': '10px'});
  3025. let ins = setInterval(() => {
  3026. $toolWrap = $(pan.btn.share);
  3027. if ($toolWrap.length > 0) {
  3028. $toolWrap.prepend($button);
  3029. clearInterval(ins);
  3030. }
  3031. }, 50);
  3032. }
  3033. $button.click(() => base.initDialog());
  3034. },
  3035.  
  3036. async getPCSLink() {
  3037. let reactDomGrid = document.querySelector(pan.dom.grid);
  3038. if (reactDomGrid) {
  3039. let res = await Swal.fire({
  3040. title: '提示',
  3041. html: '<div style="display: flex;align-items: center;justify-content: center;">请先切换到&nbsp;&nbsp;<b>列表视图</b>&nbsp;“<svg class="icon" viewBox="0 0 1024 1024" width="20" height="20"><use xlink:href="#PDSDrag"></use></svg>”&nbsp;&nbsp;后获取下载链接!</div>',
  3042. icon: 'info',
  3043. confirmButtonText: '点击切换'
  3044. });
  3045. if (res) {
  3046. document.querySelector(pan.dom.switch).click();
  3047. return message.success('切换成功,请重新获取下载链接!');
  3048. }
  3049. return false;
  3050. }
  3051. selectList = this.getSelectedList();
  3052. if (selectList.length === 0) {
  3053. return message.error('提示:请先勾选要下载的文件!');
  3054. }
  3055. if (this.isOnlyFolder()) {
  3056. return message.error('提示:请打开文件夹后勾选文件!');
  3057. }
  3058. if (pt === 'share') {
  3059. if (selectList.length > 20) {
  3060. return message.error('提示:单次最多可勾选 20 个文件!');
  3061. }
  3062. try {
  3063. let authorization = `${base.getStorage('token').token_type} ${base.getStorage('token').access_token}`;
  3064. let xShareToken = base.getStorage('shareToken').share_token;
  3065.  
  3066. for (let i = 0; i < selectList.length; i++) {
  3067. let res = await base.post(pan.pcs[0], {
  3068. expire_sec: 600,
  3069. file_id: selectList[i].fileId,
  3070. share_id: selectList[i].shareId
  3071. }, {
  3072. authorization,
  3073. "content-type": "application/json;charset=utf-8",
  3074. "x-share-token": xShareToken
  3075. });
  3076. if (res.download_url) {
  3077. selectList[i].downloadUrl = res.download_url;
  3078. }
  3079. }
  3080. } catch (e) {
  3081. return message.error('提示:请先登录(不可用)网盘!');
  3082. }
  3083. }
  3084. let html = this.generateDom(selectList);
  3085. this.showMainDialog(pan[mode][0], html, pan[mode][1]);
  3086. },
  3087.  
  3088. generateDom(list) {
  3089. let content = '<div class="pl-main">';
  3090. let alinkAllText = '';
  3091. list.forEach((v, i) => {
  3092. if (v.type === 'folder') return;
  3093. let filename = v.name;
  3094. let fid = v.fileId;
  3095. let did = v.driveId;
  3096. let size = base.sizeFormat(v.size);
  3097. let dlink = v.downloadUrl || v.url;
  3098. if (mode === 'api') {
  3099. content += `<div class="pl-item">
  3100. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3101. <a class="pl-item-link listener-link-api" data-did="${did}" data-fid="${fid}" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
  3102. <div class="pl-item-btn listener-link-api-btn" data-filename="${filename}">复制文件名</div>
  3103. </div>`;
  3104. }
  3105. if (mode === 'aria') {
  3106. let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
  3107. alinkAllText += alink + '\r\n';
  3108. content += `<div class="pl-item">
  3109. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3110. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  3111. }
  3112. if (mode === 'rpc') {
  3113. content += `<div class="pl-item">
  3114. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3115. <button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
  3116. }
  3117. if (mode === 'curl') {
  3118. let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
  3119. alinkAllText += alink + '\r\n';
  3120. content += `<div class="pl-item">
  3121. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3122. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  3123. }
  3124. if (mode === 'bc') {
  3125. let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
  3126. content += `<div class="pl-item">
  3127. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3128. <a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  3129. }
  3130. });
  3131. content += '</div>';
  3132. if (mode === 'aria')
  3133. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
  3134. if (mode === 'rpc') {
  3135. let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
  3136. content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
  3137. }
  3138. if (mode === 'curl')
  3139. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">前往助手设置修改当前终端类型(${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
  3140. return content;
  3141. },
  3142.  
  3143. async sendLinkToRPC(filename, link) {
  3144. let rpc = {
  3145. domain: base.getValue('setting_rpc_domain'),
  3146. port: base.getValue('setting_rpc_port'),
  3147. path: base.getValue('setting_rpc_path'),
  3148. token: base.getValue('setting_rpc_token'),
  3149. dir: base.getValue('setting_rpc_dir'),
  3150. };
  3151.  
  3152. let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
  3153. let rpcData = {
  3154. id: new Date().getTime(),
  3155. jsonrpc: '2.0',
  3156. method: 'aria2.addUri',
  3157. params: [`token:${rpc.token}`, [link], {
  3158. dir: rpc.dir,
  3159. out: filename,
  3160. header: [`Referer: https://www.aliyundrive.com/`]
  3161. }]
  3162. };
  3163. try {
  3164. let res = await base.post(url, rpcData, {"Referer": "https://www.aliyundrive.com/"}, '');
  3165. if (res.result) return 'success';
  3166. return 'fail';
  3167. } catch (e) {
  3168. return 'fail';
  3169. }
  3170. },
  3171.  
  3172. getSelectedList() {
  3173. try {
  3174. let selectedList = [];
  3175. let reactDom = document.querySelector(pan.dom.list);
  3176. let reactObj = base.findReact(reactDom, 1);
  3177. let props = reactObj.pendingProps;
  3178. if (props) {
  3179. let fileList = props.dataSource || [];
  3180. let selectedKeys = props.selectedKeys.split(',');
  3181. fileList.forEach((val) => {
  3182. if (selectedKeys.includes(val.fileId)) {
  3183. selectedList.push(val);
  3184. }
  3185. });
  3186. }
  3187. return selectedList;
  3188. } catch (e) {
  3189. return [];
  3190. }
  3191. },
  3192.  
  3193. detectPage() {
  3194. let path = location.pathname;
  3195. if (/^\/(drive)/.test(path)) return 'home';
  3196. if (/^\/(s|share)\//.test(path)) return 'share';
  3197. return '';
  3198. },
  3199.  
  3200. isOnlyFolder() {
  3201. for (let i = 0; i < selectList.length; i++) {
  3202. if (selectList[i].type === 'file') return false;
  3203. }
  3204. return true;
  3205. },
  3206.  
  3207. showMainDialog(title, html, footer) {
  3208. Swal.fire({
  3209. title,
  3210. html,
  3211. footer,
  3212. allowOutsideClick: false,
  3213. showCloseButton: true,
  3214. showConfirmButton: false,
  3215. position: 'top',
  3216. width,
  3217. padding: '15px 20px 5px',
  3218. customClass,
  3219. });
  3220. },
  3221.  
  3222. async initPanLinker() {
  3223. base.initDefaultConfig();
  3224. base.addPanLinkerStyle();
  3225. pt = this.detectPage();
  3226. if (base.getValue('setting_getuser_info') === 'yes') {
  3227. let res = await base.post
  3228. (`https://api.youxiaohou.com/config/ali?ver=${version}&a=${author}`, {}, {}, 'text');
  3229. pan = JSON.parse(base.d(res));
  3230. };
  3231. Object.freeze && Object.freeze(pan);
  3232. pan.num === base.getValue('setting_init_code') ? this.addButton() : this.addInitButton();
  3233. base.createTip();
  3234. base.registerMenuCommand();
  3235. }
  3236. };
  3237.  
  3238. //天翼云
  3239. let tianyi = {
  3240.  
  3241. convertLinkToAria(link, filename, ua) {
  3242. filename = base.fixFilename(filename);
  3243. return encodeURIComponent(`aria2c "${link}" --out "${filename}"`);
  3244. },
  3245.  
  3246. convertLinkToBC(link, filename, ua) {
  3247. let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}ZZ`;
  3248. return encodeURIComponent(`bc://http/${base.e(bc)}`);
  3249. },
  3250.  
  3251. convertLinkToCurl(link, filename, ua) {
  3252. let terminal = base.getValue('setting_terminal_type');
  3253. filename = base.fixFilename(filename);
  3254. return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}"`);
  3255. },
  3256.  
  3257. addPageListener() {
  3258. doc.on('click', '.pl-button-mode', (e) => {
  3259. mode = e.target.dataset.mode;
  3260. Swal.showLoading();
  3261. this.getPCSLink();
  3262. });
  3263. doc.on('click', '.listener-link-api', async (e) => {
  3264. e.preventDefault();
  3265. $('#downloadIframe').attr('src', e.currentTarget.dataset.link);
  3266. });
  3267. doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
  3268. e.preventDefault();
  3269. base.setClipboard(decodeURIComponent(e.target.dataset.link));
  3270. $(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
  3271. setTimeout(
  3272. function (){
  3273. $(e.target).text('重新复制').animate({opacity: '1'}, "slow");
  3274. },2000
  3275. )
  3276. });
  3277. doc.on('click', '.listener-link-rpc', async (e) => {
  3278. let target = $(e.currentTarget);
  3279. target.find('.icon').remove();
  3280. target.find('.pl-loading').remove();
  3281. target.prepend(base.createLoading());
  3282. let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
  3283. if (res === 'success') {
  3284. $('.listener-rpc-task').show();
  3285. target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
  3286. } else {
  3287. target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
  3288. }
  3289. });
  3290. doc.on('click', '.listener-send-rpc', (e) => {
  3291. $('.listener-link-rpc').click();
  3292. $(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
  3293. });
  3294. doc.on('click', '.listener-open-setting', () => {
  3295. base.showSetting();
  3296. });
  3297. doc.on('click', '.listener-open-updatelog', () => {
  3298. base.showUpdateLog();
  3299. });
  3300. doc.on('click', '.listener-rpc-task', () => {
  3301. let rpc = JSON.stringify({
  3302. domain: base.getValue('setting_rpc_domain'),
  3303. port: base.getValue('setting_rpc_port'),
  3304. }), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
  3305. GM_openInTab(url, {active: true});
  3306. });
  3307. },
  3308.  
  3309. addButton() {
  3310. if (!pt) return;
  3311. let $toolWrap;
  3312. let $button = $(`<div class="tianyi-button pl-button">下载助手<ul class="pl-dropdown-menu" style="top: 26px;"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">助手设置</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-updatelog">更新日志</li></ul></div>`);
  3313. if (pt === 'home') {
  3314. let ins = setInterval(() => {
  3315. $toolWrap = $(pan.btn.home);
  3316. if ($toolWrap.length > 0) {
  3317. $toolWrap.prepend($button);
  3318. clearInterval(ins);
  3319. }
  3320. }, 50);
  3321. }
  3322. if (pt === 'share') {
  3323. let ins = setInterval(() => {
  3324. $toolWrap = $(pan.btn.share);
  3325. if ($toolWrap.length > 0) {
  3326. $toolWrap.prepend($button);
  3327. clearInterval(ins);
  3328. }
  3329. }, 50);
  3330. }
  3331. base.createDownloadIframe();
  3332. this.addPageListener();
  3333. },
  3334.  
  3335. addInitButton() {
  3336. if (!pt) return;
  3337. let $toolWrap;
  3338. let $button = $(`<div class="tianyi-button pl-button-init">下载助手(未点亮)</div>`);
  3339. if (pt === 'home') {
  3340. let ins = setInterval(() => {
  3341. $toolWrap = $(pan.btn.home);
  3342. if ($toolWrap.length > 0) {
  3343. $toolWrap.append($button);
  3344. clearInterval(ins);
  3345. }
  3346. }, 50);
  3347. }
  3348. if (pt === 'share') {
  3349. $button.css({'margin-right': '10px'});
  3350. let ins = setInterval(() => {
  3351. $toolWrap = $(pan.btn.share);
  3352. if ($toolWrap.length > 0) {
  3353. $toolWrap.prepend($button);
  3354. clearInterval(ins);
  3355. }
  3356. }, 50);
  3357. }
  3358. $button.click(() => base.initDialog());
  3359. },
  3360.  
  3361. async getToken() {
  3362. let res = await base.getFinalUrl(pan.pcs[1], {});
  3363. let accessToken = res.match(/accessToken=(\w+)/)?.[1];
  3364. accessToken && base.setStorage('accessToken', accessToken);
  3365. return accessToken;
  3366. },
  3367.  
  3368. async getFileUrlByOnce(item, index, token) {
  3369. try {
  3370. if (item.downloadUrl) return {
  3371. index,
  3372. downloadUrl: item.downloadUrl
  3373. };
  3374. let time = Date.now(),
  3375. fileId = item.fileId,
  3376. o = "AccessToken=" + token + "&Timestamp=" + time + "&fileId=" + fileId,
  3377. url = pan.pcs[2] + '?fileId=' + fileId;
  3378. if (item.shareId) {
  3379. o = "AccessToken=" + token + "&Timestamp=" + time + "&dt=1&fileId=" + fileId + "&shareId=" + item.shareId;
  3380. url += '&dt=1&shareId=' + item.shareId;
  3381. }
  3382. let sign = md5(o).toString();
  3383. let res = await base.get(url, {
  3384. "accept": "application/json;charset=UTF-8",
  3385. "sign-type": 1,
  3386. "accesstoken": token,
  3387. "timestamp": time,
  3388. "signature": sign
  3389. });
  3390. if (res.res_code === 0) {
  3391. return {
  3392. index,
  3393. downloadUrl: res.fileDownloadUrl
  3394. };
  3395. } else if (res.errorCode === 'InvalidSessionKey') {
  3396. return {
  3397. index,
  3398. downloadUrl: '提示:请先登录(不可用)网盘!'
  3399. };
  3400. } else if (res.res_code === 'ShareNotFoundFlatDir') {
  3401. return {
  3402. index,
  3403. downloadUrl: '提示:请先[转存]文件,👉前往[我的网盘]中下载!'
  3404. };
  3405. } else {
  3406. return {
  3407. index,
  3408. downloadUrl: '获取下载地址失败,请刷新重试!'
  3409. };
  3410. }
  3411. } catch (e) {
  3412. return {
  3413. index,
  3414. downloadUrl: '获取下载地址失败,请刷新重试!'
  3415. };
  3416. }
  3417. },
  3418.  
  3419. async getPCSLink() {
  3420. selectList = this.getSelectedList();
  3421. if (selectList.length === 0) {
  3422. return message.error('提示:请先勾选要下载的文件!');
  3423. }
  3424. if (this.isOnlyFolder()) {
  3425. return message.error('提示:请打开文件夹后勾选文件!');
  3426. }
  3427. let token = base.getStorage('accessToken') || await this.getToken();
  3428. if (!token) {
  3429. return message.error('提示:请先登录(不可用)网盘!');
  3430. }
  3431. let queue = [];
  3432. selectList.forEach((item, index) => {
  3433. queue.push(this.getFileUrlByOnce(item, index, token));
  3434. });
  3435.  
  3436. const res = await Promise.all(queue);
  3437. res.forEach(val => {
  3438. selectList[val.index].downloadUrl = val.downloadUrl;
  3439. });
  3440.  
  3441. let html = this.generateDom(selectList);
  3442. this.showMainDialog(pan[mode][0], html, pan[mode][1]);
  3443. },
  3444.  
  3445. generateDom(list) {
  3446. let content = '<div class="pl-main">';
  3447. let alinkAllText = '';
  3448. list.forEach((v, i) => {
  3449. if (v.isFolder) return;
  3450. let filename = v.fileName;
  3451. let size = base.sizeFormat(v.size);
  3452. let dlink = v.downloadUrl;
  3453. if (mode === 'api') {
  3454. content += `<div class="pl-item">
  3455. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3456. <a class="pl-item-link listener-link-api" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
  3457. </div>`;
  3458. }
  3459. if (mode === 'aria') {
  3460. let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
  3461. alinkAllText += alink + '\r\n';
  3462. content += `<div class="pl-item">
  3463. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3464. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  3465. }
  3466. if (mode === 'rpc') {
  3467. content += `<div class="pl-item">
  3468. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3469. <button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
  3470. }
  3471. if (mode === 'curl') {
  3472. let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
  3473. alinkAllText += alink + '\r\n';
  3474. content += `<div class="pl-item">
  3475. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3476. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  3477. }
  3478. if (mode === 'bc') {
  3479. let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
  3480. content += `<div class="pl-item">
  3481. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3482. <a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  3483. }
  3484. });
  3485. content += '</div>';
  3486. if (mode === 'aria')
  3487. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
  3488. if (mode === 'rpc') {
  3489. let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
  3490. content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
  3491. }
  3492. if (mode === 'curl')
  3493. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
  3494. return content;
  3495. },
  3496.  
  3497. async sendLinkToRPC(filename, link) {
  3498. let rpc = {
  3499. domain: base.getValue('setting_rpc_domain'),
  3500. port: base.getValue('setting_rpc_port'),
  3501. path: base.getValue('setting_rpc_path'),
  3502. token: base.getValue('setting_rpc_token'),
  3503. dir: base.getValue('setting_rpc_dir'),
  3504. };
  3505.  
  3506. let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
  3507. let rpcData = {
  3508. id: new Date().getTime(),
  3509. jsonrpc: '2.0',
  3510. method: 'aria2.addUri',
  3511. params: [`token:${rpc.token}`, [link], {
  3512. dir: rpc.dir,
  3513. out: filename,
  3514. header: []
  3515. }]
  3516. };
  3517. try {
  3518. let res = await base.post(url, rpcData, {}, '');
  3519. if (res.result) return 'success';
  3520. return 'fail';
  3521. } catch (e) {
  3522. return 'fail';
  3523. }
  3524. },
  3525.  
  3526. getSelectedList() {
  3527. try {
  3528. return document.querySelector(".c-file-list").__vue__.selectedList;
  3529. } catch (e) {
  3530. return [document.querySelector(".info-detail").__vue__.fileDetail];
  3531. }
  3532. },
  3533.  
  3534. detectPage() {
  3535. let path = location.pathname;
  3536. if (/^\/web\/main/.test(path)) return 'home';
  3537. if (/^\/web\/share/.test(path)) return 'share';
  3538. return '';
  3539. },
  3540.  
  3541. isOnlyFolder() {
  3542. for (let i = 0; i < selectList.length; i++) {
  3543. if (!selectList[i].isFolder) return false;
  3544. }
  3545. return true;
  3546. },
  3547.  
  3548. showMainDialog(title, html, footer) {
  3549. Swal.fire({
  3550. title,
  3551. html,
  3552. footer,
  3553. allowOutsideClick: false,
  3554. showCloseButton: true,
  3555. showConfirmButton: false,
  3556. position: 'top',
  3557. width,
  3558. padding: '15px 20px 5px',
  3559. customClass,
  3560. });
  3561. },
  3562.  
  3563. async initPanLinker() {
  3564. base.initDefaultConfig();
  3565. base.addPanLinkerStyle();
  3566. pt = this.detectPage();
  3567. if (base.getValue('setting_getuser_info') === 'yes') {
  3568. let res = await base.post
  3569. (`https://api.youxiaohou.com/config/tianyi?ver=${version}&a=${author}`, {}, {}, 'text');
  3570. pan = JSON.parse(base.d(res));
  3571. };
  3572. Object.freeze && Object.freeze(pan);
  3573. pan.num === base.getValue('setting_init_code') ? this.addButton() : this.addInitButton();
  3574. this.getToken();
  3575. base.createTip();
  3576. base.registerMenuCommand();
  3577. }
  3578. };
  3579.  
  3580. //迅雷云盘
  3581. let xunlei = {
  3582.  
  3583. convertLinkToAria(link, filename, ua) {
  3584. filename = base.fixFilename(filename);
  3585. return encodeURIComponent(`aria2c "${link}" --out "${filename}"`);
  3586. },
  3587.  
  3588. convertLinkToBC(link, filename, ua) {
  3589. let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}ZZ`;
  3590. return encodeURIComponent(`bc://http/${base.e(bc)}`);
  3591. },
  3592.  
  3593. convertLinkToCurl(link, filename, ua) {
  3594. let terminal = base.getValue('setting_terminal_type');
  3595. filename = base.fixFilename(filename);
  3596. return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}"`);
  3597. },
  3598.  
  3599. addPageListener() {
  3600. doc.on('click', '.pl-button-mode', (e) => {
  3601. mode = e.target.dataset.mode;
  3602. Swal.showLoading();
  3603. this.getPCSLink();
  3604. });
  3605. doc.on('click', '.listener-link-api', async (e) => {
  3606. e.preventDefault();
  3607. $('#downloadIframe').attr('src', e.currentTarget.dataset.link);
  3608. });
  3609. doc.on('click', '.listener-link-api-btn', async (e) => {
  3610. base.setClipboard(e.target.dataset.filename);
  3611. $(e.target).text('复制成功').animate({opacity: '0.5'}, "slow");
  3612. setTimeout(
  3613. function (){
  3614. $(e.target).text('重新复制').animate({opacity: '1'}, "slow");
  3615. },2000
  3616. )
  3617. });
  3618. doc.on('click', '.listener-link-bc-btn', async (e) => {
  3619. let mirror = base.getMirrorList(e.target.dataset.dlink, pan.mirror);
  3620. base.setClipboard(mirror);
  3621. $(e.target).text('复制成功').animate({opacity: '0.5'}, "slow");
  3622. setTimeout(
  3623. function (){
  3624. $(e.target).text('重新复制').animate({opacity: '1'}, "slow");
  3625. },2000
  3626. )
  3627. });
  3628. doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
  3629. e.preventDefault();
  3630. base.setClipboard(decodeURIComponent(e.target.dataset.link));
  3631. $(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
  3632. setTimeout(
  3633. function (){
  3634. $(e.target).text('重新复制').animate({opacity: '1'}, "slow");
  3635. },2000
  3636. )
  3637. });
  3638. doc.on('click', '.listener-link-rpc', async (e) => {
  3639. let target = $(e.currentTarget);
  3640. target.find('.icon').remove();
  3641. target.find('.pl-loading').remove();
  3642. target.prepend(base.createLoading());
  3643. let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
  3644. if (res === 'success') {
  3645. $('.listener-rpc-task').show();
  3646. target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
  3647. } else {
  3648. target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
  3649. }
  3650. });
  3651. doc.on('click', '.listener-send-rpc', (e) => {
  3652. $('.listener-link-rpc').click();
  3653. $(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
  3654. });
  3655. doc.on('click', '.listener-open-setting', () => {
  3656. base.showSetting();
  3657. });
  3658. doc.on('click', '.listener-open-updatelog', () => {
  3659. base.showUpdateLog();
  3660. });
  3661. doc.on('click', '.listener-rpc-task', () => {
  3662. let rpc = JSON.stringify({
  3663. domain: base.getValue('setting_rpc_domain'),
  3664. port: base.getValue('setting_rpc_port'),
  3665. }), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
  3666. GM_openInTab(url, {active: true});
  3667. });
  3668. },
  3669.  
  3670. addButton() {
  3671. if (!pt) return;
  3672. let $toolWrap;
  3673. let $button = $(`<div class="xunlei-button pl-button"><i class="xlpfont xlp-download"></i><span style="font-size: 13px;margin-left: 6px;">下载助手</span><ul class="pl-dropdown-menu" style="top: 34px;"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">助手设置</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-updatelog">更新日志</li></ul></div>`);
  3674. if (pt === 'home') {
  3675. let ins = setInterval(() => {
  3676. $toolWrap = $(pan.btn.home);
  3677. if ($toolWrap.length > 0) {
  3678. $toolWrap.prepend($button);
  3679. clearInterval(ins);
  3680. }
  3681. }, 50);
  3682. }
  3683. if (pt === 'share') {
  3684. $button.css({'margin-right': '10px'});
  3685. let ins = setInterval(() => {
  3686. $toolWrap = $(pan.btn.share);
  3687. if ($toolWrap.length > 0) {
  3688. $toolWrap.prepend($button);
  3689. clearInterval(ins);
  3690. }
  3691. }, 50);
  3692. }
  3693. base.createDownloadIframe();
  3694. this.addPageListener();
  3695. },
  3696.  
  3697. addInitButton() {
  3698. if (!pt) return;
  3699. let $toolWrap;
  3700. let $button = $(`<div class="xunlei-button pl-button-init"><i class="xlpfont xlp-download"></i><span style="font-size: 13px;margin-left: 6px;">下载助手(未点亮)</span></div>`);
  3701. if (pt === 'home') {
  3702. let ins = setInterval(() => {
  3703. $toolWrap = $(pan.btn.home);
  3704. if ($toolWrap.length > 0) {
  3705. $toolWrap.append($button);
  3706. clearInterval(ins);
  3707. }
  3708. }, 50);
  3709. }
  3710. if (pt === 'share') {
  3711. $button.css({'margin-right': '10px'});
  3712. let ins = setInterval(() => {
  3713. $toolWrap = $(pan.btn.share);
  3714. if ($toolWrap.length > 0) {
  3715. $toolWrap.prepend($button);
  3716. clearInterval(ins);
  3717. }
  3718. }, 50);
  3719. }
  3720. $button.click(() => base.initDialog());
  3721. },
  3722.  
  3723. getToken() {
  3724. let credentials = {}, captcha = {};
  3725. for (let i = 0; i < localStorage.length; i++) {
  3726. if (/^credentials_/.test(localStorage.key(i))) {
  3727. credentials = base.getStorage(localStorage.key(i));
  3728. base.setStorage('');
  3729. }
  3730. if (/^captcha_[\w]{16}/.test(localStorage.key(i))) {
  3731. captcha = base.getStorage(localStorage.key(i));
  3732. }
  3733. }
  3734. let deviceid = /(\w{32})/.exec(base.getStorage('deviceid').split(','))[0];
  3735. let token = {
  3736. credentials,
  3737. captcha,
  3738. deviceid
  3739. };
  3740. return token;
  3741. },
  3742.  
  3743. async getFileUrlByOnce(item, index, token) {
  3744. try {
  3745. if (item.downloadUrl) return {
  3746. index,
  3747. downloadUrl: item.downloadUrl
  3748. };
  3749. let res = await base.get(pan.pcs[0] + item.id, {
  3750. 'Authorization': `${token.credentials.token_type} ${token.credentials.access_token}`,
  3751. 'content-type': "application/json",
  3752. 'x-captcha-token': token.captcha.token,
  3753. 'x-device-id': token.deviceid,
  3754. });
  3755. if (res.web_content_link) {
  3756. return {
  3757. index,
  3758. downloadUrl: res.web_content_link
  3759. };
  3760. } else {
  3761. return {
  3762. index,
  3763. downloadUrl: '获取下载地址失败,请刷新重试!'
  3764. };
  3765. }
  3766. } catch (e) {
  3767. return message.error('提示:请先登录(不可用)网盘后刷新页面!');
  3768. }
  3769. },
  3770.  
  3771. async getPCSLink() {
  3772. selectList = this.getSelectedList();
  3773. if (selectList.length === 0) {
  3774. return message.error('提示:请先勾选要下载的文件!');
  3775. }
  3776. if (this.isOnlyFolder()) {
  3777. return message.error('提示:请打开文件夹后勾选文件!');
  3778. }
  3779. if (pt === 'home') {
  3780. let queue = [];
  3781. let token = this.getToken();
  3782. selectList.forEach((item, index) => {
  3783. queue.push(this.getFileUrlByOnce(item, index, token));
  3784. });
  3785. const res = await Promise.all(queue);
  3786. res.forEach(val => {
  3787. selectList[val.index].downloadUrl = val.downloadUrl;
  3788. });
  3789. } else {
  3790. return message.error('提示:请保存到自己网盘后去网盘主页下载!');
  3791. }
  3792. let html = this.generateDom(selectList);
  3793. this.showMainDialog(pan[mode][0], html, pan[mode][1]);
  3794.  
  3795. },
  3796.  
  3797. generateDom(list) {
  3798. let content = '<div class="pl-main">';
  3799. let alinkAllText = '';
  3800. list.forEach((v, i) => {
  3801. if (v.kind === 'drive#folder') return;
  3802. let filename = v.name;
  3803. let size = base.sizeFormat(+v.size);
  3804. let dlink = v.downloadUrl;
  3805. if (mode === 'api') {
  3806. content += `<div class="pl-item">
  3807. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3808. <a class="pl-item-link listener-link-api" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
  3809. <div class="pl-item-btn listener-link-api-btn" data-filename="${filename}">复制文件名</div>
  3810. </div>`;
  3811. }
  3812. if (mode === 'aria') {
  3813. let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
  3814. alinkAllText += alink + '\r\n';
  3815. content += `<div class="pl-item">
  3816. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3817. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  3818. }
  3819. if (mode === 'rpc') {
  3820. content += `<div class="pl-item">
  3821. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3822. <button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
  3823. }
  3824. if (mode === 'curl') {
  3825. let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
  3826. alinkAllText += alink + '\r\n';
  3827. content += `<div class="pl-item">
  3828. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3829. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  3830. }
  3831. if (mode === 'bc') {
  3832. let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
  3833. content += `<div class="pl-item">
  3834. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  3835. <a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a>
  3836. <div class="pl-item-btn listener-link-bc-btn" data-dlink="${dlink}">复制镜像地址</div>
  3837. </div>`;
  3838. }
  3839. });
  3840. content += '</div>';
  3841. if (mode === 'aria')
  3842. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
  3843. if (mode === 'rpc') {
  3844. let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
  3845. content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
  3846. }
  3847. if (mode === 'curl')
  3848. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
  3849. return content;
  3850. },
  3851.  
  3852. async sendLinkToRPC(filename, link) {
  3853. let rpc = {
  3854. domain: base.getValue('setting_rpc_domain'),
  3855. port: base.getValue('setting_rpc_port'),
  3856. path: base.getValue('setting_rpc_path'),
  3857. token: base.getValue('setting_rpc_token'),
  3858. dir: base.getValue('setting_rpc_dir'),
  3859. };
  3860.  
  3861. let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
  3862. let rpcData = {
  3863. id: new Date().getTime(),
  3864. jsonrpc: '2.0',
  3865. method: 'aria2.addUri',
  3866. params: [`token:${rpc.token}`, [link], {
  3867. dir: rpc.dir,
  3868. out: filename,
  3869. header: []
  3870. }]
  3871. };
  3872. try {
  3873. let res = await base.post(url, rpcData, {}, '');
  3874. if (res.result) return 'success';
  3875. return 'fail';
  3876. } catch (e) {
  3877. return 'fail';
  3878. }
  3879. },
  3880.  
  3881. getSelectedList() {
  3882. try {
  3883. let doms = document.querySelectorAll('.pan-list-item');
  3884. let selectedList = [];
  3885. for (let dom of doms) {
  3886. let domVue = dom.__vue__;
  3887. if (domVue.selected.includes(domVue.info.id)) {
  3888. selectedList.push(domVue.info);
  3889. }
  3890. }
  3891. return selectedList;
  3892. } catch (e) {
  3893. return [];
  3894. }
  3895. },
  3896.  
  3897. detectPage() {
  3898. let path = location.pathname;
  3899. if (/^\/$/.test(path)) return 'home';
  3900. if (/^\/(s|share)\//.test(path)) return 'share';
  3901. return '';
  3902. },
  3903.  
  3904. isOnlyFolder() {
  3905. for (let i = 0; i < selectList.length; i++) {
  3906. if (selectList[i].kind === 'drive#file') return false;
  3907. }
  3908. return true;
  3909. },
  3910.  
  3911. showMainDialog(title, html, footer) {
  3912. Swal.fire({
  3913. title,
  3914. html,
  3915. footer,
  3916. allowOutsideClick: false,
  3917. showCloseButton: true,
  3918. showConfirmButton: false,
  3919. position: 'top',
  3920. width,
  3921. padding: '15px 20px 5px',
  3922. customClass,
  3923. });
  3924. },
  3925.  
  3926. async initPanLinker() {
  3927. base.initDefaultConfig();
  3928. base.addPanLinkerStyle();
  3929. pt = this.detectPage();
  3930. if (base.getValue('setting_getuser_info') === 'yes') {
  3931. let res = await base.post
  3932. (`https://api.youxiaohou.com/config/xunlei?ver=${version}&a=${author}`, {}, {}, 'text');
  3933. pan = JSON.parse(base.d(res));
  3934. };
  3935. Object.freeze && Object.freeze(pan);
  3936. pan.num === base.getValue('setting_init_code') ? this.addButton() : this.addInitButton();
  3937. base.createTip();
  3938. base.registerMenuCommand();
  3939. }
  3940. };
  3941.  
  3942. //夸克网盘
  3943. let quark = {
  3944.  
  3945. convertLinkToAria(link, filename, ua) {
  3946. filename = base.fixFilename(filename);
  3947. return encodeURIComponent(`aria2c "${link}" --out "${filename}" --header "Cookie: ${document.cookie}"`);
  3948. },
  3949.  
  3950. convertLinkToBC(link, filename, ua) {
  3951. let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}&cookie=${encodeURIComponent(document.cookie)}ZZ`;
  3952. return encodeURIComponent(`bc://http/${base.e(bc)}`);
  3953. },
  3954.  
  3955. convertLinkToCurl(link, filename, ua) {
  3956. let terminal = base.getValue('setting_terminal_type');
  3957. filename = base.fixFilename(filename);
  3958. return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}" -b "${document.cookie}"`);
  3959. },
  3960.  
  3961. addPageListener() {
  3962. window.addEventListener('hashchange', async (e) => {
  3963. let home = 'https://pan.quark.cn/list#/', all = 'https://pan.quark.cn/list#/list/all';
  3964. if (e.oldURL === home && e.newURL === all) return;
  3965. await base.sleep(150);
  3966. if ($('.quark-button').length > 0) return;
  3967. pan.num === base.getValue('setting_init_code') ? this.addButton() : this.addInitButton();
  3968. });
  3969. doc.on('click', '.pl-button-mode', (e) => {
  3970. mode = e.target.dataset.mode;
  3971. Swal.showLoading();
  3972. this.getPCSLink();
  3973. });
  3974. doc.on('click', '.listener-link-api', async (e) => {
  3975. e.preventDefault();
  3976. $('#downloadIframe').attr('src', e.currentTarget.dataset.link);
  3977. });
  3978. doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
  3979. e.preventDefault();
  3980. base.setClipboard(decodeURIComponent(e.target.dataset.link));
  3981. $(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
  3982. setTimeout(
  3983. function (){
  3984. $(e.target).text('重新复制').animate({opacity: '1'}, "slow");
  3985. },2000
  3986. )
  3987. });
  3988. doc.on('click', '.listener-link-rpc', async (e) => {
  3989. let target = $(e.currentTarget);
  3990. target.find('.icon').remove();
  3991. target.find('.pl-loading').remove();
  3992. target.prepend(base.createLoading());
  3993. let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
  3994. if (res === 'success') {
  3995. $('.listener-rpc-task').show();
  3996. target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
  3997. } else {
  3998. target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
  3999. }
  4000. });
  4001. doc.on('click', '.listener-send-rpc', (e) => {
  4002. $('.listener-link-rpc').click();
  4003. $(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
  4004. });
  4005. doc.on('click', '.listener-open-setting', () => {
  4006. base.showSetting();
  4007. });
  4008. doc.on('click', '.listener-open-updatelog', () => {
  4009. base.showUpdateLog();
  4010. });
  4011. doc.on('click', '.listener-rpc-task', () => {
  4012. let rpc = JSON.stringify({
  4013. domain: base.getValue('setting_rpc_domain'),
  4014. port: base.getValue('setting_rpc_port'),
  4015. }), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
  4016. GM_openInTab(url, {active: true});
  4017. });
  4018. },
  4019.  
  4020. addButton() {
  4021. if ($("#quark-button")){
  4022. $("#quark-button").remove();
  4023. };
  4024. if (!pt) return;
  4025. let $toolWrap;
  4026. let $button = $(`<div id="quark-button" class="file-info_r quark-button pl-button"><svg width="22" height="22" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" stroke="#FFFFFF" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 2-2z"/><path d="M14 8h1.553c.85 0 1.16.093 1.47.267.311.174.556.43.722.756.166.326.255.65.255 1.54v4.873c0 .892-.089 1.215-.255 1.54-.166.327-.41.583-.722.757-.31.174-.62.267-1.47.267H6.447c-.85 0-1.16-.093-1.47-.267a1.778 1.778 0 01-.722-.756c-.166-.326-.255-.65-.255-1.54v-4.873c0-.892.089-1.215.255-1.54.166-.327.41-.583.722-.757.31-.174.62-.267 1.47-.267H11"/><path stroke-linecap="round" stroke-linejoin="round" d="M11 3v10"/></g></svg>下载助手<ul class="pl-dropdown-menu"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">助手设置</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-updatelog">更新日志</li></ul></div>`);
  4027. $button.css({"margin-right":"10px","background-color":color});
  4028. if (pt === 'home') {
  4029. let ins = setInterval(() => {
  4030. $toolWrap = $(pan.btn.home);
  4031. if ($toolWrap.length > 0) {
  4032. $toolWrap.prepend($button);
  4033. clearInterval(ins);
  4034. }
  4035. }, 50);
  4036. }
  4037. if (pt === 'share') {
  4038. $button.css({"margin-right":"10px","background-color":color});
  4039. let ins = setInterval(() => {
  4040. $toolWrap = $(pan.btn.share);
  4041. if ($toolWrap.length > 0) {
  4042. $toolWrap.prepend($button);
  4043. clearInterval(ins);
  4044. }
  4045. }, 50);
  4046. }
  4047. },
  4048.  
  4049. addInitButton() {
  4050. $("#pl-button-init").remove();
  4051. if (!pt) return;
  4052. let $toolWrap;
  4053. let $button = $(`<div id="quark-button" class="file-info_r quark-button pl-button-init"><svg width="22" height="22" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" stroke="#FFFFFF" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 2-2z"/><path d="M14 8h1.553c.85 0 1.16.093 1.47.267.311.174.556.43.722.756.166.326.255.65.255 1.54v4.873c0 .892-.089 1.215-.255 1.54-.166.327-.41.583-.722.757-.31.174-.62.267-1.47.267H6.447c-.85 0-1.16-.093-1.47-.267a1.778 1.778 0 01-.722-.756c-.166-.326-.255-.65-.255-1.54v-4.873c0-.892.089-1.215.255-1.54.166-.327.41-.583.722-.757.31-.174.62-.267 1.47-.267H11"/><path stroke-linecap="round" stroke-linejoin="round" d="M11 3v10"/></g></svg>下载助手(未点亮)</div>`);
  4054. $button.css({"margin-right":"10px","background-color":color});
  4055. if (pt === 'home') {
  4056. let ins = setInterval(() => {
  4057. $toolWrap = $(pan.btn.home);
  4058. if ($toolWrap.length > 0) {
  4059. $toolWrap.prepend($button);
  4060. clearInterval(ins);
  4061. }
  4062. }, 50);
  4063. }
  4064. if (pt === 'share') {
  4065. $button.css({'margin-right': '10px','width': '160px',"background-color":color});
  4066. let ins = setInterval(() => {
  4067. $toolWrap = $(pan.btn.share);
  4068. if ($toolWrap.length > 0) {
  4069. $toolWrap.prepend($button);
  4070. clearInterval(ins);
  4071. }
  4072. }, 50);
  4073. }
  4074. $button.click(() => base.initDialog());
  4075. },
  4076.  
  4077. async getPCSLink() {
  4078. selectList = this.getSelectedList();
  4079. if (selectList.length === 0) {
  4080. return message.error('提示:请先勾选要下载的文件!');
  4081. }
  4082. if (this.isOnlyFolder()) {
  4083. return message.error('提示:请打开文件夹后勾选文件!');
  4084. }
  4085. let fids = [];
  4086. selectList.forEach(val => {
  4087. fids.push(val.fid);
  4088. });
  4089. if (pt === 'home') {
  4090. let res = await base.post(pan.pcs[0], {
  4091. "fids": fids
  4092. }, {"content-type": "application/json;charset=utf-8", "user-agent": pan.ua});
  4093. if (res.code === 31001) {
  4094. return message.error('提示:请先登录(不可用)网盘!');
  4095. }
  4096. if (res.code !== 0) {
  4097. return message.error('提示:获取链接失败!');
  4098. }
  4099. let html = this.generateDom(res.data);
  4100. this.showMainDialog(pan[mode][0], html, pan[mode][1]);
  4101. } else {
  4102. message.error('提示:请保存到自己网盘后去网盘主页下载!');
  4103. await base.sleep(1000);
  4104. document.querySelector('.file-info_r').click();
  4105. return;
  4106. }
  4107. },
  4108.  
  4109. generateDom(list) {
  4110. let content = '<div class="pl-main">';
  4111. let alinkAllText = '';
  4112. list.forEach((v, i) => {
  4113. if (v.file === false) return;
  4114. let filename = v.file_name;
  4115. let fid = v.fid;
  4116. let size = base.sizeFormat(v.size);
  4117. let dlink = v.download_url;
  4118. if (mode === 'api') {
  4119. content += `<div class="pl-item">
  4120. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4121. <a class="pl-item-link listener-link-api" data-fid="${fid}" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
  4122. </div>`;
  4123. }
  4124. if (mode === 'aria') {
  4125. let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
  4126. alinkAllText += alink + '\r\n';
  4127. content += `<div class="pl-item">
  4128. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4129. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  4130. }
  4131. if (mode === 'rpc') {
  4132. content += `<div class="pl-item">
  4133. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4134. <button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
  4135. }
  4136. if (mode === 'curl') {
  4137. let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
  4138. alinkAllText += alink + '\r\n';
  4139. content += `<div class="pl-item">
  4140. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4141. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  4142. }
  4143. if (mode === 'bc') {
  4144. let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
  4145. content += `<div class="pl-item">
  4146. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4147. <a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  4148. }
  4149. });
  4150. content += '</div>';
  4151. if (mode === 'aria')
  4152. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
  4153. if (mode === 'rpc') {
  4154. let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
  4155. content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
  4156. }
  4157. if (mode === 'curl')
  4158. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
  4159. return content;
  4160. },
  4161.  
  4162. async sendLinkToRPC(filename, link) {
  4163. let rpc = {
  4164. domain: base.getValue('setting_rpc_domain'),
  4165. port: base.getValue('setting_rpc_port'),
  4166. path: base.getValue('setting_rpc_path'),
  4167. token: base.getValue('setting_rpc_token'),
  4168. dir: base.getValue('setting_rpc_dir'),
  4169. };
  4170.  
  4171. let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
  4172. let rpcData = {
  4173. id: new Date().getTime(),
  4174. jsonrpc: '2.0',
  4175. method: 'aria2.addUri',
  4176. params: [`token:${rpc.token}`, [link], {
  4177. dir: rpc.dir,
  4178. out: filename,
  4179. header: [`Cookie: ${document.cookie}`]
  4180. }]
  4181. };
  4182. try {
  4183. let res = await base.post(url, rpcData, {"Cookie": document.cookie}, '');
  4184. if (res.result) return 'success';
  4185. return 'fail';
  4186. } catch (e) {
  4187. return 'fail';
  4188. }
  4189. },
  4190.  
  4191. getSelectedList() {
  4192. try {
  4193. let selectedList = [];
  4194. let reactDom = document.getElementsByClassName('file-list')[0];
  4195. let reactObj = base.findReact(reactDom);
  4196. let props = reactObj.props;
  4197. if (props) {
  4198. let fileList = props.list || [];
  4199. let selectedKeys = props.selectedRowKeys || [];
  4200. fileList.forEach((val) => {
  4201. if (selectedKeys.includes(val.fid)) {
  4202. selectedList.push(val);
  4203. }
  4204. });
  4205. }
  4206. return selectedList;
  4207. } catch (e) {
  4208. return [];
  4209. }
  4210. },
  4211.  
  4212. detectPage() {
  4213. let path = location.pathname;
  4214. if (/^\/(list)/.test(path)) return 'home';
  4215. if (/^\/(s|share)\//.test(path)) return 'share';
  4216. return '';
  4217. },
  4218.  
  4219. isOnlyFolder() {
  4220. for (let i = 0; i < selectList.length; i++) {
  4221. if (selectList[i].file) return false;
  4222. }
  4223. return true;
  4224. },
  4225.  
  4226. showMainDialog(title, html, footer) {
  4227. Swal.fire({
  4228. title,
  4229. html,
  4230. footer,
  4231. allowOutsideClick: false,
  4232. showCloseButton: true,
  4233. showConfirmButton: false,
  4234. position: 'top',
  4235. width,
  4236. padding: '15px 20px 5px',
  4237. customClass,
  4238. });
  4239. },
  4240.  
  4241. async initPanLinker() {
  4242. base.initDefaultConfig();
  4243. base.addPanLinkerStyle();
  4244. pt = this.detectPage();
  4245. if (base.getValue('setting_getuser_info') === 'yes') {
  4246. let res = await base.post
  4247. (`https://api.youxiaohou.com/config/quark?ver=${version}&a=${author}`, {}, {}, 'text');
  4248. pan = JSON.parse(base.d(res));
  4249. };
  4250. Object.freeze && Object.freeze(pan);
  4251. pan.num === base.getValue('setting_init_code') ? this.addButton() : this.addInitButton();
  4252. this.addPageListener();
  4253. base.createTip();
  4254. base.createDownloadIframe();
  4255. base.registerMenuCommand();
  4256. }
  4257. };
  4258.  
  4259. //中国移动云盘/和彩云
  4260. let yidong = {
  4261.  
  4262. convertLinkToAria(link, filename, ua) {
  4263. filename = base.fixFilename(filename);
  4264. return encodeURIComponent(`aria2c "${link}" --out "${filename}"`);
  4265. },
  4266.  
  4267. convertLinkToBC(link, filename, ua) {
  4268. let bc = `AA/${encodeURIComponent(filename)}/?url=${encodeURIComponent(link)}ZZ`;
  4269. return encodeURIComponent(`bc://http/${base.e(bc)}`);
  4270. },
  4271.  
  4272. convertLinkToCurl(link, filename, ua) {
  4273. let terminal = base.getValue('setting_terminal_type');
  4274. filename = base.fixFilename(filename);
  4275. return encodeURIComponent(`${terminal !== 'wp' ? 'curl' : 'curl.exe'} -L -C - "${link}" -o "${filename}"`);
  4276. },
  4277.  
  4278. addPageListener() {
  4279. doc.on('click', '.pl-button-mode', (e) => {
  4280. mode = e.target.dataset.mode;
  4281. Swal.showLoading();
  4282. this.getPCSLink();
  4283. });
  4284. doc.on('click', '.listener-link-api', async (e) => {
  4285. e.preventDefault();
  4286. $('#downloadIframe').attr('src', e.currentTarget.dataset.link);
  4287. });
  4288. doc.on('click', '.listener-link-aria, .listener-copy-all', (e) => {
  4289. e.preventDefault();
  4290. base.setClipboard(decodeURIComponent(e.target.dataset.link));
  4291. $(e.target).text('复制成功,快去粘贴吧!').animate({opacity: '0.5'}, "slow");
  4292. setTimeout(
  4293. function (){
  4294. $(e.target).text('重新复制').animate({opacity: '1'}, "slow");
  4295. },2000
  4296. )
  4297. });
  4298. doc.on('click', '.listener-link-rpc', async (e) => {
  4299. let target = $(e.currentTarget);
  4300. target.find('.icon').remove();
  4301. target.find('.pl-loading').remove();
  4302. target.prepend(base.createLoading());
  4303. let res = await this.sendLinkToRPC(e.currentTarget.dataset.filename, e.currentTarget.dataset.link);
  4304. if (res === 'success') {
  4305. $('.listener-rpc-task').show();
  4306. target.removeClass('pl-btn-danger').html('发送成功,快去看看吧!').animate({opacity: '0.5'}, "slow");
  4307. } else {
  4308. target.addClass('pl-btn-danger').text('发送失败,请检查您的RPC配置信息!').animate({opacity: '0.5'}, "slow");
  4309. }
  4310. });
  4311. doc.on('click', '.listener-send-rpc', (e) => {
  4312. $('.listener-link-rpc').click();
  4313. $(e.target).text('发送完成,发送结果见上方按钮!').animate({opacity: '0.5'}, "slow");
  4314. });
  4315. doc.on('click', '.listener-open-setting', () => {
  4316. base.showSetting();
  4317. });
  4318. doc.on('click', '.listener-open-updatelog', () => {
  4319. base.showUpdateLog();
  4320. });
  4321. doc.on('click', '.listener-rpc-task', () => {
  4322. let rpc = JSON.stringify({
  4323. domain: base.getValue('setting_rpc_domain'),
  4324. port: base.getValue('setting_rpc_port'),
  4325. }), url = `${pan.d}/?rpc=${base.e(rpc)}#${base.getValue('setting_rpc_token')}`;
  4326. GM_openInTab(url, {active: true});
  4327. });
  4328. },
  4329.  
  4330. addButton() {
  4331. if (!pt) return;
  4332. let $toolWrap;
  4333. let $button = $(`<div class="yidong-button pl-button">下载助手<ul class="pl-dropdown-menu" style="top: 36px;"><li class="pl-dropdown-menu-item pl-button-mode" data-mode="api">API下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="aria" >Aria下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="rpc">RPC下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="curl">cURL下载</li><li class="pl-dropdown-menu-item pl-button-mode" data-mode="bc" >BC下载</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-setting">助手设置</li><li class="pl-dropdown-menu-item pl-button-mode listener-open-updatelog">更新日志</li>${pan.code == 200 && version < pan.version ? pan.new : ''}</ul></div>`);
  4334. if (pt === 'home') {
  4335. let ins = setInterval(() => {
  4336. $toolWrap = $(pan.btn.home);
  4337. if ($toolWrap.length > 0) {
  4338. $toolWrap.prepend($button);
  4339. clearInterval(ins);
  4340. }
  4341. }, 50);
  4342. }
  4343. if (pt === 'share') {
  4344. $button.removeClass('yidong-button').addClass('yidong-share-button');
  4345. let ins = setInterval(() => {
  4346. $toolWrap = $(pan.btn.share);
  4347. if ($toolWrap.length > 0) {
  4348. $toolWrap.prepend($button);
  4349. clearInterval(ins);
  4350. }
  4351. }, 50);
  4352. }
  4353. base.createDownloadIframe();
  4354. this.addPageListener();
  4355. },
  4356.  
  4357. addInitButton() {
  4358. if (!pt) return;
  4359. let $toolWrap;
  4360. let $button = $(`<div class="yidong-button pl-button-init">下载助手(未点亮)</div>`);
  4361. if (pt === 'home') {
  4362. let ins = setInterval(() => {
  4363. $toolWrap = $(pan.btn.home);
  4364. if ($toolWrap.length > 0) {
  4365. $toolWrap.prepend($button);
  4366. clearInterval(ins);
  4367. }
  4368. }, 50);
  4369. }
  4370. if (pt === 'share') {
  4371. $button.removeClass('yidong-button').addClass('yidong-share-button');
  4372. let ins = setInterval(() => {
  4373. $toolWrap = $(pan.btn.share);
  4374. if ($toolWrap.length > 0) {
  4375. $toolWrap.prepend($button);
  4376. clearInterval(ins);
  4377. }
  4378. }, 50);
  4379. }
  4380. $button.click(() => base.initDialog());
  4381. },
  4382.  
  4383. getRandomString(len) {
  4384. len = len || 16;
  4385. let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
  4386. let maxPos = $chars.length;
  4387. let pwd = '';
  4388. for (let i = 0; i < len; i++) {
  4389. pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
  4390. }
  4391. return pwd;
  4392. },
  4393.  
  4394. utob(str) {
  4395. const u = String.fromCharCode;
  4396. return str.replace(/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g, (t) => {
  4397. if (t.length < 2) {
  4398. let e = t.charCodeAt(0);
  4399. return e < 128 ? t : e < 2048 ? u(192 | e >>> 6) + u(128 | 63 & e) : u(224 | e >>> 12 & 15) + u(128 | e >>> 6 & 63) + u(128 | 63 & e);
  4400. }
  4401. e = 65536 + 1024 * (t.charCodeAt(0) - 55296) + (t.charCodeAt(1) - 56320);
  4402. return u(240 | e >>> 18 & 7) + u(128 | e >>> 12 & 63) + u(128 | e >>> 6 & 63) + u(128 | 63 & e);
  4403. });
  4404. },
  4405.  
  4406. getSign(e, t, a, n) {
  4407. let r = "",
  4408. i = "";
  4409. if (t) {
  4410. let s = Object.assign({}, t);
  4411. i = JSON.stringify(s),
  4412. i = i.replace(/\s*/g, ""),
  4413. i = encodeURIComponent(i);
  4414. let c = i.split(""),
  4415. u = c.sort();
  4416. i = u.join("");
  4417. }
  4418. let A = md5(base.e(this.utob(i)));
  4419. let l = md5(a + ":" + n);
  4420. return md5(A + l).toUpperCase();
  4421. },
  4422.  
  4423. async getFileUrlByOnce(item, index) {
  4424. try {
  4425. if (item.downloadUrl) return {
  4426. index,
  4427. downloadUrl: item.downloadUrl
  4428. };
  4429.  
  4430. if (this.detectPage() === 'home') {
  4431. let body = {
  4432. "appName": "",
  4433. "contentID": item.contentID,
  4434. "commonAccountInfo": {"account": item.owner, "accountType": 1}
  4435. };
  4436. let time = new Date(+new Date() + 8 * 3600 * 1000).toJSON().substr(0, 19).replace('T', ' ');
  4437. let key = this.getRandomString(16);
  4438. let sign = this.getSign(undefined, body, time, key);
  4439.  
  4440. let res = await base.post(pan.pcs[0], body, {
  4441. 'x-huawei-channelSrc': '10000034',
  4442. 'x-inner-ntwk': '2',
  4443. 'mcloud-channel': '1000101',
  4444. 'mcloud-client': '10701',
  4445. 'mcloud-sign': time + "," + key + "," + sign,
  4446. 'content-type': "application/json;charset=UTF-8",
  4447. 'caller': 'web',
  4448. 'CMS-DEVICE': 'default',
  4449. 'x-DeviceInfo': '||9|85.0.4183.83|chrome|85.0.4183.83|||windows 10||zh-CN|||',
  4450. 'x-SvcType': '1',
  4451. });
  4452. if (res.success) {
  4453. return {
  4454. index,
  4455. downloadUrl: res.data.downloadURL
  4456. };
  4457. } else {
  4458. return {
  4459. index,
  4460. downloadUrl: '获取下载地址失败,请刷新重试!'
  4461. };
  4462. }
  4463. }
  4464. if (this.detectPage() === 'share') {
  4465. let vueDom = document.querySelector(".home-page").__vue__;
  4466.  
  4467. let res = await base.post(pan.pcs[1], `linkId=${vueDom.linkID}&contentIds=${encodeURIComponent(vueDom.currentPath.id + '/' + item.coID)}&catalogIds=`, {
  4468. 'Content-Type': 'application/x-www-form-urlencoded',
  4469. });
  4470. if (res.code === 0) {
  4471. return {
  4472. index,
  4473. downloadUrl: res.data.redrUrl
  4474. };
  4475. } else {
  4476. return {
  4477. index,
  4478. downloadUrl: '获取下载地址失败,请刷新重试!'
  4479. };
  4480. }
  4481. }
  4482. } catch (e) {
  4483. return {
  4484. index,
  4485. downloadUrl: '获取下载地址失败,请刷新重试!'
  4486. };
  4487. }
  4488. },
  4489.  
  4490. async getPCSLink() {
  4491. selectList = this.getSelectedList();
  4492. if (selectList.length === 0) {
  4493. return message.error('提示:请先勾选要下载的文件!');
  4494. }
  4495. if (this.isOnlyFolder()) {
  4496. return message.error('提示:请打开文件夹后勾选文件!');
  4497. }
  4498.  
  4499. let queue = [];
  4500. selectList.forEach((item, index) => {
  4501. queue.push(this.getFileUrlByOnce(item, index));
  4502. });
  4503.  
  4504. const res = await Promise.all(queue);
  4505. res.forEach(val => {
  4506. selectList[val.index].downloadUrl = val.downloadUrl;
  4507. });
  4508.  
  4509. let html = this.generateDom(selectList);
  4510. this.showMainDialog(pan[mode][0], html, pan[mode][1]);
  4511. },
  4512.  
  4513. generateDom(list) {
  4514. let content = '<div class="pl-main">';
  4515. let alinkAllText = '';
  4516. list.forEach((v, i) => {
  4517. if (v.dirEtag || v.caName) return;
  4518. let filename = v.contentName || v.coName;
  4519. let size = base.sizeFormat(v.contentSize || v.coSize);
  4520. let dlink = v.downloadUrl;
  4521. if (mode === 'api') {
  4522. content += `<div class="pl-item">
  4523. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4524. <a class="pl-item-link listener-link-api" data-filename="${filename}" data-link="${dlink}" data-index="${i}">${dlink}</a>
  4525. </div>`;
  4526. }
  4527. if (mode === 'aria') {
  4528. let alink = this.convertLinkToAria(dlink, filename, navigator.userAgent);
  4529. alinkAllText += alink + '\r\n';
  4530. content += `<div class="pl-item">
  4531. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4532. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制aria2c链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  4533. }
  4534. if (mode === 'rpc') {
  4535. content += `<div class="pl-item">
  4536. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4537. <button class="pl-item-link listener-link-rpc pl-btn-primary pl-btn-info" data-filename="${filename}" data-link="${dlink}"><em class="icon icon-device"></em><span style="margin-left: 5px;">推送到 RPC 下载器</span></button></div>`;
  4538. }
  4539. if (mode === 'curl') {
  4540. let alink = this.convertLinkToCurl(dlink, filename, navigator.userAgent);
  4541. alinkAllText += alink + '\r\n';
  4542. content += `<div class="pl-item">
  4543. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4544. <a class="pl-item-link listener-link-aria" href="${alink}" title="点击复制curl链接" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  4545. }
  4546. if (mode === 'bc') {
  4547. let alink = this.convertLinkToBC(dlink, filename, navigator.userAgent);
  4548. content += `<div class="pl-item">
  4549. <div class="pl-item-name listener-tip" data-size="${size}">${filename}</div>
  4550. <a class="pl-item-link" href="${decodeURIComponent(alink)}" title="点击用比特彗星下载" data-filename="${filename}" data-link="${alink}">${decodeURIComponent(alink)}</a> </div>`;
  4551. }
  4552. });
  4553. content += '</div>';
  4554. if (mode === 'aria')
  4555. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button></div>`;
  4556. if (mode === 'rpc') {
  4557. let rpc = base.getValue('setting_rpc_domain') + ':' + base.getValue('setting_rpc_port') + base.getValue('setting_rpc_path');
  4558. content += `<div class="pl-extra"><button class="pl-btn-primary listener-send-rpc">发送全部链接</button><button title="${rpc}" class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px">设置 RPC 参数(当前为:${rpc})</button><button class="pl-btn-primary pl-btn-success listener-rpc-task" style="margin-left: 10px;display: none">查看下载任务</button></div>`;
  4559. }
  4560. if (mode === 'curl')
  4561. content += `<div class="pl-extra"><button class="pl-btn-primary listener-copy-all" data-link="${alinkAllText}">复制全部链接</button><button class="pl-btn-primary pl-btn-warning listener-open-setting" style="margin-left: 10px;">设置终端类型(当前为:${terminalType[base.getValue('setting_terminal_type')]})</button></div>`;
  4562. return content;
  4563. },
  4564.  
  4565. async sendLinkToRPC(filename, link) {
  4566. let rpc = {
  4567. domain: base.getValue('setting_rpc_domain'),
  4568. port: base.getValue('setting_rpc_port'),
  4569. path: base.getValue('setting_rpc_path'),
  4570. token: base.getValue('setting_rpc_token'),
  4571. dir: base.getValue('setting_rpc_dir'),
  4572. };
  4573.  
  4574. let url = `${rpc.domain}:${rpc.port}${rpc.path}`;
  4575. let rpcData = {
  4576. id: new Date().getTime(),
  4577. jsonrpc: '2.0',
  4578. method: 'aria2.addUri',
  4579. params: [`token:${rpc.token}`, [link], {
  4580. dir: rpc.dir,
  4581. out: filename,
  4582. header: []
  4583. }]
  4584. };
  4585. try {
  4586. let res = await base.post(url, rpcData, {}, '');
  4587. if (res.result) return 'success';
  4588. return 'fail';
  4589. } catch (e) {
  4590. return 'fail';
  4591. }
  4592. },
  4593.  
  4594. getSelectedList() {
  4595. try {
  4596. return document.querySelector(".main_file_list").__vue__.selectList.map(val => val.item);
  4597. } catch (e) {
  4598. let vueDom = document.querySelector(".home-page").__vue__;
  4599. let fileList = vueDom._computedWatchers.fileList.value;
  4600. let dirList = vueDom._computedWatchers.dirList.value;
  4601. let selectedFileIndex = vueDom.selectedFile;
  4602. let selectedDirIndex = vueDom.selectedDir;
  4603. let selectFileList = fileList.filter((v, i) => {
  4604. return selectedFileIndex.includes(i);
  4605. });
  4606. let selectDirList = dirList.filter((v, i) => {
  4607. return selectedDirIndex.includes(i);
  4608. });
  4609. return [...selectFileList, ...selectDirList];
  4610. }
  4611. },
  4612.  
  4613. detectPage() {
  4614. let hostname = location.hostname;
  4615. if (/^yun/.test(hostname)) return 'home';
  4616. if (/^caiyun/.test(hostname)) return 'share';
  4617. return '';
  4618. },
  4619.  
  4620. isOnlyFolder() {
  4621. for (let i = 0; i < selectList.length; i++) {
  4622. if (selectList[i].fileEtag || selectList[i].coName) return false;
  4623. }
  4624. return true;
  4625. },
  4626.  
  4627. showMainDialog(title, html, footer) {
  4628. Swal.fire({
  4629. title,
  4630. html,
  4631. footer,
  4632. allowOutsideClick: false,
  4633. showCloseButton: true,
  4634. showConfirmButton: false,
  4635. position: 'top',
  4636. width,
  4637. padding: '15px 20px 5px',
  4638. customClass,
  4639. });
  4640. },
  4641.  
  4642. async initPanLinker() {
  4643. base.initDefaultConfig();
  4644. base.addPanLinkerStyle();
  4645. pt = this.detectPage();
  4646. let res = await base.post
  4647. (`https://api.youxiaohou.com/config/yidong?ver=${version}&a=${author}`, {}, {}, 'text');
  4648. pan = JSON.parse(base.d(res));
  4649. Object.freeze && Object.freeze(pan);
  4650. pan.num === base.getValue('setting_init_code') ? this.addButton() : this.addInitButton();
  4651. base.createTip();
  4652. base.registerMenuCommand();
  4653. }
  4654. };
  4655.  
  4656. let youxiaohou ={
  4657. async initPanLinker() {
  4658. base.initDefaultConfig();
  4659. base.addPanLinkerStyle();
  4660. let res = await base.post
  4661. (`https://api.youxiaohou.com/config/?ver=${version}&a=${author}`, {}, {}, 'text');
  4662. pan = JSON.parse(base.d(res));
  4663. base.createTip();
  4664. base.registerPanMenuCommand();
  4665.  
  4666. let $button1 = `<div class="nav-item" style="text-align: center;"><a class="listener-open-updatelog">(改)下载助手<br>更新日志</a></div>`
  4667. doc.on('click', '.listener-open-updatelog', () => {
  4668. base.showUpdateLog();
  4669. });
  4670. document.getElementsByClassName("nav-links can-hide")[0].innerHTML += $button1
  4671.  
  4672. let $button2 = `<div class="nav-item" style="text-align: center;"><a class="listener-open-info">(改)下载助手<br>暗号查看</a></div>`
  4673. doc.on('click', '.listener-open-info', () => {
  4674. base.showPanInfo();
  4675. });
  4676. document.getElementsByClassName("nav-links can-hide")[0].innerHTML += $button2
  4677. }
  4678. }
  4679.  
  4680. //获取原脚本的GreasyFork信息,确保油小猴服务器信任
  4681. var scriptId = '436446'; // 替换为要获取版本的脚本的唯一标识
  4682. var scriptUrl = 'https://gf.qytechs.cn/zh-CN/scripts/' + scriptId + '.json';
  4683. var retryCount = 3; // 重新尝试次数
  4684.  
  4685. function fetchScriptInfo(url, retryCount) {
  4686. fetch(scriptUrl)
  4687. .then(response => response.json())
  4688. .then(data => {
  4689. var scriptVersion = data.version;
  4690. var scriptAuthor = data.users[0].name;
  4691. var scriptName = data.name;
  4692. var scriptDescription = data.description;
  4693. console.log('原脚本版本:', scriptVersion);
  4694. console.log('原脚本作者:', scriptAuthor);
  4695. console.log('原脚本名称:', scriptName);
  4696. console.log('原脚本介绍:', scriptDescription);
  4697. base.setValue('setting_script_version', scriptVersion);
  4698. base.setValue('setting_script_author', scriptAuthor);
  4699. base.setValue('setting_script_name', scriptName);
  4700. base.setValue('setting_script_description', scriptDescription);
  4701. })
  4702. .catch(error => {
  4703. console.error('获取脚本版本时发生错误:', error);
  4704. if (retryCount > 0) {
  4705. console.log('重新尝试获取脚本信息...');
  4706. fetchScriptInfo(url, retryCount - 1); // 重新尝试获取脚本版本
  4707. } else {
  4708. console.error('无法获取脚本信息,达到最大尝试次数。');
  4709. }
  4710. });
  4711. }
  4712. fetchScriptInfo(scriptUrl, retryCount);
  4713.  
  4714. //用于油小猴服务器检测的脚本内容
  4715. const scriptInfo = GM_info.script;
  4716.  
  4717. //用于油小猴服务器检测的脚本作者
  4718. const realauthor = scriptInfo.author;
  4719. const author = 'YouXiaoHou';
  4720.  
  4721. //用于油小猴服务器检测的脚本名称
  4722. const realname = scriptInfo.name;
  4723. const name = base.getValue('setting_script_name');
  4724.  
  4725. //用于油小猴服务器检测的脚本版本,防止服务器返回更新信息
  4726. const version = base.getValue('setting_script_version');
  4727. const realversion = scriptInfo.version;
  4728.  
  4729. let main = {
  4730. init() {
  4731. if (/(pan|yun).baidu.com/.test(location.host)) {
  4732. baidu.initPanLinker();
  4733. }
  4734. if (/www.aliyundrive.com/.test(location.host)) {
  4735. ali.initPanLinker();
  4736. }
  4737. if (/cloud.189.cn/.test(location.host)) {
  4738. tianyi.initPanLinker();
  4739. }
  4740. if (/pan.xunlei.com/.test(location.host)) {
  4741. xunlei.initPanLinker();
  4742. }
  4743. if (/pan.quark.cn/.test(location.host)) {
  4744. quark.initPanLinker();
  4745. }
  4746. if (/(yun|caiyun).139.com/.test(location.host)) {
  4747. yidong.initPanLinker();
  4748. }
  4749. if (/www.youxiaohou.com/.test(location.host)) {
  4750. youxiaohou.initPanLinker();
  4751. }
  4752. }
  4753. };
  4754. main.init();
  4755. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址