WebDAV Image Saver

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

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

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