Files
GX-gp-notify/gx_gp_monitor/wechat/message_handler.py.backup
T

971 lines
36 KiB
Plaintext

"""
企业微信消息处理器
处理用户消息和事件,实现菜单功能
"""
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"""<xml>
<ToUserName><![CDATA[{to_user}]]></ToUserName>
<FromUserName><![CDATA[{self.config.wechat_app.corp_id}]]></FromUserName>
<CreateTime>{timestamp}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{content}]]></Content>
</xml>"""
return response_xml