xiaoyaocz / AllLive

获取多个直播平台的信息和弹幕
MIT License
323 stars 21 forks source link

[虎牙直播]丢失系统提示弹幕 #56

Closed gitldg closed 1 month ago

gitldg commented 1 month ago

虎牙直播间WebSocket指令类型:

public enum EWebSocketCommandType
{
    EWSCmd_NULL = 0,
    EWSCmd_RegisterReq = 1,
    EWSCmd_RegisterRsp = 2,
    EWSCmd_WupReq = 3,
    EWSCmd_WupRsp = 4,
    EWSCmdC2S_HeartBeat = 5,
    EWSCmdS2C_HeartBeatAck = 6,
    EWSCmdS2C_MsgPushReq = 7,
    EWSCmdC2S_DeregisterReq = 8,
    EWSCmdS2C_DeRegisterRsp = 9,
    EWSCmdC2S_VerifyCookieReq = 10,
    EWSCmdS2C_VerifyCookieRsp = 11,
    EWSCmdC2S_VerifyHuyaTokenReq = 12,
    EWSCmdS2C_VerifyHuyaTokenRsp = 13,
    EWSCmdC2S_UNVerifyReq = 14,
    EWSCmdS2C_UNVerifyRsp = 15,
    EWSCmdC2S_RegisterGroupReq = 16,
    EWSCmdS2C_RegisterGroupRsp = 17,
    EWSCmdC2S_UnRegisterGroupReq = 18,
    EWSCmdS2C_UnRegisterGroupRsp = 19,
    EWSCmdC2S_HeartBeatReq = 20,
    EWSCmdS2C_HeartBeatRsp = 21,
    EWSCmdS2C_MsgPushReq_V2 = 22
}

目前,在源码位置:*\AllLive-master\AllLive.Core\Danmaku\HuyaDanmaku.cs,仅解析了type = 7的弹幕,未解析type = 22的弹幕数据,后者所占弹幕量比重量更多一些。

private void Ws_OnMessage(object sender, MessageEventArgs e)
{
    try
    {
        var stream = new TarsInputStream(e.RawData);
        var type = stream.Read(0, 0, false);
        if (type == 7)
        {
            stream = new TarsInputStream(stream.Read(new byte[0], 1, false));
            HYPushMessage wSPushMessage = new HYPushMessage();
            wSPushMessage.ReadFrom(stream);
            if (wSPushMessage.Uri == 1400)
            {
                //HYMessage弹幕数据解析
            }
            if (wSPushMessage.Uri == 8006)
            {
                //Online相关
            }
        }

    //目前现在很多弹幕是type = 22,未处理此类型弹幕数据

    }
    catch (Exception)
    {
    }
}
xiaoyaocz commented 1 month ago

没有爬到type=22的弹幕,需要特定直播间?

gitldg commented 1 month ago

@xiaoyaocz 不好意思,没能及时回复。测试发现type=22数据未解析,但一直有数据在跑。目前确实可以忽略type=22的数据,因基本都是AI弹幕(系统通知弹幕,非用户手敲弹幕),可以不用处理,其内部都是MsgItem.Uri = 1100003(AiBarrageDetectNotify) 类型的数据。参考资料:虎牙弹幕指令类型