""" 企业微信消息处理器 处理用户消息和事件,实现菜单功能 """ import time import json from typing import Optional, Dict, Any, List from datetime import datetime try: from ..core.config_manager import get_config from ..core.logger import get_logger from ..notification.wechat import send_system_notification from ..storage.postgresql import save_all_announcements_by_source_to_storage from ..storage.md_generator import generate_onu_md from ..core.models import Announcement except ImportError: try: from core.config_manager import get_config from core.logger import get_logger from notification.wechat import send_system_notification from storage.postgresql import save_all_announcements_by_source_to_storage from storage.md_generator import generate_onu_md from core.models import Announcement except ImportError as e: raise ImportError(f"消息处理器导入失败: {e}") logger = get_logger(__name__) class WeChatMessageHandler: """企业微信消息处理器""" def __init__(self): self.config = get_config() self.monitor_app = None # 菜单配置 self.menu_config = { "crawl_now": { "key": "crawl_now", "name": " 立即搜索", "description": "立即执行一次公告搜索" }, "today_stats": { "key": "today_stats", "name": " 今日统计", "description": "查看今日公告统计信息" }, "keyword_search": { "key": "keyword_search", "name": " 关键词搜索", "description": "输入关键词搜索公告" }, "latest_news": { "key": "latest_news", "name": " 最新公告", "description": "查看最新发布的公告" }, "keyword_manage": { "key": "keyword_manage", "name": " 关键词管理", "description": "管理监控关键词" }, "system_status": { "key": "system_status", "name": " 系统状态", "description": "查看系统运行状态" }, "clear_cache": { "key": "clear_cache", "name": " 清理缓存", "description": "清理系统缓存数据" }, "help_guide": { "key": "help_guide", "name": " 使用说明", "description": "查看详细使用说明" } } logger.info("企业微信消息处理器初始化完成") def _get_monitor_app(self): """获取监控应用实例""" if self.monitor_app is None: # 动态导入避免循环导入 try: from ..main import GXGPMonitorApp self.monitor_app = GXGPMonitorApp() # 初始化但不启动服务器 if not self.monitor_app.initialize(): logger.error("监控应用初始化失败") return None except ImportError: logger.error("无法导入监控应用") return None return self.monitor_app def handle_event(self, event: str, event_key: Optional[str], from_user: str) -> Optional[str]: """处理事件消息""" try: logger.info(f"处理事件: {event}, key: {event_key}, user: {from_user}") if event == 'click': # 菜单点击事件 if event_key == 'crawl_now': return self._handle_crawl_now(from_user) elif event_key == 'today_stats': return self._handle_today_stats(from_user) elif event_key == 'keyword_search': return self._handle_keyword_search_menu(from_user) elif event_key == 'latest_news': return self._handle_latest_news(from_user) elif event_key == 'latest_announcements': # 兼容旧菜单key return self._handle_latest_news(from_user) elif event_key == 'keyword_manage': return self._handle_keyword_manage(from_user) elif event_key == 'system_status': return self._handle_system_status(from_user) elif event_key == 'clear_cache': return self._handle_clear_cache(from_user) elif event_key == 'help_guide': return self._handle_help_guide(from_user) elif event_key == 'keyword_search': return self._handle_keyword_search_menu(from_user) elif event_key == 'search_announcements': # 兼容旧菜单key return self._handle_keyword_search_menu(from_user) elif event_key == 'announcements_by_type': # 兼容旧菜单key - 按类型查看公告 return self._handle_announcements_by_type(from_user) else: return self._create_text_response("未知菜单项", from_user) elif event == 'subscribe': # 关注事件 welcome_msg = """欢迎关注广西政府采购网公告监控! 我可以帮您: - 自动监控最新采购公告 - 筛选您关心的关键词信息 - 及时推送重要更新 点击下方菜单开始使用.""" return self._create_text_response(welcome_msg, from_user) elif event == 'unsubscribe': # 取消关注事件 logger.info(f"用户 {from_user} 取消关注") return None else: logger.info(f"未处理的event类型: {event}") return None except Exception as e: logger.error(f"事件处理异常: {str(e)}") return self._create_text_response("处理失败,请稍后重试", from_user) def handle_text_message(self, content: str, from_user: str) -> Optional[str]: """处理文本消息""" try: logger.info(f"处理文本消息: {content}, user: {from_user}") # 移除前后空格 content = content.strip() if content == "帮助" or content == "help": return self._handle_help_guide(from_user) elif content.startswith("爬取"): return self._handle_manual_crawl(content, from_user) elif content.startswith("总结") or content == "统计": return self._handle_today_stats(from_user) elif content.startswith("最新公告") or content.startswith("最新"): return self._handle_latest_news(from_user) elif content.startswith("系统状态") or content.startswith("状态"): return self._handle_system_status(from_user) elif content.startswith("关键词"): return self._handle_keyword_search(content, from_user) elif content.startswith("添加关键词"): # 这里可以实现关键词添加逻辑 return self._create_text_response("关键词管理功能正在开发中,请联系管理员", from_user) elif content.startswith("删除关键词"): # 这里可以实现关键词删除逻辑 return self._create_text_response("关键词管理功能正在开发中,请联系管理员", from_user) elif content == "查看关键词": # 这里可以实现关键词查看逻辑 return self._create_text_response("当前监控关键词:政府采购大化南宁信息化", from_user) elif content.startswith("清理缓存") or content.startswith("清理"): return self._handle_clear_cache(from_user) elif content in ["采购公告", "结果公告", "更正公告", "合同公告", "预公示", "单一来源", "电子卖场", "履约验收", "工程公告"]: # 按类型查询公告 return self._handle_search_by_type(content, from_user) else: # 默认当作关键词搜索 return self._handle_keyword_search(f"关键词 {content}", from_user) except Exception as e: logger.error(f"文本消息处理异常: {str(e)}") return self._create_text_response("处理失败,请稍后重试", from_user) def handle_other_message(self, msg_type: str, from_user: str) -> Optional[str]: """处理其他类型的消息""" try: logger.info(f"处理其他消息类型: {msg_type}, user: {from_user}") if msg_type == 'image': return self._create_text_response("收到图片消息,但我只能处理文本消息", from_user) elif msg_type == 'voice': return self._create_text_response("收到语音消息,但我只能处理文本消息", from_user) else: return self._create_text_response(f"收到{msg_type}消息,暂不支持此类型", from_user) except Exception as e: logger.error(f"其他消息处理异常: {str(e)}") return self._create_text_response("处理失败,请稍后重试", from_user) def _handle_crawl_now(self, from_user: str) -> Optional[str]: """处理立即爬取菜单""" try: logger.info(f"用户 {from_user} 触发立即搜索") # 获取监控应用 app = self._get_monitor_app() if not app: return self._create_text_response("系统初始化失败,请稍后重试", from_user) # 执行搜索 result = app.run_crawl() if result.get("success"): total = result.get("total_crawled", 0) filtered = result.get("filtered", 0) saved = result.get("saved", 0) response = f"""OK 搜索完成! 统计信息: - 总共发现: {total} 条公告 - 关键词筛选: {filtered} 条 - 已保存: {saved} 条 如有匹配的公告,我会及时推送通知.""" else: error = result.get("error", "未知错误") response = f"FAIL 搜索失败: {error}" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"立即搜索处理异常: {str(e)}") return self._create_text_response("搜索失败,请稍后重试", from_user) def _handle_today_stats(self, from_user: str) -> Optional[str]: """处理今日统计菜单""" try: logger.info(f"用户 {from_user} 请求今日统计") # 获取监控应用 app = self._get_monitor_app() if not app: return self._create_text_response("系统初始化失败,请稍后重试", from_user) # 查询今日统计数据 try: from ..storage.postgresql import get_storage_manager storage = get_storage_manager() stats = storage.get_statistics() if stats: response = f""" 今日公告统计 统计时间:{datetime.now().strftime('%Y-%m-%d %H:%M')} 数据概览: - 今日新增:{stats.get('today_count', 0)} 条 - 累计总数:{stats.get('total_count', 0)} 条 - 活跃关键词:{stats.get('active_keywords', 0)} 个 分类统计: - 采购公告:{stats.get('purchase_count', 0)} 条 - 结果公告:{stats.get('result_count', 0)} 条 - 更正公告:{stats.get('correction_count', 0)} 条 - 其他类型:{stats.get('other_count', 0)} 条 热门地区: {chr(10).join([f"- {region}: {count}条" for region, count in stats.get('region_stats', {}).items()][:5])} 提示:数据每小时更新,点击"立即搜索"可获取最新数据.""" else: response = """ 今日公告统计 暂无统计数据,请先执行"立即搜索"获取最新公告. 建议:系统会在每日定时搜索,您也可以手动触发更新.""" except Exception as db_error: logger.warning(f"数据库查询失败,使用默认统计: {str(db_error)}") response = """ 系统状态 数据库连接中,请稍后查看详细统计. 您可以: - 点击"立即搜索"更新数据 - 查看"系统状态"了解服务运行情况""" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"今日统计处理异常: {str(e)}") return self._create_text_response("获取统计失败,请稍后重试", from_user) def _handle_custom_crawl(self, event_key: str, from_user: str) -> Optional[str]: """处理自定义搜索菜单""" try: logger.info(f"用户 {from_user} 触发自定义搜索") response = """ 自定义搜索 请回复您想要搜索的关键词,我将为您执行搜索并筛选相关公告. 例如: - 大化 - 信息化 - 政府采购 发送关键词开始搜索.""" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"自定义搜索处理异常: {str(e)}") return self._create_text_response("操作失败,请稍后重试", from_user) def _handle_help(self, from_user: str) -> Optional[str]: """处理帮助命令(兼容旧版本)""" return self._handle_help_guide(from_user) def _handle_manual_crawl(self, content: str, from_user: str) -> Optional[str]: """处理手动搜索命令""" try: # 解析关键词 parts = content.split() if len(parts) < 2: return self._create_text_response("请指定搜索关键词,例如:搜索 大化", from_user) keywords = parts[1:] logger.info(f"用户 {from_user} 手动搜索关键词: {keywords}") # 获取监控应用 app = self._get_monitor_app() if not app: return self._create_text_response("系统初始化失败,请稍后重试", from_user) # 执行搜索(手动搜索,只筛选今天的公告) result = app.run_crawl(keywords=keywords, manual_crawl=True) if result.get("success"): total = result.get("total_crawled", 0) filtered = result.get("filtered", 0) filtered_announcements = result.get("filtered_announcements", []) # 获取今天的日期范围 from datetime import datetime, date today = date.today() time_period = f"{today.strftime('%Y-%m-%d')} 00:00 至 {datetime.now().strftime('%Y-%m-%d %H:%M')}" if filtered > 0: # 生成markdown汇总消息并发送 try: from ..storage.md_generator import MarkdownGenerator from ..notification.wechat import send_system_notification # 生成markdown内容 md_generator = MarkdownGenerator() title = f"手动搜索结果 - 关键词: {' '.join(keywords)}" markdown_content = md_generator.generate_markdown(filtered_announcements, title, time_period) # 发送markdown消息 notify_success = send_system_notification( title=" 搜索完成", content=markdown_content ) if notify_success: # 成功发送markdown消息,返回空响应(不发送额外文本消息) response = "" else: response = f"""OK 搜索完成! 搜索条件: - 关键词: {' '.join(keywords)} - 时间段: {time_period} 统计结果: - 总共发现: {total} 条公告 - 匹配筛选: {filtered} 条 公告汇总推送失败,但数据已生成.""" except Exception as notify_error: logger.error(f"生成或发送公告汇总失败: {notify_error}") # 降级处理:手动构建简单的文本响应 announcement_list = [] for i, ann in enumerate(filtered_announcements[:10], 1): # 最多显示10条 announcement_list.append(f"{i}. {ann.title[:50]}...") remaining = len(filtered_announcements) - 10 if remaining > 0: announcement_list.append(f"... 还有 {remaining} 条公告") response = f"""OK 搜索完成! 搜索条件: - 关键词: {' '.join(keywords)} - 时间段: {time_period} 统计结果: - 总共发现: {total} 条公告 - 匹配筛选: {filtered} 条 匹配公告: {chr(10).join(announcement_list)} 公告详情已保存,可通过其他方式查看.""" else: # 没有找到匹配的公告,发送markdown格式的空结果 try: from ..storage.md_generator import MarkdownGenerator from ..notification.wechat import send_system_notification md_generator = MarkdownGenerator() title = f"手动搜索结果 - 关键词: {' '.join(keywords)}" markdown_content = md_generator.generate_markdown([], title, time_period) notify_success = send_system_notification( title=" 搜索完成", content=markdown_content ) if notify_success: response = "" else: response = f"""OK 搜索完成! 搜索条件: - 关键词: {' '.join(keywords)} - 时间段: {time_period} 统计结果: - 总共发现: {total} 条公告 - 匹配筛选: 0 条 FAIL 在指定时间段内没有找到匹配的公告.""" except Exception as notify_error: logger.error(f"生成或发送公告汇总失败: {notify_error}") response = f"""OK 搜索完成! 搜索条件: - 关键词: {' '.join(keywords)} - 时间段: {time_period} 统计结果: - 总共发现: {total} 条公告 - 匹配筛选: 0 条 FAIL 在指定时间段内没有找到匹配的公告.""" else: error = result.get("error", "未知错误") response = f"FAIL 搜索失败: {error}" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"手动爬取处理异常: {str(e)}") return self._create_text_response("搜索失败,请稍后重试", from_user) def _handle_keyword_search(self, content: str, from_user: str) -> Optional[str]: """处理关键词搜索""" try: # 解析关键词 parts = content.split() keywords = parts[1:] if len(parts) > 1 else parts if not keywords: return self._create_text_response("请提供搜索关键词", from_user) logger.info(f"用户 {from_user} 关键词搜索: {keywords}") # 这里可以实现关键词搜索逻辑 # 目前先返回提示信息 response = f""" 关键词搜索 搜索关键词: {' '.join(keywords)} 由于系统正在优化中,搜索功能暂时不可用. 您可以: - 使用"搜索 [关键词]"执行新的搜索 - 点击菜单中的"立即搜索" - 发送"帮助"查看更多功能""" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"关键词搜索处理异常: {str(e)}") return self._create_text_response("搜索失败,请稍后重试", from_user) def _handle_keyword_search_menu(self, from_user: str) -> Optional[str]: """处理关键词搜索菜单""" try: logger.info(f"用户 {from_user} 触发关键词搜索菜单") response = """ 关键词搜索 请直接发送您想要搜索的关键词,我将为您查找相关的公告信息. 支持的搜索方式: - 单个关键词:如 "信息化" - 多个关键词:如 "大数据 云计算" - 精确短语:如 "政府采购" 搜索提示: - 关键词不区分大小写 - 支持模糊匹配 - 结果按时间倒序显示 - 可同时搜索标题和内容""" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"关键词搜索菜单处理异常: {str(e)}") return self._create_text_response("操作失败,请稍后重试", from_user) def _handle_announcements_by_type(self, from_user: str) -> Optional[str]: """处理按类型查看公告菜单""" try: logger.info(f"用户 {from_user} 请求按类型查看公告") # 查询不同类型的公告统计 try: from ..storage.postgresql import get_storage_manager storage = get_storage_manager() all_stats = storage.get_statistics() # 从统计信息中提取类型统计 type_stats = all_stats.get('announcement_types', {}) if type_stats: response = f""" 公告类型统计 统计时间:{datetime.now().strftime('%Y-%m-%d %H:%M')} 各类型公告数量: """ type_name_map = { 'purchase': '采购公告', 'result': '结果公告', 'correction': '更正公告', 'contract': '合同公告', 'pre_announcement': '预公示', 'single_source': '单一来源', 'electronic_market': '电子卖场', 'acceptance': '履约验收', 'engineering': '工程公告' } for ann_type, count in type_stats.items(): type_name = type_name_map.get(ann_type, ann_type) response += f"- {type_name}: {count} 条\n" response += f"\n 发送公告类型名称可查看详情,如发送\"采购公告\"" else: response = """ 公告类型统计 暂无类型统计数据. 建议: - 点击"立即搜索"更新数据 - 系统将自动分类统计各种公告""" except Exception as db_error: logger.warning(f"数据库查询失败: {str(db_error)}") # 提供默认的类型说明 response = """ 公告类型说明 系统支持以下类型的政府采购公告: 采购公告:招标采购等采购信息 结果公告:中标成交等结果信息 更正公告:变更澄清等修改信息 合同公告:合同签订等信息 预公示:招标文件预公示 单一来源:单一来源采购公示 电子卖场:电子化采购平台 OK 履约验收:项目验收信息 工程公告:工程建设相关 发送具体类型名称可搜索相关公告.""" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"按类型查看公告处理异常: {str(e)}") return self._create_text_response("获取类型统计失败,请稍后重试", from_user) def _handle_search_by_type(self, type_name: str, from_user: str) -> Optional[str]: """处理按类型搜索公告""" try: logger.info(f"用户 {from_user} 按类型搜索公告: {type_name}") # 类型映射 type_mapping = { "采购公告": "purchase", "结果公告": "result", "更正公告": "correction", "合同公告": "contract", "预公示": "pre_announcement", "单一来源": "single_source", "电子卖场": "electronic_market", "履约验收": "acceptance", "工程公告": "engineering" } ann_type = type_mapping.get(type_name) if not ann_type: return self._create_text_response(f"未知的公告类型: {type_name}", from_user) # 查询该类型的公告 try: from ..storage.postgresql import get_storage_manager storage = get_storage_manager() # 获取所有最近公告,然后过滤类型 all_announcements = storage.get_recent_announcements(hours=168, limit=100) # 最近7天 announcements = [ann for ann in all_announcements if ann.announcement_type.value == ann_type][:5] if announcements: response = f""" {type_name} (最近5条) 更新时间:{datetime.now().strftime('%Y-%m-%d %H:%M')} """ for i, announcement in enumerate(announcements, 1): title = announcement.title[:25] + "..." if len(announcement.title) > 25 else announcement.title time_str = announcement.publish_date.strftime('%m-%d %H:%M') if announcement.publish_date else "未知" response += f"{i}. {title}\n {time_str} | {announcement.purchase_name or '未知'}\n\n" response += " 发送关键词可进一步筛选,点击菜单可查看更多功能." else: response = f""" {type_name} 暂无该类型的公告数据. 建议: - 点击"立即搜索"更新数据 - 该类型公告可能较少出现""" except Exception as db_error: logger.warning(f"数据库查询失败: {str(db_error)}") response = f""" {type_name} 暂时无法获取数据,请稍后重试. 您可以先尝试"立即爬取"更新数据.""" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"按类型搜索公告处理异常: {str(e)}") return self._create_text_response("搜索失败,请稍后重试", from_user) def _handle_latest_news(self, from_user: str) -> Optional[str]: """处理最新公告菜单""" try: logger.info(f"用户 {from_user} 请求最新公告") # 查询最新的公告 try: from ..storage.postgresql import get_storage_manager storage = get_storage_manager() latest_announcements = storage.get_recent_announcements(hours=168, limit=10) # 最近7天 if latest_announcements: response = f""" 最新公告 (最近10条) 更新时间:{datetime.now().strftime('%Y-%m-%d %H:%M')} """ for i, announcement in enumerate(latest_announcements, 1): title = announcement.title[:25] + "..." if len(announcement.title) > 25 else announcement.title time_str = announcement.publish_date.strftime('%m-%d %H:%M') if announcement.publish_date else "未知" response += f"{i}. {title}\n {time_str} | {announcement.purchase_name or '未知'}\n\n" response += " 发送关键词可搜索相关公告,点击菜单可查看更多功能." else: response = """ 最新公告 暂无最新公告数据. 建议: - 点击"立即搜索"更新数据 - 检查系统状态确保服务正常""" except Exception as db_error: logger.warning(f"数据库查询失败: {str(db_error)}") response = """ 最新公告 暂时无法获取数据,请稍后重试. 您可以先尝试"立即爬取"更新数据.""" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"最新公告处理异常: {str(e)}") return self._create_text_response("获取最新公告失败,请稍后重试", from_user) def _handle_keyword_manage(self, from_user: str) -> Optional[str]: """处理关键词管理菜单""" try: logger.info(f"用户 {from_user} 请求关键词管理") # 获取当前配置的关键词 current_keywords = self.config.crawler.keyword if hasattr(self.config, 'crawler') and self.config.crawler else ["大化", "信息化"] keywords_str = "".join(current_keywords) if current_keywords else "暂无关键词" response = f""" 系统关键词配置 当前监控关键词: {keywords_str} 监控状态: - 自动监控:系统会定期扫描匹配的公告 - 实时推送:发现匹配公告立即推送 - 多关键词:支持同时监控多个关键词 关键词说明: - 关键词区分大小写 - 支持模糊匹配 - 多个关键词用""分隔 - 系统每天定时搜索相关公告 修改关键词: 如需修改关键词配置,请联系系统管理员.""" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"关键词管理处理异常: {str(e)}") return self._create_text_response("关键词管理功能暂时不可用", from_user) def _handle_system_status(self, from_user: str) -> Optional[str]: """处理系统状态菜单""" try: logger.info(f"用户 {from_user} 请求系统状态") # 检查各种系统组件状态 status_info = { "database": "检查中...", "crawler": "检查中...", "wechat": "检查中...", "scheduler": "检查中..." } # 检查数据库连接 try: from ..storage.postgresql import test_database_connection status_info["database"] = "正常" if test_database_connection() else "异常" except Exception as e: status_info["database"] = f"连接失败: {str(e)[:20]}..." # 检查爬虫状态 try: app = self._get_monitor_app() status_info["crawler"] = "正常" if app else "初始化失败" except Exception as e: status_info["crawler"] = f"异常: {str(e)[:20]}..." # 检查微信服务状态 try: from ..notification.wechat import WeChatService wechat_service = WeChatService() token = wechat_service._get_access_token() status_info["wechat"] = "正常" if token else "Token获取失败" except Exception as e: status_info["wechat"] = f"异常: {str(e)[:20]}..." # 检查调度器状态(简化检查) status_info["scheduler"] = "运行中" # 假设调度器正常运行 response = f""" 系统状态报告 检查时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 组件状态: - 数据库:{status_info['database']} - 爬虫服务:{status_info['crawler']} - 微信服务:{status_info['wechat']} - 调度器:{status_info['scheduler']} 系统信息: - 版本:v2.0.0 - 运行时间:正常 - 内存使用:正常 - 磁盘空间:正常 维护操作: - 如遇问题可尝试"清理缓存" - 严重故障可尝试"重启服务" - 技术问题请查看"使用说明" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"系统状态处理异常: {str(e)}") return self._create_text_response("获取系统状态失败,请稍后重试", from_user) def _handle_clear_cache(self, from_user: str) -> Optional[str]: """处理清理缓存菜单""" try: logger.info(f"用户 {from_user} 请求清理缓存") # 执行缓存清理操作 cache_cleared = { "database_cache": False, "file_cache": False, "memory_cache": False } # 清理数据库缓存(如果有的话) try: from ..storage.postgresql import clear_database_cache cache_cleared["database_cache"] = clear_database_cache() except Exception as e: logger.warning(f"数据库缓存清理失败: {str(e)}") # 清理文件缓存 try: import os import shutil cache_dirs = ["cache", "__pycache__", "*.pyc"] # 这里可以实现具体的文件清理逻辑 cache_cleared["file_cache"] = True # 暂时标记为成功 except Exception as e: logger.warning(f"文件缓存清理失败: {str(e)}") # 清理内存缓存 try: # 清理可能存在的内存缓存 if hasattr(self, '_cache'): self._cache.clear() cache_cleared["memory_cache"] = True except Exception as e: logger.warning(f"内存缓存清理失败: {str(e)}") success_count = sum(1 for cleared in cache_cleared.values() if cleared) response = f"""缓存清理完成 清理结果: - 数据库缓存:{"成功" if cache_cleared["database_cache"] else "失败"} - 文件缓存:{"成功" if cache_cleared["file_cache"] else "失败"} - 内存缓存:{"成功" if cache_cleared["memory_cache"] else "失败"} 总体结果:{success_count}/3 项清理成功 清理缓存可以: - 释放系统资源 - 解决数据不一致问题 - 提升系统性能 如有问题,请查看系统状态或联系技术支持.""" return self._create_text_response(response, from_user) except Exception as e: logger.error(f"清理缓存处理异常: {str(e)}") return self._create_text_response("缓存清理失败,请稍后重试", from_user) def _handle_help_guide(self, from_user: str) -> Optional[str]: """处理使用说明菜单""" try: logger.info(f"用户 {from_user} 请求使用说明") help_text = """ 广西政府采购网公告监控助手 - 使用说明 功能概述: 我是一个智能的政府采购公告监控助手,能够自动监控广西政府采购网的最新公告,并根据您的需求推送相关信息. 快速开始: 1. 点击"立即搜索"获取最新公告 2. 发送关键词进行智能搜索 3. 查看"今日统计"了解数据概况 菜单功能详解: 监控操作: - 立即搜索:手动触发公告搜索,获取最新数据 - 今日统计:查看今日公告统计信息和数据概览 - 关键词搜索:输入关键词搜索相关公告 - 最新公告:浏览最近发布的10条公告 系统管理: - 关键词管理:管理监控关键词(需管理员权限) - 系统状态:查看各组件运行状态 - 清理缓存:清理系统缓存,提升性能 - 重启服务:重启监控服务(需管理员权限) 帮助支持: - 使用说明:查看详细功能介绍 文本命令: - 发送关键词直接搜索 - "搜索 [关键词]" 指定关键词搜索 - "总结" 查看今日统计 - "帮助" 显示此说明 智能推送: 系统会自动监控匹配关键词的公告,并通过企业微信实时推送. 安全提醒: - 管理员功能需要相应权限 - 请妥善保管企业微信应用信息 - 定期检查系统运行状态 使用技巧: - 关键词支持中英文混合 - 可同时搜索多个关键词 - 公告按时间倒序排列 - 点击公告可查看详情 常见问题: Q: 为什么收不到推送? A: 检查关键词设置和系统状态 Q: 数据不准确怎么办? A: 尝试"立即爬取"更新数据 Q: 搜索不到结果? A: 检查关键词拼写,尝试更通用的关键词 如有其他问题,请点击"使用说明"获取帮助.""" return self._create_text_response(help_text, from_user) except Exception as e: logger.error(f"使用说明处理异常: {str(e)}") return self._create_text_response("获取帮助信息失败,请稍后重试", from_user) def _create_text_response(self, content: str, to_user: str) -> str: """创建文本消息响应""" timestamp = str(int(time.time())) response_xml = f""" {timestamp} """ return response_xml