async def handle(app: Ariadne, message: MessageChain, group: Group, member: Member): if message.asDisplay() == "搜番": await update_user_call_count_plus(group, member, UserCalledCount.search, "search") if not await group_setting.get_setting(group.id, Setting.bangumi_search): return MessageItem(MessageChain.create([Plain(text="搜番功能未开启呐~请联系管理员哦~")]), Normal()) try: await app.sendGroupMessage(group, MessageChain.create([ At(member.id), Plain("请在30秒内发送要搜索的图片呐~") ])) except AccountMuted: logger.error(f"Bot 在群 <{group.name}> 被禁言,无法发送!") return None image_get = None message_received = None @Waiter.create_using_function([GroupMessage]) def waiter( event: GroupMessage, waiter_group: Group, waiter_member: Member, waiter_message: MessageChain ): nonlocal image_get nonlocal message_received if time.time() - start_time < 30: if all([ waiter_group.id == group.id, waiter_member.id == member.id, len(waiter_message[Image]) == len(waiter_message.__root__) - 1 ]): image_get = True message_received = waiter_message return event else: logger.warning("等待用户超时!BangumiSearchHandler进程推出!") return event inc = InterruptControl(bcc) start_time = time.time() await inc.wait(waiter) if image_get: logger.success("收到用户图片,启动搜索进程!") try: await app.sendGroupMessage( group, await BangumiSearcher.search_bangumi(message_received[Image][0]), quote=message_received[Source][0] ) except AccountMuted: logger.error(f"Bot 在群 <{group.name}> 被禁言,无法发送!") pass return None else: return None
async def new_question_nofication(app: Ariadne, group: Group, member: Member, msg: MessageChain): enable_in_groups: List[int] = [qq.littleskin_main] admins = await app.getMemberList(qq.notification_channel) admins_id = [m.id for m in admins] if group.id in enable_in_groups and member.id not in admins_id: await app.sendGroupMessage(qq.notification_channel, MessageChain.create( [Plain(tF.new_question_nofication)]), quote=msg[Source][0].id) await app.sendGroupMessage(group, MessageChain.create( [Plain(tF.new_question_sent)]), quote=msg[Source][0].id)
async def cache(self, **kwargs): accepted = ['update', 'store'] command = None for name, arg in kwargs.items(): if name == "arg" and isinstance(arg, str): command = arg if not command: return MessageChain.create([Plain(text=f"未填写参数")]) if command not in accepted: return MessageChain.create([Plain(text=f"未知参数:{command}")]) if command == 'update': return self.update_cache(manual=True) if command == 'store': return self.store_cache(manual=True)
async def command_handler(app: Ariadne, group: Group, params: WildcardMatch): player_name = params.result.asDisplay() player_uuid = await apis.MojangPlayerUuidApi.get(player_name) if not player_uuid.existed: await app.sendGroupMessage(group, MessageChain.create([Plain(f'「{player_name}」不存在')])) return async with aiohttp.ClientSession() as session: async with session.get(f'https://crafatar.com/renders/body/{player_uuid.id}?overlay') as resp: if resp.status == 200: image = await resp.content.read() await app.sendGroupMessage(group, MessageChain.create([Image(data_bytes=image)])) else: err_msg = await resp.text() await app.sendGroupMessage(group, MessageChain.create([Plain(f'Crafatar Error: {err_msg.strip()[:64]}')]))
async def github_schedule(self, **kwargs): if not self.initialize: self.update_cache() self.initialize = True try: app = None manual = False repo = None per_page = 30 page = 1 for name, arg in kwargs.items(): if name == "manual" and isinstance(arg, bool): manual = arg if name == "repo" and isinstance(arg, tuple): repo = arg if name == "per_page" and isinstance(arg, int): per_page = arg if name == "page" and isinstance(arg, int): page = arg if isinstance(arg, Ariadne): app = arg if not app: logger.error("无法获得 Ariadne 实例") return None if self.__is_running: if manual: return MessageItem( MessageChain.create( [Plain(text="Github 订阅插件正在进行其他操作,请稍后再试。")]), QuoteSource()) return None if self.__status and repo: res = [] if events := await self.get_repo_event(repo, per_page, page): if isinstance(events, list): self.__cached[repo]['last_id'] = int(events[0]['id']) if resp := await self.a_generate_plain(events[0]): res.append(resp) else: res.append(Plain(text=events["message"])) if not res: return None res.insert(0, Plain(text=f"仓库:{repo[0]}/{repo[1]}\n")) res.append( Plain( text= f"----------\n获取时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" )) return MessageChain.create(res)
def update_cache(self, manual: bool = False): try: with open(str(Path(__file__).parent.joinpath("watcher_data.json")), "r") as r: data = json.loads(r.read()) cache = {} for key in data.keys(): owner, repo = key.split("/") cache[(owner, repo)] = data[key] self.__cached = cache return MessageChain.create([Plain( text="更新缓存成功")]) if manual else None except (FileNotFoundError, JSONDecodeError): return MessageChain.create( [Plain(text="无法更新缓存,请检查是否删除了缓存文件并重新储存缓存")])
async def search(*, keyword: Optional[str] = None, data_bytes: Optional[bytes] = None) -> MessageChain: search_url = "https://xslist.org/search?lg=en&query=" pic_search_url = "https://xslist.org/search/pic" if not keyword and not data_bytes: raise ValueError("You should give keyword or data_bytes!") elif keyword: keyword = keyword.strip() async with get_running(Adapter).session.get(search_url + keyword, proxy=proxy) as resp: html = await resp.text() elif data_bytes: async with get_running(Adapter).session.post(pic_search_url, data={ "pic": data_bytes, "lg": "en" }, proxy=proxy) as resp: html = await resp.text() soup = BeautifulSoup(html, "html.parser") lis = soup.find_all("li") if not lis: return MessageChain(f"没有找到关于 {keyword} 的结果呢~换个关键词试试?") msgs = [] for li in lis: avatar = li.find("img")["src"] async with get_running(Adapter).session.get(avatar, proxy=proxy) as resp: avatar = await resp.read() msgs.append( MessageChain([ Image(data_bytes=avatar), Plain('\n'), Plain(li.find("h3").find("a")["title"]), Plain('\n'), Plain(li.find("p").get_text().replace("<br />", '\n')) ])) return msgs[0] if len(msgs) == 1 else MessageChain([ Forward([ ForwardNode( senderId=config.bot_qq, time=datetime.now(), senderName="SAGIRI BOT", messageChain=msg, ) for msg in msgs ]) ])
async def gacha(app: Ariadne, group: Group, message: MessageChain, member: Member, count: RegexResult): gid = group.id user_id = member.id count = int(count.result.asDisplay()) if all([ count == 10 and not daily_limiter_10.check(user_id), count == 90 and not daily_limiter_90.check(user_id), count == 180 and not daily_limiter_180.check(user_id) ]): await app.sendMessage( group, MessageChain.create([Plain(text='今天已经抽了很多次啦,明天再来吧~')])) return if gid in group_pool: G = Gacha(group_pool[gid]) else: G = Gacha() if count == 10: daily_limiter_10.increase(user_id) elif count == 90: daily_limiter_90.increase(user_id) else: daily_limiter_180.increase(user_id) await app.sendMessage(group, G.gacha_10() if count == 10 else (G.gacha_90() if count == 90 else G.gacha_90(180)), quote=message.getFirst(Source))
async def group_wordcloud_generator( app: Ariadne, message: MessageChain, group: Group, member: Member, scope: MatchResult, period: MatchResult, topK: MatchResult, mask: ElementResult ): scope = "group" if scope.result.asDisplay() == "本群" else "member" if scope == "group" and not await user_permission_require(group, member, 2): return await app.sendGroupMessage( group, MessageChain.create([Plain(text="权限不足呢~爪巴!")]), quote=message.getFirst(Source), ) period = period.result.asDisplay() topK = min(int(topK.result.asDisplay()), 100000) if topK.matched else 1000 await app.sendGroupMessage( group, await GroupWordCloudGenerator.get_review(group, member, period, scope, topK, mask.result), quote=message.getFirst(Source), )
def exception_resender_listener(app: Ariadne, exception_resender_instance: ExceptionReSender, loop): while True: task = exception_resender_instance.get() if task: logger.warning("task caught! " + "len:" + str(exception_resender_instance.getLen()) + "task: " + str(task)) try: asyncio.run_coroutine_threadsafe( task[0].strategy.send(app, task[0].message, task[1], task[2], task[3]), loop) logger.success(f"task resend successfully! task: {str(task)}") except Exception: task[4] += 1 if task[4] <= exception_resender_instance.max_retries: exception_resender_instance.addTask(task) else: logger.error( "Maximum number of retries exceeded! Task cancelled!") asyncio.run_coroutine_threadsafe( app.sendGroupMessage( task[4], MessageChain.create([ Plain( text= "Maximum number of retries exceeded! Task cancelled!" ) ]), quote=task[1][Source][0]), loop) time.sleep(2)
async def cd_check(event: GroupMessage) -> NoReturn: if await Permission.get(event.sender.group, event.sender) >= override_level: return current = time.time() async with (await cls.get_lock()): last = cls.last_exec[event.sender.id] if current - cls.last_exec[event.sender.id][1] >= suspend_time: cls.last_exec[event.sender.id] = (1, current) if event.sender.id in cls.sent_alert: cls.sent_alert.remove(event.sender.id) return elif last[0] < max_exec: cls.last_exec[event.sender.id] = (last[0] + 1, current) if event.sender.id in cls.sent_alert: cls.sent_alert.remove(event.sender.id) return if event.sender.id not in cls.sent_alert: if not silent: await ariadne_ctx.get().sendGroupMessage( event.sender.group, MessageChain.create([ Plain( f"冷却还有{last[1] + suspend_time - current:.2f}秒结束," f"之后可再执行{max_exec}次") ]), quote=event.messageChain.getFirst(Source).id, ) cls.sent_alert.add(event.sender.id) raise ExecutionStop()
async def github_info(app: Ariadne, message: MessageChain, group: Group, image: ArgResult, keyword: RegexResult): image = image.matched keyword = keyword.result.asDisplay() url = "https://api.github.com/search/repositories?q=" img_url = "https://opengraph.githubassets.com/c9f4179f4d560950b2355c82aa2b7750bffd945744f9b8ea3f93cc24779745a0/" async with get_running(Adapter).session.get(url=url + keyword) as resp: result = (await resp.json())["items"] if not result: await app.sendGroupMessage(group, MessageChain("没有搜索到结果呢~"), quote=message.getFirst(Source)) elif image: img_url += result[0]["full_name"] async with get_running(Adapter).session.get(img_url) as resp: content = await resp.read() await app.sendGroupMessage(group, MessageChain([Image(data_bytes=content)]), quote=message.getFirst(Source)) else: result = result[0] name = result["name"] owner = result["owner"]["login"] description = result["description"] repo_url = result["html_url"] stars = result["stargazers_count"] watchers = result["watchers"] language = result["language"] forks = result["forks"] issues = result["open_issues"] repo_license = result["license"]["key"] if result["license"] else "无" msg = MessageChain([ Plain(text=f"名称:{name}\n"), Plain(text=f"作者:{owner}\n"), Plain(text=f"描述:{description}\n"), Plain(text=f"链接:{repo_url}\n"), Plain(text=f"stars:{stars}\n"), Plain(text=f"watchers:{watchers}\n"), Plain(text=f"forks:{forks}\n"), Plain(text=f"issues:{issues}\n"), Plain(text=f"language:{language}\n"), Plain(text=f"license:{repo_license}") ]) try: await app.sendGroupMessage(group, msg, quote=message.getFirst(Source)) except MessageTooLong: await app.sendGroupMessage( group, MessageChain([Image(data_bytes=TextEngine([GraiaAdapter(msg)]).draw())]), quote=message.getFirst(Source) )
async def super_resolution(image_data: bytes, resize: bool = False) -> MessageItem: start = time.time() image = IMG.open(BytesIO(image_data)) image_size = image.size[0] * image.size[1] if image_size > max_size: if not resize: await mutex.acquire() SuperResolution.processing = False mutex.release() return MessageItem( MessageChain.create([ Plain( text= "图片尺寸过大!请发送1080p以内即像素数小于 1920×1080=2073600的照片!\n"), Plain( text= f"此图片尺寸为:{image.size[0]}×{image.size[1]}={image_size}!" ) ]), QuoteSource()) length = 1 for b in str(max_size / image_size).split('.')[1]: if b == '0': length += 1 else: break magnification = round(max_size / image_size, length + 1) image = image.resize((round(image.size[0] * magnification), round(image.size[1] * magnification))) image_array: np.ndarray = image.__array__() output, _ = await loop.run_in_executor(None, upsampler.enhance, image_array, 2) result = BytesIO() img = IMG.fromarray(output) img.save(result, format='PNG') # format: PNG / JPEG end = time.time() use_time = round(end - start, 2) await mutex.acquire() SuperResolution.processing = False mutex.release() return MessageItem( MessageChain.create([ Plain(text=f"超分完成!处理用时:{use_time}s\n"), Plain(text=f"由于像素过大,图片已进行缩放,结果可能不如原图片清晰\n" if resize else ""), Image(data_bytes=result.getvalue()) ]), QuoteSource())
async def command_handler(app: Ariadne, group: Group, params: WildcardMatch): player_name = params.result.asDisplay() result = await apis.CustomSkinLoaderApi.get('https://littleskin.cn/csl', player_name) if not result.player_existed: await app.sendGroupMessage(group, MessageChain.create([Plain(f'「{player_name}」不存在')])) else: bs_root = 'https://littleskin.cn' preview_images: List[Image] = list() for texture in [result.skin_hash, result.cape_hash]: if texture: preview_images.append(Image(data_bytes=await apis.getTexturePreview( bs_root, texture))) await app.sendGroupMessage(group, MessageChain.create([*preview_images, Plain(f'''「{player_name}」 Skin: {result.skin_hash[:7]} [{result.skin_type}] Cape: {result.cape_hash[:7] if result.cape_existed else None}''')]))
async def search_bangumi(img: Image) -> MessageChain: url = f"https://api.trace.moe/search?anilistInfo&url={img.url}" async with aiohttp.ClientSession() as session: async with session.post(url=url, proxy=proxy if proxy != "proxy" else '') as resp: result = await resp.json() # print(result) if result := result.get("result"): # print(json.dumps(result[0], indent=4)) title_native = result[0]["anilist"]["title"]["native"] title_romaji = result[0]["anilist"]["title"]["romaji"] title_english = result[0]["anilist"]["title"]["english"] file_name = result[0]["filename"] similarity = round(float(result[0]["similarity"]) * 100, 2) time_from = result[0]["from"] time_to = result[0]["to"] thumbnail_url = result[0]["image"] async with aiohttp.ClientSession() as session: async with session.get(url=thumbnail_url) as resp: thumbnail_content = await resp.read() message = await MessageChainUtils.messagechain_to_img( MessageChain.create([ Plain(text="搜索到结果:\n"), Image(data_bytes=thumbnail_content), Plain(text=f"番剧名: {title_native}\n"), Plain(text=f"罗马音名: {title_romaji}\n"), Plain(text=f"英文名: {title_english}\n"), Plain(text=f"文件名: {file_name}\n"), Plain(text=f"时间: {sec_to_str(time_from)} ~ {sec_to_str(time_to)}\n"), Plain(text=f"相似度: {similarity}%"), ]) ) return message
async def saucenao_search(api_key: str, proxies: Optional[str] = None, *, url: Optional[str] = None, file: Optional[BinaryIO] = None) -> MessageChain: if not url and not file: raise ValueError("You should give url or file!") if not api_key: return MessageChain("未配置SAUCENAO_API_KEY!") async with Network(proxies=proxies) as client: saucenao = SauceNAO(client=client, api_key=api_key) if url: resp = await saucenao.search(url=url) elif file: resp = await saucenao.search(file=file) if not resp.raw: return MessageChain("SAUCENAO未搜索到结果!") resp = resp.raw[0] return MessageChain([ Plain("SAUCENAO搜索到以下结果:\n"), Image(data_bytes=await get_thumb(resp.thumbnail, proxies)), Plain(f"\n标题:{resp.title}\n"), Plain(f"相似度:{resp.similarity}%\n"), Plain(f"作者:{resp.author}\n"), Plain(f"pixiv图像 id:{resp.pixiv_id}\n" if resp.pixiv_id else ''), Plain(f"pixiv画师 id:{resp.member_id}\n" if resp.member_id else ''), Plain(f"链接:{resp.url}") ])
def store_cache(self, manual: bool = False): with open(str(Path(__file__).parent.joinpath("watcher_data.json")), "w") as w: cache = {} for key in self.__cached.keys(): new_key = f"{key[0]}/{key[1]}" cache[new_key] = self.__cached[key] w.write(json.dumps(cache, indent=4)) return MessageChain.create([Plain(text="写入缓存成功")]) if manual else None
async def online_notice(app: Ariadne): group_list = await app.getGroupList() for group in group_list: if await group_setting.get_setting(group.id, Setting.online_notice): try: await app.sendGroupMessage( group, MessageChain.create([Plain(text="纱雾酱打卡上班啦!")])) except AccountMuted: pass
async def command_handler(app: Ariadne, group: Group, params: WildcardMatch): infos = await apis.CustomSkinLoaderLatest.get() mod_loader = params.result.asDisplay().strip() forge = f'''CustomSkinLoader 最新版本:{infos.version} 1.7.10 ~ 1.16.5: {infos.downloads.Forge} 1.17+: {infos.downloads.ForgeActive}''' fabric = f'''CustomSkinLoader 最新版本:{infos.version} Fabric: {infos.downloads.Fabric}''' _message = forge if mod_loader == 'forge' else fabric await app.sendGroupMessage(group, MessageChain.create([Plain(_message)]))
async def command_handler(app: Ariadne, group: Group, params: WildcardMatch): player_name = params.result.asDisplay() result = await apis.CustomSkinLoaderApi.get('https://littleskin.cn/csl', player_name) if not result.player_existed: _message = f'「{player_name}」不存在' else: _message = f'''「{player_name}」 Skin: {result.skin_hash[:7]} [{result.skin_type}] Cape: {result.cape_hash[:7] if result.cape_existed else None}''' await app.sendGroupMessage(group, MessageChain.create([Plain(_message)]))
async def handle(app: Ariadne, message: MessageChain, group: Group, member: Member): if message.asDisplay().startswith("/fake "): content = "".join(i.text for i in message.get(Plain))[6:] if not message.has(At): return MessageItem(MessageChain.create([Plain(text="未指定目标!")]), Normal()) sender = message.get(At)[0] forward_nodes = [ ForwardNode( senderId=sender.target, time=datetime.now(), senderName=(await app.getMember(group, sender.target)).name, messageChain=MessageChain.create(Plain(text=content)), ) ] return MessageItem( MessageChain.create(Forward(nodeList=forward_nodes)), Normal())
def get_tarot() -> MessageChain: card, filename = Tarot.get_random_tarot() card_dir = random.choice(['normal', 'reverse']) card_type = '正位' if card_dir == 'normal' else '逆位' content = f"{card['name']} ({card['name-en']}) {card_type}\n牌意:{card['meaning'][card_dir]}" elements = [] img_path = f"{os.getcwd()}/statics/tarot/{card_dir}/{filename + '.jpg'}" if filename and os.path.exists(img_path): elements.append(Image(path=img_path)) elements.append(Plain(text=content)) return MessageChain(elements)
async def friend_message_listener(message: MessageChain, app: Ariadne, friend: Friend): command = normalize(message) result = kernel(command, str(friend.id)) if result: try: await app.sendFriendMessage(friend, MessageChain.create([result])) except Exception as ex: print('## ', ex) await app.sendFriendMessage(friend, MessageChain.create([Plain(str(ex))]))
async def wrapper(*args, **kwargs): try: if asyncio.iscoroutinefunction(func): result = await func(*args, **kwargs) else: result = func(*args, **kwargs) return result except: return MessageItem( MessageChain.create([Plain(text=traceback.format_exc())]), QuoteSource())
async def handle(app: Ariadne, message: MessageChain, group: Group, member: Member): if re.match(pattern, message.asDisplay()): if not await user_permission_require(group, member, 2): return MessageItem( MessageChain.create([Plain(text="你没有权限,爬!")]), Normal()) image_type = re.findall(r"添加(.*?)图片.*(\[图片].*)+", message.asDisplay(), re.S)[0][0] if image_type not in legal_type: return MessageItem( MessageChain.create([ Plain( text=f"非法图片类型!\n合法image_type:{'、'.join(legal_type)}" ) ]), QuoteSource()) if path := image_paths.get(image_type): if os.path.exists(path): try: await ImageAdder.add_image(path, message.get(Image)) except: logger.error(traceback.format_exc()) return MessageItem( MessageChain.create( [Plain(text="出错了呐~请查看日志/控制台输出!")]), Normal()) return MessageItem( MessageChain.create([ Plain( text=f"保存成功!共保存了{len(message.get(Image))}张图片!") ]), Normal()) else: return MessageItem( MessageChain.create([ Image( path= f"{os.getcwd()}/statics/error/path_not_exists.png" ) ]), QuoteSource()) else: return MessageItem( MessageChain.create([Plain(text=f"无{image_type}项!请检查配置!") ]), QuoteSource())
async def google_search(proxies: Optional[str] = None, *, url: Optional[str] = None, file: Optional[BinaryIO] = None) -> MessageChain: if not url and not file: raise ValueError("You should offer url or file!") async with Network(proxies=proxies) as client: google = Google(client=client) if url: resp = await google.search(url=url) elif file: resp = await google.search(file=file) if not resp.raw: return MessageChain("GOOGLE未搜索到结果!") resp = resp.raw[2] return MessageChain([ Plain("GOOGLE搜索到以下结果:\n"), Image(data_bytes=await get_thumb(resp.thumbnail, proxies)), Plain(f"\n标题:{resp.title}\n"), Plain(f"链接:{resp.url}") ])
async def baidu_search(*, url: Optional[str] = None, file: Optional[BinaryIO] = None) -> MessageChain: if not url and not file: raise ValueError("You should offer url or file!") async with Network() as client: baidu = BaiDu(client=client) if url: resp = await baidu.search(url=url) elif file: resp = await baidu.search(file=file) if not resp.raw: return MessageChain("BAIDU未搜索到结果!") resp = resp.raw[2] return MessageChain([ Plain("BAIDU搜索到以下结果:\n"), Image(data_bytes=await get_thumb(resp.image_src, '')), Plain(f"\n标题:{resp.title}\n"), Plain(f"摘要:{resp.abstract}\n"), Plain(f"链接:{resp.url}") ])
async def check(self, **kwargs) -> MessageChain: group = None friend = None for name, arg in kwargs.items(): if isinstance(arg, Group): group = arg if isinstance(arg, Friend): friend = arg if not group and not friend: return MessageChain.create([Plain(text=f"无法获取 Group 或 Friend 实例")]) watched = [] target = group if group else friend field = 'group' if group else 'friend' for repo in self.__cached.keys(): if target.id in self.__cached[repo][field]: watched.append(f"{repo[0]}/{repo[1]}") res = [ Plain(text=f"{'本群' if group else '你'}订阅的仓库有:\n" f"{' '.join(watched)}") ] return MessageChain.create(res)
async def ehentai_search(proxies: Optional[str] = None, cookies: Optional[str] = None, ex: bool = False, *, url: Optional[str] = None, file: Optional[BinaryIO] = None) -> MessageChain: if not url and not file: raise ValueError("You should offer url or file!") if ex and not cookies: raise ValueError( "If you use EXHentai Searcher, you should offer cookies!") async with Network(proxies=proxies, cookies=cookies) as client: ehentai = EHentai(client=client) if url: resp = await ehentai.search(url=url, ex=ex) elif file: resp = await ehentai.search(file=file, ex=ex) if not resp.raw: return MessageChain("EHentai未搜索到结果!") resp = resp.raw[0] return MessageChain([ Plain("EHentai搜索到以下结果:\n"), Image(data_bytes=await get_thumb(resp.thumbnail, proxies)), Plain(f"\n标题:{resp.title}\n"), Plain(f"类别:{resp.type}\n"), Plain(f"上传日期:{resp.date}\n"), Plain(f"标签:{', '.join(resp.tags)}\n"), Plain(f"链接:{resp.url}") ])
async def chat_reply( app: Ariadne, message: MessageChain, group: Group, member: Member, at: ElementResult ): assert isinstance(at.result, At) if at.result.target == config.bot_qq: content = "".join(plain.text for plain in message.get(Plain)).strip().replace(" ", ",") mode_now = await group_setting.get_setting(group, Setting.speak_mode) if mode_now in ("normal", "zuanLow", "zuanLow"): return elif mode_now == "rainbow": async with get_running(Adapter).session.get("https://api.shadiao.app/chp") as resp: text = (await resp.json())['data']['text'] elif mode_now == "chat": user_data = config.functions['tencent'] if user_data["secret_id"] == "secret_id" or user_data["secret_key"] == "secret_key": text = "secret_id/secret_key未初始化" else: try: user_data = config.functions['tencent'] cred = credential.Credential(user_data["secret_id"], user_data["secret_key"]) http_profile = HttpProfile() http_profile.endpoint = "nlp.tencentcloudapi.com" client_profile = ClientProfile() client_profile.httpProfile = http_profile client = nlp_client.NlpClient(cred, "ap-guangzhou", client_profile) req = models.ChatBotRequest() params = {"Query": content} req.from_json_string(json.dumps(params)) resp = client.ChatBot(req) text = json.loads(resp.to_json_string())["Reply"]\ .replace("腾讯小龙女", "纱雾酱").replace("小龙女", "纱雾酱") except TencentCloudSDKException as e: logger.error(traceback.format_exc()) text = str(e) else: raise Exception(f"数据库群 <{group.id}> speak_mode项非法!目前值:{mode_now}") if text: await app.sendGroupMessage(group, MessageChain.create([ At(target=member.id), Plain(text=f" {text}") ]))