diff --git a/README.md b/README.md index b2086ac..c500fa2 100644 --- a/README.md +++ b/README.md @@ -58,13 +58,71 @@ ``` +## 同时监听多个直播间 + +```python +import asyncio +from blive import BLiver, Events, BLiverCtx +from blive.msg import DanMuMsg + + +# 定义弹幕事件handler +async def listen(ctx: BLiverCtx): + danmu = DanMuMsg(ctx.body) + print( + f'\n{danmu.sender.name} ({danmu.sender.medal.medal_name}:{danmu.sender.medal.medal_level}): "{danmu.content}"\n' + ) + + +async def main(): + # 两个直播间 + ke = BLiver(605) + azi = BLiver(510) + + # 注册handler + ke.register_handler(Events.DANMU_MSG, listen) + azi.register_handler(Events.DANMU_MSG, listen) + + # 以异步task的形式运行 + task1 = ke.run_as_task() + task2 = azi.run_as_task() + + # await 两个任务 + await asyncio.gather(*[task1, task2]) + + +if __name__ == "__main__": + loop = asyncio.get_event_loop() + loop.run_until_complete(main()) +``` + +## 作为协议解析工具在其他地方使用(伪代码) + +```python +from blive.core import BWS_MsgPackage + +packman = BWS_MsgPackage() # 实例化一个消息包处理器 + +while True: + data = ws.receive() # 当收到消息时 + msg = packman.unpack(data) # 使用packman解析消息,返回一个形如 [(header,body), (header,body), ... ] 数组 + # 如果你想发送弹幕之类的消息,可以自行构建消息数据并使用packman.pack方法打包消息 + print(msg) +``` + ## 项目简介 - blive 文件夹为框架代码 -- app.py 为一个简单示例 + + - core.py 为B站ws直播聊天室协议包处理的核心代码 + + - framework.py 为框架代码 + + - msg.py 为消息操作类代码 + +- app.py , multi_room.py 为2个简单示例,分别是以框架运行和同时监听多个直播间的实现 ## TODO -- 打包发布 -- 更多的消息操作类 -- 尝试加入中间件架构 +- 更多的消息操作类(欢迎各位提pr) +- 尝试加入中间件架构(目前感觉需求不大) diff --git a/blive/framework.py b/blive/framework.py index 908d1ec..08e40a1 100644 --- a/blive/framework.py +++ b/blive/framework.py @@ -74,8 +74,9 @@ class Processor: class BLiver: - def __init__(self, roomid, logger=None, log_level="INFO"): + def __init__(self, roomid, uid=0, logger=None, log_level="INFO"): self.roomid = roomid + self.uid = uid self.real_roomid, self.uname = get_blive_room_info(roomid) if not logger: self.logger = loguru.logger @@ -175,7 +176,8 @@ class BLiver: # 发送认证 await ws.send_bytes( self.packman.pack( - certification(self.real_roomid, token), Operation.AUTH + certification(self.real_roomid, token, uid=self.uid), + Operation.AUTH, ) ) return