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.下播;