如何通过Chrome扩展替换网站全部HTML代码?已配置manifest.json
解决Chrome扩展替换指定网站HTML的问题
嘿,我懂你现在的困扰——已经配置好content_scripts触发了,但用document.write没成功,想要彻底替换目标网站的HTML代码对吧?别愁,给你两种靠谱的方案,按需选就行:
方案一:通过Content Script直接替换DOM(简单直接)
document.write失效大概率是时机不对——如果你的content script在页面加载完成后才运行,document.write要么会异常,要么就算覆盖了页面也会出现奇怪的问题。调整时机+直接替换DOM就能搞定:
步骤1:修改manifest.json的注入时机
把run_at设为"document_start",让脚本在页面开始渲染前就注入,抢在原页面内容加载前完成替换:
{ "content_scripts": [ { "matches": ["https://目标网站域名/*"], "js": ["content.js"], "run_at": "document_start" } ] }
步骤2:在content.js里替换整个HTML
直接替换根元素的内容,把你修改好的完整HTML字符串塞进去就行:
// 假设modifiedHtml是你已经编辑好的完整HTML代码 const modifiedHtml = `<!DOCTYPE html> <html> <head> <title>修改后的页面</title> <!-- 你的自定义头部内容 --> </head> <body> <!-- 你的自定义页面内容,包括替换后的script标签 --> <script>console.log("这是替换后的脚本内容");</script> </body> </html>`; // 完全替换原页面的所有内容 document.documentElement.innerHTML = modifiedHtml;
这种方式会彻底覆盖原页面的所有代码,包括所有<script>标签,完美满足你的需求。
方案二:用WebRequest API拦截替换响应(更彻底)
如果目标网站有防篡改机制,或者你想从根源上替换服务器返回的内容,就用这个方法——直接拦截网站的HTML请求,把响应改成你自己的版本:
步骤1:在manifest.json添加权限
需要webRequest和webRequestBlocking权限,加上目标网站的主机权限:
{ "permissions": [ "webRequest", "webRequestBlocking", "https://目标网站域名/*" ], "background": { "service_worker": "background.js" } }
步骤2:在background.js里拦截并替换
// 提前定义好你修改后的完整HTML代码 const modifiedHtml = `<!DOCTYPE html> <!-- 你的自定义HTML内容 -->`; chrome.webRequest.onBeforeRequest.addListener( function(details) { // 只拦截主页面的HTML请求,避免替换CSS/JS等资源 if (details.type === "main_frame") { return { redirectUrl: "data:text/html," + encodeURIComponent(modifiedHtml) }; } }, { urls: ["https://目标网站域名/*"] }, ["blocking"] );
这种方式相当于让浏览器直接加载你修改后的内容,完全绕开原页面的渲染,非常彻底。
额外小技巧
如果只是想替换特定的<script>标签而非整个HTML,可以这么做:
// 替换所有内联script的内容 document.querySelectorAll('script:not([src])').forEach(script => { script.textContent = "你的自定义脚本内容"; }); // 替换指定src的外部脚本 document.querySelectorAll('script[src="原脚本地址"]').forEach(script => { script.src = "你的自定义脚本地址"; });
内容的提问来源于stack exchange,提问作者Soupman59
相关产品推荐
相关产品推荐

