async def animal_on_7_00_to_23_00(): try: Bot_me = nonebot.get_bots()[Config.me] logger.success(f"{Config.me}:scheduler-animal") choice = ['猫猫', '狗狗'] choice = random.choice(choice) if choice == '猫猫': img_url = await get_cat_url() elif choice == '狗狗': img_url = await get_dog_url() else: img_url = None msg = f'已经{datetime.datetime.now().hour}点了,来看{choice}图叭' + Message( f'[CQ:image,file={img_url}]') await Bot_me.call_api( 'send_group_msg', **{ 'message': msg, 'group_id': Config.test_group }) except: logger.error("定时任务animal失败")
async def member_vocations_monitor(): logger.debug(f"member_vocations_monitor: vocation checking started") from nonebot import get_bots over_vocation_user = set() for bot_id, bot in get_bots().items(): group_list = await bot.call_api('get_group_list') for group in group_list: group_id = group.get('group_id') group = DBGroup(group_id=group_id) # 跳过不具备权限的组 if group.permission_command( ).result != 1 or group.permission_level().result < 80: continue # 调用api获取群成员信息 group_member_list = await bot.call_api(api='get_group_member_list', group_id=group_id) for user_info in group_member_list: user_nickname = user_info['card'] if not user_nickname: user_nickname = user_info['nickname'] user_qq = user_info['user_id'] user = DBUser(user_id=user_qq) status, stop_time = user.vocation_status().result if status == 1 and datetime.now() >= stop_time: msg = f'【{user_nickname}】的假期已经结束啦~\n快给他/她安排工作吧!' await bot.call_api(api='send_group_msg', group_id=group_id, message=msg) over_vocation_user.add(user) for user in over_vocation_user: _res = user.status_set(status=0) if not _res.success(): logger.error(f"reset user status failed: {_res.info}") logger.debug('member_vocations_monitor: vocation checking completed')
async def pr_on_11_50(): try: Bot_me = nonebot.get_bots()[Config.me] logger.success(f"{Config.me}:scheduler-pr") for rank in range(3): data = await p_rank(rank) msg = f'''rank:{rank + 1} id:{data['id']} title:{data['title']} user_id:{data['user_id']} user_name:{data['user_name']}''' + Message(f'[CQ:image,file={data["url"]}]') # await bot.call_api('send_private_msg', **{ # 'message': msg, # 'user_id': Config.superuser # }) await Bot_me.call_api( 'send_group_msg', **{ 'message': msg, 'group_id': Config.test_group }) except: logger.error("定时任务pr失败")
async def live_dd_each_1_minute(): dd_list = [77386, 34027] try: Bot_me = nonebot.get_bots()[Config.me] datas = await get_dd_list_status(dd_list=dd_list) for data in datas: if data['live_status']: if data['room_id'] not in live_dd_status or data[ 'live_time'] != live_dd_status[data['room_id']]: live_dd_status[data['room_id']] = data['live_time'] msg = f'''{data["name"]}开播啦! 房间号:{data["room_id"]} 标题:{data["title"]}''' + Message(f'[CQ:image,file={data["img"]}]') await Bot_me.call_api( 'send_group_msg', **{ 'message': msg, 'group_id': Config.test_group }) logger.success( f'{Config.me}:scheduler-live_dd:{data["name"]}开播啦!') except: logger.error("定时任务live_dd失败")
async def test_get(monkeypatch: pytest.MonkeyPatch, nonebug_clear): import nonebot from nonebot.drivers import ForwardDriver, ReverseDriver from nonebot import get_app, get_bot, get_asgi, get_bots, get_driver try: get_driver() assert False, "Driver can only be got after initialization" except ValueError: assert True nonebot.init(driver="nonebot.drivers.fastapi") driver = get_driver() assert isinstance(driver, ReverseDriver) assert get_asgi() == driver.asgi assert get_app() == driver.server_app runned = False def mock_run(*args, **kwargs): nonlocal runned runned = True assert args == ("arg", ) and kwargs == {"kwarg": "kwarg"} monkeypatch.setattr(driver, "run", mock_run) nonebot.run("arg", kwarg="kwarg") assert runned try: get_bot() assert False except ValueError: assert True monkeypatch.setattr(driver, "_clients", {"test": "test"}) assert get_bot() == "test" assert get_bot("test") == "test" assert get_bots() == {"test": "test"}
async def blackjack_statistics_daliy(): record_dict = get_record_map() print(record_dict) loser = '' loser_score = 0 for user in record_dict: if record_dict[user] < loser_score: loser = user loser_score = record_dict[user] if len(score_dict) == 0: return elif loser == '': msg = {"type": "text", "data": {"text": "忙碌的一天又结束了呢~ 今天的21点最倒霉玩家是……好像是菜菜自己???不可能不可能!菜菜可是出了……不!不是你们想的那个意思哇!你……你们……别过来QAQ!"}} else: msg = [ {"type": "text", "data": {"text": "忙碌的一天又结束了呢~ 今天的21点最倒霉玩家是"}}, {"type": "at", "data": {"qq": loser}}, {"type": "text", "data": {"text": f" 共计输了{-loser_score}局哦(规则: Blackjack胜利记胜1.5局,普通胜利记胜1局,输掉/爆牌记-1局)"}} ] from random import randint x = randint(1, 5) if x == 1: msg.append({"type": "text", "data": {"text": "看在这么惨的份上大家请他/她喝杯奶茶吧qwq~"}}) elif x == 2: msg.append({"type": "text", "data": {"text": "看在这么惨的份上大家让他/她日日吧qwq~"}}) elif x == 3: msg.append({"type": "text", "data": {"text": "看在这么惨的份上大家日日他/她吧₍₍ (ง ˙ω˙)ว ⁾⁾"}}) elif x == 4: msg.append({"type": "text", "data": {"text": "看在这么惨的份大家让他/她情喝奶茶吧qwq~"}}) elif x == 5: msg.append({"type": "text", "data": {"text": "弱诶!拜托,你很弱诶!你现在知道谁是老大了哦(ФωФ)"}}) from nonebot import get_bots bot_dict = get_bots() if not bot_dict.__contains__('2485909839'): return bot = bot_dict['2485909839'] await bot.send_group_msg(group_id=864515208, message=msg)
async def restart(bot: Bot): cqhttp_dir = (await bot.get_version_info())['coolq_directory'] pids = psutil.process_iter() for pid in pids: try: if 'go-cqhttp' in pid.name() and \ pid.exe() == path.join(cqhttp_dir, pid.name()): subprocess.Popen( pid.exe(), cwd=pid.cwd(), # stdout=subprocess.PIPE, stderr=None if platform.system() == 'Windows' else subprocess.DEVNULL, creationflags=subprocess.CREATE_NEW_CONSOLE if platform.system() == 'Windows' else 0) pid.terminate() while True: await asyncio.sleep(1) bots = nonebot.get_bots() if bot.self_id in bots: return bots[bot.self_id] except psutil.ZombieProcess: continue
async def safe_send(bot_id, send_type, type_id, message, at=False): """发送出现错误时, 尝试重新发送, 并捕获异常且不会中断运行""" try: bot = nonebot.get_bots()[str(bot_id)] except KeyError: logger.error(f"推送失败,Bot({bot_id})未连接") return if at and (await bot.get_group_at_all_remain(group_id=type_id) )['can_at_all']: message = MessageSegment.at('all') + message try: return await bot.call_api('send_'+send_type+'_msg', **{ 'message': message, 'user_id' if send_type == 'private' else 'group_id': type_id }) except ActionFailed as e: url = "https://haruka-bot.sk415.icu/usage/faq.html#机器人不发消息也没反应" logger.error(f"推送失败,账号可能被风控({url}),错误信息:{e.info}") except NetworkError as e: logger.error(f"推送失败,请检查网络连接,错误信息:{e.msg}")
async def remind(): data_file1 = "/root/testbot/testbot/plugins/config.json" with open(data_file1, encoding='utf-8') as f: userid_data = json.load(f) for userid in userid_data: data_file2 = "/root/testbot/testbot/plugins/jjconfig/" + userid + '/update.json' with open(data_file2, 'r', encoding='utf-8') as f: update_data = json.load(f) if 'remind' not in update_data: update_data['remind'] = 0 if update_data['remind'] == 1: continue if update_data['flag'] == 1: update_data['remind'] = 1 with open(data_file2, 'w', encoding='utf-8') as f: json.dump(update_data, f) bot = nonebot.get_bots()['80303142'] message = '[CQ:at,qq=' + userid + ']' + '今日净值全部已更新' await bot.call_api('send_group_msg', **{ 'group_id': '235498647', 'message': message }) return 0
async def check_auth(): bot = get_bots()[config.bot_id] global GROUP_LIST gl = await bot.get_group_list() for g in gl: if not g["group_id"] in black_list: GROUP_LIST[str(g["group_id"])] = g["group_name"] try: for item in GROUP_LIST.keys(): msg = "" if group_auth.data.get(item): group_id = item auth_info = group_auth.get_auth_info(item) rest_day = cal_day(timeStamp2time(int(auth_info["auth_time"])), timeStamp2time(time.time())).days if rest_day <= 5: if rest_day < 0: msg += "Nia~ 还有人记得猫猫吗?猫猫不要和コッコロちゃん一样!" elif rest_day <= 5: msg += leave_msg[str(rest_day)] msg += f"\n猫猫还会陪伴大家{cal_day(timeStamp2time(int(auth_info['auth_time'])),timeStamp2time(time.time())).days}天" print(group_id, msg) await bot.send_group_msg(group_id=group_id, message=msg) else: print(f"add new group_info: {item}") new_group_info = { item: { "name": GROUP_LIST[item], "join_time": str(int(time.time())), "auth_time": str(int(time.time()) + 7 * 24 * 3600), } } print(new_group_info) group_auth.add_new_group(item, new_group_info) except Exception as e: await bot.send_group_msg(group_id="426770092", message=f"zfjbot-auth:{e}")
async def fetch_and_send(target_type: str): config = Config() target = config.get_next_target(target_type) if not target: return logger.debug( "try to fecth new posts from {}, target: {}".format(target_type, target) ) send_user_list = config.target_user_cache[target_type][target] send_userinfo_list = list( map( lambda user: UserSubInfo( user, lambda target: config.get_sub_category( target_type, target, user.user_type, user.user ), lambda target: config.get_sub_tags( target_type, target, user.user_type, user.user ), ), send_user_list, ) ) bot_list = list(nonebot.get_bots().values()) bot = bot_list[0] if bot_list else None to_send = await platform_manager[target_type].fetch_new_post( target, send_userinfo_list ) for user, send_list in to_send: for send_post in send_list: logger.info("send to {}: {}".format(user, send_post)) if not bot: logger.warning("no bot connected") else: await send_msgs( bot, user.user, user.user_type, await send_post.generate_messages() )
async def dy_sched(): """直播推送""" with Config() as config: uid = config.next_uid('dynamic') if not uid: return push_list = config.get_push_list(uid, 'dynamic') name = push_list[0]['name'] logger.debug(f'爬取动态 {name}({uid})') api = BiliAPI() dynamics = (await api.get_dynamic(uid)).get('cards', []) # 获取最近十二条动态 # config['uid'][uid]['name'] = dynamics[0]['desc']['user_profile']['info']['uname'] # await update_config(config) if len(dynamics) == 0: # 没有发过动态或者动态全删的直接结束 return if uid not in last_time: # 没有爬取过这位主播就把最新一条动态时间为 last_time dynamic = Dynamic(dynamics[0]) last_time[uid] = dynamic.time return for dynamic in dynamics[4::-1]: # 从旧到新取最近5条动态 dynamic = Dynamic(dynamic) if dynamic.time > last_time[uid] and dynamic.time > datetime.now().timestamp() - timedelta(minutes=10).seconds: await dynamic.get_screenshot() await dynamic.encode() os.remove(dynamic.img_path) await dynamic.format() for sets in push_list: bot = nonebot.get_bots()[sets['bot_id']] await safe_send(bot, sets['type'], sets['type_id'], dynamic.message) last_time[uid] = dynamic.time
async def ofl_rmd(bot: Bot): dc_time = datetime.now().time().strftime("%H:%M:%S") logger.critical(f'Bot {bot.self_id} disconnected') ol_bots = [bt for strid, bt in get_bots().items()] if ol_bots: while ol_bots: notifier: Bot = choice(ol_bots) try: for su in SUPERUSERS: await notifier.send_private_msg( user_id=su, message=f' {bot.self_id}disconnected at {dc_time}') break except BaseException as err: logger.error( f'Bot {notifier.self_id} failed to send offline notification: {err}' ) ol_bots.remove(notifier) else: logger.error(f'All bots failed to send notification!') else: logger.critical('There is no bot can send notification!')
async def living(): for bot in get_bots().values(): for bid in liveroom: lm = liveroom[bid] info = live.get_info_(lm['mid']) k = info['liveStatus'] if k == 1 and lm['status'] == 0: live.change_status(bid) title = info['title'] cover = info['cover'] url = info['url'] msg = f'你关注的{lm["nickname"]}开播啦!\n#{title}\n{url}[CQ:image,file={cover}]' #print(msg) await bot.send_group_msg(group_id=648868273, message=msg) elif k == 0 and lm['status'] == 1: live.change_status(bid) msg = f'{lm["nickname"]}下播了。。' await bot.send_group_msg(group_id=648868273, message=msg) await asyncio.sleep(0.5)
GroupDecreaseNoticeEvent, GroupAdminNoticeEvent, GroupBanNoticeEvent, GroupRecallNoticeEvent, FriendRecallNoticeEvent, ) import ATRI from ATRI.service import Service from ATRI.log import logger as log from ATRI.rule import is_in_service from ATRI.config import BotSelfConfig from ATRI.utils import CoolqCodeChecker driver = ATRI.driver() bots = nonebot.get_bots() ESSENTIAL_DIR = Path(".") / "ATRI" / "data" / "database" / "essential" MANEGE_DIR = Path(".") / "ATRI" / "data" / "database" / "manege" os.makedirs(ESSENTIAL_DIR, exist_ok=True) os.makedirs(MANEGE_DIR, exist_ok=True) @driver.on_startup async def startup(): log.info("アトリは、高性能ですから!") @driver.on_shutdown async def shutdown(): log.info("Thanks for using.")
def getBot() -> Bot: return list(nonebot.get_bots().values())[0]
def get_first_bot() -> Bot: """ 获得连接的第一个 bot """ if get_bots(): return list(get_bots().values())[0]
async def yincha(): (bot, ) = nonebot.get_bots().values() for id in group_id_list: await bot.send_msg(message_type="group", group_id=int(id), message='三点几嚟,做碌鸠啊做!做这么多,老板不会心疼你的,饮茶先啦!')
async def bilibili_dynamic_monitor(): logger.debug(f"bilibili_dynamic_monitor: checking started") # 获取当前bot列表 bots = [] for bot_id, bot in get_bots().items(): bots.append(bot) # 获取所有有通知权限的群组 all_noitce_groups = [] t = DBTable(table_name='Group') for item in t.list_col_with_condition('group_id', 'notice_permissions', 1).result: all_noitce_groups.append(int(item[0])) # 获取订阅表中的所有动态订阅 check_sub = [] t = DBTable(table_name='Subscription') for item in t.list_col_with_condition('sub_id', 'sub_type', 2).result: check_sub.append(int(item[0])) # 注册一个异步函数用于检查动态 async def check_dynamic(dy_uid): # 获取动态并返回动态类型及内容 try: _res = await get_user_dynamic_history(dy_uid=dy_uid) if not _res.success(): logger.error(f'bilibili_dynamic_monitor: 获取动态失败, uid: {dy_uid}, error: {_res.info}') return except Exception as _e: logger.error(f'bilibili_dynamic_monitor: 获取动态失败, uid: {dy_uid}, error: {repr(_e)}') return dynamic_info = dict(_res.result) # 用户所有的动态id _res = get_user_dynamic(user_id=dy_uid) if not _res.success(): logger.error(f'bilibili_dynamic_monitor: 获取用户已有动态失败, uid: {dy_uid}, error: {_res.info}') return user_dy_id_list = list(_res.result) sub = DBSubscription(sub_type=2, sub_id=dy_uid) # 获取订阅了该直播间的所有群 sub_group = sub.sub_group_list().result # 需通知的群 notice_group = list(set(all_noitce_groups) & set(sub_group)) for num in range(len(dynamic_info)): try: # 如果有新的动态 if dynamic_info[num]['id'] not in user_dy_id_list: logger.info(f"用户: {dy_uid}/{dynamic_info[num]['name']} 新动态: {dynamic_info[num]['id']}") # 转发的动态 if dynamic_info[num]['type'] == 1: # 获取原动态信息 origin_dynamic_id = dynamic_info[num]['origin'] _dy_res = await get_dynamic_info(dynamic_id=origin_dynamic_id) if not _dy_res.success(): msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}'.format( dynamic_info[num]['name'], 'Unknown', dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16, 'Unknown', '获取原动态失败' ) else: origin_dynamic_info = _dy_res.result # 原动态type=2, 带图片 if origin_dynamic_info['type'] == 2: # 处理图片序列 pic_segs = '' for pic_url in origin_dynamic_info['origin_pics']: _res = await pic_2_base64(pic_url) pic_b64 = _res.result pic_segs += f'{MessageSegment.image(pic_b64)}\n' msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}\n{}'.format( dynamic_info[num]['name'], origin_dynamic_info['name'], dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16, origin_dynamic_info['name'], origin_dynamic_info['content'], pic_segs ) # 原动态为其他类型, 无图 else: msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}'.format( dynamic_info[num]['name'], origin_dynamic_info['name'], dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16, origin_dynamic_info['name'], origin_dynamic_info['content'] ) for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}") except Exception as _e: logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue # 原创的动态(有图片) elif dynamic_info[num]['type'] == 2: # 处理图片序列 pic_segs = '' for pic_url in dynamic_info[num]['pic_urls']: _res = await pic_2_base64(pic_url) pic_b64 = _res.result pic_segs += f'{MessageSegment.image(pic_b64)}\n' msg = '{}发布了新动态!\n\n“{}”\n{}\n{}'.format( dynamic_info[num]['name'], dynamic_info[num]['content'], dynamic_info[num]['url'], pic_segs) for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}") except Exception as _e: logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue # 原创的动态(无图片) elif dynamic_info[num]['type'] == 4: msg = '{}发布了新动态!\n\n“{}”\n{}'.format( dynamic_info[num]['name'], dynamic_info[num]['content'], dynamic_info[num]['url']) for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}") except Exception as _e: logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue # 视频 elif dynamic_info[num]['type'] == 8: msg = '{}发布了新的视频!\n\n《{}》\n“{}”\n{}'.format( dynamic_info[num]['name'], dynamic_info[num]['origin'], dynamic_info[num]['content'], dynamic_info[num]['url']) for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}") except Exception as _e: logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue # 小视频 elif dynamic_info[num]['type'] == 16: msg = '{}发布了新的小视频动态!\n\n“{}”\n{}'.format( dynamic_info[num]['name'], dynamic_info[num]['content'], dynamic_info[num]['url']) for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}") except Exception as _e: logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue # 番剧 elif dynamic_info[num]['type'] in [32, 512]: msg = '{}发布了新的番剧!\n\n《{}》\n{}'.format( dynamic_info[num]['name'], dynamic_info[num]['origin'], dynamic_info[num]['url']) for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}") except Exception as _e: logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue # 文章 elif dynamic_info[num]['type'] == 64: msg = '{}发布了新的文章!\n\n《{}》\n“{}”\n{}'.format( dynamic_info[num]['name'], dynamic_info[num]['origin'], dynamic_info[num]['content'], dynamic_info[num]['url']) for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}") except Exception as _e: logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue # 音频 elif dynamic_info[num]['type'] == 256: msg = '{}发布了新的音乐!\n\n《{}》\n“{}”\n{}'.format( dynamic_info[num]['name'], dynamic_info[num]['origin'], dynamic_info[num]['content'], dynamic_info[num]['url']) for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}") except Exception as _e: logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue # B站活动相关 elif dynamic_info[num]['type'] == 2048: msg = '{}发布了一条活动相关动态!\n\n【{}】\n“{}”\n{}'.format( dynamic_info[num]['name'], dynamic_info[num]['origin'], dynamic_info[num]['content'], dynamic_info[num]['url']) for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}") except Exception as _e: logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue elif dynamic_info[num]['type'] == -1: logger.warning(f"未知的动态类型: {dynamic_info[num]['id']}") # 更新动态内容到数据库 dy_id = dynamic_info[num]['id'] dy_type = dynamic_info[num]['type'] content = dynamic_info[num]['content'] # 向数据库中写入动态信息 dynamic = DBDynamic(uid=dy_uid, dynamic_id=dy_id) _res = dynamic.add(dynamic_type=dy_type, content=content) if _res.success(): logger.info(f"向数据库写入动态信息: {dynamic_info[num]['id']} 成功") else: logger.error(f"向数据库写入动态信息: {dynamic_info[num]['id']} 失败") except Exception as _e: logger.error(f'bilibili_dynamic_monitor: 解析新动态: {dy_uid} 的时发生了错误, error info: {repr(_e)}') # 检查所有在订阅表里面的直播间(异步) tasks = [] for uid in check_sub: tasks.append(check_dynamic(uid)) try: await asyncio.gather(*tasks) logger.debug('bilibili_dynamic_monitor: checking completed') except Exception as e: logger.error(f'bilibili_dynamic_monitor: error occurred in checking {repr(e)}')
async def report_status(bot: Bot): bots_dict = get_bots() msg = f'{len(bots_dict)} connection(s):\n' + '\n'.join( [q for q in bots_dict]) await connection_report.send(msg)
def daily_setu(): logger.success('daily setu进程开启!') time.sleep(5) daily_setu_time = nonebot.get_driver().config.daily_setu_time while True: try: now_time = get_beijing_time() send_time = datetime.datetime.strptime( str(now_time.date()) + daily_setu_time, '%Y-%m-%d%H:%M') prepare_time = send_time - datetime.timedelta(minutes=10) logger.info('daily setu | 北京时间|{beijing_time}'.format( beijing_time=str(now_time))) # 达到时间,开始准备涩图 if (prepare_time < now_time < send_time): try: logger.info('达到时间,开始准备涩图') bots = get_bots() bot = None for id in bots.keys(): bot = bots[id] setu_list = get_daily_setu() if (len(setu_list) == 0): # 出现任何异常则跳过准备时间的十分钟 time.sleep(660) raise Exception('今日排行版没有符合条件的涩图') # 访问涩图排行版正确,但是没有符合条件的涩图 logger.info('成功获取每日涩图列表!') for setu in setu_list: setu.pic_file = save_setu(setu.url) logger.info('成功缓存每日涩图!') # 获得开启日常涩图功能的群号 daily_setu_group = nonebot.get_driver().config.daily_setu while True: try: now_time = get_beijing_time() logger.info('每日涩图等待发送...') # 达到发送时间,发送 if (now_time > send_time): for group in daily_setu_group.keys(): asyncio.run( send_daily_setu( daily_setu_group[group], bot, setu_list)) logger.info('每日涩图发送完成!') break time.sleep(30) except Exception as e: pass except Exception as e: for group in daily_setu_group.keys(): asyncio.run( bot.send_group_msg( group_id=daily_setu_group[group], message=str(e.args[0]))) logger.error(e.args[0]) finally: for setu in setu_list: try: os.remove(setu.pic_file) except Exception: pass logger.info('删除每日涩图成功!') # delete pic except Exception as e: logger.error(e.args[0]) time.sleep(60)
async def bilibili_live_monitor(): logger.debug(f"bilibili_live_monitor: checking started") global live_title global live_status global live_up_name # 获取当前bot列表 bots = [] for bot_id, bot in get_bots().items(): bots.append(bot) # 获取所有有通知权限的群组 all_noitce_groups = [] t = DBTable(table_name='Group') for item in t.list_col_with_condition('group_id', 'notice_permissions', 1).result: all_noitce_groups.append(int(item[0])) # 获取订阅表中的所有直播间订阅 check_sub = [] t = DBTable(table_name='Subscription') for item in t.list_col_with_condition('sub_id', 'sub_type', 1).result: check_sub.append(int(item[0])) # 注册一个异步函数用于检查直播间状态 async def check_live(room_id: int): # 获取直播间信息 _res = await get_live_info(room_id=room_id) if not _res.success(): logger.error( f'bilibili_live_monitor: 获取直播间信息失败, room_id: {room_id}, error: {_res.info}' ) return live_info = _res.result sub = DBSubscription(sub_type=1, sub_id=room_id) # 获取订阅了该直播间的所有群 sub_group = sub.sub_group_list().result # 需通知的群 notice_group = list(set(all_noitce_groups) & set(sub_group)) up_name = live_up_name[room_id] # 检查是否是已开播状态, 若已开播则监测直播间标题变动 # 为避免开播时同时出现标题变更通知和开播通知, 在检测到直播状态变化时更新标题, 且仅在直播状态为直播中时发送标题变更通知 if live_info['status'] != live_status[room_id]\ and live_info['status'] == 1\ and live_info['title'] != live_title[room_id]: # 更新标题 live_title[room_id] = live_info['title'] logger.info( f"直播间: {room_id}/{up_name} 标题变更为: {live_info['title']}") elif live_info[ 'status'] == 1 and live_info['title'] != live_title[room_id]: # 通知有通知权限且订阅了该直播间的群 cover_pic = await pic_2_base64(url=live_info.get('cover_img')) if cover_pic.success(): msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{MessageSegment.image(cover_pic.result)}" else: # msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{live_info['url']}" msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】" for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info(f"向群组: {group_id} 发送直播间: {room_id} 标题变更通知") except Exception as _e: logger.warning( f"向群组: {group_id} 发送直播间: {room_id} 标题变更通知失败, error: {repr(_e)}" ) continue live_title[room_id] = live_info['title'] logger.info( f"直播间: {room_id}/{up_name} 标题变更为: {live_info['title']}") # 检测开播/下播 # 检查直播间状态与原状态是否一致 if live_info['status'] != live_status[room_id]: try: # 现在状态为未开播 if live_info['status'] == 0: live_start_info = f"LiveEnd! Room: {room_id}/{up_name}" new_event = DBHistory(time=int(time.time()), self_id=-1, post_type='bilibili', detail_type='live') new_event.add(sub_type='live_end', user_id=room_id, user_name=up_name, raw_data=repr(live_info), msg_data=live_start_info) msg = f'{up_name}下播了' # 通知有通知权限且订阅了该直播间的群 for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info( f"向群组: {group_id} 发送直播间: {room_id} 下播通知") except Exception as _e: logger.warning( f"向群组: {group_id} 发送直播间: {room_id} 下播通知失败, error: {repr(_e)}" ) continue # 更新直播间状态 live_status[room_id] = live_info['status'] logger.info(f"直播间: {room_id}/{up_name} 下播了") # 现在状态为直播中 elif live_info['status'] == 1: # 记录准确开播信息 live_start_info = f"LiveStart! Room: {room_id}/{up_name}, Title: {live_info['title']}, " \ f"TrueTime: {live_info['time']}" new_event = DBHistory(time=int(time.time()), self_id=-1, post_type='bilibili', detail_type='live') new_event.add(sub_type='live_start', user_id=room_id, user_name=up_name, raw_data=repr(live_info), msg_data=live_start_info) cover_pic = await pic_2_base64( url=live_info.get('cover_img')) if cover_pic.success(): msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】" \ f"\n{MessageSegment.image(cover_pic.result)}" else: # msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】\n{live_info['url']}" msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】" for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info( f"向群组: {group_id} 发送直播间: {room_id} 开播通知") except Exception as _e: logger.warning( f"向群组: {group_id} 发送直播间: {room_id} 开播通知失败, error: {repr(_e)}" ) continue live_status[room_id] = live_info['status'] logger.info(f"直播间: {room_id}/{up_name} 开播了") # 现在状态为未开播(轮播中) elif live_info['status'] == 2: live_start_info = f"LiveEnd! Room: {room_id}/{up_name}" new_event = DBHistory(time=int(time.time()), self_id=-1, post_type='bilibili', detail_type='live') new_event.add(sub_type='live_end_with_playlist', user_id=room_id, user_name=up_name, raw_data=repr(live_info), msg_data=live_start_info) msg = f'{up_name}下播了(轮播中)' for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) logger.info( f"向群组: {group_id} 发送直播间: {room_id} 下播通知") except Exception as _e: logger.warning( f"向群组: {group_id} 发送直播间: {room_id} 下播通知失败, error: {repr(_e)}" ) continue live_status[room_id] = live_info['status'] logger.info(f"直播间: {room_id}/{up_name} 下播了(轮播中)") except Exception as _e: logger.warning( f'试图向群组发送直播间: {room_id}/{up_name} 的直播通知时发生了错误: {repr(_e)}') # 检查所有在订阅表里面的直播间(异步) tasks = [] for rid in check_sub: tasks.append(check_live(rid)) try: await asyncio.gather(*tasks) logger.debug('bilibili_live_monitor: checking completed') except Exception as e: logger.error( f'bilibili_live_monitor: error occurred in checking {repr(e)}')
async def invite_auto(ev: Event = {}): bot = get_bots()[config.bot_id] msg = "" with open(os.path.join(plugin_path, "account.json")) as fp: config_json = json.load(fp) white_list = config_json["white_list"] while client.shouldLogin: await client.login() if os.path.exists(plugin_path + "/data.json"): with open(plugin_path + "/data.json", "rb") as f: data_save = json.loads(f.read()) else: data_save = "" # 获取游戏内信息 clan_info_data = { "clan_id": 0, "get_user_equip": 1, "viewer_id": client.viewer_id, } clan_info = await client.callapi("/clan/info", clan_info_data) member_list = {} if clan_info.get("clan"): for item in clan_info["clan"]["members"]: member_list[item["viewer_id"]] = item["name"] clan_join_request_list_data = { "clan_id": clan_info["clan"]["detail"]["clan_id"], "page": 0, "oldest_time": 0, "viewer_id": client.viewer_id, } join_request_list = await client.callapi("/clan/join_request_list", clan_join_request_list_data) # print("join_request_list", join_request_list) reruest_list = [item["viewer_id"] for item in join_request_list["list"]] # print(reruest_list) for item in join_request_list["list"]: # 自动同意,想要启用自动同意取消注释即可,懒得写开关了 # if item["viewer_id"] in white_list: # clan_join_request_accept_data = { # "request_viewer_id": item["viewer_id"], # "clan_id": clan_info["clan"]["detail"]["clan_id"], # "viewer_id": client.viewer_id, # } # clan_join_request_accept = await client.callapi("/clan/join_request_accept", clan_join_request_accept_data) # print(f"同意{item['name']}加入公会") # msg+=f"哦,是猫猫的好朋友{item['name']}来了,已自动同意加入公会{clan_info['clan']['detail']['clan_name']}" # request_count-=1 # print("clan_join_request_accept", clan_join_request_accept) # else: # if data_save.get('invite_list'): if data_save["invite_list"].get(str(item["viewer_id"])): # 有效申请 print(time.time() - int(data_save["invite_list"][str(item["viewer_id"])]["create_time"])) print("is_old", data_save["invite_list"][str(item["viewer_id"])]["old"]) if ( time.time() - int(data_save["invite_list"][str(item["viewer_id"])]["create_time"]) < 10 * 60 or data_save["invite_list"][str(item["viewer_id"])]["old"] ): data_save["invite_list"][str(item["viewer_id"])]["old"] = False msg += f"嗯? {item['name']} 申请加入公会,猫猫要怎么做呢?\nuid:{item['viewer_id']}" print("msg:", msg) else: # 新的申请 data_save["invite_list"][str(item["viewer_id"])]["old"] = False msg += f"嗯? {item['name']} 申请加入公会,猫猫要怎么做呢?\nuid:{item['viewer_id']}" data_save["invite_list"][str(item["viewer_id"])] = {"create_time": int(time.time())} with open(plugin_path + "/data.json", "w", encoding="utf8") as f: json.dump(data_save, f, ensure_ascii=False) # 过期申请 for item in data_save["invite_list"]: if item not in reruest_list: data_save["invite_list"][item]["old"] = True if msg != "": msg += f"\n================\ninvite <uid>: 有申请则通过,无申请则邀请" if ev: await bot.send(ev, message=Message(f"{msg}"), at_sender=True) elif msg: await bot.send_group_msg( group_id=account_json["group_id"], message=Message(f"[CQ:at,qq={account_json['admin']}]\n{msg}") ) # await bot.send_group_msg(group_id=618773789, message=f"[CQ:at,qq={account_json['admin']}]\n{msg}") # 自动邀请,鸽了 return
async def pixivision_monitor(): logger.debug(f"pixivision_monitor: checking started") # 获取当前bot列表 bots = [] for bot_id, bot in get_bots().items(): bots.append(bot) # 获取所有有通知权限的群组 all_noitce_groups = [] t = DBTable(table_name='Group') for item in t.list_col_with_condition('group_id', 'notice_permissions', 1).result: all_noitce_groups.append(int(item[0])) # 初始化tag黑名单 block_tag_id = [] block_tag_name = [] for block_tag in TAG_BLOCK_LIST: block_tag_id.append(block_tag.get('id')) block_tag_name.append(block_tag.get('name')) # 提取数据库中已有article的id列表 exist_article = [] t = DBTable(table_name='Pixivision') for item in t.list_col('aid').result: exist_article.append(int(item[0])) # 获取最新一页pixivision的article new_article = [] _res = await get_pixivsion_article() if _res.success() and not _res.result.get('error'): try: pixivsion_article = dict(_res.result) for article in pixivsion_article['body']['illustration']: article_tags_id = [] article_tags_name = [] for tag in article['tags']: article_tags_id.append(int(tag['tag_id'])) article_tags_name.append(str(tag['tag_name'])) # 跳过黑名单tag的article if list(set(article_tags_id) & set(block_tag_id)) or list( set(article_tags_name) & set(block_tag_name)): continue # 获取新的article内容 if int(article['id']) not in exist_article: logger.info( f"pixivision_monitor: 检查到新的Pixivision article: {article['id']}" ) new_article.append({ 'aid': int(article['id']), 'tags': article_tags_name }) except Exception as e: logger.error( f'pixivision_monitor: an error occured in checking pixivision: {repr(e)}' ) return else: logger.error( f'pixivision_monitor: checking pixivision timeout or other error: {_res.info}' ) return if not new_article: logger.info(f'pixivision_monitor: checking completed, 没有新的article') return sub = DBSubscription(sub_type=8, sub_id=-1) # 获取订阅了该直播间的所有群 sub_group = sub.sub_group_list().result # 需通知的群 notice_group = list(set(all_noitce_groups) & set(sub_group)) # 处理新的aritcle for article in new_article: aid = int(article['aid']) tags = list(article['tags']) a_res = await pixivsion_article_parse(aid=aid, tags=tags) if a_res.success(): if not notice_group: continue article_data = a_res.result msg = f"新的Pixivision特辑!\n\n" \ f"《{article_data['title']}》\n\n{article_data['description']}\n{article_data['url']}" for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) except Exception as e: logger.warning( f"向群组: {group_id} 发送article简介信息失败, error: {repr(e)}" ) continue # 处理article中图片内容 tasks = [] for pid in article_data['illusts_list']: tasks.append(fetch_image_b64(pid=pid)) p_res = await asyncio.gather(*tasks) image_error = 0 for image_res in p_res: if not image_res.success(): image_error += 1 continue else: img_seg = MessageSegment.image(image_res.result) # 发送图片 for group_id in notice_group: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=img_seg) except Exception as e: logger.warning( f"向群组: {group_id} 发送图片内容失败, error: {repr(e)}") continue logger.info(f"article: {aid} 图片已发送完成, 失败: {image_error}") else: logger.error(f"article: {aid} 信息解析失败, info: {a_res.info}") logger.info( f'pixivision_monitor: checking completed, 已处理新的article: {repr(new_article)}' )
async def errlogger(msg): bot = get_bots()[config.bot_id] await bot.send_private_msg(user_id=acinfo["admin"], Message=f"猫猫登录错误:{msg}")
async def update_rss(rss: Rss, mode='init'): try: connect = sqlite3.connect('./db/rss.db') cursor = connect.cursor() if (mode == 'init'): results = cursor.execute( 'SELECT * FROM rss WHERE rss_url="{rss_url}"'.format( rss_url=rss.url)) results = [result for result in results] rss.id = results[0][0] r = requests.get(rss.url) r = feedparser.parse(r.text) new_items = [ Item(rss_id=rss.id, title=item['title'], link=item['link']) for item in r['entries'] ] # 与存储在数据库中的item进行比较,查看是否有更新 sql = 'SELECT * FROM items WHERE rss_id={rss_id}'.format(rss_id=rss.id) results = cursor.execute(sql) old_items = [ Item(rss_id=item[0], id=item[1], title=item[2], link=item[3]) for item in results ] update_items = [] for new_item in new_items: is_update = True for old_item in old_items: if (old_item.title == new_item.title and old_item.link == new_item.link): is_update = False break if (is_update): update_items.append(new_item) if (len(update_items) >= 1): for item in update_items: sql = 'INSERT INTO items (rss_id,title,link) VALUES({rss_id},"{title}","{link}");'.format( rss_id=item.rss_id, title=item.title.replace('"', '""'), link=item.link) cursor.execute(sql) connect.commit() if (mode == 'update'): bots = get_bots() bot = None for id in bots.keys(): bot = bots[id] subscribres = cursor.execute( 'SELECT * FROM subscribe WHERE rss_id={rss_id}'.format( rss_id=rss.id)) for update in update_items: for subscribre in subscribres: reply = msg.at(user_id=subscribre[1]) reply = reply + '您所订阅的{rss_name}更新了\r\ntitle:{title}\r\nurl:{url}'.format( rss_name=subscribre[5], title=update.title, url=update.link) try: await bot.send_group_msg(group_id=subscribre[2], message=reply) except Exception: raise Exception('发送rss更新失败!') except Exception as e: logger.error('rss {name}更新失败!'.format(name=rss.name)) raise Exception(e.args[0]) finally: cursor.close() connect.close()
def get_first_bot() -> Optional[Bot]: """ 获得连接的第一个 bot """ if get_bots(): return list(get_bots().values())[0]
async def sleep(): for bot in get_bots().values(): for group in groups: await bot.send_group_msg(group_id=group, message=sleep_img)
def get_bot(): if nonebot.get_bots(): return list(nonebot.get_bots().values())[0]
async def check(bot: Bot = get_bots(), event: Event = {}): print("ev", event) bot = get_bots()[config.bot_id] while client.shouldLogin: await client.login() if os.path.exists(plugin_path + "/data.json"): with open(plugin_path + "/data.json", "rb") as f: data_save = json.loads(f.read()) else: data_save = "" result = [] # /clan/info data1 = { "clan_id": 0, "get_user_equip": 1, "viewer_id": client.viewer_id, } res1 = await client.callapi("/clan/info", data1) # print("res1:", res1) # /clan/chat_info_list data2 = { "clan_id": res1["clan"]["detail"]["clan_id"], "start_message_id": 0, "search_date": "2099-12-31", "direction": 1, "count": 10, "wait_interval": 3, "update_message_ids": [], "viewer_id": client.viewer_id, } res2 = await client.callapi("/clan/chat_info_list", data2) # print("res2:", res2) clan_chat_message = res2["clan_chat_message"] equip_requests = res2["equip_requests"] users = res2["users"] # 只统计8小时内的 for equip_request in equip_requests: for chat_message in clan_chat_message: if ( chat_message["message_id"] == equip_request["message_id"] and int(time.time()) - int(chat_message["create_time"]) <= 8 * 3600 ): # print(equip_request) # print(chat_message["create_time"]) for user in users: if user["viewer_id"] == chat_message["viewer_id"]: # print(chat_message["viewer_id"], user["name"]) result.append( { "viewer_id": equip_request["viewer_id"], "name": user["name"], "equip_id": equip_request["equip_id"], "request_num": equip_request["request_num"], "donation_num": equip_request["donation_num"], "create_time": chat_message["create_time"], } ) # print(result) remind_list = [] if not event: if data_save != {}: for item in result: if data_save["users"].get(str(item["viewer_id"])): # 新请求提醒 if data_save["users"][str(item["viewer_id"])]["create_time"] != item["create_time"]: remind_list.append(item) # 请求将要结束提醒 elif ( 0 <= item["create_time"] + 8 * 3600 - int(time.time()) <= 15 * 60 and item["donation_num"] < 10 ): remind_list.append(item) else: remind_list.append(item) else: for item in result: remind_list.append(item) else: for item in result: remind_list.append(item) for item in result: data_save["users"][str(item["viewer_id"])] = item print("remind_list:", remind_list) reply = "" for i in range(len(remind_list)): reply += f"{remind_list[i]['name']}请求装备:{equip_data_dict[remind_list[i]['equip_id']]}\n目前捐助:{remind_list[i]['donation_num']}/{remind_list[i]['request_num']}\n结束时间:{time.strftime('%H:%M:%S',time.localtime(int(remind_list[i]['create_time'])+8*3600))}\n==============" if i != len(remind_list) - 1: reply += "\n" # 写入文件 with open(plugin_path + "/data.json", "w", encoding="utf8") as f: json.dump(data_save, f, ensure_ascii=False) # print("reply:", reply) print(event) if event: await bot.send(event, message=Message(f"[CQ:at,qq={account_json['admin']}]\n{reply}")) elif reply: await bot.send_group_msg( group_id=account_json["group_id"], message=Message(f"[CQ:at,qq={account_json['admin']}]\n{reply}") ) # await bot.send_group_msg(group_id=618773789, message=f"[CQ:at,qq={account_json['admin']}]\n{reply}") await invite_auto() return remind_list