async def check_update(self): temp_dict = {} diff_dict = {} logger.info(f'Original: {self.tweet_list_init}') tasks = [] for ch_name in self.tweet_config: tasks.append(self._check_update_helper(ch_name)) results = await asyncio.gather(*tasks) for element in results: temp_dict.update(element) for element in temp_dict: if element not in self.tweet_list_init or \ (self.tweet_list_init[element] != temp_dict[element]): if not (not temp_dict[element] or temp_dict[element] == '转发动态' or temp_dict[element] == self.INFO_NOT_AVAILABLE or element not in self.tweet_list_init): diff_dict[element] = temp_dict[element] self.tweet_list_init = temp_dict logger.info(f'Changed: {self.tweet_list_init}') return diff_dict
async def _(bot: Bot, event: Event, state: dict): msg = str(event.message) logger.info(msg) user_id = str(event.user_id) group = str(event.group_id) if group not in records: rec = Record(msg, user_id, 1) records[group] = rec return rec = records.get(group) if rec.last_msg != msg or rec.last_user_id == user_id: rec.last_msg = msg rec.repeat_count = 1 return rec.repeat_count += 1 if rec.repeat_count == 2: if msg not in repeat_data: repeat_data[msg] = 1 else: repeat_data[msg] += 1 with open(RECORD, 'w') as file: ujson.dump(repeat_data, file) delay = randint(5, 20) / 10 await asyncio.sleep(delay) await repeater.finish(msg)
async def addQQ(qqNum, qqId) -> str: if qqNum in myQQs: try: qqInfo = qqId.split(",") for i in qqInfo: if i == "": continue try: int(i.split("*")[0]) #判断是不是数字 if len(i.split("*")) > 1: #判断增加次数是不是数字 int(i.split("*")[1]) except ValueError as identifier: continue logger.info(i) num = int(i.split("*")[1]) if len(i.split("*")) > 1 else 1 addQQUsedNum(i.split("*")[0], num) msg = getCurrQQList(getQQList()) #return "添加成功!当前可用列表:"+(",".join('%s' %id for id in qqList)) return "添加成功!当前可用列表:\n" + msg except (ValueError): return "QQ只能是数字哦~" else: return "您没有权限添加!"
async def achat(session: CommandSession): logger.info('[一言]用户激活指令开始运行') aword = session.get('aword') logger.debug('[一言]向编译库发送请求获取信息') achat_report = await get_achat_of_chat(aword) logger.info('[一言]向用户发送运行结果,任务结束') await session.send(achat_report,at_sender=True)
async def pixiv_handle(bot: Bot, event: Event, state: dict): msg = str(event.message).strip() msg = msg.replace('/pixiv', '') if not msg: logger.info('pixiv_handle | no keyword') await sv_search.finish() state['keyword'] = msg
async def call_tencent_api(qq: int, content: str): rand_str = ''.join(random.sample(ALL_STR, 20)) # 随机字符串 time_pin = int(time.time()) # 时间戳 raw = "app_id=" + APP_ID + \ "&nonce_str=" + rand_str + \ "&question=" + quote(content.replace(' ', '。')) + \ "&session=" + str(qq) + \ "&time_stamp=" + str(time_pin) sign = await calcu_sign(raw + "&app_key=" + APP_KEY) raw += '&sign=' + sign resp = await requests.get(CHAT_API + raw) resp = await resp.json() logger.info(resp) if not isinstance(resp, dict) or \ resp.get('ret') != 0 or \ not resp.get('data'): return None if qq: return resp['data']['answer'] return resp['data']['answer']
async def do_tweet_update_fetch(): logger.info('Automatically fetching tweet info...') diff_dict = await tweet.check_update() if diff_dict: bot = nonebot.get_bot() for ch_name in diff_dict: group_id_list = tweet.get_tweet_config()[ch_name]['group'] message = diff_dict[ch_name] if message[0:2] == 'RT': message = f'=== {ch_name}转发推文说 ===\n' + message elif message[0] == '@': message = f'=== {ch_name}回了一条推 ===\n' + message else: message = f'=== {ch_name}发了一条推 ===\n' + message nonebot.logger.warning(f'发现新推!来自{ch_name}:\n' f'{message}') for element in group_id_list: sanity_meter.set_user_data(0, 'tweet', 1, True) await bot.send_group_msg(group_id=element, message=message) await bot.send_private_msg( user_id=SUPER_USER, message=f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] ' f'A message was sent to group: {element}\n' f'The group belongs to: {ch_name}')
async def dblwar(session: CommandSession): tag = session.get('tag', prompt='欢迎使用特别功能!请回复你的游戏TAG查询你的部落战情况吧', at_sender=True, only_to_me=True) dblwar_report = await get_dblwar(tag) #logger.info('[部落3+1]发送打油诗') #await session.send('信息量较大查询可能较慢,敬请谅解\n请稍微休息一下吧:\n部落3 + 1,获胜笑嘻嘻。\n既能拿宝箱,还能拿奖品。\n倘若人数多,岂不悲哀乎?\n管家笑嘻嘻,首领惨兮兮。\n温馨提示:仅为小管家自动吐槽,逗君一笑,请勿当真!',at_sender=True) if dblwar_report == 'ERROR-CRTimeOut': logger.info('[部落3+1]出现错误了:官方API查询超时,提示详见Debug模式') logger.debug('[部落3+1]详细信息:查询超时.详见小管家Wiki') logger.debug('[部落3+1]查询脚本执行完毕并返回信息到Nonebot脚本') await session.send('出现意外了:\n因为连接速度太慢所以主动放弃查询了,请您重新使用指令再查询一下吧', at_sender=True) elif dblwar_report == 'ERROR-CRNotCallMe': logger.info('[部落3+1]用户意外触发或未正常放弃,查询无效,提示详见Debug模式') logger.debug('[部落3+1]详细信息:包含英文数字以外的其他语言,查询无效.详见小管家Wiki') logger.debug('[部落3+1]查询脚本执行完毕并返回信息到Nonebot脚本') await session.send('对不起,你似乎不是来查询信息的(。﹏。)', at_sender=True) elif dblwar_report == 'NotWar': logger.info('[部落3+1]信息查询完成,部落未开部落战') logger.debug('[部落3+1]查询脚本执行完毕并返回信息到Nonebot脚本') await session.send('部落战还没有开始呢,着急不是一件好事情(⊙o⊙)哦', at_sender=True) elif dblwar_report == 'NoUser': logger.info('[部落3+1]信息查询完成,没有参战或不在查询部落') logger.debug('[部落3+1]查询脚本执行完毕并返回信息到Nonebot脚本') await session.send('没有参战的小坏蛋查什么部落战?一边喝可乐去( ̄┰ ̄)', at_sender=True) else: await session.send(dblwar_report, at_sender=True) logger.info('[部落3+1]结果无错误并已查询完毕并发送给用户,任务结束')
def run_py(code, callback): logger.info("Running .. '{}'".format(code)) client = docker.from_env() tmp_dir = tempfile.mkdtemp() file_name = "temp.py" with open(os.path.join(tmp_dir, file_name), "w", encoding="utf-8") as file: file.write("{}".format(code)) logger.info("Container created.") container = client.containers.create( DOCKER_IMAGE, "python /temp/{}".format(file_name), tty=True, detach=False, volumes={tmp_dir: { "bind": "/temp", "mode": "ro" }}, mem_limit="50m", memswap_limit="50m", oom_kill_disable=True, nano_cpus=int(0.1 * 1 / 1e-9), ) thd = Thread(target=execute_daemon_calc, args=(container, callback)) thd.setDaemon(True) thd.start() keeper = Thread(target=keeper_thread, args=(thd, container, code, callback)) keeper.setDaemon(True) keeper.start() keeper.join() thd.join()
async def wrapper(session: UnionSession, *args, **kwargs): returnData: Union[Tuple[str, bool], str] = await function( session, *args, **kwargs ) if isinstance(returnData, tuple): replyData, atSender = returnData else: replyData, atSender = returnData, True if not isinstance(replyData, (str, MessageSegment)): return replyData = str(replyData) if atSender: replyData = "\n" + replyData if settings.DEBUG: replyData += "\n(DEBUG)" logger.info( "Reply to message of conversation " + f'{session.ctx["message_id"]} as {_shortCQCode(replyData)}' ) if hasattr(session, "finish"): session.finish(replyData, at_sender=atSender) else: await session.send(replyData, at_sender=atSender)
async def update_pcrdata(): ''' 对比本地和远程的_pcr_data.py, 自动补充本地没有的角色信息, 已有角色信息不受影响 ''' online_pcrdata = await get_online_pcrdata() logger.info('开始对比角色数据') if online_pcrdata == {}: return -1 for id in online_pcrdata: if id not in _pcr_data.CHARA_NAME and id != 9401: logger.info(f'已开始更新角色{id}的数据和图标') # 由于返回数据可能出现全半角重复, 做一定程度的兼容性处理, 会将所有全角替换为半角, 并移除重复别称 for i, name in enumerate(online_pcrdata[id]): name_format = name.replace('(', '(') name_format = name_format.replace(')', ')') online_pcrdata[id][i] = name_format # 转集合再转列表, 移除重复元素 online_pcrdata[id] = list(set(online_pcrdata[id])) _pcr_data.chara_master.add_chara(id, online_pcrdata[id]) chara.download_chara_icon(id, 6) chara.download_chara_icon(id, 3) chara.download_chara_icon(id, 1) # 重载花名册(不会引起全局reload) _pcr_data.chara_master.sort() chara.update()
async def autoTest(session: CommandSession): msg = session.get('msgInfo', prompt='请输入学号和密码(ps:学号和密码用空格分隔开,密码为身份证后6位)') qqNum = session.ctx["user_id"] useNum = selectNumByQQId(qqNum) msgsplit = msg.split(' ') logger.info(str(qqNum) + "当前可用次数:" + str(useNum)) if (useNum is not None and useNum > 0) or qqNum in myQQs: if len(msgsplit) < 2: sendMsg = "账号密码格式不正确!" else: auth = "9h6BGD624a273gm2FOJeeDeY5jKB7b5NR6b1LR75adQleqg8gfE8vyBq3abXY1eV090u5n6fR5RefEFyZ3jZH820NtuDc4HZ9Isz63IeDv6dPA0FeHU3P0TJ15O9mzf4d00ffMeaX8qvS2i8U3CX7Df9r5x00Fn2UJT3Q1btEa4X0kiy1c0L2P0ao4LB0J1RB17cJf6O17e84rc8M9pbcvuu01d2N1R6aW1FBMVS20c6A6cs5C586Tlc2dJFGxsB" resp = httpGet(session.bot.config.localhost + "/getToken?auth=" + auth) data = { "username": msgsplit[0], "password": msgsplit[1], "token": resp.text } sendMsg = httpPost(session.bot.config.localhost + "/sportfull", data).json()['msg'] if sendMsg.find("请自行登录公体部查询确认") > 0: updateNum(qqNum, useNum - 1) else: sendMsg = "您还未获得相关权限!" await session.send(sendMsg)
def disable_cache(self) -> None: """关闭定时缓存任务""" if self._cache_job: self._cache_job.remove() self._cache_job = None plugin_config.fflogs_enable_cache = False logger.info("定时缓存已关闭")
async def luck(bot: Bot, event: Event, state: dict): if len(utils.war or utils.magic or utils.land or utils.hand or utils.stains) == 0: await utils.initialization() # 拿到命令使用者的qq号 caller_qq_number = event.user_id logger.info(caller_qq_number) # 生成当天种子 r = random.Random(await utils.get_seed(caller_qq_number)) # content # 运势 1-100 luck_number = str(r.randint(1, 100)) # 职业 ff14全部职业 luck_job = await utils.sub_event(str(r.choice(utils.war + utils.magic + utils.land + utils.hand))) # 宜 luck_event = r.choice(utils.EVENT_LIST) # 忌 unlucky_event = utils.EVENT_LIST.copy() unlucky_event.remove(luck_event) unlucky_event = r.choice(unlucky_event) # 染剂 stain = r.choice(utils.stains) # 一言 hint = await utils.get_hint(luck_number, luck_job, luck_event, unlucky_event, stain) message = "运势: " + luck_number + "% 幸运职业: " \ + luck_job + "\n宜: " + luck_event + " 忌: " + unlucky_event + " 幸运染剂: " + stain + "\n" + hint # print(r.randint(0, len(EVENT_LIST) - 2)) try: group_id = event.group_id await ffxiv_zhanbu.send("\n" + message, at_sender=True) except: await ffxiv_zhanbu.send(message)
async def passkeygetdll(): data = await request.form dllid = data['id'] passkey = data['passkey'] HWID = data['HWID'] ret = {} if passkey and HWID and db.checkPassKey(passkey, HWID): db.varpp('dllcount') db.varpp('dllcountday') ret['status'] = 'success' paths = db.getDLL(dllid) with open(paths['dllpath'], 'rb') as dllfile: with open(paths['xprpath'], 'rb') as xprfile: ret['payload'] = { 'dll': base64.b64encode(dllfile.read()).decode(), 'xpr': base64.b64encode(xprfile.read()).decode(), } if paths['resourcepath']: with open(paths['resourcepath'], 'rb') as rcfile: ret['payload']['resource'] = base64.b64encode(rcfile.read()).decode() await bot.send_group_msg_rate_limited(group_id=config.notice_group, message='用户' + passkey + '已注入DLL IP:' + request.remote_addr) logger.info('用户' + passkey + '已注入DLL IP:' + request.remote_addr) else: ret['status'] = 'failed' return json.dumps(ret)
async def selectItem(session: CommandSession): getItem = session.get('msgInfo', prompt='请问你要查询的题目是?') data = {'topic[0]': getItem} resp = requests.session().post('https://cx.icodef.com/v2/answer', data=data, verify=False, timeout=5) logger.info(resp.json()) result = [] for each in resp.json(): for answ in each['result']: temp = {} temp['题目'] = answ['topic'] temp['答案'] = '' for option in answ['correct']: temp['答案'] = temp['答案'] + str(option['content']) isAdd = True for i in result: if removeSign(i).find(removeSign(temp['题目'])) > 0: isAdd = False if isAdd: result.append( str("题目:" + temp['题目'] + "\n答案:" + temp['答案'] + "\n")) if len(result) > 0: resultMsg = "查询结果如下:\n" + "\n".join(result) else: resultMsg = "没有该题目的答案" await session.send(resultMsg)
def del_event(token: str, event_type='normal', **kwargs) -> None: """ 移除冷却事件。 参数: - `token: str`:事件标签。 关键字参数: - `event_type: str`:事件类型,默认为 `normal`。包括: - `global`:全局冷却事件; - `group`:群组冷却事件,需要额外的关键字参数 `group: int` 指定群组 ID; - `normal`:一般冷却事件,需要额外的关键字参数 `group: int` 和 `user: int` 分别指定群组 ID 和用户 ID; - `user`:用户冷却事件,需要额外的关键字参数 `user: int` 指定用户 ID。 """ global _cooldown_events group = kwargs.get('group') if event_type in ('group', 'normal') else 0 user = kwargs.get('user') if event_type in ('normal', 'user') else 0 records = _cooldown_events.get(token) for i, record in enumerate(records): if record.get('group') == group and record.get('user') == user: del records[i] logger.info(f'Event {token}({record}) has been removed manually.')
async def deldy(session: CommandSession): rss_name = session.get('deldy', prompt='输入要删除的订阅名或订阅地址') # 权限判断 user_id = session.ctx['user_id'] # print(type(user_id),type(config.ROOTUSER)) if int(user_id) in config.ROOTUSER: # 获取、处理信息 flag = 0 try: list_rss = RWlist.readRss() for rss_ in list_rss: if rss_.name == rss_name or rss_.url == rss_name: list_rss.remove(rss_) scheduler.remove_job(rss_.name) try: os.remove(file_path+rss_.name+".json") except BaseException as e: logger.info(e) await session.send('订阅 ' + rss_name + ' 删除成功!') flag = flag + 1 if flag <= 0: await session.send('订阅 ' + rss_name + ' 删除失败!该订阅不存在!') else: RWlist.writeRss(list_rss) await session.send('删除 ' + str(flag) + ' 条订阅!') except BaseException as e: #logger.info(e) await session.send('你还没有任何订阅!') else: await session.send('你没有权限进行此操作!\n关于插件:http://ii1.fun/7byIVb')
async def handle_image(bot: Bot, event: Event, state: dict): message = str(event.get_message()) images = await get_data(message) # TODO 使用抛出异常的方式统一处理,避免使用独立的异常处理逻辑 if type(images) is list and len(images): logger.info(f'[{message}] images count: {len(images)}') reply_image = random.choice(images) # logger.info(f'reply_image: {reply_image}') # 使用 objURL 时,图片可能会不存在,不知道百度搜图这个操作啥意思 _(:3J∠)_ # 可能是由于百度会从源地址去下载原图,但是原图不存在的问题 obj_url = reply_image['objURL'] middle_url = reply_image['middleURL'] logger.info(f'obj_url: {obj_url}') logger.info(f'middle_url: {middle_url}') try: # await image.finish(f'[CQ:image,file={escape(reply_image)}]') # 通过字符串暂时无法发送带有特殊符号的图片链接 await image.finish(get_message(event, obj_url)) logger.info(f'reply obj_url: {obj_url}') except exception.ActionFailed: logger.warning(f'reply obj_url failed, retry by middle_url') await image.finish(get_message(event, middle_url)) else: logger.info(f'[{message}] no images') await image.finish(f'未找到 [{message}] 相关图片 _(:3J∠)_')
async def update_group_members(bot: Bot, group_id: str): """Update group members' information and store it to the database.""" logger.info('Updating group [%s] members ...' % group_id) universal_id = str(bot.self_id) + str(group_id) # load the original information from the database members = load(universal_id, 'members') if not members: members = {} group_members_list = await bot.get_group_member_list(group_id=group_id) for member in group_members_list: group_member_info = await bot.get_group_member_info( group_id=group_id, user_id=member['user_id'], no_cache=True) user_id = str(group_member_info['user_id']) if user_id not in members: # update the user information from the remote server members[user_id] = {} members[user_id]['id'] = group_member_info['title'] members[user_id]['nickname'] = group_member_info['nickname'] members[user_id]['card'] = group_member_info['card'] for user_id in members: # generate locally stored information members[user_id].setdefault('42score', 0) members[user_id].setdefault('42score_daily', 0) # save the updated information to the database save(universal_id, 'members', members)
async def commit(): """Commit to the database, saving the file on disk from memory.""" logger.info('Saving the database to disk ...') database_backup = os.path.join(database_backup_directory, '%d.bak' % int(time.time() * 1000000)) shutil.copyfile(database_location, database_backup) backups = os.listdir(database_backup_directory) removes = (0 < database_backup_max_storage < len(backups)) * (len(backups) - database_backup_max_storage) for i in range(removes): os.remove(os.path.join(database_backup_directory, backups[i])) # remove the redundant files try: with gzip.open(database_location, 'wb', compresslevel=database_compress_level) as tf: tf.write(json.dumps(database, sort_keys=True).encode()) return True except Exception: logger.error('Failed to save the database ...') logger.error(traceback.format_exc()) return False
async def execute(cmd, cwd=SHARED, user="******", main_group="damebot", extra_group=tuple(), env_vars=None, umask=None, empty_hint=True): if env_vars is None: env_vars = {} os.makedirs(cwd, exist_ok=True) result = await ensure_user(user, main_group, extra_group) splited = shlex.split(cmd) logger.info(f"trying to execute {splited}") proc = await asyncio.create_subprocess_exec( *splited, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, cwd=cwd, preexec_fn=set_ids(user, umask), env=env_vars, ) logger.debug(f"'{cmd}' process created.") stdout, stderr = await proc.communicate() logger.debug(f"got stdout \nf{stdout}") logger.debug(f"got stderr \nf{stderr}") if proc.returncode == 0: # also can use proc.returncode output = stdout.decode() if output.strip() == "": output = stderr.decode().strip() if empty_hint: if output.strip() == "": output = f"'{cmd}' できだ" + "!" * randint(1,3) else: err_short = await summary(stdout.decode().strip() + " " + stderr.decode().strip()) output = dame(err_short) return output
async def pixiv_rank(bot: Bot, event: Event, state: dict): # uid = bot.config.superusers[0] # sid = bot.self_id now = datetime.datetime.now() last = datetime.timedelta(days=1) lastday = now - last yesterday = lastday.strftime('%Y-%m-%d') try: aapi.login(USERNAME, PWD) res = aapi.illust_ranking(mode='day', date=yesterday) except Exception as e: await sv_rank.finish('exception') return if 'has_error' in res: error_info = res['errors']['system']['message'] res_info = f'pixivrank error:{error_info}' await sv_rank.finish(res_info) return if not res.illusts: logger.info('no pixiv rank result') await sv_rank.finish('no result') return works = res.illusts[:5] rank_list = '' for item in works: pid = item['id'] title = item['title'] account = item['user']['name'] image = await get_image(pid) link = f'https://www.pixiv.net/artworks/{pid}' rank_list += f'>>>{title}\n画师:{account}\n{image}\n{link}\n' msg = f'======pixiv排行榜======\n{rank_list}'.strip() await sv_rank.finish(msg)
async def refresh_calendar(self) -> None: """获取最新的日程表""" if self._timeline: # 最近四小时内才更新的不用再次更新 if self._timeline_update_time > datetime.now() - timedelta(hours=4): return try: async with httpx.AsyncClient() as client: r = await client.get(self._url) rjson = r.json() # 清除以前的时间线 self._timeline.clear() for event in rjson: start_time = datetime.strptime( event["start_time"], "%Y/%m/%d %H:%M:%S" ) end_time = datetime.strptime(event["end_time"], "%Y/%m/%d %H:%M:%S") name = event["name"] self.add_event(start_time, end_time, name) self._timeline_update_time = datetime.now() logger.info("公主连结Re:Dive 日程表刷新成功") except (httpx.HTTPError, KeyError) as e: logger.error(f"获取日程表出错,{e}") # 抛出上面任何异常,说明调用失败 return
def my_trigger_cron(rss: rss_class.Rss): # 解析参数 tmp_list = rss.time.split("_") times_list = ["*/5", "*", "*", "*", "*"] for index, value in enumerate(tmp_list): if value: times_list[index] = value try: # 制作一个触发器 trigger = CronTrigger( minute=times_list[0], hour=times_list[1], day=times_list[2], month=times_list[3], day_of_week=times_list[4], timezone="Asia/Shanghai", ) except Exception as e: logger.error(f"创建定时器错误!cron:{times_list} E:{e}") return # 添加任务 scheduler.add_job( func=check_update, # 要添加任务的函数,不要带参数 trigger=trigger, # 触发器 args=(rss,), # 函数的参数列表,注意:只有一个值时,不能省略末尾的逗号 id=rss.name, misfire_grace_time=30, # 允许的误差时间,建议不要省略 max_instances=1, # 最大并发 default=ThreadPoolExecutor(64), # 最大线程 processpool=ProcessPoolExecutor(8), # 最大进程 coalesce=True, # 积攒的任务是否只跑一次,是否合并所有错过的Job ) logger.info(f"定时任务 {rss.name} 添加成功")
def saveDetail(): logger.info("Refreshing detail of users and groups.") groupList: List[Dict[str, Any]] = callModuleAPI("get_group_list") groupData: Dict[int, Dict[str, Any]] = {} usersData: Dict[int, List[Dict[str, Any]]] = {} for group in groupList: groupID: int = group["group_id"] groupName: str = group["group_name"] data = callModuleAPI("get_group_member_list", params={"group_id": groupID}, ignoreError=True) if not data: continue groupData[groupID] = data DatabaseIO.groupCreate(models.Groups(gid=groupID, name=groupName, members=data), updateIfExist=True) for user in data: userID: int = user["user_id"] userGroups = usersData.get(userID, []) for i in userGroups: if i["group_id"] == groupID: userGroups.remove(i) userGroups.append(user) usersData[userID] = userGroups for userID, user in usersData.items(): DatabaseIO.userCreate( models.Users(uid=userID, nickname=user[0]["nickname"], data=user), updateIfExist=True, )
async def _run_matcher(Matcher: Type[Matcher], bot: Bot, event: Event, state: dict) -> Union[None, NoReturn]: if Matcher.expire_time and datetime.now() > Matcher.expire_time: raise _ExceptionContainer([ExpiredException]) try: if not await Matcher.check_perm( bot, event) or not await Matcher.check_rule(bot, event, state): return except Exception as e: logger.error(f"Rule check failed for matcher {Matcher}. Ignored.") logger.exception(e) return # TODO: log matcher logger.info(f"Event will be handled by {Matcher}") matcher = Matcher() # TODO: BeforeMatcherRun try: logger.debug(f"Running matcher {matcher}") await matcher.run(bot, event, state) except Exception as e: logger.error(f"Running matcher {matcher} failed.") logger.exception(e) exceptions = [] if Matcher.temp: exceptions.append(ExpiredException) if Matcher.block: exceptions.append(StopPropagation) if exceptions: raise _ExceptionContainer(exceptions)
async def getdll(): data = await request.form id = data['id'] sessionkey = data['sessionkey'] ret = {} if db.isbanned(sessionkey.split('::')[0]): ret['status'] = 'banned' return json.dumps(ret) if id and sessionkey and ssmgr.checkSessionkey(sessionkey) and data['version'] == db.getvar('current_version'): db.varpp('dllcount') db.varpp('dllcountday') db.statistics_injectpp(sessionkey.split('::')[0]) ret['status'] = 'success' paths = db.getDLL(id) with open(paths['dllpath'], 'rb') as dllfile: with open(paths['xprpath'], 'rb') as xprfile: ret['payload'] = { 'dll': base64.b64encode(dllfile.read()).decode(), 'xpr': base64.b64encode(xprfile.read()).decode(), } if paths['resourcepath']: with open(paths['resourcepath'], 'rb') as rcfile: ret['payload']['resource'] = base64.b64encode(rcfile.read()).decode() if paths['keypath']: with open(paths['keypath'], 'rb') as rcfile: ret['payload']['keyfile'] = base64.b64encode(rcfile.read()).decode() ret['payload']['keyfilename'] = paths['keypath'].split('/')[-1] ret['sessionkey'] = sessionkey # db.newSessionkey(sessionkey.split("::")[0]) await bot.send_group_msg_rate_limited(group_id=config.notice_group, message='用户' + sessionkey.split('::')[0] + '注入DLL ' + id + ' IP:' + request.remote_addr) logger.info('用户' + sessionkey.split('::')[0] + '注入DLL ' + id + ' IP:' + request.remote_addr) else: ret['status'] = 'failed' return json.dumps(ret)
def run(host: Optional[str] = None, port: Optional[int] = None, *args, **kwargs): """ :说明: 启动 NoneBot,即运行全局 Driver 对象。 :参数: * ``host: Optional[str]``: 主机名/IP,若不传入则使用配置文件中指定的值 * ``port: Optional[int]``: 端口,若不传入则使用配置文件中指定的值 * ``*args``: 传入 Driver.run 的位置参数 * ``**kwargs``: 传入 Driver.run 的命名参数 :返回: - ``None`` :用法: .. code-block:: python nonebot.run(host="127.0.0.1", port=8080) """ logger.info("Running NoneBot...") get_driver().run(host, port, *args, **kwargs)
def new(cls, data: Dict[str, Any]) -> "Event": """ 此事件类的工厂函数, 能够通过事件数据选择合适的子类进行序列化 """ type = data['type'] def all_subclasses(cls: Type[Event]): return set(cls.__subclasses__()).union( [s for c in cls.__subclasses__() for s in all_subclasses(c)]) event_class: Optional[Type[Event]] = None for subclass in all_subclasses(cls): if subclass.__name__ != type: continue event_class = subclass if event_class is None: return Event.parse_obj(data) while issubclass(event_class, Event): try: return event_class.parse_obj(data) except ValidationError as e: logger.info( f'Failed to parse {data} to class {event_class.__name__}: ' f'{e.errors()!r}. Fallback to parent class.') event_class = event_class.__base__ raise ValueError(f'Failed to serialize {data}.')