使用Socket.io/WS库连接WebSocket返回403错误排查求助
解决方案
- 调整传输配置:Socket.IO 服务默认要求先通过 HTTP 长轮询完成握手,拿到会话标识后才允许升级 WebSocket,你当前强制仅用 WebSocket 传输,跳过了握手环节会被服务端直接返回403。将配置中的
transports字段修改为["polling", "websocket"]即可。 - 补充请求凭证:目标站点存在反爬防护,仅携带 UA 和 Origin 不足以通过校验。你需要先在浏览器中正常访问目标站点,完成人机验证后,抓取浏览器发起 WebSocket 请求时携带的全部 Cookie,将 Cookie 字段补充到
extraHeaders配置中,尤其是 Cloudflare 校验所需的cf_clearance以及站点自身的会话 Cookie。 - 显式配置路径:避免客户端 URL 解析异常,建议在配置中单独添加
path: "/socket.io/"字段,和服务端路径保持一致。 - 校验版本兼容性:如果目标服务端使用的是 Socket.IO v3/v4 版本,和你当前使用的 v2.4.0 客户端默认不兼容,也会触发403错误,可尝试将客户端升级到和服务端匹配的版本。
修正后参考代码
const Io = require("socket.io-client"); // 建议先确认服务端版本,匹配对应的客户端版本 async function wsConnect(){ const socket = Io('wss://csgoexo.com', { transports: ["polling", "websocket"], path: "/socket.io/", extraHeaders: { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36", "Origin": "https://csgoexo.com", // 补充你从浏览器中抓取到的完整Cookie "Cookie": "cf_clearance=xxx; 站点会话Cookie=xxx;" } }); socket.on('connect', () => { console.log('Connected!', {id: socket.id}); }); socket.on("disconnect", (reason) => { console.log('Disconnected', reason) if (reason === "io server disconnect") { socket.connect(); } }); socket.on("connect_error", (error) => { console.log(error) }); } wsConnect();
注意:获取Cookie时使用的浏览器UA、IP地址需要和你发起请求的环境完全一致,否则反爬策略仍会拦截请求返回403。
内容的提问来源于stack exchange,提问作者SilenT
相关产品推荐
相关产品推荐

