From e34c039e0cbdc32545b301aa238628d85fb49284 Mon Sep 17 00:00:00 2001 From: x1ao4 Date: Mon, 21 Apr 2025 05:04:52 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20=E5=A2=9E=E5=BC=BA=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=8E=A8=E9=80=81=E6=88=90=E5=8A=9F=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/static/css/dashboard.css | 8 +- app/static/js/qas.addtask.user.js | 190 ++++++++++++++++++++++++++++++ 2 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 app/static/js/qas.addtask.user.js diff --git a/app/static/css/dashboard.css b/app/static/css/dashboard.css index fee0fc0..c1b4069 100644 --- a/app/static/css/dashboard.css +++ b/app/static/css/dashboard.css @@ -42,6 +42,7 @@ body { .title { margin-top: 30px; + margin-bottom: 10px; } table.jsoneditor-tree>tbody>tr.jsoneditor-expandable:first-child { @@ -59,12 +60,13 @@ table.jsoneditor-tree>tbody>tr.jsoneditor-expandable:first-child { .task-suggestions { width: 100%; - max-height: 500px; + max-height: 250px; overflow-y: auto; transform: translate(0, -100%); top: 0; margin-top: -5px; border: 1px solid #007bff; + z-index: 1021; } /* @@ -159,4 +161,8 @@ table.jsoneditor-tree>tbody>tr.jsoneditor-expandable:first-child { .form-control-dark:focus { border-color: transparent; box-shadow: 0 0 0 3px rgba(255, 255, 255, .25); +} + +.cursor-pointer { + cursor: pointer } \ No newline at end of file diff --git a/app/static/js/qas.addtask.user.js b/app/static/js/qas.addtask.user.js new file mode 100644 index 0000000..1c0367b --- /dev/null +++ b/app/static/js/qas.addtask.user.js @@ -0,0 +1,190 @@ +// ==UserScript== +// @name QAS一键推送助手 +// @namespace https://github.com/Cp0204/quark-auto-save +// @license AGPL +// @version 0.3 +// @description 在夸克网盘分享页面添加推送到 QAS 的按钮 +// @icon https://pan.quark.cn/favicon.ico +// @author Cp0204 +// @match https://pan.quark.cn/s/* +// @grant GM_getValue +// @grant GM_setValue +// @grant GM_xmlhttpRequest +// @require https://cdn.jsdelivr.net/npm/sweetalert2@11 +// @downloadURL https://update.greasyfork.org/scripts/533201/QAS%E4%B8%80%E9%94%AE%E6%8E%A8%E9%80%81%E5%8A%A9%E6%89%8B.user.js +// @updateURL https://update.greasyfork.org/scripts/533201/QAS%E4%B8%80%E9%94%AE%E6%8E%A8%E9%80%81%E5%8A%A9%E6%89%8B.meta.js +// ==/UserScript== + +(function() { + 'use strict'; + + let qas_base = GM_getValue('qas_base', ''); + let qas_token = GM_getValue('qas_token', ''); + + // QAS 设置弹窗函数 + function showQASSettingDialog(callback) { + Swal.fire({ + title: 'QAS 设置', + html: ` + + + + + `, + focusConfirm: false, + preConfirm: () => { + qas_base = document.getElementById('qas_base').value; + qas_token = document.getElementById('qas_token').value; + if (!qas_base || !qas_token) { + Swal.showValidationMessage('请填写 QAS 服务器和 Token'); + } + return { qas_base: qas_base, qas_token: qas_token } + } + }).then((result) => { + if (result.isConfirmed) { + GM_setValue('qas_base', result.value.qas_base); + GM_setValue('qas_token', result.value.qas_token); + qas_base = result.value.qas_base; + qas_token = result.value.qas_token; + if (callback) { + callback(); // 执行回调函数 + } + } + }); + } + + // 添加 QAS 设置按钮 + function addQASSettingButton() { + function waitForElement(selector, callback) { + const element = document.querySelector(selector); + if (element) { + callback(element); + } else { + setTimeout(() => waitForElement(selector, callback), 500); + } + } + + waitForElement('.DetailLayout--client-download--FpyCkdW.ant-dropdown-trigger', (clientDownloadButton) => { + const qasSettingButton = document.createElement('div'); + qasSettingButton.className = 'DetailLayout--client-download--FpyCkdW ant-dropdown-trigger'; + qasSettingButton.innerHTML = 'QAS设置'; + + qasSettingButton.addEventListener('click', () => { + showQASSettingDialog(); + }); + + clientDownloadButton.parentNode.insertBefore(qasSettingButton, clientDownloadButton.nextSibling); + }); + } + + // 推送到 QAS 按钮 + function addQASButton() { + function waitForElement(selector, callback) { + const element = document.querySelector(selector); + if (element) { + callback(element); + } else { + setTimeout(() => waitForElement(selector, callback), 500); + } + } + + waitForElement('.ant-btn.share-save', (saveButton) => { + const qasButton = document.createElement('button'); + qasButton.type = 'button'; + qasButton.className = 'ant-btn share-save'; + qasButton.style.marginLeft = '10px'; + qasButton.innerHTML = '推送到QAS'; + + let taskname, shareurl, savepath; // 声明变量 + + // 获取数据函数 + function getData() { + const currentUrl = window.location.href; + taskname = currentUrl.lastIndexOf('-') > 0 ? decodeURIComponent(currentUrl.match(/.*\/[^-]+-(.+)$/)[1]) : document.querySelector('.author-name').textContent; + shareurl = currentUrl; + let pathElement = document.querySelector('.path-name') + savepath = pathElement ? pathElement.title.replace('全部文件', '').trim() : ""; + savepath += "/" + taskname + qasButton.title = `任务名称: ${taskname}\n分享链接: ${shareurl}\n保存路径: ${savepath}`; + } + + + // 添加鼠标悬停事件 + qasButton.addEventListener('mouseover', () => { + getData(); // 鼠标悬停时获取数据 + }); + + + // 添加点击事件 + qasButton.addEventListener('click', () => { + getData(); // 点击时重新获取数据,确保最新 + + const apiUrl = `http://${qas_base}/api/add_task?token=${qas_token}`; + const data = { + "taskname": taskname, + "shareurl": shareurl, + "savepath": savepath, + }; + + GM_xmlhttpRequest({ + method: 'POST', + url: apiUrl, + headers: { + 'Content-Type': 'application/json' + }, + data: JSON.stringify(data), + onload: function(response) { + try { + const jsonResponse = JSON.parse(response.responseText); + if (jsonResponse.success) { + Swal.fire({ + title: '任务创建成功', + html: ` + 任务名称: ${taskname}

+ 保存路径: ${savepath}

+ 去 QAS 查看 + `, + icon: 'success' + }); + } else { + Swal.fire({ + title: '任务创建失败', + text: jsonResponse.message, + icon: 'error' + }); + } + } catch (e) { + Swal.fire({ + title: '解析响应失败', + text: `无法解析 JSON 响应: ${response.responseText}`, + icon: 'error' + }); + } + }, + onerror: function(error) { + Swal.fire({ + title: '任务创建失败', + text: error, + icon: 'error' + }); + } + }); + }); + + saveButton.parentNode.insertBefore(qasButton, saveButton.nextSibling); + }); + } + + // 初始化 + (function init() { + addQASSettingButton(); + + if (!qas_base || !qas_token) { + showQASSettingDialog(() => { + addQASButton(); // 在设置后添加 QAS 按钮 + }); + } else { + addQASButton(); // 如果配置存在,则直接添加 QAS 按钮 + } + })(); // 立即执行初始化 +})();