示例#1
0
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
示例#2
0
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
示例#3
0
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()
示例#4
0
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()