From 3156142011c31343fb8acc0c14233c2b7ae0070f Mon Sep 17 00:00:00 2001 From: John Smith Date: Sun, 11 Oct 2020 12:43:11 +0800 Subject: [PATCH] =?UTF-8?q?init=5Froom=E6=94=AF=E6=8C=81=E9=99=8D=E7=BA=A7?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E9=AB=98=E5=8F=AF=E7=94=A8=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blivedm.py | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/blivedm.py b/blivedm.py index 4d50971..851746c 100644 --- a/blivedm.py +++ b/blivedm.py @@ -16,6 +16,9 @@ logger = logging.getLogger(__name__) ROOM_INIT_URL = 'https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom' DANMAKU_SERVER_CONF_URL = 'https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo' +DEFAULT_DANMAKU_SERVER_LIST = [ + {'host': 'broadcastlv.chat.bilibili.com', 'port': 2243, 'wss_port': 443, 'ws_port': 2244} +] HEADER_STRUCT = struct.Struct('>I2H2I') HeaderTuple = namedtuple('HeaderTuple', ('pack_len', 'raw_header_size', 'ver', 'operation', 'seq_id')) @@ -434,6 +437,24 @@ class BLiveClient: return self._future async def init_room(self): + """ + :return: True代表没有降级,如果需要降级后还可用,重载这个函数返回True + """ + res = True + if not await self._init_room_id_and_owner(): + res = False + # 失败了则降级 + self._room_id = self._room_short_id = self._tmp_room_id + self._room_owner_uid = 0 + + if not await self._init_host_server(): + res = False + # 失败了则降级 + self._host_server_list = DEFAULT_DANMAKU_SERVER_LIST + self._host_server_token = None + return res + + async def _init_room_id_and_owner(self): try: async with self._session.get(ROOM_INIT_URL, params={'room_id': self._tmp_room_id}, ssl=self._ssl) as res: @@ -450,7 +471,16 @@ class BLiveClient: except aiohttp.ClientConnectionError: logger.exception('room %d init_room失败:', self._tmp_room_id) return False + return True + def _parse_room_init(self, data): + room_info = data['room_info'] + self._room_id = room_info['room_id'] + self._room_short_id = room_info['short_id'] + self._room_owner_uid = room_info['uid'] + return True + + async def _init_host_server(self): try: async with self._session.get(DANMAKU_SERVER_CONF_URL, params={'id': self._room_id, 'type': 0}, ssl=self._ssl) as res: @@ -462,21 +492,19 @@ class BLiveClient: if data['code'] != 0: logger.warning('room %d getConf失败:%s', self._room_id, data['msg']) return False - self._host_server_list = data['data']['host_list'] - self._host_server_token = data['data']['token'] - if not self._host_server_list: - logger.warning('room %d getConf失败:host_server_list为空') + if not self._parse_danmaku_server_conf(data['data']): return False except aiohttp.ClientConnectionError: logger.exception('room %d getConf失败:', self._room_id) return False return True - def _parse_room_init(self, data): - room_info = data['room_info'] - self._room_id = room_info['room_id'] - self._room_short_id = room_info['short_id'] - self._room_owner_uid = room_info['uid'] + def _parse_danmaku_server_conf(self, data): + self._host_server_list = data['host_list'] + self._host_server_token = data['token'] + if not self._host_server_list: + logger.warning('room %d getConf失败:host_server_list为空', self._room_id) + return False return True def _make_packet(self, data, operation): @@ -497,9 +525,10 @@ class BLiveClient: 'protover': 2, 'platform': 'web', 'clientver': '1.14.3', - 'type': 2, - 'key': self._host_server_token + 'type': 2 } + if self._host_server_token is not None: + auth_params['key'] = self._host_server_token await self._websocket.send_bytes(self._make_packet(auth_params, Operation.AUTH)) async def _message_loop(self):