在Tampermonkey脚本中恢复console.log功能的方法(网站禁用控制台输出)
解决Duolingo网站Tampermonkey脚本中console.log被拦截的问题
一、恢复原生console功能
方法1:通过iframe获取未被篡改的原生console
网站通常只会修改当前页面的console对象,而临时创建的iframe的console是原生未被修改的,可通过以下方式获取:
function getNativeConsole() { const iframe = document.createElement('iframe'); iframe.style.display = 'none'; document.body.appendChild(iframe); const nativeConsole = iframe.contentWindow.console; document.body.removeChild(iframe); return nativeConsole; } // 使用示例 const myConsole = getNativeConsole(); myConsole.log("测试原生控制台输出"); myConsole.error("错误信息");
方法2:提前保存原生console引用
如果Tampermonkey脚本的运行时机早于网站重写console的代码,可在脚本最开头保存原生console的引用:
// 脚本顶部执行,保存原始console const originalConsole = { ...console }; // 后续调试使用 originalConsole.log("这是未被拦截的日志"); originalConsole.warn("警告信息");
方法3:恢复被重写的console方法
如果网站只是重写了console的单个方法(比如log、error),可直接恢复原生实现:
// 批量恢复console核心方法 ['log', 'error', 'warn', 'info'].forEach(method => { console[method] = console[method].bind(console); });
二、替代调试方案
如果恢复console实在行不通,可使用以下替代方式:
方案1:在页面上创建日志显示区域
创建一个固定在页面角落的元素,将调试信息输出到这里,比alert更直观:
function debugLog(message) { let logContainer = document.getElementById('tm-debug-log'); if (!logContainer) { logContainer = document.createElement('div'); logContainer.id = 'tm-debug-log'; logContainer.style.cssText = ` position: fixed; bottom: 20px; left: 20px; background: #fff; padding: 15px; border: 1px solid #ddd; border-radius: 4px; z-index: 99999; max-width: 300px; max-height: 400px; overflow-y: auto; font-family: monospace; font-size: 12px; `; document.body.appendChild(logContainer); } const logItem = document.createElement('div'); logItem.style.marginBottom = '8px'; logItem.textContent = typeof message === 'object' ? JSON.stringify(message, null, 2) : message; logContainer.appendChild(logItem); } // 使用示例 debugLog("调试信息"); debugLog({ user: "test", progress: 80 });
方案2:使用Tampermonkey内置的GM_log
Tampermonkey提供了GM_log方法,会直接输出到Tampermonkey专属控制台(在Tampermonkey面板的「控制台」标签页查看),不会被网站拦截:
// 需要在脚本头部添加@grant GM_log声明 // ==UserScript== // @name Duolingo Debug Script // @namespace http://tampermonkey.net/ // @version 0.1 // @description Debug on Duolingo // @author You // @match https://www.duolingo.com/learn // @grant GM_log // ==/UserScript== // 使用示例 GM_log("这是Tampermonkey内置日志"); GM_log("对象数据:", { key: "value" });
内容的提问来源于stack exchange,提问作者user29157347
相关产品推荐
相关产品推荐

