1.0.5 • Published 10 days ago

bili-live-listener v1.0.5

Weekly downloads
-
License
MIT
Repository
github
Last release
10 days ago

bili-live-listener

NPM Version Bilibili

Bilibili直播间消息监听库。

  • 更优雅的消息监听方式
  • 更丰富的类型导出
  • 持续更新的API
  • 基于 TCP 协议,也许更节省内存

Install

npm i bili-live-listener

Example

import { BiliLive } from 'bili-live-listener'

// 获取直播间长号
const { longRoomId } = getRoomId(510)

// 实例化一个 BiliLive 对象,传入直播间号
// 需要传入登录状态下获取的 key 以及 uid,详情见下方 Options
const biliLive = new BiliLive(longRoomId, {
  key: 'xxxxxxxx', // your key
  uid: 12345678, // your logined uid
  // isBrowser: true // if you are in browser environment
})

// 监听弹幕消息,返回一个移除监听器的函数
const removeHandler = biliLive.onDanmu(({ data }) => {
  console.log(`${data.user.uname} : ${data.content}`)
})

// 移除监听器
removeHandler()

// 切断连接
biliLive.close()

Class Params

!IMPORTANT 叔叔B站修改了获取直播间数据包的要求,现在必须传入登录状态下获取的 key 以及 登录的 uid 才能正常接受到数据包。

BiliLive 的构造函数接受两个参数,分别为 roomIdoptions

roomId

要监听的直播间号,需要传入长号。

node 环境下,可以使用本库提供的 getRoomId 函数获取长号与短号(如果有)。

import { getRoomId } from 'bili-live-listener'

console.log(getRoomId(510))
// => { longRoomId: 80397, shortRoomId: 510 }

console.log(getRoomId(80397))
// => { longRoomId: 80397, shortRoomId: 510 }

options

key

登录状态下获取的 key

登录状态下,在浏览器中访问链接 https://api.live.bilibili.com/room/v1/Room/mobileRoomInit?id={LONG_ROOM_ID} , 找到响应体中的 data.token 即为 key

node 环境下,可以使用本库提供的 getRoomConf 函数获取,示例如下:

import { getRoomConf } from 'bili-live-listener'

// bilibili.com 中的 cookie,注意不要通过 `document.cookie` 获取,而应该通过浏览器发送请求的请求头中的 `cookie` 属性获取
const cookie = 'buvid3=...'

// 注意传入长号
const longRoomId = 80397

const { key } = getRoomConf(longRoomId, cookie)

uid

登录的 uid

登录状态下,在浏览器中访问 https://api.bilibili.com/x/web-interface/nav ,找到响应体中的 data.mid 即为 uid

当然,你也可以直接访问自己的主页,找到 uid

node 环境下,可以使用本库提供的 getLoginedUid 函数获取,示例如下:

import { getLoginedUid } from 'bili-live-listener'

// bilibili.com 中的 cookie,注意不要通过 `document.cookie` 获取,而应该通过浏览器发送请求的请求头中的 `cookie` 属性获取
const cookie = 'buvid3=...'

const uid = getLoginedUid(cookie)

isBrowser

是否在浏览器环境下运行,默认为 false

浏览器环境下必须传入 true

Instance Methods

Common Methods

Instance MethodCallback ParamsTrigger When ...
onOpenvoid连接开启
onLivevoid成功登入房间
onHeartbeatvoid收到服务器心跳包,约30s一次
onClosevoid连接关闭
onErrorerror: any连接 error,同时连接也会关闭

Listen to Raw Message

你可以使用 onRawMessage 方法监听原生消息,以应对B站新增的消息类型。一个例子如下:

// 监听一切消息
biliLive.onRawMessage('msg',(message) => {
  console.log(message)
})

// 监听指定消息
biliLive.onRawMessage('DANMU_MSG',(message) => {
  console.log(message)
})

Message Methods

Instance MethodCallback ParamsTrigger When ...
onDanmuDanmuData收到弹幕消息
onGuardBuyGuardBuyData收到上船消息
onSuperChatSuperChatData收到醒目留言消息
onGiftGiftData收到礼物消息
onWatchedChangeWatchedChangeData“XX人看过”人数变动
onRankCountChangeRankCountChangeData高能榜人数变动
onLikeCountChangeLikeCountChangeData点赞数变动
onNoticeNoticeData收到全站广播
onHotRankUpdateHotRankUpdateData当前直播间的分区排名变动
onFansCountUpdateFansCountUpdateData粉丝数量\粉丝团数量变动
onLiveStartLiveStartData直播开启
onLiveEndLiveEndData直播结束
onInteractInteractData互动消息(用户进入、关注、分享、点赞直播间)
onEntryEffectEntryEffectData有入场特效的用户进入直播间(舰长、提督、总督等)
onRoomChangeRoomChangeData房间信息变动(标题、分区)
onAnchorLotStartAnchorLotStartData天选时刻开始
onAnchorLotEndAnchorLotEndData天选时刻结束
onRedPocketStartRedPocketStartData红包抽奖开始
onRedPocketEndRedPocketEndData红包抽奖结束
onPopularRankUpdatePopularRankUpdateData当前直播间的热门排名变动
onDanmuInteractDanmuInteractData弹幕互动(弹幕投票信息、“他们都在说”类的弹幕连击)

值得注意的是,这些 Message Methods 都会返回一个移除监听器的函数,你可以调用这个函数来移除监听器,参考 这里

Message Type

Common

// 回调函数中的参数类型
export interface Message<T> {
  /** 消息原生类型 */
  cmd: string
  /** 收到消息的时间戳,由 Date.now() 生成 */
  timestamp: number
  /** 类型化后的消息主体 */
  data: T
  /** 原生消息 */
  raw: any
}

!TIP 大部分消息主体 data 中都会包含 timestamp 字段,表示消息到达的更精确的秒时间戳,建议使用这个字段。 而 Message<T> 中的 timestamp 字段,是由 Date.now() 生成的时间戳,也许会有一定的误差。

Data Type

你可以在 src/events 查看所有的消息主体类型,它将作为泛型传入回调函数的参数类型 Message<T> 中。其中部分类型在 src/types/message.ts 中定义。

比如,弹幕消息的消息主体类型为 DanmuData,定义如下:

export interface DanmuData {
  /** 用户信息 */
  user: User
  /** 弹幕内容 */
  content: string
  /** 时间戳 */
  timestamp: number
  /** 是否为抽奖弹幕 */
  isLottery: boolean
  // 弹幕表情
  emoticon?: {
    id: number
    url: string
  }
}

Reference

SocialSisterYi/bilibili-API-collect

lovelyyoshino/Bilibili-Live-API

1.0.5

10 days ago

1.0.4

12 days ago

1.0.3

13 days ago

1.0.2

15 days ago

1.0.1

15 days ago

1.0.0

15 days ago

0.0.5

2 years ago

0.0.4

2 years ago

0.0.3

2 years ago

0.0.2

2 years ago

0.0.1

2 years ago