Greasy Fork

WebDAV Image Saver

通过右键菜单保存图片到WebDAV服务器

// ==UserScript==
// @name         WebDAV Image Saver
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  通过右键菜单保存图片到WebDAV服务器
// @author       YourName
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @grant        GM_registerMenuCommand
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_notification
// @license MI
// ==/UserScript==

(function() {
    'use strict';

    let lastImageSrc = null;

    // 监听右键菜单事件,记录最后选中的图片
    document.addEventListener('contextmenu', function(e) {
        const target = e.target;
        if (target.tagName === 'IMG' && target.src) {
            lastImageSrc = target.src;
        } else {
            lastImageSrc = null;
        }
    });

    // 注册右键菜单命令
    GM_registerMenuCommand('保存图片到WebDAV', saveImageToWebDAV);
    GM_registerMenuCommand('配置WebDAV设置', configureWebDAV);

    // 配置WebDAV参数
    function configureWebDAV() {
        const webdavUrl = prompt('请输入WebDAV URL:', GM_getValue('webdavUrl', ''));
        const username = prompt('请输入用户名:', GM_getValue('username', ''));
        const password = prompt('请输入密码:', GM_getValue('password', ''));
        const savePath = prompt('请输入保存路径(以/结尾):', GM_getValue('savePath', '/'));

        if (webdavUrl && username && password) {
            GM_setValue('webdavUrl', webdavUrl);
            GM_setValue('username', username);
            GM_setValue('password', password);
            GM_setValue('savePath', savePath || '/');
            alert('配置已保存!');
        }
    }

    // 保存图片到WebDAV
    function saveImageToWebDAV() {
        if (!lastImageSrc) {
            alert('请先右键选中要保存的图片!');
            return;
        }

        const webdavUrl = GM_getValue('webdavUrl');
        const username = GM_getValue('username');
        const password = GM_getValue('password');
        const savePath = GM_getValue('savePath', '/');

        if (!webdavUrl || !username || !password) {
            alert('请先配置WebDAV参数!');
            return configureWebDAV();
        }

        // 获取文件名
        const fileName = lastImageSrc.split('/').pop().split('?')[0];
        const fullUrl = webdavUrl.replace(/\/$/, '') + savePath.replace(/\/$/, '') + '/' + fileName;

        // 下载图片
        GM_xmlhttpRequest({
            method: 'GET',
            url: lastImageSrc,
            responseType: 'blob',
            onload: function(response) {
                if (response.status !== 200) {
                    return alert('图片下载失败!');
                }

                // 上传到WebDAV
                GM_xmlhttpRequest({
                    method: 'PUT',
                    url: fullUrl,
                    headers: {
                        'Authorization': 'Basic ' + btoa(username + ':' + password)
                    },
                    data: response.response,
                    onload: function(res) {
                        if (res.status === 201 || res.status === 204) {
                            GM_notification({
                                text: '图片保存成功!',
                                title: 'WebDAV上传',
                                timeout: 3000
                            });
                        } else {
                            alert(`上传失败:${res.status} ${res.statusText}`);
                        }
                    },
                    onerror: function(err) {
                        alert('网络请求失败,请检查配置!');
                        console.error(err);
                    }
                });
            },
            onerror: function(err) {
                alert('图片下载失败!');
                console.error(err);
            }
        });
    }
})();