NodeJS用ws库连接DexTools WebSocket遇403错误求解决
解决DexTools WebSocket 403拒绝连接问题
问题背景
需要通过NodeJS的ws库连接DexTools的WebSocket端点wss://ws.dextools.io获取实时交易数据,拦截浏览器请求头编写代码后出现Error: Unexpected server response: 403,但浏览器原生WebSocket API可以正常建立连接,已排除Cookie和授权头的影响。
原代码:
import WebSocket from "ws"; import * as crypto from "crypto"; const url = "wss://ws.dextools.io"; const ws = new WebSocket(url, { headers: { 'Pragma': 'no-cache', 'Origin': 'chrome://newtab', 'Accept-Language': 'en-US,en;q=0.9', 'Sec-WebSocket-Key': crypto.randomBytes(16).toString('base64'), 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Upgrade': 'websocket', 'Cache-Control': 'no-cache', 'Connection': 'Upgrade', 'Sec-WebSocket-Version': '13', 'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits' } });
问题原因及解决方法
出现403是因为请求头缺少或错误设置了浏览器环境的关键标识,服务器通过这些头校验请求合法性:
- 错误的Origin头:你设置的
chrome://newtab并非浏览器访问DexTools时的真实源,服务器会拦截非法Origin的请求,真实Origin应为https://www.dextools.io。 - 手动设置Sec-WebSocket-Key:
ws库会自动生成并处理该字段,手动设置可能不符合服务器的校验逻辑。 - 缺失Sec-Fetch系列头:浏览器发起请求时会自动携带这些头,服务器可能依赖它们判断请求是否来自合法浏览器环境。
修改后的代码
import WebSocket from "ws"; const url = "wss://ws.dextools.io"; const ws = new WebSocket(url, { headers: { 'Pragma': 'no-cache', 'Origin': 'https://www.dextools.io', 'Accept-Language': 'en-US,en;q=0.9', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Upgrade': 'websocket', 'Cache-Control': 'no-cache', 'Connection': 'Upgrade', 'Sec-WebSocket-Version': '13', 'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits', // 添加浏览器自动发送的Sec-Fetch系列头 'Sec-Fetch-Site': 'same-site', 'Sec-Fetch-Mode': 'websocket', 'Sec-Fetch-Dest': 'empty' } }); // 监听连接成功事件 ws.on('open', () => { console.log('WebSocket连接成功'); // 后续可发送订阅指令 }); // 监听错误事件 ws.on('error', (error) => { console.error('连接错误:', error); });
补充说明
如果修改后仍出现403,可以检查浏览器请求中是否还有其他未添加的请求头(比如Referer设置为https://www.dextools.io/),或者尝试模拟浏览器的请求顺序,确保握手阶段的头完全匹配浏览器的真实请求。
内容的提问来源于stack exchange,提问作者arsu4ka
相关产品推荐
相关产品推荐

