// ==UserScript== // @name WeiyunHelper // @namespace https://github.com/loo2k/WeiyunHelper/ // @version 0.0.5 // @description 微云下载时文件支持导出到 aria2 下载 // @author Luke // @match https://www.weiyun.com/* // @grant none // @run-at document-end // @supportURL https://github.com/loo2k/WeiyunHelper/issues // @downloadURL none // ==/UserScript== (function () { 'use strict'; Date.prototype.Format = function (fmt) { var o = { 'M+': this.getMonth() + 1, 'd+': this.getDate(), 'h+': this.getHours(), 'm+': this.getMinutes(), 's+': this.getSeconds(), 'q+': Math.floor((this.getMonth() + 3) / 3), S: this.getMilliseconds(), }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)); return fmt; }; const injectChunkId = Math.random().toString(36).substring(7); webpackJsonp([7891], { [injectChunkId]: function(modules, exports, require) { // 寻找云盘操作 API 模块 const diskServices = Object.values(require.c) .filter((x) => x.exports && typeof x.exports.namespace === 'function' && typeof x.exports.namespace('PERSON').fetchUserInfo === 'function') .map((x) => x.exports.namespace); const diskService = diskServices && diskServices[0]('PERSON'); if (diskServices.length === 0) { console.error('没有检测到适配模块,已退出 WeiyunHelper'); console.error('你可以到 https://github.com/loo2k/WeiyunHelper/issues 向作者反馈问题') return false; } // 下载选中的文件 function downloadSelectedFiles() { let request = null; const selected = document.querySelectorAll('.list-group-item.checked.act'); const fileNodes = Array.from(selected).map(item => item.__vue__.fileNode); if (fileNodes.length === 1 && !fileNodes[0].isDir()) { request = diskService.fetchDownloadFileInfo({ fileNodes }); } else { request = diskService.fetchPackDownloadDirFileInfo({ fileNodes }); } request.then((ret) => { let downloadUrl = ''; let cookieName = ''; let cookieValue = ''; let URI = {}; let fileName = ''; if (ret.file_list) { downloadUrl = ret.file_list[0].https_download_url; cookieName = ret.file_list[0].cookie_name; cookieValue = ret.file_list[0].cookie_value; URI = new URL(downloadUrl); fileName = decodeURI(URI.pathname.substr(URI.pathname.lastIndexOf('/') + 1)); } else { downloadUrl = ret.https_download_url; cookieName = ret.cookie_name; cookieValue = ret.cookie_value; fileName = `微云合并下载文件_${new Date().Format('yyyy-MM-dd hh:mm:ss')}.zip`; } const ariaNgUrl = `http://aria2.me/aria-ng/#!/new/task?url=${btoa(downloadUrl)}&header=Cookie:${cookieName}=${cookieValue}&out=${encodeURI(fileName)}`; console.log('文件名称:', fileName); console.log('下载地址:', downloadUrl); console.log('请求参数:', `Cookie:${cookieName}=${cookieValue}`); console.log('AriaNg URL:', ariaNgUrl); // 使用 ariaNg 进行下载 window.open(ariaNgUrl); }).catch(e => { alert(e.msg) }); } // 监听 body 的 DOM 变化并将下载入口植入 const observeTarget = document.body; const observeConfig = { attributes: true, childList: true, subtree: true }; const observeCallback = function (mutations, observer) { for (let mutation of mutations) { if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { mutation.addedNodes.forEach((node) => { // 判断页面中增加的元素是否是针对文件的下拉菜单 if ( node.className && node.className.indexOf('mod-bubble-context-menu') > -1 && node.__vue__ && node.__vue__.items.some(e => e.method === 'download') ) { const contextItems = node.querySelectorAll('.menu-item'); const newContextItem = document.createElement('li') newContextItem.className = 'menu-item'; newContextItem.innerHTML = '使用 Aria 下载'; newContextItem.addEventListener('click', function() { downloadSelectedFiles(); // 关闭右键菜单 document.dispatchEvent(new Event('mousedown')); }); contextItems[0].parentNode.insertBefore(newContextItem, contextItems[0].nextSibling); } }) } // 针对顶部下载菜单 if ( mutation.type === 'attributes' && mutation.attributeName === 'style' && mutation.target.className.indexOf('mod-action-wrap-menu') > -1 && mutation.target.style.display !== 'none' && mutation.target.querySelectorAll('#action-item-aria').length === 0 ) { const actionItems = mutation.target.querySelectorAll('.action-item'); const newActionItem = document.createElement('div'); newActionItem.id = 'action-item-aria' newActionItem.className = 'action-item'; newActionItem.innerHTML = '