// ==UserScript== // @name 请不要污染我的剪贴板 // @namespace Violentmonkey Scripts // @version 0.6 // @description 保护用户剪贴板内容,允许或禁止网站污染剪贴板。 // @license MIT // @match *://*/* // @grant none // @downloadURL none // ==/UserScript== /* jshint esversion: 8 */ (function () { 'use strict'; let clipboardPermission = null; let rejectCount = 0; const maxRejectCount = 3; function requestPermission(message) { if (clipboardPermission === true) return true; if (rejectCount >= maxRejectCount) return false; const permission = confirm(message); if (permission) { clipboardPermission = true; return true; } else { rejectCount++; if (rejectCount >= maxRejectCount) clipboardPermission = false; return false; } } // 处理 copy/cut 事件 const handleClipboardEvent = (e, action) => { const selection = window.getSelection().toString(); const message = `此网站试图修改${action === 'copy' ? '复制' : '剪切'}到剪贴板的内容,是否允许?`; if (!requestPermission(message)) { e.stopImmediatePropagation(); e.preventDefault(); e.clipboardData.setData('text/plain', selection); if (action === 'cut') { const range = window.getSelection().getRangeAt(0); range.deleteContents(); } } }; document.addEventListener('copy', (e) => handleClipboardEvent(e, 'copy'), true); document.addEventListener('cut', (e) => handleClipboardEvent(e, 'cut'), true); // 劫持 clipboard.writeText const originalWriteText = navigator.clipboard.writeText.bind(navigator.clipboard); navigator.clipboard.writeText = async function (text) { if (requestPermission('此网站试图写入内容到剪贴板,是否允许?')) { return originalWriteText(text); } else { throw new Error('用户拒绝写入剪贴板'); } }; })();