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

Tampermonkey调用fetch时强制指定HTTP版本及CSP跨域问题咨询

问题解答

1. 能否控制Tampermonkey发起请求的HTTP版本?

不能。HTTP版本是浏览器与目标服务器在TCP握手阶段自动协商的结果,前端JavaScript(包括Tampermonkey运行在页面上下文的脚本)没有权限也没有对应的API可以主动指定请求使用的HTTP版本。你尝试添加的Connection、Upgrade头属于浏览器限制修改的逐跳请求头,手动设置会被浏览器直接忽略,额外新增的非标准头还会触发OPTIONS预检请求,和你观察到的现象一致。

2. Twitter站点的报错是否是CORS导致的?

不是,是*内容安全策略(CSP)*拦截导致的。你提供的报错日志明确说明违反了页面的connect-src指令,httpbin.org不在Twitter设置的允许请求的域名列表中,浏览器会直接拦截该请求,根本不会发送到目标服务器。你之前观察到的返回202但无回显数据的情况,本质也是请求被浏览器安全策略拦截后返回的异常响应。
CORS是跨域资源共享策略,仅限制跨域请求的响应是否能被页面读取,不会直接拦截请求发送,和当前你遇到的现象不符。

3. 有没有规避方法?是否无法发起策略外的外部请求?

有规避方法,你可以使用Tampermonkey提供的GM_xmlhttpRequest/GM_fetchAPI发起请求:

  • 这两个API是通过Tampermonkey扩展的后台进程发起请求,完全脱离当前页面的上下文,不受页面CSP、CORS策略的限制
  • 只需要在脚本头的@grant字段中声明对应的权限即可正常使用,示例如下:
// ==UserScript==
// @name         Test Request
// @namespace    http://tampermonkey.net/
// @version      0.1
// @match        https://twitter.com/*
// @grant        GM_fetch
// ==/UserScript==

(function() {
    'use strict';
    GM_registerMenuCommand("Test", postData);
})();

async function postData(){
    const resp = await GM_fetch('https://httpbin.org/post', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({test: 'data'})
    });
    const data = await resp.json();
    console.log(data);
}

使用该API发起请求时,HTTP版本仍然由浏览器和目标服务器协商决定,但可以正常绕开页面的CSP限制拿到返回数据。

内容的提问来源于stack exchange,提问作者user2739975

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:36:04