GM_xmlhttpRequest:脚本跨域请求与 connect 域名声明
GM_xmlhttpRequest 是 GM 函数里最重要也最需要谨慎的一个:它让脚本绕过同源策略,向任意域名发 HTTP 请求。官方文档对它的参数、回调与安全约束有长篇说明,这里抓主干。
基本形态
GM_xmlhttpRequest({
method: "GET",
url: "https://api.example.com/data",
headers: { "User-Agent": "my-script" },
onload: (response) => console.log(response.responseText),
onerror: (error) => console.log(error)
});
函数接收一个 details 对象,核心字段:
method:GET/POST/PUT/DELETE 等;url:目标地址(新版本也接受 Blob/File 对象);headers:请求头(个别特殊头在 Safari 与安卓浏览器上不支持);data:POST 的数据体,支持字符串、FormData、URLSearchParams 等;responseType:arraybuffer/blob/json/stream;- 回调:
onload/onerror/onabort/onprogress/ontimeout; timeout:超时毫秒数;anonymous:不带 Cookie 发请求(官方注明会强制走 fetch 模式);cookie(v5.6+):合并进请求的 Cookie。
前置条件一:grant 声明
// @grant GM_xmlhttpRequest
前置条件二:connect 域名白名单
@connect 声明脚本允许请求的域名(含子域):
// @connect api.example.com
// @connect self // 脚本当前运行的站点
// @connect localhost
官方文档的要点:
- 声明不全时,未覆盖的域名会触发用户确认弹窗——这也是跨域确认弹窗那页讲的安全机制;
- 官方给脚本作者的建议:把已知域名全声明出来减少弹窗,再补一条
@connect *让用户可以一键全放行; - 起始 URL 和最终 URL 都会被检查(重定向也算)。
常用行为细节
redirect: follow / error / manual控制重定向处理(较新版本引入,强制 fetch 模式);fetch: true可指定用 fetch 而非 XMLHttpRequest 实现(Chrome 下 timeout 届时不生效);responseType: stream时通过onloadstart拿到流对象,配合onprogress处理大响应。
安全视角
这个函数是脚本「往外送数据」的主要通道:一个恶意脚本完全可以把你的页面数据打包发往第三方服务器。装脚本前对声明了 GM_xmlhttpRequest 的脚本多做一步安全判断。
权限受限时
MV3 下 Site Access 被设为「在特定站点上」时,官方明确警告脚本更新、GM_xmlhttpRequest 等功能会坏,见Site Access 限制。