// ==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 // @downloadURL none // ==/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 = `
是否下载此图片?
`; // 添加到页面 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; } } })();