update api. openblive

This commit is contained in:
aynakeya
2024-04-08 00:55:17 -07:00
parent 5bfed2f8bb
commit 29305264ed
8 changed files with 209 additions and 20 deletions

View File

@@ -13,7 +13,7 @@ const apiServer = "http://0.0.0.0:9090"
func main() {
provider := openblive.NewOpenBLiveClientProvider(apiServer, 1661006726438)
room := provider(liveroom.LiveRoomConfig{
room, _ := provider(liveroom.LiveRoomConfig{
Room: "YOUR_CLIENT_KEY",
Provider: openblive.ProviderName,
})

42
example/webdm/webdm.go Normal file
View File

@@ -0,0 +1,42 @@
package main
import (
"fmt"
"liveroom"
"liveroom/provider/openblive"
"os"
"os/signal"
"time"
)
const apiServer = "http://0.0.0.0:9090"
func main() {
provider := web.NewOpenBLiveClientProvider(apiServer, 1661006726438)
room := provider(liveroom.LiveRoomConfig{
Room: "YOUR_CLIENT_KEY",
Provider: openblive.ProviderName,
})
room.OnMessage(func(msg *liveroom.Message) {
fmt.Println(msg.User.Username, msg.User.Uid, msg.User.Medal.Name, msg.Message)
})
room.OnStatusChange(
func(connected bool) {
if connected {
fmt.Println("Connected")
} else {
fmt.Println("Disconnected")
}
})
room.OnDisconnect(
func(liveroom liveroom.LiveRoom) {
fmt.Println("Disconnected AAAAAAAa")
})
fmt.Println("connect", room.Connect())
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt, os.Kill)
<-quit
fmt.Println("disconnect", room.Disconnect())
time.Sleep(3 * time.Second)
fmt.Println("Bye")
}

8
go.mod
View File

@@ -3,12 +3,20 @@ module liveroom
go 1.20
require (
github.com/AynaLivePlayer/blivedm-go v0.0.0-20240408074929-6565ab41764b
github.com/aynakeya/open-bilibili-live v0.0.3
github.com/go-resty/resty/v2 v2.7.0
github.com/spf13/cast v1.5.1
)
require (
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/tidwall/gjson v1.16.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
golang.org/x/net v0.0.0-20211029224645-99673261e6eb // indirect
golang.org/x/sys v0.12.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
)

View File

@@ -5,7 +5,7 @@ type LiveRoomConfig struct {
Room string `json:"room"` // RoomID is the unique identifier of the live room
}
type LiveRoomProvider func(cfg LiveRoomConfig) LiveRoom
type LiveRoomProvider func(cfg LiveRoomConfig) (LiveRoom, error)
type UserMedal struct {
Name string `json:"name"`

View File

@@ -2,8 +2,10 @@ package openblive
import (
"context"
"errors"
openblive "github.com/aynakeya/open-bilibili-live"
"liveroom"
"liveroom/utils"
"strconv"
)
@@ -19,27 +21,14 @@ type OpenBLiveClient struct {
}
func NewOpenBLiveClientProvider(apiServer string, appId int64) liveroom.LiveRoomProvider {
return func(cfg liveroom.LiveRoomConfig) liveroom.LiveRoom {
return func(cfg liveroom.LiveRoomConfig) (liveroom.LiveRoom, error) {
if cfg.Provider != ProviderName {
return nil
return nil, errors.New("invalid provider name")
}
return &OpenBLiveClient{
cfg: cfg,
openbliveClient: openblive.NewBliveClient(appId, cfg.Room, newRemoteApiClient(apiServer)),
}
}
}
func guardLevelToPrivilege(level int) int {
switch level {
case 1:
return liveroom.PrivilegeUltimate
case 2:
return liveroom.PrivilegeAdvanced
case 3:
return liveroom.PrivilegeBasic
default:
return liveroom.PrivilegeNone
}, nil
}
}
@@ -47,16 +36,20 @@ func (o *OpenBLiveClient) danmuHandler(data openblive.DanmakuData) {
if o.onMessage == nil {
return
}
roomId := strconv.Itoa(data.RoomID)
if data.FansMedalName == "" {
roomId = ""
}
o.onMessage(&liveroom.Message{
User: liveroom.User{
Uid: data.OpenID,
Username: data.UName,
Admin: false, // not supported by open bilibili live
Privilege: guardLevelToPrivilege(data.GuardLevel),
Privilege: utils.BilibiliGuardLevelToPrivilege(data.GuardLevel),
Medal: liveroom.UserMedal{
Name: data.FansMedalName,
Level: data.FansMedalLevel,
RoomID: strconv.Itoa(data.RoomID),
RoomID: roomId,
},
},
Message: data.Msg,

View File

@@ -0,0 +1,50 @@
package web
import (
"encoding/json"
"errors"
"github.com/AynaLivePlayer/blivedm-go/api"
"github.com/go-resty/resty/v2"
"strconv"
)
type remoteApi struct {
client *resty.Client
}
type apiData struct {
UID int `json:"uid"`
DanmuInfo api.DanmuInfo `json:"danmu_info"`
Error string `json:"error"`
}
type apiResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data apiData `json:"data"`
}
func (r remoteApi) GetDanmuInfo(roomID int) (int, *api.DanmuInfo, error) {
resp, err := r.client.R().
SetQueryParam("room_id", strconv.Itoa(roomID)).
Get("/api/blivedm/web/dm_info")
if err != nil {
return 0, nil, err
}
var sceneResp apiResponse
err = json.Unmarshal(resp.Body(), &sceneResp)
if err != nil {
return 0, nil, err
}
if sceneResp.Code != 0 {
return 0, nil, errors.New(sceneResp.Msg)
}
if sceneResp.Data.Error != "" {
return 0, nil, errors.New(sceneResp.Data.Error)
}
return sceneResp.Data.UID, &sceneResp.Data.DanmuInfo, nil
}
func (r remoteApi) GetRoomInfo(roomID int) (*api.RoomInfo, error) {
return api.GetRoomInfo(roomID)
}

95
provider/webdm/web.go Normal file
View File

@@ -0,0 +1,95 @@
package web
import (
"errors"
"github.com/AynaLivePlayer/blivedm-go/client"
"github.com/AynaLivePlayer/blivedm-go/message"
"github.com/go-resty/resty/v2"
"github.com/spf13/cast"
"liveroom"
"liveroom/utils"
)
const ProviderName = "biliweb"
type WebDanmuClient struct {
cfg liveroom.LiveRoomConfig
webDmClient *client.Client
onMessage func(msg *liveroom.Message)
onDisconnect func(liveroom liveroom.LiveRoom)
onStatusChange func(connected bool)
}
func NewWebDanmuClientProvider(apiServer string) liveroom.LiveRoomProvider {
return func(cfg liveroom.LiveRoomConfig) (liveroom.LiveRoom, error) {
if cfg.Provider != ProviderName {
return nil, errors.New("invalid provider name")
}
roomId, err := cast.ToIntE(cfg.Room)
if err != nil {
return nil, errors.New("invalid room id, should be integer")
}
room := &WebDanmuClient{
cfg: cfg,
webDmClient: client.NewClientWithApi(roomId, &remoteApi{client: resty.New().SetBaseURL(apiServer)}),
}
room.webDmClient.OnDanmaku(room.danmuHandler)
return room, nil
}
}
func (w *WebDanmuClient) GetName() string {
return ProviderName
}
func (w *WebDanmuClient) Config() *liveroom.LiveRoomConfig {
return &w.cfg
}
func (w *WebDanmuClient) danmuHandler(data *message.Danmaku) {
if w.onMessage == nil {
return
}
w.onMessage(&liveroom.Message{
User: liveroom.User{
Uid: cast.ToString(data.Sender.Uid),
Username: data.Sender.Uname,
Admin: data.Sender.Admin,
Privilege: data.Sender.GuardLevel,
Medal: liveroom.UserMedal{
Name: data.Sender.Medal.Name,
Level: utils.BilibiliGuardLevelToPrivilege(data.Sender.GuardLevel),
RoomID: cast.ToString(data.Sender.Medal.UpRoomId),
},
},
Message: data.Content,
})
}
func (w *WebDanmuClient) Connect() error {
err := w.webDmClient.Start()
if err == nil && w.onStatusChange != nil {
w.onStatusChange(true)
}
return err
}
func (w *WebDanmuClient) Disconnect() error {
w.webDmClient.Stop()
if w.onStatusChange != nil {
w.onStatusChange(false)
}
return nil
}
func (w *WebDanmuClient) OnDisconnect(f func(liveroom liveroom.LiveRoom)) {
w.onDisconnect = f
}
func (w *WebDanmuClient) OnStatusChange(f func(connected bool)) {
w.onStatusChange = f
}
func (w *WebDanmuClient) OnMessage(f func(msg *liveroom.Message)) {
w.onMessage = f
}

1
utils/bilibili.go Normal file
View File

@@ -0,0 +1 @@
package utils