支持直播伴侣开播获取房间信息;
WebRoomid 全部改为 string
This commit is contained in:
@@ -144,11 +144,11 @@ namespace BarrageGrab
|
||||
/// </summary>
|
||||
/// <param name="roomid"></param>
|
||||
/// <returns></returns>
|
||||
public long GetCachedWebRoomid(string roomid)
|
||||
public string GetCachedWebRoomid(string roomid)
|
||||
{
|
||||
RoomInfo value;
|
||||
if (RoomInfoCache.TryGetValue(roomid,out value)) return long.Parse(value.WebRoomId??"-1");
|
||||
return -1;
|
||||
if (RoomInfoCache.TryGetValue(roomid,out value)) return value.WebRoomId??"未知";
|
||||
return "未知";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace BarrageGrab
|
||||
ForcePolling = bool.Parse(AppSettings["forcePolling"].Trim());
|
||||
PollingInterval = int.Parse(AppSettings["pollingInterval"].Trim());
|
||||
DisableLivePageScriptCache = bool.Parse(AppSettings["disableLivePageScriptCache"].Trim());
|
||||
WebRoomIds = AppSettings["webRoomIds"].Trim().Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).Select(x => long.Parse(x)).ToArray();
|
||||
WebRoomIds = AppSettings["webRoomIds"].Trim().Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).ToArray();
|
||||
|
||||
ConfigComPort();
|
||||
ConfigFilter();
|
||||
@@ -177,7 +177,7 @@ namespace BarrageGrab
|
||||
/// <summary>
|
||||
/// 监听的房间号
|
||||
/// </summary>
|
||||
public long[] WebRoomIds { get; private set; } = new long[0];
|
||||
public string[] WebRoomIds { get; private set; } = new string[0];
|
||||
|
||||
/// <summary>
|
||||
/// 使用域名过滤
|
||||
|
||||
@@ -115,7 +115,7 @@ namespace BarrageGrab.Modles.JsonEntity
|
||||
/// <summary>
|
||||
/// web直播间ID
|
||||
/// </summary>
|
||||
public long WebRoomId { get; set; }
|
||||
public string WebRoomId { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -582,5 +582,64 @@ namespace BarrageGrab.Modles
|
||||
}
|
||||
return Tuple.Create(0, "succ");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 从直播伴侣的直播创建回调中解析房间信息
|
||||
/// </summary>
|
||||
/// <param name="json"></param>
|
||||
/// <param name="info"></param>
|
||||
/// <param name="cache">缓存</param>
|
||||
/// <returns></returns>
|
||||
public static Tuple<int, string> TryParseStreamPusherCreate(string json, out RoomInfo info)
|
||||
{
|
||||
info = null;
|
||||
JObject res;
|
||||
try
|
||||
{
|
||||
res = JsonConvert.DeserializeObject<JObject>(json);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return Tuple.Create(4, "不是合法的json格式");
|
||||
}
|
||||
if (res == null)
|
||||
{
|
||||
return Tuple.Create(1, "正文为空");
|
||||
}
|
||||
|
||||
var rootData = res["data"];
|
||||
var ownerInfo = rootData["owner"];
|
||||
|
||||
var dto = new RoomInfo();
|
||||
dto.RoomId = rootData["id_str"]?.ToString() ?? "";
|
||||
dto.AdminUserIds = rootData["admin_user_ids_str"]?.Values<string>().ToList() ?? new List<string>();
|
||||
dto.IsLive = rootData["status"]?.Value<int>() == 2;
|
||||
dto.Title = rootData["title"]?.ToString() ?? "";
|
||||
dto.UserCount = long.Parse(rootData["room_view_stats"]?["display_value"]?.Value<string>() ?? "0");
|
||||
dto.TotalUserCount = rootData["room_view_stats"]?["total_user_str"]?.Value<string>() ?? "0";
|
||||
dto.LikeCount = rootData["like_count"]?.Value<long>() ?? 0;
|
||||
dto.QrcodeUrl = $"https://live.douyin.com/{ownerInfo?["display_id"] ?? ""}";
|
||||
dto.AuthInfo = rootData["room_auth"]?.ToObject<RoomInfo.RoomAuth>();
|
||||
dto.Cover = rootData["cover"]?["url_list"]?.Values<string>().FirstOrDefault() ?? "";//下播情况下没有cover字段
|
||||
dto.WebRoomId = rootData["web_rid"]?.ToString() ?? ownerInfo?["display_id"]?.ToString() ?? "";
|
||||
if (ownerInfo != null)
|
||||
{
|
||||
dto.Owner = new RoomAnchor()
|
||||
{
|
||||
UserId = ownerInfo["id_str"].ToString(),
|
||||
Nickname = ownerInfo["nickname"].ToString(),
|
||||
SecUid = ownerInfo["sec_uid"].ToString(),
|
||||
HeadUrl = ownerInfo["avatar_thumb"]?["url_list"]?.Values<string>()?.FirstOrDefault()?.ToString(),
|
||||
FollowStatus = ownerInfo["follow_info"]?["follow_status"]?.Value<int>() ?? 0
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
info = dto;
|
||||
|
||||
return Tuple.Create(0, "succ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,759 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace BarrageGrab.Modles
|
||||
{
|
||||
/// <summary>
|
||||
/// 礼物信息
|
||||
/// </summary>
|
||||
public class WebCastGift
|
||||
{
|
||||
/// <summary>
|
||||
/// 图片信息
|
||||
/// </summary>
|
||||
public GiftImage image { get; set; }
|
||||
/// <summary>
|
||||
/// 描述
|
||||
/// </summary>
|
||||
public string describe { get; set; }
|
||||
/// <summary>
|
||||
/// 是否通知
|
||||
/// </summary>
|
||||
public bool notify { get; set; }
|
||||
/// <summary>
|
||||
/// 持续时长
|
||||
/// </summary>
|
||||
public int duration { get; set; }
|
||||
/// <summary>
|
||||
/// ID
|
||||
/// </summary>
|
||||
public long id { get; set; }
|
||||
/// <summary>
|
||||
/// 用于连麦
|
||||
/// </summary>
|
||||
public bool for_linkmic { get; set; }
|
||||
/// <summary>
|
||||
/// 涂鸦
|
||||
/// </summary>
|
||||
public bool doodle { get; set; }
|
||||
/// <summary>
|
||||
/// 用于粉丝团
|
||||
/// </summary>
|
||||
public bool for_fansclub { get; set; }
|
||||
/// <summary>
|
||||
/// 是否是连击礼物
|
||||
/// </summary>
|
||||
public bool combo { get; set; }
|
||||
/// <summary>
|
||||
/// 类型
|
||||
/// </summary>
|
||||
public int type { get; set; }
|
||||
/// <summary>
|
||||
/// 钻石数量
|
||||
/// </summary>
|
||||
public int diamond_count { get; set; }
|
||||
/// <summary>
|
||||
/// 是否显示在礼物面板上
|
||||
/// </summary>
|
||||
public bool is_displayed_on_panel { get; set; }
|
||||
/// <summary>
|
||||
/// 主要效果 ID
|
||||
/// </summary>
|
||||
public int primary_effect_id { get; set; }
|
||||
/// <summary>
|
||||
/// 名称
|
||||
/// </summary>
|
||||
public string name { get; set; }
|
||||
/// <summary>
|
||||
/// 区域
|
||||
/// </summary>
|
||||
public string region { get; set; }
|
||||
/// <summary>
|
||||
/// 手动
|
||||
/// </summary>
|
||||
public string manual { get; set; }
|
||||
/// <summary>
|
||||
/// 是否为自定义礼物
|
||||
/// </summary>
|
||||
public bool for_custom { get; set; }
|
||||
/// <summary>
|
||||
/// 特殊效果
|
||||
/// </summary>
|
||||
public Dictionary<string, object> special_effects { get; set; }
|
||||
/// <summary>
|
||||
/// 图标信息
|
||||
/// </summary>
|
||||
public Icon icon { get; set; }
|
||||
/// <summary>
|
||||
/// 行为类型
|
||||
/// </summary>
|
||||
public int action_type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 西瓜子数
|
||||
/// </summary>
|
||||
public int watermelon_seeds { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 金特效
|
||||
/// </summary>
|
||||
public string gold_effect { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订阅列表
|
||||
/// </summary>
|
||||
public List<object> subs { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 金豆数
|
||||
/// </summary>
|
||||
public int golden_beans { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 荣誉等级
|
||||
/// </summary>
|
||||
public int honor_level { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 物品类型
|
||||
/// </summary>
|
||||
public int item_type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 方案链接
|
||||
/// </summary>
|
||||
public string scheme_url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 事件名称
|
||||
/// </summary>
|
||||
public string event_name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 贵族等级
|
||||
/// </summary>
|
||||
public int noble_level { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 引导链接
|
||||
/// </summary>
|
||||
public string guide_url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 惩罚药物
|
||||
/// </summary>
|
||||
public bool punish_medicine { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否为门户
|
||||
/// </summary>
|
||||
public bool for_portal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 商业文本
|
||||
/// </summary>
|
||||
public string business_text { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否为CNY礼物
|
||||
/// </summary>
|
||||
public bool cny_gift { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// App ID
|
||||
/// </summary>
|
||||
public int app_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// VIP等级
|
||||
/// </summary>
|
||||
public int vip_level { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否灰度
|
||||
/// </summary>
|
||||
public bool is_gray { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 灰度方案链接
|
||||
/// </summary>
|
||||
public string gray_scheme_url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物场景
|
||||
/// </summary>
|
||||
public int gift_scene { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 触发词语列表
|
||||
/// </summary>
|
||||
public List<object> trigger_words { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物Buff信息列表
|
||||
/// </summary>
|
||||
public List<object> gift_buff_infos { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否为首充礼物
|
||||
/// </summary>
|
||||
public bool for_first_recharge { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 发送后动作
|
||||
/// </summary>
|
||||
public int after_send_action { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物下线时间
|
||||
/// </summary>
|
||||
public int gift_offline_time { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 顶部栏文本
|
||||
/// </summary>
|
||||
public string top_bar_text { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 横幅方案链接
|
||||
/// </summary>
|
||||
public string banner_scheme_url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否锁定
|
||||
/// </summary>
|
||||
public bool is_locked { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 请求额外类型
|
||||
/// </summary>
|
||||
public int req_extra_type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 资产ID列表
|
||||
/// </summary>
|
||||
public List<int> asset_ids { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物预览信息
|
||||
/// </summary>
|
||||
public GiftPreviewInfo gift_preview_info { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物提示信息
|
||||
/// </summary>
|
||||
public GiftTip gift_tip { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 需要扫光次数
|
||||
/// </summary>
|
||||
public int need_sweep_light_count { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分组信息列表
|
||||
/// </summary>
|
||||
public List<GroupInfo> group_info { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 神秘商店状态
|
||||
/// </summary>
|
||||
public int mystery_shop_status { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 可选资产ID列表
|
||||
/// </summary>
|
||||
public List<object> optional_asset_ids { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否禁用心愿单
|
||||
/// </summary>
|
||||
public bool disable_wish_list { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 托盘动态图可翻转
|
||||
/// </summary>
|
||||
public bool tray_dynamic_img_flippable { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Pico展示动作
|
||||
/// </summary>
|
||||
public int pico_show_action { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 选择的动态效果
|
||||
/// </summary>
|
||||
public int selected_dynamic_effect { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 业务类型
|
||||
/// </summary>
|
||||
public int biz_type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// WebP图片信息
|
||||
/// </summary>
|
||||
public WebpImage webp_image { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物来源
|
||||
/// </summary>
|
||||
public int gift_source { get; set; }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public class GiftImage
|
||||
{
|
||||
/// <summary>
|
||||
/// 图片 URL 列表
|
||||
/// </summary>
|
||||
public List<string> url_list { get; set; }
|
||||
/// <summary>
|
||||
/// 图片 URI
|
||||
/// </summary>
|
||||
public string uri { get; set; }
|
||||
/// <summary>
|
||||
/// 图片高度
|
||||
/// </summary>
|
||||
public int height { get; set; }
|
||||
/// <summary>
|
||||
/// 图片宽度
|
||||
/// </summary>
|
||||
public int width { get; set; }
|
||||
/// <summary>
|
||||
/// 平均颜色
|
||||
/// </summary>
|
||||
public string avg_color { get; set; }
|
||||
/// <summary>
|
||||
/// 图片类型
|
||||
/// </summary>
|
||||
public int image_type { get; set; }
|
||||
/// <summary>
|
||||
/// 开放的网页 URL
|
||||
/// </summary>
|
||||
public string open_web_url { get; set; }
|
||||
/// <summary>
|
||||
/// 是否是动画
|
||||
/// </summary>
|
||||
public bool is_animated { get; set; }
|
||||
/// <summary>
|
||||
/// 弹性设置列表
|
||||
/// </summary>
|
||||
public List<object> flex_setting_list { get; set; }
|
||||
/// <summary>
|
||||
/// 文本设置列表
|
||||
/// </summary>
|
||||
public List<object> text_setting_list { get; set; }
|
||||
}
|
||||
|
||||
public class Icon
|
||||
{
|
||||
/// <summary>
|
||||
/// 图标 URL 列表
|
||||
/// </summary>
|
||||
public List<string> url_list { get; set; }
|
||||
/// <summary>
|
||||
/// 图标 URI
|
||||
/// </summary>
|
||||
public string uri { get; set; }
|
||||
/// <summary>
|
||||
/// 图标高度
|
||||
/// </summary>
|
||||
public int height { get; set; }
|
||||
/// <summary>
|
||||
/// 图标宽度
|
||||
/// </summary>
|
||||
public int width { get; set; }
|
||||
/// <summary>
|
||||
/// 平均颜色
|
||||
/// </summary>
|
||||
public string avg_color { get; set; }
|
||||
/// <summary>
|
||||
/// 图标类型
|
||||
/// </summary>
|
||||
public int image_type { get; set; }
|
||||
/// <summary>
|
||||
/// 开放的网页 URL
|
||||
/// </summary>
|
||||
public string open_web_url { get; set; }
|
||||
/// <summary>
|
||||
/// 是否是动画
|
||||
/// </summary>
|
||||
public bool is_animated { get; set; }
|
||||
/// <summary>
|
||||
/// 弹性设置列表
|
||||
/// </summary>
|
||||
public List<object> flex_setting_list { get; set; }
|
||||
/// <summary>
|
||||
/// 文本设置列表
|
||||
/// </summary>
|
||||
public List<object> text_setting_list { get; set; }
|
||||
}
|
||||
|
||||
public class GiftTipDisplayTextKeyPiece
|
||||
{
|
||||
/// <summary>
|
||||
/// 键
|
||||
/// </summary>
|
||||
public string key { get; set; }
|
||||
/// <summary>
|
||||
/// 默认模式
|
||||
/// </summary>
|
||||
public string default_pattern { get; set; }
|
||||
/// <summary>
|
||||
/// 片段列表
|
||||
/// </summary>
|
||||
public List<object> pieces { get; set; }
|
||||
/// <summary>
|
||||
/// 模式信息
|
||||
/// </summary>
|
||||
public Dictionary<string, object> schema_infos { get; set; }
|
||||
}
|
||||
|
||||
public class GiftTipDisplayText
|
||||
{
|
||||
/// <summary>
|
||||
/// 显示文本键
|
||||
/// </summary>
|
||||
public GiftTipDisplayTextKeyPiece display_text { get; set; }
|
||||
}
|
||||
|
||||
public class GiftTip
|
||||
{
|
||||
/// <summary>
|
||||
/// 显示文本
|
||||
/// </summary>
|
||||
public GiftTipDisplayText display_text { get; set; }
|
||||
/// <summary>
|
||||
/// 背景颜色
|
||||
/// </summary>
|
||||
public string background_color { get; set; }
|
||||
/// <summary>
|
||||
/// 剩余时长
|
||||
/// </summary>
|
||||
public int remaining_duration { get; set; }
|
||||
/// <summary>
|
||||
/// 倒计时截止时间
|
||||
/// </summary>
|
||||
public int countdown_deadline_time { get; set; }
|
||||
}
|
||||
|
||||
public class GiftPreviewInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 锁定状态
|
||||
/// </summary>
|
||||
public int lock_status { get; set; }
|
||||
/// <summary>
|
||||
/// 客户端阻止使用网页链接
|
||||
/// </summary>
|
||||
public bool client_block_use_scheme_url { get; set; }
|
||||
/// <summary>
|
||||
/// 阻止网页链接
|
||||
/// </summary>
|
||||
public string block_scheme_url { get; set; }
|
||||
/// <summary>
|
||||
/// 客户端检查剩余钻石
|
||||
/// </summary>
|
||||
public bool client_check_left_diamond { get; set; }
|
||||
/// <summary>
|
||||
/// 阻止提示
|
||||
/// </summary>
|
||||
public string block_toast { get; set; }
|
||||
}
|
||||
|
||||
public class GroupInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 组数量
|
||||
/// </summary>
|
||||
public int group_count { get; set; }
|
||||
/// <summary>
|
||||
/// 组文本
|
||||
/// </summary>
|
||||
public string group_text { get; set; }
|
||||
}
|
||||
|
||||
public class WebpImage
|
||||
{
|
||||
/// <summary>
|
||||
/// 图片 URL 列表
|
||||
/// </summary>
|
||||
public List<string> url_list { get; set; }
|
||||
/// <summary>
|
||||
/// 图片 URI
|
||||
/// </summary>
|
||||
public string uri { get; set; }
|
||||
/// <summary>
|
||||
/// 图片高度
|
||||
/// </summary>
|
||||
public int height { get; set; }
|
||||
/// <summary>
|
||||
/// 图片宽度
|
||||
/// </summary>
|
||||
public int width { get; set; }
|
||||
/// <summary>
|
||||
/// 平均颜色
|
||||
/// </summary>
|
||||
public string avg_color { get; set; }
|
||||
/// <summary>
|
||||
/// 图片类型
|
||||
/// </summary>
|
||||
public int image_type { get; set; }
|
||||
/// <summary>
|
||||
/// 开放的网页 URL
|
||||
/// </summary>
|
||||
public string open_web_url { get; set; }
|
||||
/// <summary>
|
||||
/// 是否是动画
|
||||
/// </summary>
|
||||
public bool is_animated { get; set; }
|
||||
/// <summary>
|
||||
/// 弹性设置列表
|
||||
/// </summary>
|
||||
public List<object> flex_setting_list { get; set; }
|
||||
/// <summary>
|
||||
/// 文本设置列表
|
||||
/// </summary>
|
||||
public List<object> text_setting_list { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 礼物组信息
|
||||
/// </summary>
|
||||
public class GiftsInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 新礼物ID
|
||||
/// </summary>
|
||||
public int new_gift_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 粉丝团礼物ID列表
|
||||
/// </summary>
|
||||
public List<int> fansclub_gift_ids { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 快速礼物ID
|
||||
/// </summary>
|
||||
public int speedy_gift_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物词语
|
||||
/// </summary>
|
||||
public string gift_words { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物组信息列表
|
||||
/// </summary>
|
||||
public List<GiftGroupInfo> gift_group_infos { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 免费礼物项列表
|
||||
/// </summary>
|
||||
public List<object> free_cell_items { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 荣耀礼物ID列表
|
||||
/// </summary>
|
||||
public List<int> honor_gift_ids { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 游戏礼物项列表
|
||||
/// </summary>
|
||||
public List<object> game_gift_items { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 贵族礼物ID列表
|
||||
/// </summary>
|
||||
public List<object> noble_gift_ids { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否隐藏充值入口
|
||||
/// </summary>
|
||||
public bool hide_recharge_entry { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物入口图标信息
|
||||
/// </summary>
|
||||
public GiftEntranceIcon gift_entrance_icon { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// VIP礼物ID列表
|
||||
/// </summary>
|
||||
public List<object> vip_gift_ids { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物连击信息列表
|
||||
/// </summary>
|
||||
public List<GiftComboInfo> gift_combo_infos { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 快速礼物弹窗信息
|
||||
/// </summary>
|
||||
public SpeedyGiftPopupInfo speedy_gift_popup_info { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 首充快速礼物ID
|
||||
/// </summary>
|
||||
public int first_recharge_speedy_gift_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 消息处理过滤器
|
||||
/// </summary>
|
||||
public MsgProcessFilter msg_process_filter { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 额外参数
|
||||
/// </summary>
|
||||
public ExtraParams extra_params { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 连击信息
|
||||
/// </summary>
|
||||
public class GiftComboInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 连击次数
|
||||
/// </summary>
|
||||
public int combo_count { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 连击效果图片信息
|
||||
/// </summary>
|
||||
public ComboEffectImage combo_effect_img { get; set; }
|
||||
|
||||
public class ComboEffectImage
|
||||
{
|
||||
/// <summary>
|
||||
/// 图片URL列表
|
||||
/// </summary>
|
||||
public List<string> url_list { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 图片URI
|
||||
/// </summary>
|
||||
public string uri { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 图片高度
|
||||
/// </summary>
|
||||
public int height { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 图片宽度
|
||||
/// </summary>
|
||||
public int width { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均颜色
|
||||
/// </summary>
|
||||
public string avg_color { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 图片类型
|
||||
/// </summary>
|
||||
public int image_type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 打开网页链接
|
||||
/// </summary>
|
||||
public string open_web_url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否为动画
|
||||
/// </summary>
|
||||
public bool is_animated { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 弹性设置列表
|
||||
/// </summary>
|
||||
public List<object> flex_setting_list { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文本设置列表
|
||||
/// </summary>
|
||||
public List<object> text_setting_list { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
public class GiftGroupInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 礼物组数量
|
||||
/// </summary>
|
||||
public int group_count { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物组文本
|
||||
/// </summary>
|
||||
public string group_text { get; set; }
|
||||
}
|
||||
|
||||
public class GiftEntranceIcon
|
||||
{
|
||||
/// <summary>
|
||||
/// 图片URL列表
|
||||
/// </summary>
|
||||
public List<string> url_list { get; set; }
|
||||
|
||||
// ... (其他字段和类型同 ComboEffectImage)
|
||||
}
|
||||
|
||||
public class SpeedyGiftPopupInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 工具栏图标方案URL
|
||||
/// </summary>
|
||||
public string toolbar_icon_scheme_url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 弹出信息列表
|
||||
/// </summary>
|
||||
public List<object> pop_up_info { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 额外信息
|
||||
/// </summary>
|
||||
public object extra { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
public class MsgProcessFilter
|
||||
{
|
||||
// ... (这里可能还有其他字段,需要查看实际 JSON 结构)
|
||||
}
|
||||
|
||||
public class ExtraParams
|
||||
{
|
||||
/// <summary>
|
||||
/// 预测字典
|
||||
/// </summary>
|
||||
public PredictDict predict_dict { get; set; }
|
||||
}
|
||||
|
||||
public class PredictDict
|
||||
{
|
||||
// ... (这里可能还有其他字段,需要查看实际 JSON 结构)
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Response 包装器
|
||||
/// </summary>
|
||||
public class WebCastGiftPack
|
||||
{
|
||||
/// <summary>
|
||||
/// 礼物组
|
||||
/// </summary>
|
||||
public GiftsInfo gifts_info { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 礼物列表
|
||||
/// </summary>
|
||||
public List<WebCastGift> gifts { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -30,13 +30,13 @@ namespace BarrageGrab
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
/// <returns></returns>
|
||||
public static string ToJson(this object obj)
|
||||
public static string ToJson(this object obj,bool format = false)
|
||||
{
|
||||
if (obj is string)
|
||||
{
|
||||
return obj.ToString();
|
||||
}
|
||||
return JsonConvert.SerializeObject(obj);
|
||||
return JsonConvert.SerializeObject(obj, format?Formatting.Indented:Formatting.None);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -7,7 +7,10 @@ using System.Net.Security;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using BarrageGrab.Modles;
|
||||
using BarrageGrab.Modles.JsonEntity;
|
||||
using BarrageGrab.Proxy.ProxyEventArgs;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using Titanium.Web.Proxy;
|
||||
using Titanium.Web.Proxy.EventArguments;
|
||||
using Titanium.Web.Proxy.Http;
|
||||
@@ -28,6 +31,7 @@ namespace BarrageGrab.Proxy
|
||||
const string USER_INFO_PATH = "/webcast/user/me/";
|
||||
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";
|
||||
|
||||
public override string HttpUpstreamProxy { get { return proxyServer?.UpStreamHttpProxy?.ToString() ?? ""; } }
|
||||
|
||||
@@ -80,6 +84,10 @@ namespace BarrageGrab.Proxy
|
||||
proxyServer.CertificateManager.CreateRootCertificate();
|
||||
}
|
||||
|
||||
//信任证书
|
||||
proxyServer.CertificateManager.CreateRootCertificate();
|
||||
proxyServer.CertificateManager.TrustRootCertificate(true);
|
||||
|
||||
proxyServer.ServerCertificateValidationCallback += ProxyServer_ServerCertificateValidationCallback;
|
||||
proxyServer.BeforeResponse += ProxyServer_BeforeResponse;
|
||||
//proxyServer.AfterResponse += ProxyServer_AfterResponse;
|
||||
@@ -121,6 +129,9 @@ namespace BarrageGrab.Proxy
|
||||
var processName = base.GetProcessName(processid);
|
||||
var contentType = e.HttpClient.Response.ContentType ?? "";
|
||||
|
||||
//处理直播伴侣开播更新
|
||||
await HookSelfLive(e);
|
||||
|
||||
//处理弹幕
|
||||
await HookBarrage(e);
|
||||
|
||||
@@ -131,6 +142,51 @@ namespace BarrageGrab.Proxy
|
||||
await HookScriptAsync(e);
|
||||
}
|
||||
|
||||
// Hook 直播伴侣开播信息并更新
|
||||
private async Task HookSelfLive(SessionEventArgs e)
|
||||
{
|
||||
//Hook 直播伴侣直播间创建 https://webcast.amemv.com/webcast/room/create/?ac=wifi&app_name=webcast_mate&version_code=7.3.3&device_platform=windows&webcast_sdk_version=1520&resolution=1707%2A1067&os_version=10.0.22621&language=zh&aid=2079&live_id=1&channel=online&device_id=2164319493312045&iid=42200736232026&extra_first_tag_id=22&extra_second_tag_id=22093&extra_third_tag_id=22093195&extra_encoder_core=qsv&extra_codec_name=h264_qsv_ex&extra_codec_is_ex=1&extra_use_265=0&msToken=8tJ0NCHWun7wHpdPd_fd0_nlUmgRwM8sQYThkqkq4-qR00mKiJ3Wd3h05r4mm5HO_R_qA2qeTIn8qR2yjcXXoh5mmXkewUuTS4G1Yoi_D-m8EZiacZVWoDqgnqw=&X-Bogus=DFSzswVLJzC4fUiKt5a4a3JCqOA1&_signature=_02B4Z6wo00001fHp2wAAAIDCdmADbSJfNUnx6d-AABpim6xRe8bmnvrrC1Z7GWTwK8sPujtot.bkv7h8bk-nde0WvO-78H3cwglXRzZk8uHTs3ZKWlZqOqaBVjgdHIRritV.peh4bkRETofZ7f
|
||||
string uri = e.HttpClient.Request.RequestUri.ToString();
|
||||
var urix = new Uri(uri);
|
||||
var processid = e.HttpClient.ProcessId.Value;
|
||||
var processName = base.GetProcessName(processid);
|
||||
var response = e.HttpClient.Response;
|
||||
if (urix.AbsolutePath != "/webcast/room/create/") return;
|
||||
if (processName != "直播伴侣") return;
|
||||
if (response.StatusCode != 200) return;
|
||||
var reponse = await e.GetResponseBodyAsString();
|
||||
RoomInfo roomInfo;
|
||||
//缓存直播间信息
|
||||
var tupe = RoomInfo.TryParseStreamPusherCreate(reponse, out roomInfo);
|
||||
var code = tupe.Item1;
|
||||
var msg = tupe.Item2;
|
||||
|
||||
if (code != 0)
|
||||
{
|
||||
Logger.LogWarn($"直播伴侣开播房间资料缓存失败,原因:{msg}");
|
||||
return;
|
||||
}
|
||||
|
||||
var jobj = JsonConvert.DeserializeObject<JObject>(reponse);
|
||||
|
||||
var roomid = jobj["data"]?["id_str"]?.Value<string>();
|
||||
var sec_uid = jobj["data"]?["owner"]?["sec_uid"]?.Value<string>();
|
||||
var nickname = jobj["data"]?["owner"]?["nickname"]?.Value<string>();
|
||||
var displayId = jobj["data"]?["owner"]?["display_id"]?.Value<string>();
|
||||
|
||||
if (roomInfo != null && !roomid.IsNullOrWhiteSpace())
|
||||
{
|
||||
roomInfo.RoomId = roomid;
|
||||
roomInfo.Title = jobj["data"]?["title"]?.Value<string>();
|
||||
Logger.LogInfo($"直播伴侣开播,开播账号:{displayId} {nickname} ,更新RoomId={roomInfo.RoomId}");
|
||||
}
|
||||
|
||||
if (roomInfo != null)
|
||||
{
|
||||
AppRuntime.RoomCaches.AddRoomInfoCache(roomInfo);
|
||||
}
|
||||
}
|
||||
|
||||
// Hook 弹幕
|
||||
private async Task HookBarrage(SessionEventArgs e)
|
||||
{
|
||||
@@ -425,7 +481,8 @@ namespace BarrageGrab.Proxy
|
||||
var decryptSsls = new string[]
|
||||
{
|
||||
SCRIPT_HOST,
|
||||
LIVE_HOST
|
||||
LIVE_HOST,
|
||||
WEBCAST_AMEMV_HOST , //直播伴侣开播请求地址
|
||||
};
|
||||
|
||||
if (decryptSsls.Contains(hostname))
|
||||
|
||||
@@ -127,7 +127,10 @@ namespace BarrageGrab
|
||||
|
||||
response.Messages.ForEach(f => DoMessage(f,e.ProcessName));
|
||||
}
|
||||
catch (Exception) { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError(ex,$"处理弹幕数据包时出错:{ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
//http 数据处理
|
||||
@@ -203,43 +206,6 @@ namespace BarrageGrab
|
||||
case "WebcastGiftMessage":
|
||||
{
|
||||
var arg = Serializer.Deserialize<GiftMessage>(new ReadOnlyMemory<byte>(msg.Payload));
|
||||
|
||||
if (arg.Gift == null)
|
||||
{
|
||||
if (arg.giftId == 685)
|
||||
{
|
||||
arg.Gift = new GiftStruct()
|
||||
{
|
||||
Id = arg.giftId,
|
||||
Name = "粉丝灯牌",
|
||||
diamondCount = 1
|
||||
};
|
||||
}
|
||||
else if (arg.giftId == 3389)
|
||||
{
|
||||
arg.Gift = new GiftStruct()
|
||||
{
|
||||
Id = arg.giftId,
|
||||
Name = "欢乐盲盒",
|
||||
diamondCount = 10
|
||||
};
|
||||
}
|
||||
else if (arg.giftId == 4021)
|
||||
{
|
||||
arg.Gift = new GiftStruct()
|
||||
{
|
||||
Id = arg.giftId,
|
||||
Name = "欢乐拼图",
|
||||
diamondCount = 10
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.PrintColor("未能识别的礼物ID:" + arg.giftId, ConsoleColor.Red);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.OnGiftMessage?.Invoke(this, new RoomMessageEventArgs<GiftMessage>(processName, arg));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -145,6 +145,7 @@
|
||||
<Compile Include="AppRuntime.cs" />
|
||||
<Compile Include="AppSetting.cs" />
|
||||
<Compile Include="ComPortServer.cs" />
|
||||
<Compile Include="DyServer.cs" />
|
||||
<Compile Include="Forms\FormView.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
@@ -166,6 +167,7 @@
|
||||
<Compile Include="Modles\ProtoEntity\Messages.cs" />
|
||||
<Compile Include="Modles\ProtoEntity\Wss.cs" />
|
||||
<Compile Include="Modles\RoomInfo.cs" />
|
||||
<Compile Include="Modles\WebCastGift.cs" />
|
||||
<Compile Include="ObjectExtension.cs" />
|
||||
<Compile Include="Proxy\ProxyEventArgs\HttpResponseEventArgs.cs" />
|
||||
<Compile Include="Proxy\ProxyEventArgs\SystemProxyChangeEventArgs.cs" />
|
||||
@@ -181,6 +183,10 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
<None Include="LocalData\gift.json">
|
||||
<CustomToolNamespace>WssBarrageService.Resource.LocalData</CustomToolNamespace>
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="nlog.config">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
@@ -215,5 +221,6 @@
|
||||
<DependentUpon>RoomDetail.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
||||
Reference in New Issue
Block a user