B 站直播弹幕 Go 版。 在原项目 基础上作了以下修改:
- 更换tcp(直播姬)的方式为websocket
- 部分修改
go get github.com/dongshimou/bilidanmaku
package main
import "github.com/dongshimou/bilidanmaku"
func main() {
bili := bilidanmaku.NewBiliBiliClient()
bili.RegHandleFunc(bilidanmaku.CmdAll, bilidanmaku.DefaultHandler)
bili.ConnectServer(102)
}
如果你希望订阅不同的事件,请尝试bilidanmaku.Cmd*
开头的一系列常量。
以下是一些示例,你也可以随时在/bilidanmaku
目录下查看.
订阅弹幕事件,并输出弹幕信息
bili := bilidanmaku.NewBiliBiliClient()
bili.RegHandleFunc(bilidanmaku.CmdDanmuMsg, func(c *bilidanmaku.Context) {
dinfo := c.GetDanmuInfo()
log.Printf("[%d]%d 说: %s\r\n", c.RoomID, dinfo.UID, dinfo.Text)
})
进入房间
bili.RegHandleFunc(bilidanmaku.CmdWelcome, func(c *bilidanmaku.Context) {
winfo := c.GetWelcomeInfo()
if winfo.Uname != "" {
log.Printf("[%d]%s 进入了房间\r\n", c.RoomID, winfo.Uname)
} else {
log.Printf("[%d]%d 进入了房间\r\n", c.RoomID, winfo.UID)
}
})
投喂礼物
bili.RegHandleFunc(bilidanmaku.CmdSendGift, func(c *bilidanmaku.Context) {
gInfo := c.GetGiftInfo()
log.Printf("[%d]%s %s 了 %s x %d (价值%.3f)\r\n", c.RoomID, gInfo.Uname, gInfo.Action, gInfo.GiftName, gInfo.Num, float32(gInfo.Price*gInfo.Num)/1000)
})
在线人数变动
bili.RegHandleFunc(bilidanmaku.CmdOnlineChange, func(c *bilidanmaku.Context) bool {
online := c.GetOnlineNumber()
log.Printf("[%d]房间里当前在线:%d\r\n", c.RoomID, online)
})
状态切换为直播开始
bili.RegHandleFunc(bilidanmaku.CmdLive, func(c *bilidanmaku.Context) bool {
online := c.GetOnlineNumber()
log.Println("主播诈尸啦!")
})
状态切换为准备中
bili.RegHandleFunc(bilidanmaku.CmdPreparing, func(c *bilidanmaku.Context) bool {
online := c.GetOnlineNumber()
log.Println("主播正在躺尸")
})
Abort
如果你希望其它调用链不响应,调用c.Abort()
通过注册 bilidanmaku.DebugHandler
,可以在收到直播消息时查看原始消息。
package main
import "github.com/dongshimou/bilidanmaku"
func main() {
bili := bilidanmaku.NewBiliBiliClient()
bili.RegHandleFunc(bilidanmaku.CmdAll, bilidanmaku.DebugHandler)
bili.ConnectServer(102)
}
运行后,当直播间发生事件时,将会输出类似格式的JSON输出:
{
"cmd": "DANMU_MSG",
"info": [
[
0,
1,
25,
16777215,
1517402685,
-136720455,
0,
"c42d0814",
0
],
"干嘛不播啦",
[
30731115,
"Ed在",
0,
0,
0,
10000,
1,
""
],
[],
[
1,
0,
9868950,
"\u003e50000"
],
[],
0,
0,
{
"uname_color": ""
}
]
}
以上示例的是一个弹幕消息.
其中"cmd": "DANMU_MSG"
中的"DANMU_MSG"
,就是调用bili.RegHandleFunc
时需要传入的cmd
参数。
你可以通过bilidanmaku.CmdType("嘿,我是CmdType")
,将string转换为CmdType.
在这之后,你可以使用 bili.RegHandleFunc 或 bili.RegHandler 注册这个CmdType.
通过读取gobilibili.Context传入的Msg,可以处理尚未进行支持的事件. 请搭配上一节的消息调试进行食用。 以下是DefaultHandler的实现。
func DefaultHandler(c *Context) bool {
cmd, err := c.Msg.Get("cmd").String()
if err != nil {
return true
}
if cmd == "LIVE" {
fmt.Println("直播开始。。。")
return false
}
if cmd == "PREPARING" {
fmt.Println("房主准备中。。。")
return false
}
if cmd == "DANMU_MSG" {
commentText, err := c.Msg.Get("info").GetIndex(1).String()
if err != nil {
fmt.Println("Json decode error failed: ", err)
return false
}
commentUser, err := c.Msg.Get("info").GetIndex(2).GetIndex(1).String()
if err != nil {
fmt.Println("Json decode error failed: ", err)
return false
}
fmt.Println(commentUser, " say: ", commentText)
return false
}
return false
}