From 3b270124155e8af2b8c9fdce34a0ad156f3f227c Mon Sep 17 00:00:00 2001 From: Muihd <1083092844@qq.com> Date: Sun, 12 Jan 2025 13:54:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20`Appid`=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=8C=E7=96=91=E4=BC=BC=E7=94=A8=E6=88=B7=E7=9C=8B?= =?UTF-8?q?=E7=9B=B4=E6=92=AD=E7=9A=84=E5=BA=94=E7=94=A8id=EF=BC=8C?= =?UTF-8?q?=E6=8C=89=E9=9C=80=E4=BD=BF=E7=94=A8;=20=E8=BF=9B=E5=85=A5?= =?UTF-8?q?=E7=9B=B4=E6=92=AD=E9=97=B4=E6=B6=88=E6=81=AF=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20=E8=BF=9B=E5=85=A5=E6=B8=A0=E9=81=93=E5=AD=97?= =?UTF-8?q?=E6=AE=B5`EnterTipType`=20=E5=B7=B2=E7=9F=A50=E4=B8=BA=E6=99=AE?= =?UTF-8?q?=E9=80=9A=E8=BF=9B=E5=85=A5=EF=BC=8C6=E4=B8=BA=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=88=86=E4=BA=AB=E8=BF=9B=E5=85=A5;=20User=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=96=B0=E5=A2=9E=20=20`IsAdmin`=20=E5=92=8C=20`IsAnc?= =?UTF-8?q?hor`=20=E5=AD=97=E6=AE=B5=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=8C=BA?= =?UTF-8?q?=E5=88=86=E6=98=AF=E5=90=A6=E4=B8=BA=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E6=88=96=E8=80=85=E4=B8=BB=E6=92=AD=E7=9A=84=E6=B6=88=E6=81=AF?= =?UTF-8?q?;=20web=E5=9C=A8=E4=B8=AD=E9=80=94=E7=9B=91=E5=90=AC=E5=BC=B9?= =?UTF-8?q?=E5=B9=95=EF=BC=8C=E4=B8=94=E7=9B=B4=E6=92=AD=E9=97=B4=E5=BC=B9?= =?UTF-8?q?=E5=B9=95=E9=93=BE=E6=8E=A5=E5=B7=B2=E9=99=8D=E7=BA=A7=E4=B8=BA?= =?UTF-8?q?=E8=BD=AE=E8=AF=A2=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8C?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=20webroomid=20=E4=BB=A5=E5=8F=8A=E6=88=BF?= =?UTF-8?q?=E9=97=B4=E4=BF=A1=E6=81=AF=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= =?UTF-8?q?;=20=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=E5=B7=B2=E7=9F=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BarrageGrab/App.config | 2 +- BarrageGrab/DyServer.cs | 74 ++++++- .../Modles/JsonEntity/BarrageMessages.cs | 10 + BarrageGrab/Modles/ProtoEntity/Messages.cs | 2 - BarrageGrab/Modles/RoomInfo.cs | 76 +++++++ BarrageGrab/ObjectExtension.cs | 39 ++++ BarrageGrab/Proxy/TitaniumProxy.cs | 77 ++++++- BarrageGrab/WsBarrageServer.cs | 197 +++++++++--------- 8 files changed, 373 insertions(+), 104 deletions(-) diff --git a/BarrageGrab/App.config b/BarrageGrab/App.config index 82a6c2b..b6dd7aa 100644 --- a/BarrageGrab/App.config +++ b/BarrageGrab/App.config @@ -49,7 +49,7 @@ - + diff --git a/BarrageGrab/DyServer.cs b/BarrageGrab/DyServer.cs index 5fd7f33..0a81e06 100644 --- a/BarrageGrab/DyServer.cs +++ b/BarrageGrab/DyServer.cs @@ -5,6 +5,7 @@ using System.Net.Http; using System.Text; using System.Threading.Tasks; using BarrageGrab.Modles; +using BarrageGrab.Modles.ProtoEntity; using Newtonsoft.Json.Linq; using Org.BouncyCastle.Asn1.Cmp; using Org.BouncyCastle.Asn1.Crmf; @@ -53,7 +54,78 @@ namespace BarrageGrab { Logger.LogError($"礼物信息从服务器请求失败: {ex.Message}"); return null; - } + } + } + + /// + /// 获取房间信息,通过原生接口 + /// + /// web直播间号 + /// 账号凭据 + /// 查询代理 + /// + public static async Task GetRoomInfoForApi(string webRoomid, string cookie) + { + string url = "https://live.douyin.com/webcast/room/web/enter/"; + + var client = new HttpClient(); + + + var uri = new UriBuilder(url); + var dict = new Dictionary(); + dict.Set("aid", "6383"); + dict.Set("live_id", "1"); + dict.Set("app_name", "douyin_web"); + dict.Set("device_platform", "web"); + dict.Set("language", "zh-CN"); + dict.Set("cookie_enabled", "true"); + dict.Set("enter_from", "page_refresh"); + dict.Set("web_rid", webRoomid); + //dict.Set("room_id_str", roomid); + dict.Set("enter_source", ""); + dict.Set("is_need_double_stream", "false"); + dict.Set("insert_task_id", ""); + dict.Set("live_reason", ""); + dict.Set("browser_language", "zh-CN"); + dict.Set("browser_platform", "Win32"); + dict.Set("browser_name", "Edge"); + dict.Foreach(f => uri.AddQueryParam(f.Key, f.Value)); + + url = uri.Uri.ToString(); + + var request = new HttpRequestMessage(HttpMethod.Get, url); + request.Headers.Add("Accept", "application/json, text/plain, */*"); + request.Headers.Add("Cache-Control", "no-cache"); + request.Headers.Add("Referer", $"https://live.douyin.com/{webRoomid}"); + request.Headers.Add("Host", "live.douyin.com"); + request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"); + request.Headers.Add("Cookie", cookie); + + var rsp = await client.SendAsync(request); + if (rsp == null || rsp.StatusCode != System.Net.HttpStatusCode.OK) + { + return null; + } + + var buff = rsp.Content.ReadAsByteArrayAsync(); + var result = Encoding.UTF8.GetString(buff.Result); + + var res = RoomInfo.TryParseRoomEnterResponse(result, out var dto); + int code = res.Item1; + string msg = res.Item2; + if (code == 0) + { + dto.LiveUrl = $"https://live.douyin.com/{webRoomid}"; + dto.WebRoomId = webRoomid; + AppRuntime.RoomCaches.AddRoomInfoCache(dto); + Logger.LogInfo($"{dto.Owner.Nickname ?? dto.WebRoomId ?? dto.RoomId} 的直播间信息已添加到缓存"); + } + else + { + return null; + } + + return dto; } } } diff --git a/BarrageGrab/Modles/JsonEntity/BarrageMessages.cs b/BarrageGrab/Modles/JsonEntity/BarrageMessages.cs index cc92376..9aeaaee 100644 --- a/BarrageGrab/Modles/JsonEntity/BarrageMessages.cs +++ b/BarrageGrab/Modles/JsonEntity/BarrageMessages.cs @@ -194,6 +194,16 @@ namespace BarrageGrab.Modles.JsonEntity /// public long Id { get; set; } + /// + /// 是否是直播间管理员 + /// + public bool IsAdmin { get; set; } = false; + + /// + /// 是否是主播自己 + /// + public bool IsAnchor { get; set; } = false; + /// /// ShortId /// diff --git a/BarrageGrab/Modles/ProtoEntity/Messages.cs b/BarrageGrab/Modles/ProtoEntity/Messages.cs index 7464ec5..5fb78df 100644 --- a/BarrageGrab/Modles/ProtoEntity/Messages.cs +++ b/BarrageGrab/Modles/ProtoEntity/Messages.cs @@ -477,11 +477,9 @@ namespace BarrageGrab.Modles.ProtoEntity public PublicAreaCommon publicAreaCommon { get; set; } [global::ProtoBuf.ProtoMember(20)] - [global::System.ComponentModel.DefaultValue("")] public long userEnterTipType { get; set; } [global::ProtoBuf.ProtoMember(21)] - [global::System.ComponentModel.DefaultValue("")] public long anchorEnterTipType { get; set; } [global::ProtoBuf.ProtoContract()] diff --git a/BarrageGrab/Modles/RoomInfo.cs b/BarrageGrab/Modles/RoomInfo.cs index 635438c..ceae585 100644 --- a/BarrageGrab/Modles/RoomInfo.cs +++ b/BarrageGrab/Modles/RoomInfo.cs @@ -87,6 +87,29 @@ namespace BarrageGrab.Modles /// public string Ttwid { get; set; } + /// + /// 是否是匿名直播间 + /// + public bool IsAnonymous { get; set; } + + public void SetData(JObject room) + { + this.RoomId = room["id_str"]?.ToString() ?? ""; + this.AdminUserIds = room["admin_user_ids_str"]?.Values().ToList() ?? new List(); + this.IsLive = room["status"]?.Value() == 2; + this.IsAnonymous = room["live_room_mode"]?.Value() == 1; + this.Title = room["title"]?.ToString() ?? ""; + this.UserCount = long.Parse(room["room_view_stats"]?["display_value"]?.Value() ?? "0"); + this.TotalUserCount = room["room_view_stats"]?["total_user_str"]?.Value() ?? "0"; + this.LikeCount = room["like_count"]?.Value() ?? 0; + //this.QrcodeUrl = rootData["qrcode_url"]?.ToString() ?? ""; + this.AuthInfo = room["room_auth"]?.ToObject(); + this.Cover = room["cover"]?["url_list"]?.Values().FirstOrDefault() ?? "";//下播情况下没有cover字段 + + this.AuthInfo = room["room_auth"]?.ToObject(); + this.Cover = room["cover"]?["url_list"]?.Values().FirstOrDefault() ?? "";//下播情况下没有cover字段 + } + public class RoomAnchor { /// @@ -641,5 +664,58 @@ namespace BarrageGrab.Modles return Tuple.Create(0, "succ"); } + + /// + /// 将 EnterRoom Response 转为房间信息对象 + /// + /// + /// + /// + public static Tuple TryParseRoomEnterResponse(string response, out RoomInfo info) + { + info = null; + JObject res; + try + { + res = JsonConvert.DeserializeObject(response); + } + catch (Exception) + { + return Tuple.Create(4, "不是合法的json格式"); + } + if (res == null) + { + return Tuple.Create(1, "响应内容为空"); + } + if (res["status_code"]?.Value() != 0) + { + return Tuple.Create(2, (res["status_msg"]?.ToString() ?? "响应状态失败")); + } + + var roomInfos = res["data"]?["data"]?.Values().ToArray(); + if (roomInfos == null || roomInfos.Length == 0) return Tuple.Create(3, "房间信息列表为空"); + var rootData = res["data"]; + var room = roomInfos[0]?.ToObject(); + var roomOwner = rootData?["user"] ?? room?["owner"]; + + var dto = new RoomInfo(); + dto.SetData(room); + dto.QrcodeUrl = rootData["qrcode_url"]?.ToString() ?? ""; + if (roomOwner != null) + { + dto.Owner = new RoomInfo.RoomAnchor() + { + UserId = roomOwner["id_str"].ToString(), + Nickname = roomOwner["nickname"].ToString(), + SecUid = roomOwner["sec_uid"].ToString(), + HeadUrl = roomOwner["avatar_thumb"]["url_list"].Values()?.FirstOrDefault() ?? "", + FollowStatus = roomOwner["follow_info"]["follow_status"].Value() + }; + } + + info = dto; + return Tuple.Create(0, "succ"); + } + } } diff --git a/BarrageGrab/ObjectExtension.cs b/BarrageGrab/ObjectExtension.cs index 916578d..a6f76ea 100644 --- a/BarrageGrab/ObjectExtension.cs +++ b/BarrageGrab/ObjectExtension.cs @@ -319,5 +319,44 @@ namespace BarrageGrab }); } + /// + /// 获取Uri查询参数 + /// + /// + /// + /// + public static IDictionary GetQueryParams(this Uri uri) + { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + + var queryParams = uri.Query.TrimStart('?'); + + if (string.IsNullOrEmpty(queryParams)) + { + return new Dictionary(); + } + + return queryParams + .Split('&') + .Select(param => param.Split('=')) + .ToDictionary( + keyValuePair => Uri.UnescapeDataString(keyValuePair[0]), + keyValuePair => Uri.UnescapeDataString(keyValuePair.Length > 1 ? keyValuePair[1] : "")); + } + + /// + /// 获取Uri查询参数 + /// + /// + /// + /// + public static string GetQueryParam(this Uri uri, string key) + { + return uri.GetQueryParams().Where(w => w.Key == key).Select(s => s.Value).FirstOrDefault(); + } + } } diff --git a/BarrageGrab/Proxy/TitaniumProxy.cs b/BarrageGrab/Proxy/TitaniumProxy.cs index 404190d..876b7f5 100644 --- a/BarrageGrab/Proxy/TitaniumProxy.cs +++ b/BarrageGrab/Proxy/TitaniumProxy.cs @@ -23,6 +23,9 @@ using System.Net.Http; using System.Text; using BrotliSharpLib; using System.IO.Compression; +using System.Collections.Concurrent; +using System.Security.Policy; +using NLog.LayoutRenderers; namespace BarrageGrab.Proxy { @@ -31,6 +34,7 @@ namespace BarrageGrab.Proxy ProxyServer proxyServer = null; ExplicitProxyEndPoint explicitEndPoint = null; ExternalProxy upStreamProxy = null; + List rinfoRequestings = new List(); const string SCRIPT_HOST = "lf-cdn-tos.bytescm.com"; const string LIVE_HOST = "live.douyin.com"; @@ -39,6 +43,7 @@ namespace BarrageGrab.Proxy const string BARRAGE_POOL_PATH = "/webcast/im/fetch"; const string LIVE_SCRIPT_PATH = "/obj/static/webcast/douyin_live"; const string WEBCAST_AMEMV_HOST = "webcast.amemv.com"; + private readonly Regex webcastBarrageReg = new Regex(@"webcast\d+-ws-web-\w+\.(douyin|amemv)\.com"); public override string HttpUpstreamProxy { get { return proxyServer?.UpStreamHttpProxy?.ToString() ?? ""; } } @@ -97,6 +102,7 @@ namespace BarrageGrab.Proxy proxyServer.CertificateManager.TrustRootCertificate(true); proxyServer.ServerCertificateValidationCallback += ProxyServer_ServerCertificateValidationCallback; + proxyServer.BeforeRequest += ProxyServer_BeforeRequest; proxyServer.BeforeResponse += ProxyServer_BeforeResponse; //proxyServer.AfterResponse += ProxyServer_AfterResponse; @@ -189,7 +195,25 @@ namespace BarrageGrab.Proxy private bool CheckBrowser(string processName) { - return AppSetting.Current.ProcessFilter.Contains(processName) && processName!="直播伴侣" && processName!= "douyin"; + return AppSetting.Current.ProcessFilter.Contains(processName) && processName != "直播伴侣" && processName != "douyin"; + } + + private async Task ProxyServer_BeforeRequest(object sender, SessionEventArgs e) + { + string uri = e.HttpClient.Request.RequestUri.ToString(); + string hostname = e.HttpClient.Request.RequestUri.Host; + var processid = e.HttpClient.ProcessId.Value; + var processName = base.GetProcessName(processid); + var contentType = e.HttpClient.Response.ContentType ?? ""; + + //ws 方式 + if ( + e.HttpClient.ConnectRequest?.TunnelType == TunnelType.Websocket && + webcastBarrageReg.IsMatch(uri) + ) + { + + } } private async Task ProxyServer_BeforeResponse(object sender, SessionEventArgs e) @@ -266,20 +290,55 @@ namespace BarrageGrab.Proxy var processid = e.HttpClient.ProcessId.Value; var processName = base.GetProcessName(processid); var contentType = e.HttpClient.Response.ContentType ?? ""; + var isLiveCompan = processName == "直播伴侣"; //ws 方式 if ( e.HttpClient.ConnectRequest?.TunnelType == TunnelType.Websocket && - hostname.StartsWith("webcast") + webcastBarrageReg.IsMatch(uri) ) { e.DataReceived += WebSocket_DataReceived; + var urix = new Uri(uri); + var roomid = urix.GetQueryParam("room_id"); + Logger.LogInfo($"订阅到新的弹幕流地址,roomid:{roomid}"); } + //轮询方式(当抖音ws连接断开后,客户端也会降级使用轮询模式获取弹幕) if (uri.Contains(BARRAGE_POOL_PATH) && contentType.Contains("application/protobuffer")) { var payload = await e.GetResponseBody(); + var referrer = e.HttpClient.Request.Headers.GetFirstHeader("Referer")?.Value; + //https://live.douyin.com/22404217360 + + //检查webroomid映射 + if (!referrer.IsNullOrWhiteSpace()) + { + var webroomid = Regex.Match(referrer, @"(?<=live\.douyin\.com\/)\d+").Value; + var urix = new Uri(uri); + var roomid = urix.GetQueryParam("room_id"); + var cookie = e.HttpClient.Request.Headers.GetFirstHeader("Cookie")?.Value; + + var roomInfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(roomid); + if (roomInfo == null && cookie != null && !rinfoRequestings.Contains(webroomid)) + { + lock (rinfoRequestings) rinfoRequestings.Add(webroomid); + //查询后会自动缓存 + DyServer.GetRoomInfoForApi(webroomid, cookie).ContinueWith(t => + { + var rinfo = t.Result; + //限制只尝试一次 + if (rinfo != null) + { + lock (rinfoRequestings) rinfoRequestings.Remove(webroomid); + } + }); + } + + AppRuntime.RoomCaches.SetRoomCache(roomid, webroomid); + } + base.FireOnFetchResponse(new HttpResponseEventArgs() { HttpClient = e.HttpClient, @@ -358,7 +417,7 @@ namespace BarrageGrab.Proxy if (code == 0) { - Logger.LogInfo($"直播页{webrid}房间信息已采集到缓存"); + Logger.LogInfo($"直播页{webrid} [{roominfo.Owner.Nickname}]的直播间,房间信息已采集到缓存"); roominfo.WebRoomId = webrid; roominfo.LiveUrl = url; AppRuntime.RoomCaches.AddRoomInfoCache(roominfo); @@ -565,6 +624,16 @@ namespace BarrageGrab.Proxy string hostname = e.HttpClient.Request.RequestUri.Host; e.DecryptSsl = CheckHost(hostname); + + + //ws 方式 + //if ( + // e.HttpClient.ConnectRequest?.TunnelType == TunnelType.Websocket && + // webcastBarrageReg.IsMatch(url) + // ) + //{ + // e.HttpClient.Request.RequestUri = new Uri("wss:////localhost:8828"); + //} } //检测域名白名单 @@ -597,7 +666,7 @@ namespace BarrageGrab.Proxy var processid = args.HttpClient.ProcessId.Value; List messageData = new List(); - + try { foreach (var frame in args.WebSocketDecoderReceive.Decode(e.Buffer, e.Offset, e.Count)) diff --git a/BarrageGrab/WsBarrageServer.cs b/BarrageGrab/WsBarrageServer.cs index 136f00d..3bc11dc 100644 --- a/BarrageGrab/WsBarrageServer.cs +++ b/BarrageGrab/WsBarrageServer.cs @@ -17,6 +17,9 @@ using BarrageGrab.Modles.JsonEntity; using BarrageGrab.Modles.ProtoEntity; using System.Drawing; using System.Collections.Concurrent; +using System.Dynamic; +using static BarrageGrab.Modles.ProtoEntity.Image; +using static BarrageGrab.Modles.WebCastGift; namespace BarrageGrab { @@ -163,13 +166,68 @@ namespace BarrageGrab return user; } + //检查属性定义 + private bool HasProperty(dynamic obj, string propertyName) + { + if (obj is ExpandoObject) + { + return ((IDictionary)obj).ContainsKey(propertyName); + } + return obj.GetType().GetProperty(propertyName) != null; + } + + private T CreateMsg(dynamic msg) where T : Msg, new() + { + var roomid = msg.Common.roomId.ToString(); + RoomInfo roomInfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(roomid); + + //判断 Common 属性是否存在 + var hasUser = HasProperty(msg, nameof(msg.User)); + + var enty = new T() + { + MsgId = msg.Common?.msgId, + RoomId = roomid, + WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(roomid), + Appid = msg.Common.appId.ToString(), + User = hasUser ? GetUser(msg.User) : null, + }; + + //判断是否是直播间管理员 + if (enty.User != null && roomInfo != null && roomInfo.AdminUserIds.Any()) + { + enty.User.IsAdmin = roomInfo.AdminUserIds.Contains(enty.User.Id.ToString()); + } + + //判断是否是主播 + if (enty.User != null && roomInfo != null && roomInfo.Owner != null) + { + enty.User.IsAnchor = enty.User.Id.ToString() == roomInfo.Owner.UserId; + } + + return enty; + } + //打印消息 private void PrintMsg(Msg msg, PackMsgType barType) { var rinfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(msg.RoomId.ToString()); var roomName = (rinfo?.Owner?.Nickname ?? ((msg.WebRoomId.IsNullOrWhiteSpace() ? msg.RoomId.ToString() : msg.WebRoomId))); + var isAdmin = msg.User != null && msg.User.IsAdmin; + var isAnchor = msg.User != null && msg.User.IsAnchor; + var text = $"{DateTime.Now.ToString("HH:mm:ss")} [{roomName}] [{barType}]"; + if (isAdmin) + { + text+= " [管理员]"; + } + + if(isAnchor) + { + text += " [主播]"; + } + if (msg.User != null) { text += $" [{msg.User?.GenderToString()}] "; @@ -226,9 +284,9 @@ namespace BarrageGrab //附加房间信息 private void AttachRoomInfo(Msg msg) { - if(msg==null) return; + if (msg == null) return; var roomInfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(msg.RoomId.ToString()); - if (roomInfo != null) + if (roomInfo != null && roomInfo.Owner!=null) { msg.Onwer = new RoomAnchorInfo() { @@ -238,7 +296,7 @@ namespace BarrageGrab SecUid = roomInfo.Owner.SecUid, UserId = roomInfo.Owner.UserId }; - msg.WebRoomId = roomInfo.WebRoomId; + msg.WebRoomId = roomInfo.WebRoomId; } } @@ -247,16 +305,10 @@ namespace BarrageGrab { var msg = e.Message; if (!CheckRoomId(msg.Common.roomId)) return; - var enty = new FansclubMsg() - { - MsgId = msg.Common.msgId, - Content = msg.Content, - RoomId = msg.Common.roomId.ToString(), - WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()), - Appid = e.Message.Common.appId.ToString(), - Type = msg.Type, - User = GetUser(msg.User) - }; + var enty = CreateMsg(msg); + + enty.Content = msg.Content; + enty.Type = msg.Type; enty.Level = enty.User.FansClub.Level; var msgType = PackMsgType.粉丝团消息; @@ -271,19 +323,13 @@ namespace BarrageGrab { var msg = e.Message; if (!CheckRoomId(msg.Common.roomId)) return; - var enty = new UserSeqMsg() - { - MsgId = msg.Common.msgId, - OnlineUserCount = msg.Total, - TotalUserCount = msg.totalUser, - TotalUserCountStr = msg.totalPvForAnchor, - OnlineUserCountStr = msg.onlineUserForAnchor, - RoomId = msg.Common.roomId.ToString(), - WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()), - Content = $"当前直播间人数 {msg.onlineUserForAnchor},累计直播间人数 {msg.totalPvForAnchor}", - Appid = e.Message.Common.appId.ToString(), - User = null - }; + + var enty = CreateMsg(msg); + enty.OnlineUserCount = msg.Total; + enty.TotalUserCount = msg.totalUser; + enty.TotalUserCountStr = msg.totalPvForAnchor; + enty.OnlineUserCountStr = msg.onlineUserForAnchor; + enty.Content = $"当前直播间人数 {msg.onlineUserForAnchor},累计直播间人数 {msg.totalPvForAnchor}"; var msgType = PackMsgType.直播间统计; AttachRoomInfo(enty); @@ -319,7 +365,7 @@ namespace BarrageGrab if (msg.repeatEnd == 1 && giftCountCache.ContainsKey(key)) { //清除缓存中的key - if (msg.groupId > 0 ) + if (msg.groupId > 0) { Tuple _; giftCountCache.TryRemove(key, out _); @@ -353,24 +399,17 @@ namespace BarrageGrab var count = currCount - lastCount; - var enty = new GiftMsg() - { - MsgId = msg.Common.msgId, - RoomId = msg.Common.roomId.ToString(), - WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()), - Content = $"{msg.User.Nickname} 送出 {msg.Gift.Name}{(msg.Gift.Combo ? "(可连击)" : "")} x {msg.repeatCount}个,增量{count}个", - DiamondCount = msg.Gift.diamondCount, - RepeatCount = msg.repeatCount, - GiftCount = count, - GroupId = msg.groupId, - GiftId = msg.giftId, - GiftName = msg.Gift.Name, - Combo = msg.Gift.Combo, - ImgUrl = msg.Gift.Image?.urlLists?.FirstOrDefault() ?? "", - User = GetUser(msg.User), - ToUser = GetUser(msg.toUser), - Appid = e.Message.Common.appId.ToString() - }; + var enty = CreateMsg(msg); + enty.Content = $"{msg.User.Nickname} 送出 {msg.Gift.Name}{(msg.Gift.Combo ? "(可连击)" : "")} x {msg.repeatCount}个,增量{count}个"; + enty.DiamondCount = msg.Gift.diamondCount; + enty.RepeatCount = msg.repeatCount; + enty.GiftCount = count; + enty.GroupId = msg.groupId; + enty.GiftId = msg.giftId; + enty.GiftName = msg.Gift.Name; + enty.Combo = msg.Gift.Combo; + enty.ImgUrl = msg.Gift.Image?.urlLists?.FirstOrDefault() ?? ""; + enty.ToUser = GetUser(msg.toUser); if (enty.ToUser != null) { @@ -391,15 +430,8 @@ namespace BarrageGrab var msg = e.Message; if (!CheckRoomId(msg.Common.roomId)) return; if (msg.Action != 1) return; - var enty = new Msg() - { - MsgId = msg.Common.msgId, - Content = $"{msg.User.Nickname} 关注了主播", - RoomId = msg.Common.roomId.ToString(), - WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()), - User = GetUser(msg.User), - Appid = e.Message.Common.appId.ToString() - }; + var enty = CreateMsg(msg); + enty.Content = $"{msg.User.Nickname} 关注了主播"; var msgType = PackMsgType.关注消息; AttachRoomInfo(enty); @@ -422,16 +454,9 @@ namespace BarrageGrab type = (ShareType)int.Parse(msg.shareTarget); } - var enty = new ShareMessage() - { - MsgId = msg.Common.msgId, - Content = $"{msg.User.Nickname} 分享了直播间到{type}", - RoomId = msg.Common.roomId.ToString(), - WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()), - ShareType = type, - User = GetUser(msg.User), - Appid = e.Message.Common.appId.ToString() - }; + var enty = CreateMsg(msg); + enty.Content = $"{msg.User.Nickname} 分享了直播间到{type}"; + enty.ShareType = type; var msgType = PackMsgType.直播间分享; AttachRoomInfo(enty); @@ -450,17 +475,11 @@ namespace BarrageGrab var msg = e.Message; if (!CheckRoomId(msg.Common.roomId)) return; - var enty = new Modles.JsonEntity.MemberMessage() - { - MsgId = msg.Common.msgId, - Content = $"{msg.User.Nickname}${(e.Message.userEnterTipType==6?" 通过分享":"")} 来了 直播间人数:{msg.memberCount}", - RoomId = msg.Common.roomId.ToString(), - WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()), - CurrentCount = msg.memberCount, - User = GetUser(msg.User), - Appid = e.Message.Common.appId.ToString(), - EnterTipType = e.Message.userEnterTipType, - }; + var enterType = e.Message.userEnterTipType; + var enty = CreateMsg(msg); + enty.Content = $"{msg.User.Nickname} ${(enterType == 6 ? " 通过分享" : "")}来了 直播间人数:{msg.memberCount}"; + enty.CurrentCount = msg.memberCount; + enty.EnterTipType = enterType; var msgType = PackMsgType.进直播间; AttachRoomInfo(enty); @@ -477,17 +496,10 @@ namespace BarrageGrab var msg = e.Message; if (!CheckRoomId(msg.Common.roomId)) return; - var enty = new LikeMsg() - { - MsgId = msg.Common.msgId, - Count = msg.Count, - Content = $"{msg.User.Nickname} 为主播点了{msg.Count}个赞,总点赞{msg.Total}", - RoomId = msg.Common.roomId.ToString(), - WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()), - Total = msg.Total, - User = GetUser(msg.User), - Appid = e.Message.Common.appId.ToString() - }; + var enty = CreateMsg(msg); + enty.Total = msg.Total; + enty.Count = msg.Count; + enty.Content = $"{msg.User.Nickname} 为主播点了{msg.Count}个赞,总点赞{msg.Total}"; var msgType = PackMsgType.点赞消息; AttachRoomInfo(enty); @@ -503,15 +515,8 @@ namespace BarrageGrab var msg = e.Message; if (!CheckRoomId(msg.Common.roomId)) return; - var enty = new Msg() - { - MsgId = msg.Common.msgId, - Content = msg.Content, - RoomId = msg.Common.roomId.ToString(), - WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()), - User = GetUser(msg.User), - Appid = e.Message.Common.appId.ToString() - }; + var enty = CreateMsg(msg); + enty.Content = msg.Content; var msgType = PackMsgType.弹幕消息; AttachRoomInfo(enty); @@ -538,7 +543,7 @@ namespace BarrageGrab RoomId = msg.Common.roomId.ToString(), WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()), User = null, - Appid = e.Message.Common.appId.ToString() + Appid = e.Message.Common.appId.ToString() }; var msgType = PackMsgType.下播;