diff --git a/blivedm/client.py b/blivedm/client.py index 49d0fa2..b9715f9 100644 --- a/blivedm/client.py +++ b/blivedm/client.py @@ -216,10 +216,11 @@ class BLiveClient: async def stop_and_close(self): """ - 停止本客户端并释放本客户端的资源,调用后本客户端将不可用 + 便利函数,停止本客户端并释放本客户端的资源,调用后本客户端将不可用 """ - self.stop() - await self.join() + if self.is_running: + self.stop() + await self.join() await self.close() async def join(self): @@ -230,7 +231,7 @@ class BLiveClient: logger.warning('room=%s client is stopped, cannot join()', self.room_id) return - await self._network_future + await asyncio.shield(self._network_future) async def close(self): """ @@ -492,7 +493,7 @@ class BLiveClient: # 业务消息,可能有多个包一起发,需要分包 while True: body = data[offset + header.raw_header_size: offset + header.pack_len] - await self.__parse_business_message(header, body) + await self._parse_business_message(header, body) offset += header.pack_len if offset >= len(data): @@ -524,7 +525,7 @@ class BLiveClient: logger.warning('room=%d unknown message operation=%d, header=%s, body=%s', self.room_id, header.operation, header, body) - async def __parse_business_message(self, header: HeaderTuple, body: bytes): + async def _parse_business_message(self, header: HeaderTuple, body: bytes): """ 解析业务消息 """ diff --git a/sample.py b/sample.py index cc421c7..ea3f51e 100644 --- a/sample.py +++ b/sample.py @@ -1,51 +1,90 @@ # -*- coding: utf-8 -*- import asyncio +import random import blivedm +# 直播间ID的取值看直播间URL +TEST_ROOM_IDS = [ + 12235923, + 14327465, + 21396545, + 21449083, + 23105590, +] + async def main(): - # 直播间ID的取值看直播间URL + await run_single_client() + await run_multi_client() + + +async def run_single_client(): + """ + 演示监听一个直播间 + """ + room_id = random.choice(TEST_ROOM_IDS) # 如果SSL验证失败就把ssl设为False,B站真的有过忘续证书的情况 - client = blivedm.BLiveClient(room_id=21449083, ssl=True) + client = blivedm.BLiveClient(room_id, ssl=True) handler = MyHandler() client.add_handler(handler) client.start() try: - # 5秒后停止,测试用 - # await asyncio.sleep(5) - # client.stop() + # 演示5秒后停止 + await asyncio.sleep(5) + client.stop() await client.join() finally: - await client.close() + await client.stop_and_close() + + +async def run_multi_client(): + """ + 演示同时监听多个直播间 + """ + clients = [blivedm.BLiveClient(room_id) for room_id in TEST_ROOM_IDS] + handler = MyHandler() + for client in clients: + client.add_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() - - # 入场消息回调 - async def __interact_word_callback(self, client: blivedm.BLiveClient, command: dict): - print(f"INTERACT_WORD: self_type={type(self).__name__}, room_id={client.room_id}," - f" uname={command['data']['uname']}") - _CMD_CALLBACK_DICT['INTERACT_WORD'] = __interact_word_callback # noqa + # # 演示如何添加自定义回调 + # _CMD_CALLBACK_DICT = blivedm.BaseHandler._CMD_CALLBACK_DICT.copy() + # + # # 入场消息回调 + # async def __interact_word_callback(self, client: blivedm.BLiveClient, command: dict): + # print(f"[{client.room_id}] INTERACT_WORD: self_type={type(self).__name__}, room_id={client.room_id}," + # f" uname={command['data']['uname']}") + # _CMD_CALLBACK_DICT['INTERACT_WORD'] = __interact_word_callback # noqa async def _on_heartbeat(self, client: blivedm.BLiveClient, message: blivedm.HeartbeatMessage): - print(f'当前人气值:{message.popularity}') + print(f'[{client.room_id}] 当前人气值:{message.popularity}') async def _on_danmaku(self, client: blivedm.BLiveClient, message: blivedm.DanmakuMessage): - print(f'{message.uname}:{message.msg}') + print(f'[{client.room_id}] {message.uname}:{message.msg}') async def _on_gift(self, client: blivedm.BLiveClient, message: blivedm.GiftMessage): - print(f'{message.uname} 赠送{message.gift_name}x{message.num} ({message.coin_type}币x{message.total_coin})') + print(f'[{client.room_id}] {message.uname} 赠送{message.gift_name}x{message.num}' + f' ({message.coin_type}瓜子x{message.total_coin})') async def _on_buy_guard(self, client: blivedm.BLiveClient, message: blivedm.GuardBuyMessage): - print(f'{message.username} 购买{message.gift_name}') + print(f'[{client.room_id}] {message.username} 购买{message.gift_name}') async def _on_super_chat(self, client: blivedm.BLiveClient, message: blivedm.SuperChatMessage): - print(f'醒目留言 ¥{message.price} {message.uname}:{message.message}') + print(f'[{client.room_id}] 醒目留言 ¥{message.price} {message.uname}:{message.message}') if __name__ == '__main__':