summaryrefslogtreecommitdiff
path: root/danmaku
diff options
context:
space:
mode:
authorKeuin <[email protected]>2023-07-29 19:43:27 +0800
committerKeuin <[email protected]>2023-07-29 20:21:17 +0800
commit9b5c3913989754370bd7d03ac8cf2e32a6172afb (patch)
tree9e2caca8feb9ca5a9c14a96424d23e20db4314bc /danmaku
parenta153bf02d1cf05f020d263e9670a76ae99cfeb02 (diff)
Simulate real web app cookies & WebSocket fields
Diffstat (limited to 'danmaku')
-rw-r--r--danmaku/client.go42
-rw-r--r--danmaku/dmpkg/auth.go4
-rw-r--r--danmaku/dmpkg/raw.go2
3 files changed, 16 insertions, 32 deletions
diff --git a/danmaku/client.go b/danmaku/client.go
index a94afbf..d7826d0 100644
--- a/danmaku/client.go
+++ b/danmaku/client.go
@@ -23,6 +23,16 @@ type DanmakuClient struct {
wsio wsDatagramIO
}
+func NewClient(ctx context.Context, ws *websocket.Conn) DanmakuClient {
+ return DanmakuClient{
+ ws: ws,
+ wsio: wsDatagramIO{
+ ws: ws,
+ ctx: ctx,
+ },
+ }
+}
+
type DanmakuMessageType int
// wsDatagramIO wraps websocket into a datagram I/O,
@@ -48,34 +58,6 @@ func (w *wsDatagramIO) Get() (data []byte, err error) {
return
}
-func NewDanmakuClient() DanmakuClient {
- return DanmakuClient{
- ws: nil,
- }
-}
-
-func (d *DanmakuClient) Connect(ctx context.Context, url string) error {
- // thread unsafe
-
- // dial
- if d.ws != nil {
- return fmt.Errorf("already connected")
- }
- ws, _, err := websocket.Dial(ctx, url, nil)
- if err != nil {
- return fmt.Errorf("failed to establish WebSocket connection: %w", err)
- }
- d.ws = ws
-
- // init wsio
- d.wsio = wsDatagramIO{
- ws: ws,
- ctx: ctx,
- }
-
- return nil
-}
-
func (d *DanmakuClient) Disconnect() error {
// thread unsafe
ws := d.ws
@@ -87,8 +69,8 @@ func (d *DanmakuClient) Disconnect() error {
return ws.Close(websocket.StatusInternalError, "disconnected")
}
-func (d *DanmakuClient) Authenticate(roomId types.RoomId, authKey string) error {
- pkg := dmpkg.NewAuth(dmpkg.ProtoBrotli, roomId, authKey)
+func (d *DanmakuClient) Authenticate(roomId types.RoomId, authKey, buvid3 string) error {
+ pkg := dmpkg.NewAuth(dmpkg.ProtoBrotli, roomId, authKey, buvid3)
data, err := pkg.Marshal()
if err != nil {
return fmt.Errorf("exchange marshal failed: %w", err)
diff --git a/danmaku/dmpkg/auth.go b/danmaku/dmpkg/auth.go
index b6a90d3..81c365e 100644
--- a/danmaku/dmpkg/auth.go
+++ b/danmaku/dmpkg/auth.go
@@ -15,17 +15,19 @@ type authInfo struct {
UID uint64 `json:"uid"`
RoomId types.RoomId `json:"roomid"`
ProtoVer int `json:"protover"`
+ BUVID3 string `json:"buvid"`
Platform string `json:"platform"`
Type int `json:"type"`
Key string `json:"key"`
}
// NewAuth creates a new authentication exchange.
-func NewAuth(protocol ProtocolVer, roomId types.RoomId, authKey string) (exc DanmakuExchange) {
+func NewAuth(protocol ProtocolVer, roomId types.RoomId, authKey, buvid3 string) (exc DanmakuExchange) {
exc, _ = NewPlainExchange(OpConnect, authInfo{
UID: UidGuest,
RoomId: roomId,
ProtoVer: int(protocol),
+ BUVID3: buvid3,
Platform: PlatformWeb,
Type: AuthTypeDefault,
Key: authKey,
diff --git a/danmaku/dmpkg/raw.go b/danmaku/dmpkg/raw.go
index 34cd2e6..6de10d7 100644
--- a/danmaku/dmpkg/raw.go
+++ b/danmaku/dmpkg/raw.go
@@ -37,7 +37,7 @@ func NewPlainExchange(operation Operation, body interface{}) (exc DanmakuExchang
DanmakuExchangeHeader: DanmakuExchangeHeader{
Length: uint32(length),
HeaderLength: HeaderLength,
- ProtocolVer: ProtoPlainJson,
+ ProtocolVer: ProtoMinimal,
Operation: operation,
SequenceId: SequenceId,
},