blivedmjs
Version:
B站直播弹幕库的Node.js实现 (CommonJS版本)
406 lines (376 loc) • 14.1 kB
JavaScript
/**
* B站直播弹幕消息模型定义
* 这个文件包含了所有B站直播WebSocket接口返回的消息类型
* 每个类处理不同类型的消息并将其转换为易于使用的对象
*/
/**
* 心跳消息类
* 服务器会返回当前直播间的人气值
*/
class HeartbeatMessage {
constructor(data) {
this.popularity = data.popularity; // 直播间人气值
}
}
/**
* 弹幕消息类
* 处理用户在直播间发送的文本弹幕
*/
class DanmakuMessage {
constructor(raw) {
this.raw = raw; // 原始消息数据
const info = raw.info; // B站弹幕info数组
this.mode = info[0][1]; // 弹幕显示模式(1:滚动、4:底部、5:顶部)
this.fontsize = info[0][2]; // 字体大小
this.color = info[0][3]; // 弹幕颜色(十进制RGB值)
this.timestamp = info[0][4]; // 时间戳(毫秒)
this.random = info[0][5]; // 随机数
this.uid = info[2][0]; // 用户ID
this.uname = info[2][1]; // 用户名
this.msg = info[1]; // 弹幕内容
this.isAdmin = info[2][2]; // 是否房管
this.medal = { // 粉丝勋章信息
level: info[3][0], // 勋章等级
name: info[3][1], // 勋章名称
anchor: info[3][2], // 勋章主播名
roomid: info[3][3], // 勋章房间号
color: info[3][4], // 勋章颜色
specialColor: info[3][7] // 特殊颜色
};
this.ul = info[4][0]; // 用户等级
this.ulRank = info[4][1]; // 用户等级排名
}
}
/**
* 礼物消息类
* 处理用户在直播间赠送的礼物信息
*/
class GiftMessage {
constructor(raw) {
this.raw = raw; // 原始消息数据
const data = raw.data; // 礼物数据
this.uid = data.uid; // 赠送者用户ID
this.uname = data.uname; // 赠送者用户名
this.giftId = data.giftId; // 礼物ID
this.giftName = data.giftName; // 礼物名称
this.num = data.num; // 赠送数量
this.price = data.price; // 礼物单价(金瓜子)
this.coinType = data.coin_type; // 货币类型('gold'金瓜子 或 'silver'银瓜子)
this.totalCoin = data.total_coin; // 总价格(单价*数量)
}
}
/**
* 用户互动消息类
* 处理用户进入直播间等互动行为
*/
class InteractWordMessage {
constructor(raw) {
this.raw = raw; // 原始消息数据
const data = raw.data; // 互动数据
this.uid = data.uid; // 用户ID
this.uname = data.uname; // 用户名
this.msgType = data.msg_type; // 消息类型(1:进入直播间)
this.timestamp = data.timestamp; // 时间戳
this.score = data.score; // 积分
this.fans_medal = data.fans_medal ? { // 粉丝勋章信息(可能为null)
anchor_roomid: data.fans_medal.anchor_roomid, // 勋章所属主播的房间号
medal_level: data.fans_medal.medal_level, // 勋章等级
medal_name: data.fans_medal.medal_name, // 勋章名称
target_id: data.fans_medal.target_id // 勋章主播的用户ID
} : {
anchor_roomid: 0,
medal_level: 0,
medal_name: '',
target_id: 0
};
}
}
/**
* 舰长购买消息类
* 处理用户购买大航海服务(舰长、提督、总督)的消息
*/
class GuardBuyMessage {
constructor(raw) {
this.raw = raw; // 原始消息数据
const data = raw.data; // 购买数据
this.uid = data.uid; // 购买者用户ID
this.username = data.username; // 购买者用户名
this.guardLevel = data.guard_level;// 舰队等级(3:舰长,2:提督,1:总督)
this.num = data.num; // 购买数量
this.price = data.price; // 单价(金瓜子)
this.giftId = data.gift_id; // 对应礼物ID
this.giftName = data.gift_name; // 对应礼物名称
}
}
/**
* 醒目留言消息类(SuperChat)
* 处理用户发送的付费高亮消息
*/
class SuperChatMessage {
constructor(raw) {
this.raw = raw; // 原始消息数据
const data = raw.data; // SC数据
this.uid = data.uid; // 用户ID
this.uname = data.user_info.uname; // 用户名
this.message = data.message; // 消息内容
this.price = data.price; // 价格(人民币)
this.time = data.time; // 持续时间(秒)
this.startTime = data.start_time; // 开始时间戳
this.endTime = data.end_time; // 结束时间戳
}
}
/**
* 观看人数变化消息类
* 处理直播间观看人数变化的通知
*/
class WatchedChangeMessage {
constructor(data) {
this.num = data.data.num; // 观看人数
this.text_small = data.data.text_small; // 小号文本(如"1.2万人看过")
this.text_large = data.data.text_large; // 大号文本
}
}
/**
* 在线排名计数消息类
* 处理直播间高能用户数量相关信息
*/
class OnlineRankCountMessage {
constructor(data) {
this.count = data.data.count; // 高能用户数量
this.count_text = data.data.count_text; // 高能用户数量文本
this.online_count = data.data.online_count; // 在线用户数量
this.online_count_text = data.data.online_count_text; // 在线用户数量文本
}
}
/**
* 在线排名详情消息类
* 处理直播间高能用户排名详情
*/
class OnlineRankV2Message {
constructor(data) {
this.online_list = data.data.online_list; // 在线用户列表
this.rank_type = data.data.rank_type; // 排名类型
}
}
/**
* 停播房间列表消息类
* 处理批量停播房间的通知
*/
class StopLiveRoomListMessage {
constructor(data) {
this.room_id_list = data.data.room_id_list; // 停播房间ID列表
}
}
/**
* 点赞信息更新消息类
* 处理直播间总点赞数变化的通知
*/
class LikeInfoV3UpdateMessage {
constructor(data) {
this.click_count = data.data.click_count; // 点赞总数
}
}
/**
* 进场特效消息类
* 处理用户进入直播间触发的特效(如舰长进场特效)
*/
class EntryEffectMessage {
constructor(message) {
this.uid = message.data.uid; // 用户ID
this.uname = message.data.copy_writing; // 用户名(从文案中提取)
this.privilege_type = message.data.privilege_type; // 特权类型
this.copy_writing = message.data.copy_writing; // 特效文案(如"欢迎舰长xxx进入直播间")
}
}
/**
* 用户点赞消息类
* 处理单个用户点赞的通知
*/
class LikeClickMessage {
constructor(message) {
this.uid = message.data.uid; // 用户ID
this.uname = message.data.uname; // 用户名
this.like_text = message.data.like_text; // 点赞文本
this.uinfo = message.data.uinfo; // 用户信息
this.fans_medal = message.data.fans_medal ? { // 粉丝勋章信息
anchor_roomid: message.data.fans_medal.anchor_roomid, // 勋章所属主播的房间号
medal_level: message.data.fans_medal.medal_level, // 勋章等级
medal_name: message.data.fans_medal.medal_name, // 勋章名称
target_id: message.data.fans_medal.target_id // 勋章主播的用户ID
} : null;
}
}
/**
* 用户礼物提示V2消息类
* 处理新版礼物提示(主要是大航海)
*/
class UserToastV2Message {
constructor(message) {
const data = message.data;
this.username = data.username; // 用户名
this.guard_level = data.guard_level; // 舰队等级
this.price = data.price; // 价格
this.num = data.num; // 数量
this.unit = data.unit; // 单位
this.role_name = data.role_name; // 角色名称
this.start_time = data.start_time; // 开始时间
this.end_time = data.end_time; // 结束时间
}
}
/**
* 礼物连击消息类
* 处理用户连续赠送同一礼物的信息
*/
class ComboSendMessage {
constructor(message) {
const data = message.data;
this.uid = data.uid; // 用户ID
this.uname = data.uname; // 用户名
this.combo_num = data.combo_num; // 连击数量
this.gift_name = data.gift_name; // 礼物名称
this.gift_id = data.gift_id; // 礼物ID
this.price = data.price; // 单价
this.combo_total_coin = data.combo_total_coin; // 连击总价值(瓜子)
}
}
/**
* 热门榜单变化消息类
* 处理直播间在热门榜单上排名变化的通知
*/
class HotRankChangedMessage {
constructor(message) {
const data = message.data;
this.rank = data.rank; // 当前排名
this.trend = data.trend; // 趋势(0:持平, 1:上升, 2:下降)
this.countdown = data.countdown; // 倒计时
this.timestamp = data.timestamp; // 时间戳
this.web_url = data.web_url; // 网页链接
this.live_url = data.live_url; // 直播链接
this.pc_link_url = data.pc_link_url; // PC端链接
}
}
/**
* 直播状态消息类
* 处理直播开始/结束的通知
*/
class LiveMessage {
constructor(message) {
const data = message.data;
this.live_status = data.live_status; // 直播状态(1:开播, 2:下播)
this.live_time = data.live_time; // 直播时间
this.live_key = data.live_key; // 直播密钥
}
}
/**
* 系统通知消息类
* 处理全平台或房间内的系统通知
*/
class NoticeMsgMessage {
constructor(message) {
const data = message;
this.msg_common = data.msg_common; // 通用消息内容
this.msg_self = data.msg_self; // 自己看到的消息内容
this.link_url = data.link_url; // 链接URL
this.msg_type = data.msg_type; // 消息类型
}
}
/**
* PK对战消息类
* 处理直播间PK对战的状态变化
*/
class PKBattleMessage {
constructor(message) {
const data = message.data;
this.battle_type = data.battle_type; // 对战类型
this.init_info = data.init_info; // 初始信息
this.match_info = data.match_info; // 匹配信息
this.pk_status = data.pk_status; // PK状态
}
}
/**
* PK对战结算消息类
* 处理直播间PK对战结束后的结算信息
*/
class PKBattleSettleMessage {
constructor(message) {
const data = message.data;
this.pk_id = data.pk_id; // PK ID
this.settle_status = data.settle_status; // 结算状态
this.timestamp = data.timestamp; // 时间戳
this.winner = data.winner; // 获胜者信息
}
}
/**
* 直播准备中消息类
* 处理直播间进入准备状态的通知
*/
class PreparingMessage {
constructor(message) {
const data = message.data;
this.roomid = data.roomid; // 房间ID
}
}
/**
* 房间实时信息更新消息类
* 处理直播间粉丝数等实时数据的更新
*/
class RoomRealTimeMessageUpdateMessage {
constructor(message) {
const data = message.data;
this.roomid = data.roomid; // 房间ID
this.fans = data.fans; // 粉丝数
this.red_notice = data.red_notice; // 红色通知
this.fans_club = data.fans_club; // 粉丝团数量
}
}
/**
* 用户礼物提示消息类
* 处理用户赠送礼物的提示
*/
class UserToastMessage {
constructor(message) {
const data = message.data;
this.uid = data.uid; // 用户ID
this.username = data.username; // 用户名
this.toast_msg = data.toast_msg; // 提示消息
this.num = data.num; // 数量
}
}
/**
* 横幅组件消息类
* 处理直播间顶部横幅通知
*/
class WidgetBannerMessage {
constructor(message) {
const data = message.data;
this.timestamp = data.timestamp; // 时间戳
this.widget_list = data.widget_list; // 组件列表
}
}
// 导出所有消息类
module.exports = {
HeartbeatMessage,
DanmakuMessage,
GiftMessage,
InteractWordMessage,
GuardBuyMessage,
SuperChatMessage,
WatchedChangeMessage,
OnlineRankCountMessage,
OnlineRankV2Message,
StopLiveRoomListMessage,
LikeInfoV3UpdateMessage,
LikeClickMessage,
EntryEffectMessage,
UserToastV2Message,
ComboSendMessage,
HotRankChangedMessage,
LiveMessage,
NoticeMsgMessage,
PKBattleMessage,
PKBattleSettleMessage,
PreparingMessage,
RoomRealTimeMessageUpdateMessage,
UserToastMessage,
WidgetBannerMessage
};