-
Notifications
You must be signed in to change notification settings - Fork 229
/
sample.py
120 lines (92 loc) · 3.62 KB
/
sample.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# -*- coding: utf-8 -*-
import asyncio
import http.cookies
import random
from typing import *
import aiohttp
import blivedm
import blivedm.models.web as web_models
# 直播间ID的取值看直播间URL
TEST_ROOM_IDS = [
12235923,
14327465,
21396545,
21449083,
23105590,
]
# 这里填一个已登录账号的cookie的SESSDATA字段的值。不填也可以连接,但是收到弹幕的用户名会打码,UID会变成0
SESSDATA = ''
session: Optional[aiohttp.ClientSession] = None
async def main():
init_session()
try:
await run_single_client()
await run_multi_clients()
finally:
await session.close()
def init_session():
cookies = http.cookies.SimpleCookie()
cookies['SESSDATA'] = SESSDATA
cookies['SESSDATA']['domain'] = 'bilibili.com'
global session
session = aiohttp.ClientSession()
session.cookie_jar.update_cookies(cookies)
async def run_single_client():
"""
演示监听一个直播间
"""
room_id = random.choice(TEST_ROOM_IDS)
client = blivedm.BLiveClient(room_id, session=session)
handler = MyHandler()
client.set_handler(handler)
client.start()
try:
# 演示5秒后停止
await asyncio.sleep(5)
client.stop()
await client.join()
finally:
await client.stop_and_close()
async def run_multi_clients():
"""
演示同时监听多个直播间
"""
clients = [blivedm.BLiveClient(room_id, session=session) for room_id in TEST_ROOM_IDS]
handler = MyHandler()
for client in clients:
client.set_handler(handler)
client.start()
try:
await asyncio.gather(*(
client.join() for client in clients
))
finally:
await asyncio.gather(*(
client.stop_and_close() for client in clients
))
class MyHandler(blivedm.BaseHandler):
# # 演示如何添加自定义回调
# _CMD_CALLBACK_DICT = blivedm.BaseHandler._CMD_CALLBACK_DICT.copy()
#
# # 看过数消息回调
# def __watched_change_callback(self, client: blivedm.BLiveClient, command: dict):
# print(f'[{client.room_id}] WATCHED_CHANGE: {command}')
# _CMD_CALLBACK_DICT['WATCHED_CHANGE'] = __watched_change_callback # noqa
def _on_heartbeat(self, client: blivedm.BLiveClient, message: web_models.HeartbeatMessage):
print(f'[{client.room_id}] 心跳')
def _on_danmaku(self, client: blivedm.BLiveClient, message: web_models.DanmakuMessage):
print(f'[{client.room_id}] {message.uname}:{message.msg}')
def _on_gift(self, client: blivedm.BLiveClient, message: web_models.GiftMessage):
print(f'[{client.room_id}] {message.uname} 赠送{message.gift_name}x{message.num}'
f' ({message.coin_type}瓜子x{message.total_coin})')
# def _on_buy_guard(self, client: blivedm.BLiveClient, message: web_models.GuardBuyMessage):
# print(f'[{client.room_id}] {message.username} 上舰,guard_level={message.guard_level}')
def _on_user_toast_v2(self, client: blivedm.BLiveClient, message: web_models.UserToastV2Message):
print(f'[{client.room_id}] {message.username} 上舰,guard_level={message.guard_level}')
def _on_super_chat(self, client: blivedm.BLiveClient, message: web_models.SuperChatMessage):
print(f'[{client.room_id}] 醒目留言 ¥{message.price} {message.uname}:{message.message}')
# def _on_interact_word(self, client: blivedm.BLiveClient, message: web_models.InteractWordMessage):
# if message.msg_type == 1:
# print(f'[{client.room_id}] {message.username} 进入房间')
if __name__ == '__main__':
asyncio.run(main())