Greasy Fork

Greasy Fork is available in English.

豆包&剪映AI平台右键菜单禁用与图片下载

禁用豆包和剪映AI平台的右键菜单,恢复浏览器默认的右键菜单,并支持图片下载

目前为 2024-12-20 提交的版本,查看 最新版本

// ==UserScript==
// @name         豆包&剪映AI平台右键菜单禁用与图片下载
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  禁用豆包和剪映AI平台的右键菜单,恢复浏览器默认的右键菜单,并支持图片下载
// @author       Jackey
// @license      UNLICENSED
// @match        https://www.doubao.com/*
// @match        https://jimeng.jianying.com/ai-tool/*
// @grant        GM_download
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function () {
    'use strict';

    // 创建确认对话框样式
    const style = document.createElement('style');
    style.textContent = `
        .download-confirm-dialog {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
            z-index: 10000;
            min-width: 300px;
            text-align: center;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
        }
        .download-confirm-dialog h3 {
            margin: 0 0 15px 0;
            color: #333;
        }
        .download-confirm-dialog .buttons {
            margin-top: 20px;
        }
        .download-confirm-dialog button {
            margin: 0 10px;
            padding: 8px 20px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 14px;
        }
        .download-confirm-dialog .confirm-btn {
            background: #1890ff;
            color: white;
        }
        .download-confirm-dialog .cancel-btn {
            background: #f5f5f5;
            color: #333;
        }
        .download-confirm-dialog button:hover {
            opacity: 0.8;
        }
        .download-confirm-overlay {
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: rgba(0,0,0,0.5);
            z-index: 9999;
        }
    `;
    document.head.appendChild(style);

    // 获取当前网站域名
    const currentDomain = window.location.hostname;

    // 创建确认对话框
    function createConfirmDialog(imageUrl, downloadFunction) {
        // 创建遮罩层
        const overlay = document.createElement('div');
        overlay.className = 'download-confirm-overlay';

        // 创建对话框
        const dialog = document.createElement('div');
        dialog.className = 'download-confirm-dialog';

        // 设置对话框内容
        dialog.innerHTML = `
            <h3>确认下载</h3>
            <p>是否下载此图片?</p>
            <div class="buttons">
                <button class="confirm-btn">确认</button>
                <button class="cancel-btn">取消</button>
            </div>
        `;

        // 添加到页面
        document.body.appendChild(overlay);
        document.body.appendChild(dialog);

        // 绑定按钮事件
        const confirmBtn = dialog.querySelector('.confirm-btn');
        const cancelBtn = dialog.querySelector('.cancel-btn');

        confirmBtn.addEventListener('click', () => {
            downloadFunction(imageUrl);
            closeDialog();
        });

        cancelBtn.addEventListener('click', closeDialog);

        // 关闭对话框函数
        function closeDialog() {
            document.body.removeChild(overlay);
            document.body.removeChild(dialog);
        }
    }

    if (currentDomain.includes('doubao')) {
        // 监听右键点击事件
        document.addEventListener('contextmenu', function (event) {
            if (event.target.tagName.toLowerCase() === 'img') {
                const imgElement = event.target;
                let imageUrl = imgElement.src;

                if (imageUrl) {
                    createConfirmDialog(imageUrl, downloadImage);
                    event.preventDefault();
                }
            }
        }, true);

        // 下载图片的函数
        function downloadImage(imageUrl) {
            const fileName = getFileNameFromUrl(imageUrl);

            // 使用 GM_xmlhttpRequest 下载图片
            GM_xmlhttpRequest({
                method: 'GET',
                url: imageUrl,
                responseType: 'blob',
                headers: {
                    'Accept': 'image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
                    'Referer': 'https://www.doubao.com/',
                    'Origin': 'https://www.doubao.com',
                    'User-Agent': navigator.userAgent
                },
                onload: function(response) {
                    if (response.status === 200) {
                        // 创建Blob URL并下载
                        const blob = response.response;
                        const url = URL.createObjectURL(blob);
                        const link = document.createElement('a');
                        link.href = url;
                        link.download = fileName;
                        document.body.appendChild(link);
                        link.click();
                        document.body.removeChild(link);
                        setTimeout(() => URL.revokeObjectURL(url), 100);
                        console.log('下载成功:', fileName);
                    } else {
                        console.error('下载失败:', response.status);
                    }
                },
                onerror: function(error) {
                    console.error('请求失败:', error);
                }
            });

            console.log(`正在下载图片: ${imageUrl}`);
        }

        // 从 URL 中提取文件名
        function getFileNameFromUrl(url) {
            // 移除查询参数
            url = url.split('?')[0];
            const urlParts = url.split('/');
            let fileName = urlParts[urlParts.length - 1];

            // 如果文件名包含处理参数,提取基础文件名
            if (fileName.includes('~')) {
                fileName = fileName.split('~')[0];
            }

            // 确保文件名有正确的扩展名
            if (!fileName.endsWith('.jpeg') && !fileName.endsWith('.jpg')) {
                fileName += '.jpeg';
            }

            return fileName;
        }
    } else if (currentDomain.includes('jianying')) {
        // 监听右键点击事件
        document.addEventListener('contextmenu', function (event) {
            if (event.target.tagName.toLowerCase() === 'img') {
                const imgElement = event.target;
                let imageUrl = imgElement.src;

                if (imageUrl) {
                    createConfirmDialog(imageUrl, downloadJianyingImage);
                    event.preventDefault();
                }
            }
        }, true);

        // 下载剪映图片的函数
        function downloadJianyingImage(imageUrl) {
            const fileName = getJianyingFileName(imageUrl);

            // 使用 GM_xmlhttpRequest 下载图片
            GM_xmlhttpRequest({
                method: 'GET',
                url: imageUrl,
                responseType: 'blob',
                headers: {
                    'Accept': 'image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
                    'Referer': 'https://jimeng.jianying.com/',
                    'Origin': 'https://jimeng.jianying.com',
                    'User-Agent': navigator.userAgent
                },
                onload: function(response) {
                    if (response.status === 200) {
                        // 创建Blob URL并下载
                        const blob = response.response;
                        const url = URL.createObjectURL(blob);
                        const link = document.createElement('a');
                        link.href = url;
                        link.download = fileName;
                        document.body.appendChild(link);
                        link.click();
                        document.body.removeChild(link);
                        setTimeout(() => URL.revokeObjectURL(url), 100);
                        console.log('下载成功:', fileName);
                    } else {
                        console.error('下载失败:', response.status);
                    }
                },
                onerror: function(error) {
                    console.error('请求失败:', error);
                }
            });

            console.log(`正在下载图片: ${imageUrl}`);
        }

        // 从 URL 中提取剪映图片文件名
        function getJianyingFileName(url) {
            const urlParts = url.split('/');
            let fileName = urlParts[urlParts.length - 1].split('?')[0];
            if (!fileName.match(/\.(jpg|jpeg|png|gif|webp)$/i)) {
                fileName += '.jpg';
            }
            return fileName;
        }
    }
})();