diff --git a/plugins/dify/main.py b/plugins/dify/main.py index a530a18..4fe25dc 100644 --- a/plugins/dify/main.py +++ b/plugins/dify/main.py @@ -128,149 +128,92 @@ class DifyPlugin(MessagePluginInterface): sender = message.get("sender") roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") - bot: WechatAPIClient = message.get("bot") revoke: MessageAutoRevoke = message.get("revoke") - # 处理被@的消息 - if message.get("is_at", False) and roomid: - # 检查权限 - if gbm.get_group_permission(roomid, Feature.AI_CAPABILITY) == PermissionStatus.DISABLED: - return False, "没有权限" - - # 去除@的人和空格等字符 - query = re.sub(r"@.*?[\u2005|\s]", "", content).strip() - - if not query: - await bot.send_at_message(roomid, "请在@我的同时提供问题内容", [sender]) - return False, "没有提供问题内容" - - try: - # 调用Dify API获取回复 - success, response = await self._chat_with_dify((roomid if roomid else sender), sender, query) - if not success: - return False, response - # 去除广告内容 - response = remove_trailing_content(response) - - # 发送回复 - if response: - # 判断是否为本地文件路径 - if os.path.isfile(response): - # 如果是文件路径,使用发送文件方法 - file_type = self.check_file_type(response) - if file_type == 1: - await bot.send_image_message((roomid if roomid else sender), Path(response)) - elif file_type == 2: - first_farme = self._get_first_frame(response, f"dify_frame_{int(time.time())}.jpg") - await bot.send_video_message((roomid if roomid else sender), Path(response), - Path(first_farme)) - else: - return False, "获取媒资失败" - else: - # 如果是普通文本,则在长度大于100字时,转为图片发送 - if len(response) > 800: - # 转图片 - output_image = f"dify_output_{int(time.time())}.png" - respath = await convert_md_str_to_image(response, output_image) - await bot.send_image_message((roomid if roomid else sender), Path(respath)) - else: - # 如果是普通文本,使用发送文本方法 - await bot.send_at_message((roomid if roomid else sender), response, [sender]) - return True, "发送成功" - else: - await bot.send_text_message((roomid if roomid else sender), "❌未能获取到回复,请稍后再试", sender) - return False, "未获取到回复" - - except Exception as e: - self.LOG.exception(f"处理Dify聊天请求出错: {e}") - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), - "❌未能获取到回复,请稍后再试", - sender) - revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) - - return False, f"处理出错: {e}" - - # 原有的命令处理逻辑 - parts = content.split(" ", 1) - command = parts[0] - - # 检查命令格式 - if len(parts) < 2 or not parts[1].strip(): - await bot.send_text_message((roomid if roomid else sender), f"{self.command_format}", sender) - return False, "命令格式错误" + # 获取目标接收者(群聊为群ID,私聊为个人wxid) + target = roomid if roomid else sender # 检查权限 - if roomid and gbm.get_group_permission((roomid if roomid else sender), - Feature.AI_CAPABILITY) == PermissionStatus.DISABLED: + if roomid and gbm.get_group_permission(target, Feature.AI_CAPABILITY) == PermissionStatus.DISABLED: return False, "没有权限" - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), - "⏳AI 正在加油,请稍候… 😊", - sender if roomid else "") - - revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 3) - # 获取查询内容 - query = parts[1].strip() - - # 获取会话ID(群聊使用群ID,私聊使用个人wxid) - session_id = roomid if roomid else sender - - # 获取用户ID - user_id = sender + # 处理被@的消息 + if message.get("is_at", False) and roomid: + # 去除@的人和空格等字符 + query = re.sub(r"@.*?[\u2005|\s]", "", content).strip() + if not query: + await bot.send_at_message(target, "请在@我的同时提供问题内容", [sender]) + return False, "没有提供问题内容" + else: + # 处理命令消息 + parts = content.split(" ", 1) + if len(parts) < 2 or not parts[1].strip(): + await bot.send_text_message(target, f"{self.command_format}", sender) + return False, "命令格式错误" + query = parts[1].strip() try: + # 发送等待消息 + client_msg_id, create_time, new_msg_id = await bot.send_text_message( + target, "⏳AI 正在加油,请稍候… 😊", sender if roomid else "") + revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 3) + # 调用Dify API获取回复 - success, response = await self._chat_with_dify(session_id, user_id, query) + success, response = await self._chat_with_dify(target, sender, query) if not success: return False, response + # 去除广告内容 - self.LOG.debug(f"_chat_with_dify response:{response}") response = remove_trailing_content(response) - self.LOG.debug(f"remove_trailing_content response:{response}") + self.LOG.debug(f"处理后的响应: {response}") + # 发送回复 if response: - # 判断是否为本地文件路径 - if os.path.isfile(response): - # 如果是文件路径,使用发送文件方法 - # 判断是视频还是图片: - file_type = self.check_file_type(response) - if file_type == 1: - await bot.send_image_message((roomid if roomid else sender), Path(response)) - elif file_type == 2: - # 提取首帧 - first_farme = self._get_first_frame(response, f"dify_frame_{int(time.time())}.jpg") - await bot.send_video_message((roomid if roomid else sender), Path(response), Path(first_farme)) - else: - return False, "获取媒资失败" - else: - # 如果是普通文本,则在长度大于100字时,转为图片发送 - if len(response) > 800: - # 转图片 - output_image = f"dify_output_{int(time.time())}.png" - respath = await convert_md_str_to_image(response, output_image) - await bot.send_image_message((roomid if roomid else sender), Path(respath)) - else: - # 如果是普通文本,使用发送文本方法 - await bot.send_at_message((roomid if roomid else sender), response, [sender]) - return True, "发送成功" + return await self._send_response(bot, target, sender, response, roomid) else: - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), - "❌未能获取到回复,请稍后再试", - sender if roomid else "") - - revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + client_msg_id, create_time, new_msg_id = await bot.send_text_message( + target, "❌未能获取到回复,请稍后再试", sender if roomid else "") + revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 5) return False, "未获取到回复" except Exception as e: self.LOG.exception(f"处理Dify聊天请求出错: {e}") - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), - f"❌请求出错:{str(e)}", - sender if roomid else "") - - revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + client_msg_id, create_time, new_msg_id = await bot.send_text_message( + target, f"❌请求出错:{str(e)}", sender if roomid else "") + revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 5) return False, f"处理出错: {e}" + async def _send_response(self, bot: WechatAPIClient, target: str, sender: str, + response: str, roomid: str) -> Tuple[bool, str]: + """发送响应消息的辅助方法""" + try: + # 判断是否为本地文件路径 + if os.path.isfile(response): + # 如果是文件路径,使用发送文件方法 + file_type = self.check_file_type(response) + if file_type == 1: + await bot.send_image_message(target, Path(response)) + elif file_type == 2: + first_frame = self._get_first_frame(response, f"dify_frame_{int(time.time())}.jpg") + await bot.send_video_message(target, Path(response), Path(first_frame)) + else: + return False, "获取媒资失败" + else: + # 如果是普通文本,则在长度大于800字时,转为图片发送 + if len(response) > 800: + # 转图片 + output_image = f"dify_output_{int(time.time())}.png" + respath = await convert_md_str_to_image(response, output_image) + await bot.send_image_message(target, Path(respath)) + else: + # 如果是普通文本,使用发送文本方法 + await bot.send_at_message(target, response, [sender]) + return True, "发送成功" + except Exception as e: + self.LOG.error(f"发送响应消息时出错: {e}") + return False, f"发送响应失败: {e}" + async def _chat_with_dify(self, session_id: str, user_id: str, query: str) -> Tuple[bool, Optional[str]]: """ 与Dify API交互获取回复