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

Python连接WebSocket报403握手错误的排查方案

WebSocket连接返回403 Forbidden的原因和解决方法

核心原因

两个站点的WebSocket服务都配置了反爬校验规则,不会对任意来源的裸连请求放行,你直接用websocket库默认配置发起连接时,请求特征和正常浏览器访问的特征不匹配,就会被服务端直接拒绝握手,返回403状态码,不是站点本身不允许WebSocket连接。

必带的校验参数(缺任何一项都可能被拦截)

  • Origin请求头:WebSocket握手阶段服务端会强制校验Origin字段,Python websocket库默认不会携带和站点匹配的Origin值,会被直接判定为非法跨域请求拦截。
  • 合法Cookie:两个站点的WebSocket连接都要求携带访问主站时生成的有效Cookie,包含会话ID、反爬系统生成的临时校验凭证,裸连请求没有对应Cookie必然被拒。
  • 动态URL参数:你从DevTools复制的wss地址里,部分参数是临时生成的(比如socket.io连接的sid参数、接口签名参数),有效期通常只有几分钟,直接写死在代码里很快就会失效。
  • User-Agent标识:服务端会校验请求头的UA字段,websocket库默认的UA特征非常明显,会被直接识别为脚本请求拦截。
  • TLS指纹:部分站点会校验客户端的TLS握手指纹,Python默认网络库的TLS指纹和Chrome浏览器差异很大,就算带全了请求头也可能被拦截。

实操解决步骤

  1. 打开Chrome开发者工具,切换到Network面板,筛选WS类型,在页面正常触发WebSocket连接后,找到成功建立的那条连接记录,右键选择「Copy」-「Copy as cURL (bash)」,拿到完整的带所有参数、请求头的握手请求。
  2. 从复制的cURL内容里提取完整的最新wss连接地址、所有请求头(重点是Origin、User-Agent、Cookie三个字段),传入websocket.WebSocketApp的初始化参数中,示例修改如下:
import websocket
import rel

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws, close_status_code, close_msg):
    print("### closed ###")

def on_open(ws):
    print("Opened connection")

if __name__ == "__main__":
    websocket.enableTrace(True)
    # 注意替换成你从cURL里复制的最新完整wss地址,不要用写死的旧地址
    ws_url = "wss://csgoexo.com/socket.io/?EIO=3&transport=websocket"
    # 替换成你从cURL里复制的对应请求头
    ws_headers = {
        "Origin": "https://csgoexo.com",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
        "Cookie": "替换成你从浏览器复制的最新有效Cookie"
    }
    ws = websocket.WebSocketApp(ws_url,
                              header=ws_headers,
                              on_open=on_open,
                              on_message=on_message,
                              on_error=on_error,
                              on_close=on_close)

    ws.run_forever(dispatcher=rel)
    rel.signal(2, rel.abort)
    rel.dispatch()
  1. 如果加完请求头还是返回403,就是被TLS指纹校验拦截了,需要替换默认的网络库,用能模拟Chrome TLS指纹的库来发起WebSocket连接,不要用默认的websocket库。

补充说明:csgoroll的WebSocket是GraphQL订阅接口,除了基础握手参数,连接建立后还要发送对应格式的订阅消息,才能收到你要的P2P提现推送,不是连上就会自动推消息。csgoexo用的是Socket.IO协议,优先用对应版本的python-socketio库连接,比手动拼原生WebSocket参数更不容易漏协议要求的字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:30:11