From 2f705b86ce02e4c8c93ca6d066964747160fd617 Mon Sep 17 00:00:00 2001 From: John Smith Date: Wed, 12 Jun 2019 22:32:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=94=99=E8=AF=AF=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blivedm.py | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/blivedm.py b/blivedm.py index 1eb4664..83a2c69 100644 --- a/blivedm.py +++ b/blivedm.py @@ -3,11 +3,10 @@ import asyncio import json import logging +import ssl as ssl_ import struct from collections import namedtuple from enum import IntEnum -# noinspection PyProtectedMember -from ssl import _create_unverified_context from typing import * import aiohttp @@ -232,14 +231,17 @@ class BLiveClient: ) } for cmd in ( # 其他已知命令 - # 从前端扒来的 - '66FFFF', 'SYS_MSG', 'SYS_GIFT', 'GUARD_MSG', 'LIVE', 'PREPARING', 'END', 'CLOSE', + 'SYS_MSG', 'SYS_GIFT', 'GUARD_MSG', 'LIVE', 'PREPARING', 'END', 'CLOSE', 'BLOCK', 'ROUND', 'WELCOME', 'REFRESH', 'ACTIVITY_RED_PACKET', 'ROOM_LIMIT', - 'PK_PRE', 'PK_END', 'PK_SETTLE', 'PK_MIC_END', - # 其他遇到的 - 'COMBO_SEND', 'COMBO_END', 'ROOM_RANK', 'NOTICE_MSG', 'WELCOME_GUARD', + 'PK_MATCH', 'PK_PRE', 'PK_START', 'PK_PROCESS', 'PK_END', 'PK_SETTLE', 'PK_MIC_END', + 'PK_AGAIN', 'COMBO_SEND', 'COMBO_END', 'ROOM_RANK', 'NOTICE_MSG', 'WELCOME_GUARD', 'WISH_BOTTLE', 'RAFFLE_START', 'ENTRY_EFFECT', 'ROOM_REAL_TIME_MESSAGE_UPDATE', - 'USER_TOAST_MSG', 'GUARD_LOTTERY_START' + 'USER_TOAST_MSG', 'GUARD_LOTTERY_START', 'ROOM_BLOCK_MSG', 'ACTIVITY_MATCH_GIFT', + 'CHANGE_ROOM_INFO', 'CUT_OFF', 'WARNING', 'LUCK_GIFT_AWARD_USER', + 'MESSAGEBOX_USER_GAIN_MEDAL', 'RAFFLE_END', 'ROOM_REFRESH', 'ROOM_SKIN_MSG', + 'SCORE_CARD', 'TV_START', 'TV_END', 'ROOM_BLOCK_INTO', 'ROOM_KICKOUT', 'ROOM_LOCK', + 'ROOM_SILENT_ON', 'ROOM_SILENT_OFF', 'SEND_TOP', 'SPECIAL_GIFT', 'WIN_ACTIVITY', + 'HOUR_RANK_AWARDS', 'LOL_ACTIVITY', 'ROOM_REAL_TIME_MESSAGE_UPDATE' ): _COMMAND_HANDLERS[cmd] = None @@ -261,6 +263,7 @@ class BLiveClient: if loop is not None: self._loop = loop elif session is not None: + # noinspection PyDeprecation self._loop = session.loop else: self._loop = asyncio.get_event_loop() @@ -272,9 +275,11 @@ class BLiveClient: else: self._session = session self._own_session = False + # noinspection PyDeprecation if self._session.loop is not self._loop: raise RuntimeError('BLiveClient and session has to use same event loop') - self._ssl = ssl if ssl else _create_unverified_context() + # noinspection PyProtectedMember + self._ssl = ssl if ssl else ssl_._create_unverified_context() self._websocket = None @property @@ -317,8 +322,17 @@ class BLiveClient: if self._future is not None: raise RuntimeError('This client is already running') self._future = asyncio.ensure_future(self._message_loop(), loop=self._loop) + self._future.add_done_callback(self.__on_message_loop_done) return self._future + def __on_message_loop_done(self, future): + self._future = None + logger.debug('room %s 消息协程结束', self.room_id) + exception = future.exception() + if exception is not None: + logger.exception('room %s 消息协程异常结束:', self.room_id, + exc_info=(type(exception), exception, exception.__traceback__)) + def stop(self): """ 停止相关的协程 @@ -384,11 +398,17 @@ class BLiveClient: self._websocket = websocket await self._send_auth() heartbeat_future = asyncio.ensure_future(self._heartbeat_loop(), loop=self._loop) + heartbeat_future.add_done_callback( + lambda _future: logger.debug('room %d 心跳循环结束', self.room_id) + ) # 处理消息 async for message in websocket: # type: aiohttp.WSMessage if message.type == aiohttp.WSMsgType.BINARY: - await self._handle_message(message.data) + try: + await self._handle_message(message.data) + except: + logger.exception('room %d 处理消息时发生错误:', self.room_id) else: logger.warning('room %d 未知的websocket消息:type=%s %s', self.room_id, message.type, message.data) @@ -398,6 +418,10 @@ class BLiveClient: except (aiohttp.ClientConnectorError, asyncio.TimeoutError): # 重连 pass + except ssl_.SSLError: + logger.exception('SSL错误:') + # 证书错误时无法重连 + break finally: if heartbeat_future is not None: heartbeat_future.cancel() @@ -414,8 +438,6 @@ class BLiveClient: except asyncio.CancelledError: break - self._future = None - async def _heartbeat_loop(self): while True: try: