blive-message-listener
Bilibili 直播间弹幕监听器,支持类型输出。
import { startListen, type MsgHandler } from 'blive-message-listener' // 浏览器环境,从 '/browser' 导入 startListen // import { startListen } from 'blive-message-listener/browser' const handler: MsgHandler = { onIncomeDanmu: (msg) => { console.log(msg.id, msg.body) }, onIncomeSuperChat: (msg) => { console.log(msg.id, msg.body) }, } const instance = startListen(652581, handler) instance.close()
const startListen: (roomId: number, handler: MsgHandler) => MessageListener export interface MessageListener { /** 直播间房间号 */ roomId: number /** 关闭连接 */ close: () => void /** 刷新当前直播间热度 */ getAttention: () => Promise<number> } export interface Message<T> { /** 消息id */ id: string, /** 接收消息的时间,毫秒时间戳 */ timestamp: number, /** 消息类型 */ type: string, /** 消息内容 */ body: T } export interface User { /** 用户uid */ uid: number /** 用户名 */ uname: string /** 用户头像 */ face?: string /** 用户牌子·*/ badge?: { /** 是否点亮 */ active: boolean /** 牌子名称 */ name: string /** 牌子等级 */ level: number /** 牌子颜色 */ color: string /** 主播信息 */ anchor: { /** 主播uid */ uid: number /** 主播用户名 */ uname: string /** 主播房间号 */ room_id: number /** 是否为本直播间 */ is_same_room?: boolean } } /** 用户身份 */ identity?: { /** 直播榜单排名 */ rank: 0 | 1 | 2 | 3 /** 大航海信息 */ guard_level: GuardLevel /** 房管 */ room_admin: boolean } } export enum GuardLevel { /** 无 */ None = 0, /** 总督 */ Zongdu = 1, /** 提督 */ Tidu = 2, /** 舰长 */ Jianzhang = 3, }
export type Handler = { /** 用户进入、关注、分享直播间 */ onUserAction: (msg: Message<UserActionMsg>) => void } type msgType = 'INTERACT_WORD' | 'ENTRY_EFFECT' type UserAction = 'enter' | 'follow' | 'share' | 'unknown' export interface UserActionMsg { user: User /** 事件类型 */ action: UserAction /** 事件时间,毫秒时间戳 */ timestamp: number }
export type Handler = { /** 直播间信息修改 */ onRoomInfoChange: (msg: Message<RoomInfoChangeMsg>) => void } type msgType = 'ROOM_CHANGE' export interface RoomInfoChangeMsg { /** 直播间标题 */ title: number /** 一级分区id */ parent_area_id: number /** 一级分区名 */ parent_area_name: number /** 二级分区id */ area_id: number /** 二级分区名 */ area_name: number }
export type Handler = { /** 收到普通弹幕消息 */ onIncomeDanmu: (msg: Message<DanmuMsg>) => void } type msgType = 'DANMU_MSG' export interface DanmuMsg { user: User /** 弹幕内容 */ content: string /** 发送时间,毫秒时间戳 */ timestamp: number /** 是否为天选抽奖弹幕 */ lottery: boolean /** 弹幕表情 */ emoticon?: { id: string height: number width: number url: string } }
export type Handler = { /** 收到醒目留言 */ onIncomeSuperChat: (msg: Message<SuperChatMsg>) => void } type msgType = 'SUPER_CHAT_MESSAGE' export interface SuperChatMsg { user: User /** 弹幕内容 */ content: string /** 弹幕颜色 */ content_color: string /** 价格,RMB */ price: number /** 持续时间 */ time: number }
is_same_room
是否为本直播间。export type Handler = { /** 收到礼物 */ onGift: (msg: Message<GiftMsg>) => void } type msgType = 'SEND_GIFT' export interface GiftMsg { user: User /** 礼物id */ gift_id: number /** 礼物名称 */ gift_name: string /** 礼物价格类型 */ coin_type: 'silver' | 'gold' /** 礼物价格,除以1000为RMB */ price: number /** 礼物数量 */ amount: number /** 送礼指向主播信息,多人直播间可指定要送给的主播,单人直播间为空 */ send_master?: { uid: number uname: string room_id: number } /** 礼物连击 */ combo?: { /** 连击id */ batch_id: string /** 当前连击数(礼物总数) */ combo_num: number /** 连击礼物总价格,除以1000为RMB */ total_price: number } }
export type Handler = { /** 舰长上舰消息 */ onGuardBuy: (msg: Message<GuardBuyMsg>) => void } type msgType = 'GUARD_BUY' export interface GuardBuyMsg { user: User /** 礼物id */ gift_id: number /** 礼物名称 */ gift_name: string /** 大航海信息 */ guard_level: GuardLevel /** 价格,RMB */ price: number /** 等级生效时间 */ start_time: number /** 等级过期时间 */ end_time: number }