enable-devtool

解决大部网站打开控制台页面直接重定向或 about:blank 问题

2025-12-18 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         enable-devtool
// @namespace    http://tampermonkey.net/
// @version      2025-12-18
// @description  解决大部网站打开控制台页面直接重定向或 about:blank 问题
// @author       Mr.Fang
// @match        https://*/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=www.google.com
// @grant        unsafeWindow
// @run-at 	 document-start
// @license      Apache-2.0
// ==/UserScript==

(function() {
	'use strict'

	const originalAddEventListener = window.addEventListener;

	// 重写 setTimeout ,拦截定时器执行 about:blank 内容
	const originalSetTimeout = unsafeWindow.setTimeout;
	unsafeWindow.setTimeout = function(callback, delay, ...args) {
		let toStr = callback?.toString();
		console.log(toStr)
		if (toStr && toStr.includes('about:blank')) return true; // 自定修改 about:blank 要匹配的内容
		const wrappedCallback = function() {
			callback(...args);  // 也可注释掉此行进行验证
		};
		return originalSetTimeout(wrappedCallback, delay);
	};

	// 重写 setInterval,拦截定时器执行 about:blank 内容
	const originalSetInterval = unsafeWindow.setInterval;
	unsafeWindow.setInterval = function(callback, delay, ...args) {
		let toStr = callback?.toString();
		console.log(toStr)
		if (toStr && toStr.includes('about:blank')) return true; // 自定修改 about:blank 要匹配的内容
		const wrappedCallback = function() {
			callback(...args); // 也可注释掉此行进行验证
		};
		return originalSetInterval(wrappedCallback, delay);
	};



	// 重写 addEventListener 方法
	window.addEventListener = function(type, listener, options) {
		if (type === 'devtoolschange') {
			// 拦截对 devtoolschange 事件的监听,阻止其添加
			console.log("拦截了添加“devtoolschange”侦听器的尝试.");
			return;
		}
		// 对其他事件,使用原始方法进行添加
		originalAddEventListener.call(window, type, listener, options);
	};

	// 如果已经存在的监听器需要移除
	const originalRemoveEventListener = window.removeEventListener;
	window.removeEventListener = function(type, listener, options) {
		if (type === 'devtoolschange') {
			// 拦截对 devtoolschange 事件监听的移除
			console.log("拦截了删除“devtoolschange”侦听器的尝试.");
			return;
		}
		// 对其他事件,使用原始方法进行移除
		originalRemoveEventListener.call(window, type, listener, options);
	};
	
	// 监听开发者窗口改变
	window.addEventListener("devtoolschange", event => {
		console.log('阻止')
		event.preventDefault();
		return
	});
	
	// 监听离开当前页面,例如使用 window.location.href
	window.addEventListener("beforeunload", function(event) {
		// 在用户尝试离开页面时执行你的逻辑
		// 例如:
		event.preventDefault();
		console.log('阻止');
		return
		// event.returnValue = ""; // 兼容老版本浏览器
		// return ""; // 兼容新版本浏览器
		// 或者显示一个警告框
		// return "您确定要离开吗?";
	});
})();