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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:12:51