// ==UserScript== // @name 头歌防拦截一键粘贴面板 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 提供输入框,一键写入剪贴板,并在粘贴时劫持绕过系统限制 // @author tj // @match https://www.educoder.net/tasks/* // @grant none // @run-at document-idle // ==/UserScript== (function() { 'use strict'; // 用于存储你当前面板里输入的代码 let myCode = ''; let editorInstance = null; // 1. 等待编辑器加载并抓取实例 const timer = setInterval(() => { const root = document.querySelector('.my-monaco-editor'); if (!root) return; let fiber = root[Object.keys(root).find(k => k.startsWith('__reactFiber$'))]; for (let i = 0; fiber && i < 20 && !editorInstance; i++, fiber = fiber.return) { for (let h = fiber.memoizedState, j = 0; h && j < 100; h = h.next, j++) { const instance = h.memoizedState?.current?.instance; if (instance && typeof instance.getModel === 'function') { editorInstance = instance; break; } } } if (editorInstance) { clearInterval(timer); // 找到了编辑器,停止轮询 createPanel(); // 创建控制面板 setupPasteBypass(); // 设置粘贴劫持 console.log('✅ 编辑器实例已获取,防拦截面板已加载!'); } }, 1000); // 2. 创建右下角的交互面板 function createPanel() { const panel = document.createElement('div'); panel.style.cssText = 'position:fixed;right:20px;bottom:20px;z-index:999999;width:320px;background:#fff;border:2px solid #2563eb;border-radius:8px;padding:12px;box-shadow:0 4px 12px rgba(0,0,0,0.15);font-family:sans-serif;'; panel.innerHTML = `

一键防拦截粘贴

请先在框内输入代码,然后点击写入剪贴板,去代码框按 Ctrl+V。

`; document.body.appendChild(panel); const inputEl = document.getElementById('my-code-input'); const statusEl = document.getElementById('status-text'); // 按钮1:写入剪贴板 document.getElementById('btn-copy').onclick = async () => { myCode = inputEl.value; if (!myCode) { statusEl.textContent = '❌ 请先输入代码!'; statusEl.style.color = '#dc2626'; return; } try { await navigator.clipboard.writeText(myCode); statusEl.textContent = '✅ 已写入剪贴板!请去代码框直接按 Ctrl+V。'; statusEl.style.color = '#16a34a'; } catch (err) { statusEl.textContent = '❌ 剪贴板写入失败,请用“直接注入”。'; statusEl.style.color = '#dc2626'; } }; // 按钮2:直接注入(底层修改,完全无视任何拦截) document.getElementById('btn-direct').onclick = () => { const code = inputEl.value; if (!code) return; const model = editorInstance.getModel(); model.setValue(code); // 直接覆盖底层代码 statusEl.textContent = '✅ 已通过底层强制注入代码!'; statusEl.style.color = '#16a34a'; }; } // 3. 劫持粘贴事件(核心黑科技) function setupPasteBypass() { // 使用捕获阶段(true),确保在头歌的监听器执行之前拦截 document.addEventListener('paste', (e) => { // 如果没有输入代码,正常放行(不做处理) if (!myCode) return; // 强制阻断头歌的拦截逻辑继续传播 e.preventDefault(); e.stopImmediatePropagation(); // 获取剪贴板文本(如果浏览器限制了,就用我们存的 myCode 备用) let pasteText = e.clipboardData?.getData('text/plain') || myCode; // 直接调用 Monaco 底层 API 进行物理写入 const model = editorInstance.getModel(); const selection = editorInstance.getSelection(); // 如果编辑器内有选中的代码,替换它;如果没有,插入到光标处 model.applyEdits([{ range: selection, text: pasteText }]); const statusEl = document.getElementById('status-text'); if (statusEl) { statusEl.textContent = '🚀 拦截成功!已强制写入代码。'; statusEl.style.color = '#2563eb'; } // 写入完成后清空变量,防止干扰你正常的复制粘贴 myCode = ''; // 清空输入框 document.getElementById('my-code-input').value = ''; }, true); // true 表示在捕获阶段执行,这是致胜关键 } })();