WebDAV Image Saver

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

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например 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);
            }
        });
    }
})();