
本文介绍如何通过 Tampermonkey 的 GM_webRequest API 或 @webRequest 元指令,在 YouTube 等网站中精准拦截(取消)特定的 GET 请求(如搜索建议请求),避免传统 hook 方式失效的问题。
本文介绍如何通过 tampermonkey 的 `gm_webrequest` api 或 `@webrequest` 元指令,在 youtube 等网站中精准拦截(取消)特定的 get 请求(如搜索建议请求),避免传统 hook 方式失效的问题。
在浏览器自动化与隐私增强场景中,单纯覆盖 fetch 或 XMLHttpRequest.prototype.send 往往无法可靠拦截现代网站(如 YouTube)的异步请求——原因包括:请求可能由 Web Workers 发起、使用私有封装函数调用、或被 Service Worker 代理;此外,beforesendheaders 并非标准 DOM 事件,而是某些扩展自定义 API,Tampermonkey 默认不支持。
✅ 正确且高效的方式是利用 Tampermonkey 提供的底层网络请求控制能力:GM_webRequest(JavaScript API)或 @webRequest(声明式元指令)。二者均基于浏览器原生 webRequest 权限,可在请求发起前(onBeforeRequest 阶段)直接取消请求,无需依赖 JavaScript 运行时劫持,具备更高优先级与稳定性。
✅ 推荐方案一:使用 GM_webRequest(推荐用于动态规则或需日志反馈)
// ==UserScript==
// @name YouTube URL Blocker
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Block search suggestion requests on YouTube
// @author You
// @match https://www.youtube.com/*
// @grant GM_webRequest
// ==/UserScript==
(function() {
'use strict';
// 支持通配符匹配:* 表示任意字符(含路径、查询参数)
const blockedSelector = 'https://suggestqueries-clients6.youtube.com/complete/search*';
GM_webRequest([
{ selector: blockedSelector, action: 'cancel' }
], (info, message, details) => {
console.log('[YouTube Blocker] Request cancelled:', {
url: info.url,
method: info.method,
tabId: info.tabId,
timestamp: Date.now()
});
});
})();⚠️ 注意事项:
- selector 必须为完整 URL 或带 * 通配符的模式(如 https://*.youtube.com/* 或 https://suggestqueries-*.google.com/complete/*);
- action: 'cancel' 会静默终止请求,不触发任何网络错误(页面无感知);
- GM_webRequest 需显式声明 @grant GM_webRequest,且仅在匹配域名下生效;
- 回调函数(第三个参数)为可选,用于调试,但不影响拦截行为。
✅ 推荐方案二:使用 @webRequest 元指令(启动最快,零延迟拦截)
// ==UserScript==
// @name YouTube URL Blocker (Static)
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Cancel YouTube search suggestions at earliest possible stage
// @author You
// @match https://www.youtube.com/*
// @webRequest {"selector":"https://suggestqueries-clients6.youtube.com/complete/search*","action":"cancel"}
// ==/UserScript==
// 脚本主体可为空 —— 拦截规则已在加载前由 Tampermonkey 注入
// 如需额外逻辑(如 UI 提示),可在此添加✅ 优势:@webRequest 规则在用户脚本代码执行前即生效,甚至早于页面 DOM 构建,确保 100% 拦截率;
? 安全性:不依赖 JS 执行上下文,不受混淆、沙箱或模块化加载影响;
? 限制:仅支持静态规则(不支持运行时动态修改),适合固定 URL 模式。
❌ 为什么传统 Hook 失效?
- fetch 覆盖仅作用于主线程显式调用,而 YouTube 使用内部封装(如 yt.config_.ajax)、Worker 线程或 AbortController 控制流,绕过全局 fetch;
- XMLHttpRequest.prototype.send 劫持需提前保存原始方法,但 YouTube 可能通过 Object.defineProperty 冻结原型,或使用 new XMLHttpRequest() 后立即 send(),导致 this._url 未赋值;
- beforesendheaders 是虚构事件,非标准 API,Tampermonkey 和主流浏览器均不支持。
✅ 最终验证方式
- 打开 YouTube → 点击搜索框(触发建议请求);
- 打开开发者工具 → Network 标签页 → 过滤 suggestqueries;
- 刷新页面并输入关键词 —— 应完全看不到 https://suggestqueries-clients6.youtube.com/complete/search?... 请求;
- 若启用 console.log,可在 Console 中看到拦截日志。
通过 GM_webRequest 或 @webRequest,你不仅能精准屏蔽 YouTube 搜索建议,还可轻松扩展至其他场景:广告资源、分析脚本(如 analytics.js)、第三方追踪像素等。这是现代用户脚本实现网络层过滤的标准、可靠且高性能实践。

















