async def receive_danmu(q, barrage_queue): while True: command = await q.get() if command.iCmdType == 7: await process_danmu(command, barrage_queue) # download_danmu(command) # analysis_danmu(command) elif command.iCmdType == 4: try: rsplist, unpacklen = Wup.unpackRspList(command.vData) for wup in rsplist: print(f'wup = {wup.sFuncName}') if wup.sFuncName == 'sendMessage': bs = tarscore.TarsInputStream(wup.sBuffer) newdata = bs.read( tarscore.mapclass(tarscore.string, tarscore.bytes), 0, True) rsps = tarscore.TarsInputStream(newdata.get('tRsp')) rsp = rsps.read(SendMessageRsp, 0, True) print( f'SendMessageRsp iStatus = {rsp.iStatus} sToast={rsp.sToast} UserInfo = {rsp.tNotice.tUserInfo.sNickName} Content = {rsp.tNotice.sContent} ' ) except: with open('log.txt', 'a+') as f: print(f'sendMessage error = {command.vData}', file=f) print(f'sendMessage error = {command.vData}') elif command.iCmdType == 11: message = WSVerifyCookieRsp() cos = tarscore.TarsInputStream(command.vData) message.readFrom(cos) global is_login if message.iValidate == 0: print('登录成功') is_login = True else: logger.info('登录失败,请重新启动获取token') is_login = False try: os.remove(config.get('cookie_path')) except: pass return
def read_cookies(): try: with open(config.get('cookie_path'), "rb") as cookiefile: cookies = pickle.load(cookiefile) cookie = [item["name"] + "=" + item["value"] for item in cookies] cookiestr = ';'.join(item for item in cookie) print(f'cookiestr={cookiestr}') for c in cookie: if 'yyuid' in c: yyuid = c.split('=')[1] config.set('yyuid', yyuid) print(f'yyuid={yyuid}') if 'udb_n' in c: udb_n = c.split('=')[1] config.set('udb_n', udb_n) print(f'udb_n = {udb_n}') config.set('cookie', cookiestr) return True except Exception as e: logger.info(f"read_cookies error = {repr(e)}") return False
async def main(): room_id = config.get('room_id') await block_when_room_open(room_id) print("开播啦") if not config.get('cookie') or not config.get('yyuid'): if not os.path.exists(config.get('cookie_path')): logger.info("没有找到cookie_path") return if not read_cookies(): print('读取cookie 失败') return q = asyncio.Queue() barrage_queue = asyncio.Queue() dmc = DanmakuClient(f'https://www.huya.com/{room_id}', q) asyncio.create_task(receive_danmu(q, barrage_queue)) asyncio.create_task(time_danmu(barrage_queue)) asyncio.create_task(send_barrage(dmc, barrage_queue)) asyncio.create_task(stop_when_room_close(room_id, dmc)) await dmc.start()
async def stop_when_room_close(room_id, dmc: DanmakuClient): while True: await asyncio.sleep(5 * 60) if not is_room_open(room_id): logger.info('退出') await dmc.stop()