(改)网盘直链下载助手

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

当前为 2023-06-02 提交的版本,查看 最新版本

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

QingJ © 2025

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