WebDAV Image Saver

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);
            }
        });
    }
})();