OBS WebSocket连接立即断开问题求助(Node.js环境)
解决OBS WebSocket 5.x连接立即断开问题
问题原因
你的代码用了OBS WebSocket 4.x及更早版本的协议格式(发送request-type字段),但当前OBS搭载的是5.3.4版本的websocket服务,它要求使用全新的opcode-based协议结构,因此服务器以错误码4010断开了连接。
解决方案
OBS WebSocket 5.x必须完成认证流程才能维持连接,以下是适配后的代码:
修改后的完整代码
const WebSocket = require('ws'); const crypto = require('crypto'); const obsAddress = 'ws://localhost:4455'; const obsPassword = 'xxxxxxxxxxxxx'; const obsSocket = new WebSocket(obsAddress); obsSocket.on('open', () => { console.log('Connected to OBS WebSocket'); }); obsSocket.on('message', (data) => { const message = JSON.parse(data); // 处理服务器的初始Hello消息(op=0) if (message.op === 0) { const { salt, challenge } = message.d.authentication; // 按照OBS要求生成认证字符串 const secretHash = crypto.createHash('sha256') .update(obsPassword + salt, 'utf8') .digest(); const authStr = crypto.createHash('sha256') .update(Buffer.concat([secretHash, Buffer.from(challenge, 'utf8')])) .digest('base64'); // 发送认证请求(op=1) obsSocket.send(JSON.stringify({ op: 1, d: { rpcVersion: message.d.rpcVersion, // 必须匹配服务器的rpc版本 authentication: authStr, eventSubscriptions: 0 // 0=不订阅事件,按需修改 } })); console.log('Sent authentication request'); } // 认证成功通知(op=2) else if (message.op === 2) { console.log('认证成功,连接已维持'); // 示例:发送获取场景列表的请求 obsSocket.send(JSON.stringify({ op: 6, d: { requestType: 'GetSceneList', requestId: 'req_001' } })); } // 请求响应(op=7) else if (message.op === 7) { const res = message.d; if (res.status === 'ok') { console.log('请求成功:', res.responseData); } else { console.error('请求失败:', res.error); } } }); obsSocket.on('error', (error) => { console.error('WebSocket错误:', error); }); obsSocket.on('close', (code, reason) => { console.log(`连接断开,码值${code}: ${reason.toString()}`); });
核心要点
- opcode区分消息类型:5.x版本用
op字段定义消息用途,比如op0=服务器打招呼、op1=客户端认证、op6=发送业务请求、op7=接收响应 - 认证逻辑严格匹配:必须通过两次SHA-256哈希生成认证字符串,不能用旧版的
GetAuthRequired请求 - rpc版本对齐:必须使用服务器返回的
rpcVersion,否则会认证失败 - 事件订阅可选:
eventSubscriptions可以设置为对应数值来订阅OBS事件(比如1=订阅所有事件)
预期运行结果
执行node obs.js后,终端会输出类似内容,且连接不会断开:
Connected to OBS WebSocket Sent authentication request 认证成功,连接已维持 请求成功: { scenes: [ {...}, {...} ], currentProgramSceneName: "你的场景名" }
内容的提问来源于stack exchange,提问作者skyewasthelimit
相关产品推荐
相关产品推荐

