async def dig_and_filter(self, doc_id: int, uid: int, post_time: int, describe: str): dyn_raffle_status: DynRaffleStatus = await notifier.exec_func( -1, DynRaffleHandlerTask.fetch_dyn_raffle_status, doc_id, uid, post_time, describe) if dyn_raffle_status.lottery_time <= utils.curr_time() + 60: printer.info([f'{doc_id}的动态抽奖已经开奖或马上开奖,不再参与'], True) return for key_word in self.dyn_raffle_description_filter: if key_word in dyn_raffle_status.describe: printer.info([f'{doc_id}的动态抽奖正文触发关键词过滤({key_word})'], True) return for key_word in self.dyn_prize_cmt_filter: if key_word in dyn_raffle_status.prize_cmt_1st or \ key_word in dyn_raffle_status.prize_cmt_2nd or \ key_word in dyn_raffle_status.prize_cmt_3rd: printer.info([f'{doc_id}的动态抽奖正文触发关键词过滤({key_word})'], True) return # 如果是刚刚出来的抽奖,就延迟150秒, if dyn_raffle_status.post_time >= utils.curr_time() - 150: printer.info([f'{doc_id}的动态抽奖触发时间约束,休眠150秒后再正式参与'], True) await asyncio.sleep(150) printer.info([f'{doc_id}的动态抽奖通过时间和关键词过滤'], True) notifier.exec_task(-1, DynRaffleHandlerTask, 0, dyn_raffle_status, delay_range=(0, 0))
async def check_result(self): while True: results = dyn_raffle_sql.select_bytime(utils.curr_time() + 900) # 延迟15min处理抽奖 for dyn_raffle_status in results: dyn_raffle_results: Optional[ DynRaffleResults] = await notifier.exec_func( -1, DynRaffleHandlerTask.fetch_dyn_raffle_results, dyn_raffle_status) print(dyn_raffle_status, dyn_raffle_results) future = asyncio.Future() notifier.exec_task(-1, DynRaffleHandlerTask, 2, dyn_raffle_status, dyn_raffle_results, future, delay_range=(0, 30)) await future if dyn_raffle_results is not None: dyn_raffle_sql.insert_dynraffle_results_table( dyn_raffle_results) print('Dnone') await asyncio.sleep(3600)
async def exec_task(self, id, task, step, args): # print('bili_console:', task, args) for i, arg in enumerate(args): if isinstance(arg, list): args[i] = await notifier.exec_func(*arg) # print('bili_console:', task, args) notifier.exec_task(id, task, step, *args)
async def run(self): while True: raffle0 = await self.queue.get() await asyncio.sleep(2) list_raffle = [self.queue.get_nowait() for i in range(self.queue.qsize())] list_raffle.append(raffle0) # 后期考虑如何更好的压缩 list_raffle = list(set(list_raffle)) # print('raffle_handler', list_raffle) for task, *args in list_raffle: notifier.exec_task(-1, task, 0, *args, delay_range=(0, 2))
async def run(self): if self.curr_aid is None: await self.init_curr_aid() aid = self.curr_aid for id in range(aid - 15, aid + 1): notifier.exec_task(-1, SubstanceRaffleHandlerTask, 0, id, delay_range=(0, 35)) while True: is_latest, old_curr_aid = await self.is_latest_aid() if not is_latest: for id in range(old_curr_aid + 1, self.curr_aid + 1): notifier.exec_task(-1, SubstanceRaffleHandlerTask, 0, id, delay_range=(0, 10)) await asyncio.sleep(60)
# users[1].fall_in_jail() console_thread = threading.Thread(target=Biliconsole(loop).cmdloop) console_thread.start() danmu_tasks = [connect.RaffleConnect(i).run() for i in area_ids] yj_danmu_roomid = dict_user['other_control']['raffle_minitor_roomid'] danmu_tasks.append(connect.YjConnection(yj_danmu_roomid).run()) default_monitor_roomid = dict_user['other_control']['default_monitor_roomid'] connect.init_danmu_roomid(default_monitor_roomid) danmu_tasks.append(connect.run_danmu()) notifier.exec_task(-2, HeartBeatTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, RecvHeartGiftTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, OpenSilverBoxTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, RecvDailyBagTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, SignTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, WatchTvTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, SignFansGroupsTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, SendGiftTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, ExchangeSilverCoinTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, JudgeCaseTask, 0, delay_range=(0, 5)) notifier.exec_task(-2, BiliMainTask, 0, delay_range=(0, 5)) other_tasks = [ raffle_handler.run(), # SubstanceRaffleMonitor().run() ]
# 时间间隔为小时,同时每次休眠结束都会计时归零,重新从当前时间计算时间间隔 # 下面表示每隔多少小时执行一次 bili_sched.add_daily_jobs(HeartBeatTask, every_hours=6) bili_sched.add_daily_jobs(RecvHeartGiftTask, every_hours=6) bili_sched.add_daily_jobs(OpenSilverBoxTask, every_hours=6) bili_sched.add_daily_jobs(RecvDailyBagTask, every_hours=3) bili_sched.add_daily_jobs(SignTask, every_hours=6) bili_sched.add_daily_jobs(WatchTvTask, every_hours=6) bili_sched.add_daily_jobs(SignFansGroupsTask, every_hours=6) bili_sched.add_daily_jobs(SendGiftTask, every_hours=2) bili_sched.add_daily_jobs(ExchangeSilverCoinTask, every_hours=6) bili_sched.add_daily_jobs(JudgeCaseTask, every_hours=0.75) bili_sched.add_daily_jobs(BiliMainTask, every_hours=4) loop.run_until_complete(notifier.exec_task(LoginTask)) other_control = dict_ctrl['other_control'] area_ids = loop.run_until_complete( notifier.exec_func(UtilsTask.fetch_blive_areas)) area_duplicated = other_control['area_duplicated'] if area_duplicated: area_ids *= 2 bili_statistics.init(area_num=len(area_ids), area_duplicated=area_duplicated) default_roomid = other_control['default_monitor_roomid'] # aiohttp sb session async def init_monitors(): yjmonitor_tcp_addr = other_control['yjmonitor_tcp_addr'] yjmonitor_tcp_key = other_control['yjmonitor_tcp_key']
def run(user_info: dict, pipe: connection.Connection): """ :param user_info: 用户信息 :param pipe:进程间通信管道 :return: """ notifier.register_pipe(pipe) user_info['password'] = rsa_long_decrypt(eval(user_info['password'])) user_info_copy = deepcopy(user_info) # print(user_info['password']) loop = asyncio.get_event_loop() dict_bili = conf_loader.read_bili() dict_color = conf_loader.read_color() dict_ctrl = conf_loader.read_ctrl() dict_task = conf_loader.read_task() printer.init_config(dict_color, dict_ctrl['print_control']['danmu']) ############################################################################ ############################################################################ # 👇users 录入程序 async def init_users(): global_task_control = dict_task['global_task_control'] custom_task_control = dict_task['custom_task_control'] global_task_arrangement = dict_task['global_task_arrangement'] custom_task_arrangement = dict_task['custom_task_arrangement'] users = notifier.Users(global_task_control=global_task_control, global_task_arrangement=global_task_arrangement, dict_bili=dict_bili, force_sleep=bili_sched.force_sleep) notifier.init(users=users) username = user_info['username'] await notifier.add_user( user_info=user_info_copy, custom_task_control=custom_task_control.get(username, {}), custom_task_arrangement=custom_task_arrangement.get(username, {})) loop.run_until_complete(init_users()) ############################################################################ ############################################################################ # 👇重复任务录入程序 # 时间间隔为小时,同时每次休眠结束都会计时归零,重新从当前时间计算时间间隔 # 下面表示每隔多少小时执行一次 def add_daily_jobs(tasks): for task in tasks: if task['status']: if task['frequency_unit'] == 2: fre = 1 elif task['frequency_unit'] == 1: fre = 60 elif task['frequency_unit'] == 3: fre = 1 / 24 elif task['frequency_unit'] == 0: fre = 3600 else: raise Exception("fre不能为空!") # fre = 1 bili_sched.add_daily_jobs(globals()[task['task']], every_hours=task['frequency_num'] / fre) # 心跳 print("成功添加任务:", task['task']) bili_sched.add_daily_jobs(HeartBeatTask, every_hours=6) # 心跳 # bili_sched.add_daily_jobs(OpenSilverBoxTask, every_hours=6) # 每日开宝箱任务 bili_sched.add_daily_jobs(RecvDailyBagTask, every_hours=3) # # bili_sched.add_daily_jobs(SignTask, every_hours=6) # 直播签到 # bili_sched.add_daily_jobs(WatchTvTask, every_hours=6) # 双端观看任务 # bili_sched.add_daily_jobs(SignFansGroupsTask, every_hours=6) # 签名粉丝组任务 # bili_sched.add_daily_jobs(SendGiftTask, every_hours=2) # 送礼物的任务 # bili_sched.add_daily_jobs(ExchangeSilverCoinTask, every_hours=6) # 硬币兑换 bili_sched.add_daily_jobs(JudgeCaseTask, every_hours=0.75) # 风纪委员任务 bili_sched.add_daily_jobs(BiliMainTask, every_hours=4) # 主任务 # bili_sched.add_daily_jobs(MangaSignTask, every_hours=6) # 漫画签到 # bili_sched.add_daily_jobs(ShareComicTask, every_hours=6) # 漫画分享任务 bili_sched.add_daily_jobs(DahuiyuanTask, every_hours=6) if user_info.get('tasks'): tasks = user_info.get('tasks') else: tasks = [] add_daily_jobs(tasks) ############################################################################ ############################################################################ # 登录 loop.run_until_complete(notifier.exec_task(LoginTask)) other_control = dict_ctrl['other_control'] area_ids = loop.run_until_complete( notifier.exec_func(UtilsTask.fetch_blive_areas)) area_duplicated = other_control['area_duplicated'] if area_duplicated: area_ids *= 2 bili_statistics.init(area_num=len(area_ids), area_duplicated=area_duplicated) default_roomid = other_control['default_monitor_roomid'] ############################################################################ ############################################################################ # 👇录入 monitors # aiohttp sb session async def init_monitors(): session = aiohttp.ClientSession() monitors_ = [] # 弹幕打印功能 danmu_printer_ = DanmuPrinter(room_id=default_roomid, area_id=-1, session=session) # 弹幕抽奖监控 for area_id in area_ids: monitor = DanmuRaffleMonitor(room_id=0, area_id=area_id, session=session) monitors_.append(monitor) # yjmonitor 弹幕监控 yjmonitor_tcp_addr = other_control['yjmonitor_tcp_addr'] yjmonitor_tcp_key = other_control['yjmonitor_tcp_key'] if yjmonitor_tcp_key: monitor = TcpYjMonitorClient(key=yjmonitor_tcp_key, url=yjmonitor_tcp_addr, area_id=0) monitors_.append(monitor) if other_control['substance_raffle']: monitors_.append(SubstanceRaffleMonitor()) if other_control['dyn_raffle']: monitors_.append( DynRaffleMonitor(should_join_immediately=other_control[ 'join_dyn_raffle_at_once'])) return danmu_printer_, monitors_ danmu_printer, monitors = loop.run_until_complete(init_monitors()) ############################################################################ ############################################################################ bili_sched.init(monitors=monitors, sleep_ranges=dict_ctrl['other_control']['sleep_ranges']) # 初始化控制台 if sys.platform != 'linux' or signal.getsignal( signal.SIGHUP) == signal.SIG_DFL: console_thread = threading.Thread( target=ConsoleCmd(loop, default_roomid, danmu_printer).cmdloop) console_thread.start() else: console_thread = None tasks = [monitor.run() for monitor in monitors] other_tasks = [bili_sched.run(), raffle_handler.run(), danmu_printer.run()] if other_tasks: loop.run_until_complete(asyncio.wait(tasks + other_tasks)) loop.run_forever() if console_thread is not None: console_thread.join()
def exec_at_once(self, task, *args): notifier.exec_task(-1, task, 0, *args, delay_range=(0, 0))
async def exec_task(self, id, task, step, args): for i, arg in enumerate(args): if isinstance(arg, list): args[i] = await notifier.exec_func(*arg) notifier.exec_task(id, task, step, *args)