From 03ae656c503487afba851d69ef113f609e2e661a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=BB=BA=E8=81=AA?= Date: Tue, 18 Jul 2017 14:31:02 +0800 Subject: [PATCH 1/2] [Panda Tv] The api ajax_chatroom has been removed.It's easy to get chat room info. --- danmu/Panda.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/danmu/Panda.py b/danmu/Panda.py index be0c27c..ab519d9 100644 --- a/danmu/Panda.py +++ b/danmu/Panda.py @@ -6,57 +6,64 @@ from .Abstract import AbstractDanMuClient + class _socket(socket.socket): def communicate(self, data): self.push(data) return self.pull() + def push(self, data): self.sendall(data) + def pull(self): - try: # for socket.settimeout + try: # for socket.settimeout return self.recv(9999) except: return '' + class PandaDanMuClient(AbstractDanMuClient): def _get_live_status(self): params = { 'roomid': (self.url.split('/')[-1] or - self.url.split('/')[-2]), + self.url.split('/')[-2]), 'pub_key': '', '_': int(time.time()), } j = requests.get('http://www.panda.tv/api_room', params).json()['data'] return j['videoinfo']['status'] == '2' + def _prepare_env(self): roomId = self.url.split('/')[-1] or self.url.split('/')[-2] - url = 'http://www.panda.tv/ajax_chatroom?roomid=%s&_=%s'%(roomId, str(int(time.time()))) - roomInfo = requests.get(url).json() + # url = 'http://www.panda.tv/ajax_chatroom?roomid=%s&_=%s' % (roomId, str(int(time.time()))) + # roomInfo = requests.get(url).json() url = 'http://api.homer.panda.tv/chatroom/getinfo' params = { - 'rid': roomInfo['data']['rid'], + # 'rid': roomInfo['data']['rid'], 'roomid': roomId, 'retry': 0, - 'sign': roomInfo['data']['sign'], - 'ts': roomInfo['data']['ts'], + # 'sign': roomInfo['data']['sign'], + # 'ts': roomInfo['data']['ts'], '_': int(time.time()), } serverInfo = requests.get(url, params).json()['data'] serverAddress = serverInfo['chat_addr_list'][0].split(':') return (serverAddress[0], int(serverAddress[1])), serverInfo + def _init_socket(self, danmu, roomInfo): data = [ - ('u', '%s@%s'%(roomInfo['rid'], roomInfo['appid'])), + ('u', '%s@%s' % (roomInfo['rid'], roomInfo['appid'])), ('k', 1), ('t', 300), ('ts', roomInfo['ts']), ('sign', roomInfo['sign']), - ('authtype', roomInfo['authType']) ] - data = '\n'.join('%s:%s'%(k, v) for k, v in data) + ('authtype', roomInfo['authType'])] + data = '\n'.join('%s:%s' % (k, v) for k, v in data) data = (b'\x00\x06\x00\x02\x00' + pack('B', len(data)) + - data.encode('utf8') + b'\x00\x06\x00\x00') + data.encode('utf8') + b'\x00\x06\x00\x00') self.danmuSocket = _socket(socket.AF_INET, socket.SOCK_STREAM) self.danmuSocket.settimeout(3) self.danmuSocket.connect(danmu) self.danmuSocket.push(data) + def _create_thread_fn(self, roomInfo): def get_danmu(self): if not select.select([self.danmuSocket], [], [], 1)[0]: return @@ -65,16 +72,18 @@ def get_danmu(self): try: msg = json.loads(msg.decode('utf8', 'ignore')) msg['NickName'] = msg.get('data', {}).get('from', {} - ).get('nickName', '') - msg['Content'] = msg.get('data', {}).get('content', '') - msg['MsgType'] = {'1': 'danmu', '206': 'gift' - }.get(msg['type'], 'other') + ).get('nickName', '') + msg['Content'] = msg.get('data', {}).get('content', '') + msg['MsgType'] = {'1': 'danmu', '206': 'gift' + }.get(msg['type'], 'other') except: pass else: self.danmuWaitTime = time.time() + self.maxNoDanMuWait self.msgPipe.append(msg) + def heart_beat(self): self.danmuSocket.push(b'\x00\x06\x00\x06') time.sleep(60) + return get_danmu, heart_beat From 19f65d58bd3e56cbc92e7ea6696d56d7559cb267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=BB=BA=E8=81=AA?= Date: Tue, 18 Jul 2017 15:17:58 +0800 Subject: [PATCH 2/2] [ZhanQi Tv] ZhanQi Tv's message not always end with a character 0x0a --- danmu/ZhanQi.py | 60 +++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/danmu/ZhanQi.py b/danmu/ZhanQi.py index 1ac5ceb..ba99246 100644 --- a/danmu/ZhanQi.py +++ b/danmu/ZhanQi.py @@ -7,17 +7,19 @@ from danmu.config import USER_AGENT from .Abstract import AbstractDanMuClient + class ZhanQiDanMuClient(AbstractDanMuClient): def _get_live_status(self): r = requests.get('https://www.zhanqi.tv/' + - self.url.split('/')[-1] or self.url.split('/')[-2], - headers={'User-Agent': USER_AGENT}) + self.url.split('/')[-1] or self.url.split('/')[-2], + headers={'User-Agent': USER_AGENT}) if r.url == 'https://www.zhanqi.tv/': return False rawJson = re.findall('oRoom = (.*);[\s\S]*?window.', r.text) if not rawJson: rawJson = re.findall('aVideos = (.*);[\s\S]*?oPageConfig.', r.text) self.roomInfo = json.loads(rawJson[0]) if isinstance(self.roomInfo, list): self.roomInfo = self.roomInfo[0] return self.roomInfo['status'] == '4' + def _prepare_env(self): serverAddress = json.loads(base64.b64decode( self.roomInfo['flashvars']['Servers']).decode('ascii'))['list'][0] @@ -28,40 +30,42 @@ def _prepare_env(self): '_t': int(time.time() / 60), } roomInfo = requests.get(url, params).json() roomInfo['id'] = int(self.roomInfo['id']) - return serverAddress, roomInfo # danmu, roomInfo + return serverAddress, roomInfo # danmu, roomInfo + def _init_socket(self, danmu, roomInfo): self.danmuSocket = socket.socket() self.danmuSocket.settimeout(3) data = { - 'nickname' : '', - 'roomid' : int(roomInfo['id']), - 'gid' : roomInfo['data']['gid'], - 'sid' : roomInfo['data']['sid'], - 'ssid' : roomInfo['data']['sid'], - 'timestamp' : roomInfo['data']['timestamp'], - 'cmdid' : 'loginreq', - 'develop_date' : '2015-06-07', - 'fhost' : 'zhanqi.tool', - 'fx' : 0, - 't' : 0, - 'thirdacount' : '', - 'uid' : 0, - 'ver' : 2, - 'vod' : 0, } - data = json.dumps(data, separators = (',',':')) + 'nickname': '', + 'roomid': int(roomInfo['id']), + 'gid': roomInfo['data']['gid'], + 'sid': roomInfo['data']['sid'], + 'ssid': roomInfo['data']['sid'], + 'timestamp': roomInfo['data']['timestamp'], + 'cmdid': 'loginreq', + 'develop_date': '2015-06-07', + 'fhost': 'zhanqi.tool', + 'fx': 0, + 't': 0, + 'thirdacount': '', + 'uid': 0, + 'ver': 2, + 'vod': 0, } + data = json.dumps(data, separators=(',', ':')) self.danmuSocket.connect(danmu) - self.danmuSocket.sendall(b'\xbb\xcc' + b'\x00'*4 + - pack('i', len(data)) + b'\x10\x27' + data.encode('ascii')) + self.danmuSocket.sendall(b'\xbb\xcc' + b'\x00' * 4 + + pack('i', len(data)) + b'\x10\x27' + data.encode('ascii')) + def _create_thread_fn(self, roomInfo): def get_danmu(self): if not select.select([self.danmuSocket], [], [], 1)[0]: return - content = self.danmuSocket.recv(999) - for msg in re.findall(b'\x10\x27({[^\x00]*})\x0a', content): + content = self.danmuSocket.recv(9999) + for msg in re.findall(b'\x10\x27({[^\x00]*})', content): try: msg = json.loads(msg.decode('utf8', 'ignore')) msg['NickName'] = (msg.get('fromname', '') or - msg.get('data', {}).get('nickname', '')) - msg['Content'] = msg.get('content', '') + msg.get('data', {}).get('nickname', '')) + msg['Content'] = msg.get('content', '') if 'chatm' in msg.get('cmdid', ''): msg['MsgType'] = 'danmu' elif 'Gift' in msg.get('cmdid', ''): @@ -73,7 +77,9 @@ def get_danmu(self): else: self.danmuWaitTime = time.time() + self.maxNoDanMuWait self.msgPipe.append(msg) + def heart_beat(self): time.sleep(3) - self.danmuSocket.sendall(b'\xbb\xcc' + b'\x00'*8 + b'\x59\x27') - return get_danmu, heart_beat # danmu, heart + self.danmuSocket.sendall(b'\xbb\xcc' + b'\x00' * 8 + b'\x59\x27') + + return get_danmu, heart_beat # danmu, heart