You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:50:06