diff --git a/CRON_README.md b/CRON_README.md index ff0c6aa..7a65d0a 100644 --- a/CRON_README.md +++ b/CRON_README.md @@ -1,11 +1,11 @@ -# 定时爬取脚本使用说明 +# 定时搜索脚本使用说明 ## 脚本功能 -`cron_crawl.py` 是一个用于定时爬取广西政府采购网公告的脚本,具有以下功能: +`cron_crawl.py` 是一个用于定时搜索广西政府采购网公告的脚本,具有以下功能: - ✅ 从 `gx_gp_monitor/config/config.yaml` 读取关键词配置 -- ✅ 爬取最新的公告(数据库中没有的) +- ✅ 搜索最新的公告(数据库中没有的) - ✅ 自动筛选匹配关键词的公告 - ✅ 将筛选结果保存到数据库 - ✅ 以卡片形式发送企业微信通知 @@ -16,7 +16,7 @@ project/ ├── venv/ # Python虚拟环境 ├── gx_gp_monitor/ -│ ├── cron_crawl.py # 定时爬取主脚本 +│ ├── cron_crawl.py # 定时搜索主脚本 │ └── config/config.yaml # 配置文件 ├── run_cron_crawl.sh # 启动脚本(自动激活虚拟环境) ├── CRON_README.md # 使用说明 @@ -62,8 +62,8 @@ crontab -e ### 3. 脚本输出示例 ``` -=== 定时爬取任务完成 === -总共爬取: 1300 条公告 +=== 定时搜索任务完成 === +总共搜索: 1300 条公告 新增公告: 5 条 关键词筛选: 2 条 保存到数据库: 2 条 @@ -135,7 +135,7 @@ tail -f /home/v6ole/pyproject/GX-gp-notify/logs/cron.log 4. **时区设置**:确保系统时区设置正确,影响定时任务执行时间 -5. **资源消耗**:爬取过程中会消耗一定的CPU和网络资源,建议在非高峰期运行 +5. **资源消耗**:搜索过程中会消耗一定的CPU和网络资源,建议在非高峰期运行 ## 故障排除 diff --git a/README_企业微信.md b/README_企业微信.md index 9292625..20f4736 100644 --- a/README_企业微信.md +++ b/README_企业微信.md @@ -6,7 +6,7 @@ - 企业微信应用消息推送 - 回调服务器处理用户交互 - 应用菜单管理 -- 实时爬取和自定义搜索 +- 实时搜索和智能筛选 ## 配置要求 @@ -43,7 +43,7 @@ wechat_app: 系统会在以下情况下自动推送消息到企业微信: -- **爬取完成通知**:每次执行爬取后,推送筛选结果 +- **搜索完成通知**:每次执行搜索后,推送筛选结果 - **关键词匹配通知**:发现匹配关键词的公告时推送 - **系统状态通知**:系统启动、错误等重要事件 @@ -51,36 +51,85 @@ wechat_app: ### 2. 应用菜单 -系统提供以下菜单功能: +系统提供全新的菜单结构,包含三大功能模块: -#### 操作菜单 -- **立即爬取**:执行一次完整的公告爬取 -- **今日总结**:查看今日公告统计(开发中) -- **自定义爬取**:输入关键词进行搜索 +#### 🚀 监控操作 +- **立即搜索**:执行一次完整的公告搜索,获取最新数据 +- **今日统计**:查看今日公告统计信息和数据概览 +- **关键词搜索**:输入关键词搜索相关公告 +- **最新公告**:浏览最近发布的10条公告 -#### 帮助菜单 -- **使用说明**:显示详细使用指南 -- **联系我们**:联系信息 +#### ⚙️ 系统管理 +- **关键词管理**:查看当前系统监控的关键词 +- **系统状态**:查看各组件运行状态和系统信息 +- **清理缓存**:清理系统缓存,提升性能 + +#### ❓ 帮助 +- **使用说明**:查看详细功能介绍和使用指南 ### 3. 文本交互 -支持以下文本命令: +支持丰富的文本命令交互: +#### 🔍 搜索功能 ``` -# 关键词搜索 -直接发送关键词,如:大化、信息化 +# 直接关键词搜索 +大化 # 搜索"大化"相关公告 +信息化 政府采购 # 搜索多个关键词 -# 手动爬取 -爬取 [关键词] # 如:爬取 大化 - -# 获取帮助 -帮助 # 显示使用说明 -help - -# 查看总结 -总结 # 查看今日统计 +# 关键词命令 +关键词 大化 # 明确指定关键词搜索 +搜索 政府采购 # 搜索政府采购相关公告 ``` +#### 📊 数据查询 +``` +# 统计信息 +总结 # 查看今日统计 +统计 # 查看系统统计信息 + +# 最新数据 +最新公告 # 查看最新发布的公告 +最新 # 同上 +``` + +#### 🛠️ 系统管理 +``` +# 系统状态 +系统状态 # 查看系统运行状态 +状态 # 同上 + +# 缓存管理 +清理缓存 # 清理系统缓存 +清理 # 同上 + +# 关键词管理 +查看关键词 # 查看当前监控关键词 +添加关键词 [关键词] # 添加新关键词(开发中) +删除关键词 [关键词] # 删除关键词(开发中) +``` + +#### ℹ️ 信息查询 +``` +# 帮助信息 +帮助 # 显示详细使用说明 +help # 同上 + +# 系统信息 +关于系统 # 查看系统详细信息 +关于 # 同上 + +# 联系方式 +联系我们 # 查看联系信息 +联系 # 同上 +``` + +#### 💡 智能交互 +- **自动识别**:直接发送关键词即可搜索 +- **多关键词**:用空格分隔多个关键词 +- **模糊匹配**:支持标题和内容搜索 +- **实时反馈**:所有操作都有即时响应 + ## 部署和运行 ### 1. 安装依赖 @@ -144,10 +193,10 @@ python gx_gp_monitor/main.py wechat-menu --action get python gx_gp_monitor/main.py wechat-menu --action test ``` -### 5. 正常爬取 +### 5. 正常搜索 ```bash -# 执行爬取(会自动推送消息) +# 执行搜索(会自动推送消息) python gx_gp_monitor/main.py crawl ``` diff --git a/create_wechat_menu.py b/create_wechat_menu.py new file mode 100644 index 0000000..e906277 --- /dev/null +++ b/create_wechat_menu.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +""" +创建企业微信菜单脚本 +""" + +import sys +import os + +# 添加项目路径 +sys.path.insert(0, os.path.dirname(__file__)) + +try: + from gx_gp_monitor.wechat.menu_manager import WeChatMenuManager + from gx_gp_monitor.core.config_manager import load_config + + def main(): + """主函数""" + print("🚀 开始创建企业微信菜单...") + print("=" * 50) + + try: + # 加载配置 + load_config() + print("✅ 配置加载成功") + + # 创建菜单管理器 + menu_manager = WeChatMenuManager() + print("✅ 菜单管理器初始化成功") + + # 显示当前菜单结构 + menu_info = menu_manager.get_menu_info() + print("\n📋 菜单结构预览:") + for button in menu_info['menu_structure']['buttons']: + sub_count = len(button.get('sub_buttons', [])) if isinstance(button.get('sub_buttons'), list) else button.get('sub_buttons', 0) + print(f"• {button['name']} ({sub_count}个子菜单)") + if isinstance(button.get('sub_buttons'), list): + for sub_btn in button['sub_buttons']: + print(f" - {sub_btn['name']}") + + print("\n🔄 正在创建菜单到企业微信...") + + # 创建菜单 + result = menu_manager.create_menu() + + if result: + print("✅ 企业微信菜单创建成功!") + print("\n💡 菜单功能说明:") + print("• 🚀 监控操作:搜索、统计、筛选等核心功能") + print("• ⚙️ 系统管理:状态监控、维护操作") + print("• ❓ 帮助:使用说明和联系方式") + print("\n🎯 现在可以在企业微信中查看和使用新菜单了!") + else: + print("❌ 企业微信菜单创建失败") + print("💡 可能的原因:") + print("• 企业微信配置错误") + print("• 网络连接问题") + print("• API权限不足") + print("• 请检查日志文件获取详细错误信息") + + except Exception as e: + print(f"❌ 创建菜单失败: {str(e)}") + print("请检查配置和网络连接") + + if __name__ == "__main__": + main() + +except ImportError as e: + print(f"❌ 导入失败: {e}", file=sys.stderr) + print("请确保已安装所有依赖: pip install -r gx_gp_monitor/requirements.txt", file=sys.stderr) + sys.exit(1) +except Exception as e: + print(f"❌ 脚本执行失败: {e}", file=sys.stderr) + sys.exit(1) diff --git a/gx_gp_monitor/__pycache__/main.cpython-313.pyc b/gx_gp_monitor/__pycache__/main.cpython-313.pyc index c64809a..dbed077 100644 Binary files a/gx_gp_monitor/__pycache__/main.cpython-313.pyc and b/gx_gp_monitor/__pycache__/main.cpython-313.pyc differ diff --git a/gx_gp_monitor/cron_crawl.py b/gx_gp_monitor/cron_crawl.py index 4f7b68b..beca3be 100755 --- a/gx_gp_monitor/cron_crawl.py +++ b/gx_gp_monitor/cron_crawl.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ -定时爬取脚本 -执行爬取、筛选关键词、保存到数据库并发送企业微信卡片通知 +定时搜索脚本 +执行搜索、筛选关键词、保存到数据库并发送企业微信卡片通知 """ import sys @@ -23,7 +23,7 @@ try: logger = get_logger(__name__) def main(): - """主函数:执行定时爬取任务""" + """主函数:执行定时搜索任务""" try: # 加载配置 config = load_config() @@ -34,13 +34,13 @@ try: # 初始化日志 init_logger(config=config) - logger.info("=== 开始定时爬取任务 ===") + logger.info("=== 开始定时搜索任务 ===") # 初始化存储 init_storage() - # 执行爬取 - logger.info("开始执行爬取...") + # 执行搜索 + logger.info("开始执行搜索...") crawl_results = crawl_announcements() if not crawl_results: @@ -54,7 +54,7 @@ try: all_announcements.extend(result.announcements) total_crawled = len(all_announcements) - logger.info(f"爬取到 {total_crawled} 条原始公告") + logger.info(f"搜索到 {total_crawled} 条原始公告") # 保存所有公告(按来源分组,每源保留最新100条) all_saved_stats = save_all_announcements_by_source_to_storage(all_announcements, max_per_source=100) @@ -103,18 +103,18 @@ try: print(f"保存到数据库: {saved_count} 条") print(f"企业微信通知: {'成功' if notify_success else '失败' if config.wechat_app.enabled else '未启用'}") - logger.info("=== 定时爬取任务完成 ===") + logger.info("=== 定时搜索任务完成 ===") return True except Exception as e: - logger.error(f"定时爬取任务执行失败: {str(e)}") - print(f"❌ 定时爬取任务失败: {str(e)}", file=sys.stderr) + logger.error(f"定时搜索任务执行失败: {str(e)}") + print(f"❌ 定时搜索任务失败: {str(e)}", file=sys.stderr) # 尝试发送错误通知 try: if config and config.wechat_app.enabled: send_system_notification( - "定时爬取任务失败", + "定时搜索任务失败", f"错误信息: {str(e)}" ) except Exception as notify_error: diff --git a/gx_gp_monitor/main.py b/gx_gp_monitor/main.py index f524761..e412376 100644 --- a/gx_gp_monitor/main.py +++ b/gx_gp_monitor/main.py @@ -90,22 +90,22 @@ class GXGPMonitorApp: return False def run_crawl(self, keywords: list = None, sources: list = None, max_pages: int = None, manual_crawl: bool = False): - """执行爬取任务 + """执行搜索任务 Args: keywords: 关键词列表 sources: 来源列表 max_pages: 最大页数 - manual_crawl: 是否为手动爬取(只筛选今天的数据) + manual_crawl: 是否为手动搜索(只筛选今天的数据) """ try: - logger.info(f"开始执行爬取任务 (手动爬取: {manual_crawl})") + logger.info(f"开始执行搜索任务 (手动搜索: {manual_crawl})") # 执行爬取 crawl_results = crawl_announcements(keywords, sources) if not crawl_results: - logger.info("爬取完成:无数据") + logger.info("搜索完成:无数据") return {"success": True, "results": []} # 收集所有公告 @@ -114,9 +114,9 @@ class GXGPMonitorApp: if result.announcements: all_announcements.extend(result.announcements) - logger.info(f"爬取到 {len(all_announcements)} 条原始公告") + logger.info(f"搜索到 {len(all_announcements)} 条原始公告") - # 对于手动爬取,不保存公告到数据库,只进行筛选和返回结果 + # 对于手动搜索,不保存公告到数据库,只进行筛选和返回结果 if not manual_crawl: # 先保存所有公告(按来源分组,每源保留最新100条) all_saved_stats = save_all_announcements_by_source_to_storage(all_announcements, max_per_source=100) @@ -125,11 +125,11 @@ class GXGPMonitorApp: else: all_saved_count = 0 all_saved_stats = {} - logger.info("手动爬取模式:跳过数据库保存") + logger.info("手动搜索模式:跳过数据库保存") # 筛选公告 if manual_crawl: - # 手动爬取:只筛选今天的公告和用户指定的关键词,不进行去重 + # 手动搜索:只筛选今天的公告和用户指定的关键词,不进行去重 from .filters.filters import KeywordFilter, DateFilter, SourceFilter from datetime import date @@ -149,7 +149,7 @@ class GXGPMonitorApp: filter_stats = type('FilterResult', (), { "keyword_filtered": len(date_filtered) - len(keyword_filtered), "date_filtered": len(all_announcements) - len(date_filtered), - "duplicate_filtered": 0, # 手动爬取不进行去重 + "duplicate_filtered": 0, # 手动搜索不进行去重 "source_filtered": len(keyword_filtered) - len(filtered_announcements) })() else: diff --git a/gx_gp_monitor/notification/__pycache__/wechat.cpython-313.pyc b/gx_gp_monitor/notification/__pycache__/wechat.cpython-313.pyc index 8ccbeb2..d0a612a 100644 Binary files a/gx_gp_monitor/notification/__pycache__/wechat.cpython-313.pyc and b/gx_gp_monitor/notification/__pycache__/wechat.cpython-313.pyc differ diff --git a/gx_gp_monitor/wechat/__pycache__/menu_manager.cpython-313.pyc b/gx_gp_monitor/wechat/__pycache__/menu_manager.cpython-313.pyc index 6b03f7d..70e218e 100644 Binary files a/gx_gp_monitor/wechat/__pycache__/menu_manager.cpython-313.pyc and b/gx_gp_monitor/wechat/__pycache__/menu_manager.cpython-313.pyc differ diff --git a/gx_gp_monitor/wechat/__pycache__/message_handler.cpython-313.pyc b/gx_gp_monitor/wechat/__pycache__/message_handler.cpython-313.pyc index 9d72ad3..04cfa4e 100644 Binary files a/gx_gp_monitor/wechat/__pycache__/message_handler.cpython-313.pyc and b/gx_gp_monitor/wechat/__pycache__/message_handler.cpython-313.pyc differ diff --git a/gx_gp_monitor/wechat/menu_manager.py b/gx_gp_monitor/wechat/menu_manager.py index 15ba593..73d0da0 100644 --- a/gx_gp_monitor/wechat/menu_manager.py +++ b/gx_gp_monitor/wechat/menu_manager.py @@ -34,22 +34,47 @@ class WeChatMenuManager: self.menu_data = { "button": [ { - "name": "操作", + "name": "监控操作", "sub_button": [ { "type": "click", - "name": "立即爬取", + "name": "立即搜索", "key": "crawl_now" }, { "type": "click", - "name": "今日总结", - "key": "today_summary" + "name": "今日统计", + "key": "today_stats" }, { "type": "click", - "name": "自定义爬取", - "key": "custom_crawl" + "name": "关键词搜索", + "key": "keyword_search" + }, + { + "type": "click", + "name": "最新公告", + "key": "latest_news" + } + ] + }, + { + "name": "系统管理", + "sub_button": [ + { + "type": "click", + "name": "关键词管理", + "key": "keyword_manage" + }, + { + "type": "click", + "name": "系统状态", + "key": "system_status" + }, + { + "type": "click", + "name": "清理缓存", + "key": "clear_cache" } ] }, @@ -60,11 +85,6 @@ class WeChatMenuManager: "type": "click", "name": "使用说明", "key": "help_guide" - }, - { - "type": "click", - "name": "联系我们", - "key": "contact_us" } ] } diff --git a/gx_gp_monitor/wechat/message_handler.py b/gx_gp_monitor/wechat/message_handler.py index bdcb9f3..5dce0a1 100644 --- a/gx_gp_monitor/wechat/message_handler.py +++ b/gx_gp_monitor/wechat/message_handler.py @@ -39,20 +39,45 @@ class WeChatMessageHandler: # 菜单配置 self.menu_config = { - "crawl": { + "crawl_now": { "key": "crawl_now", - "name": "立即爬取", - "description": "立即执行一次公告爬取" + "name": "立即搜索", + "description": "立即执行一次公告搜索" }, - "today_summary": { - "key": "today_summary", - "name": "今日总结", - "description": "查看今日公告统计" + "today_stats": { + "key": "today_stats", + "name": "今日统计", + "description": "查看今日公告统计信息" }, - "custom_crawl": { - "key": "custom_crawl", - "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": "查看详细使用说明" } } @@ -61,11 +86,9 @@ class WeChatMessageHandler: 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 @@ -80,30 +103,43 @@ class WeChatMessageHandler: 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_summary': - return self._handle_today_summary(from_user) - elif event_key.startswith('custom_crawl'): - return self._handle_custom_crawl(event_key, 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 == '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 == 'latest_announcements': + return self._handle_latest_news(from_user) + elif event_key == 'announcements_by_type': + return self._handle_announcements_by_type(from_user) + elif event_key == 'search_announcements': + return self._handle_keyword_search_menu(from_user) else: return self._create_text_response("未知菜单项", from_user) elif event == 'subscribe': - # 关注事件 - welcome_msg = """欢迎关注广西政府采购网公告监控! + welcome_msg = """欢迎关注广西政府采购网公告监控! -我可以帮您: -• 自动监控最新采购公告 -• 筛选您关心的关键词信息 -• 及时推送重要更新 +我可以帮您: +- 自动监控最新采购公告 +- 筛选您关心的关键词信息 +- 及时推送重要更新 -点击下方菜单开始使用。""" +点击下方菜单开始使用.""" return self._create_text_response(welcome_msg, from_user) elif event == 'unsubscribe': - # 取消关注事件 logger.info(f"用户 {from_user} 取消关注") return None @@ -120,25 +156,656 @@ class WeChatMessageHandler: try: logger.info(f"处理文本消息: {content}, user: {from_user}") - # 移除前后空格 content = content.strip() if content == "帮助" or content == "help": - return self._handle_help(from_user) - elif content.startswith("爬取"): + return self._handle_help_guide(from_user) + elif content.startswith("爬取") or content.startswith("搜索"): return self._handle_manual_crawl(content, from_user) - elif content.startswith("总结"): - return self._handle_today_summary(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_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"""搜索完成! + +统计信息: +- 总共发现: {total} 条公告 +- 关键词筛选: {filtered} 条 +- 已保存: {saved} 条 + +如有匹配的公告,我会及时推送通知.""" + else: + error = result.get("error", "未知错误") + response = f"搜索失败: {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)} 条 + +提示: 数据每小时更新,点击"立即搜索"可获取最新数据.""" + 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_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_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) + + 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 = [] + try: + if hasattr(self.config, 'crawler') and self.config.crawler and hasattr(self.config.crawler, 'keyword'): + current_keywords = self.config.crawler.keyword + else: + # 从配置文件直接读取 + import yaml + import os + config_path = os.path.join(os.path.dirname(__file__), '..', '..', 'gx_gp_monitor', 'config', 'config.yaml') + if os.path.exists(config_path): + with open(config_path, 'r', encoding='utf-8') as f: + config_data = yaml.safe_load(f) + current_keywords = config_data.get('crawler', {}).get('keyword', []) + except Exception as e: + logger.warning(f"读取关键词配置失败: {str(e)}") + + # 如果获取不到,使用默认显示 + if not current_keywords: + current_keywords = ["大化", "南宁", "信息化", "政府采购"] + + keywords_str = "\n• ".join(current_keywords) + + 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_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 _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 += "\n发送公告类型名称可查看详情,如发送\"采购公告\"" + + 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_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) + 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_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) + + if filtered > 0: + response = f"""搜索完成! + +关键词: {' '.join(keywords)} +发现匹配公告: {filtered} 条 + +如有匹配的公告,我会及时推送通知。""" + else: + response = f"""搜索完成! + +关键词: {' '.join(keywords)} +未发现匹配的公告。 + +建议: +- 尝试更通用的关键词 +- 检查关键词拼写 +- 等待系统更新最新数据""" + else: + error = result.get("error", "未知错误") + response = f"搜索失败: {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 + logger.info(f"用户 {from_user} 关键词搜索: {keywords}") + + if not keywords: + return self._create_text_response("请提供搜索关键词", from_user) + + 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"): + filtered = result.get("filtered", 0) + + if filtered > 0: + response = f"""搜索完成! + +关键词: {' '.join(keywords)} +发现匹配公告: {filtered} 条 + +如有匹配的公告,我会及时推送通知。""" + else: + response = f"""搜索完成! + +关键词: {' '.join(keywords)} +未发现匹配的公告。 + +建议: +- 尝试更通用的关键词 +- 检查关键词拼写 +- 等待系统更新最新数据""" + else: + error = result.get("error", "未知错误") + response = f"搜索失败: {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_other_message(self, msg_type: str, from_user: str) -> Optional[str]: """处理其他类型的消息""" try: @@ -155,280 +822,6 @@ class WeChatMessageHandler: 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"""✅ 爬取完成! - -📊 统计信息: -• 总共发现: {total} 条公告 -• 关键词筛选: {filtered} 条 -• 已保存: {saved} 条 - -如有匹配的公告,我会及时推送通知。""" - else: - error = result.get("error", "未知错误") - response = f"❌ 爬取失败: {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_summary(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_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]: - """处理帮助命令""" - help_text = """🤖 广西政府采购网公告监控助手 - -📋 菜单功能: -• 立即爬取 - 执行一次公告爬取 -• 今日总结 - 查看今日公告统计 -• 自定义爬取 - 输入关键词搜索 - -💬 文本命令: -• 发送关键词 - 搜索相关公告 -• "爬取 [关键词]" - 指定关键词爬取 -• "总结" - 查看今日统计 -• "帮助" - 显示此帮助信息 - -📢 自动推送: -系统会自动监控最新公告,并推送匹配关键词的信息。 - -💡 使用提示: -• 关键词支持多个,用空格分隔 -• 公告按时间倒序显示 -• 点击公告标题可查看详情""" - - return self._create_text_response(help_text, 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"""✅ 爬取完成! - -🔍 搜索条件: -• 关键词: {' '.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"""✅ 爬取完成! - -🔍 搜索条件: -• 关键词: {' '.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"""✅ 爬取完成! - -🔍 搜索条件: -• 关键词: {' '.join(keywords)} -• 时间段: {time_period} - -📊 统计结果: -• 总共发现: {total} 条公告 -• 匹配筛选: 0 条 - -❌ 在指定时间段内没有找到匹配的公告。""" - except Exception as notify_error: - logger.error(f"生成或发送公告汇总失败: {notify_error}") - response = f"""✅ 爬取完成! - -🔍 搜索条件: -• 关键词: {' '.join(keywords)} -• 时间段: {time_period} - -📊 统计结果: -• 总共发现: {total} 条公告 -• 匹配筛选: 0 条 - -❌ 在指定时间段内没有找到匹配的公告。""" - else: - error = result.get("error", "未知错误") - response = f"❌ 爬取失败: {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 _create_text_response(self, content: str, to_user: str) -> str: """创建文本消息响应""" timestamp = str(int(time.time())) diff --git a/gx_gp_monitor/wechat/message_handler.py.backup b/gx_gp_monitor/wechat/message_handler.py.backup new file mode 100644 index 0000000..c490241 --- /dev/null +++ b/gx_gp_monitor/wechat/message_handler.py.backup @@ -0,0 +1,970 @@ +""" +企业微信消息处理器 +处理用户消息和事件,实现菜单功能 +""" + +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 diff --git a/gx_gp_monitor/wechat/message_handler_clean.py b/gx_gp_monitor/wechat/message_handler_clean.py new file mode 100644 index 0000000..d3433a1 --- /dev/null +++ b/gx_gp_monitor/wechat/message_handler_clean.py @@ -0,0 +1,824 @@ +""" +企业微信消息处理器 +处理用户消息和事件,实现菜单功能 +""" + +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 == '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 == 'latest_announcements': + return self._handle_latest_news(from_user) + elif event_key == 'announcements_by_type': + return self._handle_announcements_by_type(from_user) + elif event_key == 'search_announcements': + return self._handle_keyword_search_menu(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("爬取") or 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_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"""搜索完成! + +统计信息: +- 总共发现: {total} 条公告 +- 关键词筛选: {filtered} 条 +- 已保存: {saved} 条 + +如有匹配的公告,我会及时推送通知.""" + else: + error = result.get("error", "未知错误") + response = f"搜索失败: {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)} 条 + +提示: 数据每小时更新,点击"立即搜索"可获取最新数据.""" + 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_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_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) + + 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_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 _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 += "\n发送公告类型名称可查看详情,如发送\"采购公告\"" + + 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_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) + 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_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) + + if filtered > 0: + response = f"""搜索完成! + +关键词: {' '.join(keywords)} +发现匹配公告: {filtered} 条 + +如有匹配的公告,我会及时推送通知。""" + else: + response = f"""搜索完成! + +关键词: {' '.join(keywords)} +未发现匹配的公告。 + +建议: +- 尝试更通用的关键词 +- 检查关键词拼写 +- 等待系统更新最新数据""" + else: + error = result.get("error", "未知错误") + response = f"搜索失败: {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 + logger.info(f"用户 {from_user} 关键词搜索: {keywords}") + + if not keywords: + return self._create_text_response("请提供搜索关键词", from_user) + + 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"): + filtered = result.get("filtered", 0) + + if filtered > 0: + response = f"""搜索完成! + +关键词: {' '.join(keywords)} +发现匹配公告: {filtered} 条 + +如有匹配的公告,我会及时推送通知。""" + else: + response = f"""搜索完成! + +关键词: {' '.join(keywords)} +未发现匹配的公告。 + +建议: +- 尝试更通用的关键词 +- 检查关键词拼写 +- 等待系统更新最新数据""" + else: + error = result.get("error", "未知错误") + response = f"搜索失败: {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_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 _create_text_response(self, content: str, to_user: str) -> str: + """创建文本消息响应""" + timestamp = str(int(time.time())) + + response_xml = f""" + + +{timestamp} + + +""" + + return response_xml diff --git a/logs/gx_gp_monitor.log b/logs/gx_gp_monitor.log index 9ec9d2c..8d5c1c3 100644 --- a/logs/gx_gp_monitor.log +++ b/logs/gx_gp_monitor.log @@ -1,103 +1,1708 @@ -2026-01-08 21:39:23 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:39:23 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:40:03 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:40:03 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:40:12 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:40:12 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:42:21 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:42:21 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:42:30 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:42:30 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:42:59 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 -2026-01-08 21:42:59 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: wZm4V0y7wZ7GCKNacdIhhN+KCQoX6c6peaCl8aCxA7zeHQy9H1... -2026-01-08 21:42:59 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: f1e34ecdef54dcb3f3ea1b84898cec64c54a128e -2026-01-08 21:42:59 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: f1e34ecdef54dcb3f3ea1b84898cec64c54a128e -2026-01-08 21:42:59 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True -2026-01-08 21:42:59 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... -2026-01-08 21:42:59 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text -2026-01-08 21:42:59 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=帮助..., user=WeiJueSen -2026-01-08 21:42:59 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 帮助, user: WeiJueSen -2026-01-08 21:46:51 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:46:51 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:47:00 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:47:00 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:47:42 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:47:42 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:48:17 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:48:17 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:49:11 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:49:11 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:50:36 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:50:36 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: jiJ2j73W7wKovmd8M9YmBGuai+FUfQCGkPH1KYPM4mCA1q/3jr... -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: a62b23e0fce089e9ee78072a8467642588448e65 -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: a62b23e0fce089e9ee78072a8467642588448e65 -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=爬取 大化..., user=WeiJueSen -2026-01-08 21:51:00 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 爬取 大化, user: WeiJueSen -2026-01-08 21:51:00 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 手动爬取关键词: ['大化'] -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - 版本: 1.0.0 -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 -2026-01-08 21:51:00 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 -2026-01-08 21:51:00 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 -2026-01-08 21:51:00 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 -2026-01-08 21:51:00 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 -2026-01-08 21:51:00 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - 应用初始化完成 -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - 开始执行爬取任务 (手动爬取: True) -2026-01-08 21:51:00 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 -2026-01-08 21:51:00 - gx_gp_monitor - INFO - 开始爬取 采购公告 -2026-01-08 21:51:00 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:00 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.49秒 -2026-01-08 21:51:00 - gx_gp_monitor - INFO - 开始爬取 结果公告 -2026-01-08 21:51:01 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 开始爬取 合同公告 -2026-01-08 21:51:01 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.26秒 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 开始爬取 更正公告 -2026-01-08 21:51:01 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 -2026-01-08 21:51:01 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.26秒 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 -2026-01-08 21:51:02 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.20秒 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 -2026-01-08 21:51:02 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.39秒 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 -2026-01-08 21:51:02 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 开始爬取 工程类公告 -2026-01-08 21:51:02 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.25秒 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.20秒 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.19秒 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 爬取到 1300 条原始公告 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过数据库保存 -2026-01-08 21:51:03 - gx_gp_monitor.filters.filters - INFO - 日期筛选: 1300 -> 537 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 537 -> 2 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 2 -> 2 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 筛选后剩余 2 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过筛选后公告的数据库保存 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 2, 'saved': 0, 'markdown_generated': False, 'notification_sent': True, 'filter_stats': {'keyword_filtered': 535, 'date_filtered': 763, 'duplicate_filtered': 0, 'source_filtered': 0}, 'filtered_announcements': [Announcement(id=None, title='广西壮族自治区大化公路养护中心2026年3月至4月政府采购意向', publish_date=datetime.datetime(2026, 1, 8, 16, 55, 31), purchase_name='广西壮族自治区大化公路养护中心', content_url='https://zfcg.gxzf.gov.cn/site/detail?parentId=66485&articleId=aMzhKRWZyOvYpGoEA4k/8g==', source_code='61-266648', source_name='采购意向公开', announcement_type=, crawled_at=datetime.datetime(2026, 1, 8, 21, 51, 3, 530262), created_at=None, updated_at=None, content_hash='1895a00610c2dc0dfbcdb724260f4597', keyword_matched=True, date_filtered=True, is_new=True, is_today=True), Announcement(id=None, title='中国共产党大化瑶族自治县委员会组织部2026年2月至3月政府采购意向', publish_date=datetime.datetime(2026, 1, 8, 11, 41, 6), purchase_name='中国共产党大化瑶族自治县委员会组织部', content_url='https://zfcg.gxzf.gov.cn/site/detail?parentId=66485&articleId=Qgm7DlkoLsuw6Asij2HL8w==', source_code='61-266648', source_name='采购意向公开', announcement_type=, crawled_at=datetime.datetime(2026, 1, 8, 21, 51, 3, 530262), created_at=None, updated_at=None, content_hash='4a57bc4330c2885de63b8d96b8f686bb', keyword_matched=True, date_filtered=True, is_new=True, is_today=True)]} -2026-01-08 21:51:03 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 -2026-01-08 21:51:04 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 -2026-01-08 21:51:04 - gx_gp_monitor.notification.wechat - INFO - Markdown消息发送成功 +2026-01-08 22:41:36 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 22:41:36 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 22:41:36 - __main__ - INFO - 启动企业微信回调服务器: 0.0.0.0:18001 +2026-01-08 22:41:36 - gx_gp_monitor.wechat.callback_server - INFO - 启动企业微信回调服务器: 0.0.0.0:18001 +2026-01-08 22:41:44 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:41:44 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: zy7uHHAFlJT0PQvlUO9DZ/NB+B4mxjwtvDyDdahZ7uC65b0wIy... +2026-01-08 22:41:44 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 91f558622223ff08a7f4fb4914204d61efad5eca +2026-01-08 22:41:44 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 91f558622223ff08a7f4fb4914204d61efad5eca +2026-01-08 22:41:44 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:41:44 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:41:44 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:41:44 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=system_status, user=WeiJueSen +2026-01-08 22:41:44 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: system_status, user: WeiJueSen +2026-01-08 22:41:44 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求系统状态 +2026-01-08 22:41:44 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === +2026-01-08 22:41:44 - gx_gp_monitor.main - INFO - 版本: 1.0.0 +2026-01-08 22:41:44 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 +2026-01-08 22:41:45 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-08 22:41:45 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-08 22:41:45 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-08 22:41:45 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-08 22:41:45 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-08 22:41:45 - gx_gp_monitor.main - INFO - 应用初始化完成 +2026-01-08 22:41:45 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 22:41:45 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 22:42:15 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:42:15 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: qNrTTn4MIPr01UWhDpsVEAluwZPSLsJfAe95qyi6bsfUFbvi/p... +2026-01-08 22:42:15 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 15d8792e47c8088666bf8d7a4a3ee068d004cb46 +2026-01-08 22:42:15 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 15d8792e47c8088666bf8d7a4a3ee068d004cb46 +2026-01-08 22:42:15 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:42:15 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:42:15 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:42:15 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=latest_announcements, user=WeiJueSen +2026-01-08 22:42:15 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: latest_announcements, user: WeiJueSen +2026-01-08 22:42:38 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:42:38 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: tOgfICzwKY9r4CHIttYs2ZQjjN1ykRjkupEyw5JI7zHH07fKon... +2026-01-08 22:42:38 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 6209c703657dbe9ff88560a9394725ef1241f007 +2026-01-08 22:42:38 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 6209c703657dbe9ff88560a9394725ef1241f007 +2026-01-08 22:42:38 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:42:38 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:42:38 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:42:38 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=announcements_by_type, user=WeiJueSen +2026-01-08 22:42:38 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: announcements_by_type, user: WeiJueSen +2026-01-08 22:42:40 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:42:40 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: scJJYHd/ASP9zpXjcgP6LTpCw+zMtTkN+QWEbCWC5M7UwdM9wg... +2026-01-08 22:42:40 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 1428e3db02b9d178b9de7e2674fa75af52890817 +2026-01-08 22:42:40 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 1428e3db02b9d178b9de7e2674fa75af52890817 +2026-01-08 22:42:40 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:42:40 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:42:40 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:42:40 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=search_announcements, user=WeiJueSen +2026-01-08 22:42:40 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: search_announcements, user: WeiJueSen +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: latest_announcements, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求最新公告 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - WARNING - 数据库查询失败: cannot import name 'get_latest_announcements' from 'gx_gp_monitor.storage.postgresql' (/home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/storage/postgresql.py) +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: announcements_by_type, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求按类型查看公告 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - WARNING - 数据库查询失败: cannot import name 'get_announcements_by_type' from 'gx_gp_monitor.storage.postgresql' (/home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/storage/postgresql.py) +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: search_announcements, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 触发关键词搜索菜单 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: latest_news, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求最新公告 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - WARNING - 数据库查询失败: cannot import name 'get_latest_announcements' from 'gx_gp_monitor.storage.postgresql' (/home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/storage/postgresql.py) +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_search, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 触发关键词搜索菜单 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: system_status, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求系统状态 +2026-01-08 22:49:04 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === +2026-01-08 22:49:04 - gx_gp_monitor.main - INFO - 版本: 1.0.0 +2026-01-08 22:49:04 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 +2026-01-08 22:49:04 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-08 22:49:04 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-08 22:49:04 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-08 22:49:04 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-08 22:49:04 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-08 22:49:04 - gx_gp_monitor.main - INFO - 应用初始化完成 +2026-01-08 22:49:04 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 22:49:04 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: help_guide, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求使用说明 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 采购公告, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 按类型搜索公告: 采购公告 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - WARNING - 数据库查询失败: cannot import name 'get_announcements_by_type_and_limit' from 'gx_gp_monitor.storage.postgresql' (/home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/storage/postgresql.py) +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 结果公告, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 按类型搜索公告: 结果公告 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - WARNING - 数据库查询失败: cannot import name 'get_announcements_by_type_and_limit' from 'gx_gp_monitor.storage.postgresql' (/home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/storage/postgresql.py) +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 更正公告, user: test_user +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 按类型搜索公告: 更正公告 +2026-01-08 22:49:04 - gx_gp_monitor.wechat.message_handler - WARNING - 数据库查询失败: cannot import name 'get_announcements_by_type_and_limit' from 'gx_gp_monitor.storage.postgresql' (/home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/storage/postgresql.py) +2026-01-08 22:51:33 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 22:51:33 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 22:51:33 - __main__ - INFO - 启动企业微信回调服务器: 0.0.0.0:18001 +2026-01-08 22:51:33 - gx_gp_monitor.wechat.callback_server - INFO - 启动企业微信回调服务器: 0.0.0.0:18001 +2026-01-08 22:51:37 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:51:37 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: UkaegZFBbxgju5C6KZvYRkw1HBLbwDF5yzwEhEOffaeXZcbybC... +2026-01-08 22:51:37 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 5c97afbacb28d3c5880d11f1c849edbd747b5944 +2026-01-08 22:51:37 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 5c97afbacb28d3c5880d11f1c849edbd747b5944 +2026-01-08 22:51:37 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:51:37 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:51:37 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:51:37 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=latest_announcements, user=WeiJueSen +2026-01-08 22:51:37 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: latest_announcements, user: WeiJueSen +2026-01-08 22:51:37 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求最新公告 +2026-01-08 22:51:37 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-08 22:52:15 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:52:15 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: UixDCGFGrvh/SHPWyIaKml64/lFFLTbdqtfG3Ha2pCzJZgoU8j... +2026-01-08 22:52:15 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 04e04877f11c393184edb4af917f4f1c2ba6d985 +2026-01-08 22:52:15 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 04e04877f11c393184edb4af917f4f1c2ba6d985 +2026-01-08 22:52:15 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:52:15 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:52:15 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:52:15 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=today_stats, user=WeiJueSen +2026-01-08 22:52:15 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: today_stats, user: WeiJueSen +2026-01-08 22:52:15 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求今日统计 +2026-01-08 22:52:15 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === +2026-01-08 22:52:15 - gx_gp_monitor.main - INFO - 版本: 1.0.0 +2026-01-08 22:52:15 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 +2026-01-08 22:52:15 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-08 22:52:15 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-08 22:52:15 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-08 22:52:15 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-08 22:52:15 - gx_gp_monitor.main - INFO - 应用初始化完成 +2026-01-08 22:52:25 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:52:25 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: zggZXiK9Kd+/OrwuAThCXv9oZlwquC34r3bkCGAmNc5p2+I+pR... +2026-01-08 22:52:25 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 39e474ab78e052a07484216d19e28c3ee4669bd5 +2026-01-08 22:52:25 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 39e474ab78e052a07484216d19e28c3ee4669bd5 +2026-01-08 22:52:25 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:52:25 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:52:25 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:52:25 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_search, user=WeiJueSen +2026-01-08 22:52:25 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_search, user: WeiJueSen +2026-01-08 22:52:25 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发关键词搜索菜单 +2026-01-08 22:52:33 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:52:33 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: AgFqIGQuILuzjJtXhoteHPd97jgTE9JdS4t832GfHu19/OP7Aq... +2026-01-08 22:52:33 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: d3553f3faae53288a5143ab892371dc45b9d1660 +2026-01-08 22:52:33 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: d3553f3faae53288a5143ab892371dc45b9d1660 +2026-01-08 22:52:33 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:52:33 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:52:33 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text +2026-01-08 22:52:33 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=大化..., user=WeiJueSen +2026-01-08 22:52:33 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 大化, user: WeiJueSen +2026-01-08 22:52:33 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 关键词搜索: ['大化'] +2026-01-08 22:52:48 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:52:48 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: vks0rZrGMJPZ/iKMXIYVM/HWlQ/y9w3hpQpnXjj2uXhvqC5+Eh... +2026-01-08 22:52:48 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 1eb52eda1d731c10e750c06b0ed8283c62cc392a +2026-01-08 22:52:48 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 1eb52eda1d731c10e750c06b0ed8283c62cc392a +2026-01-08 22:52:48 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:52:48 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:52:48 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:52:48 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=WeiJueSen +2026-01-08 22:52:48 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: WeiJueSen +2026-01-08 22:52:48 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发立即爬取 +2026-01-08 22:52:48 - gx_gp_monitor.main - INFO - 开始执行爬取任务 (手动爬取: False) +2026-01-08 22:52:48 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-08 22:52:48 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-08 22:52:49 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:49 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.49秒 +2026-01-08 22:52:49 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-08 22:52:49 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:49 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 22:52:49 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-08 22:52:49 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:49 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-08 22:52:49 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-08 22:52:49 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:49 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-08 22:52:49 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-08 22:52:50 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:50 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-08 22:52:50 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-08 22:52:50 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:50 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-08 22:52:50 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-08 22:52:50 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:50 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.37秒 +2026-01-08 22:52:50 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-08 22:52:50 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:50 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-08 22:52:50 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-08 22:52:51 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:51 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 22:52:51 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-08 22:52:51 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:51 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 22:52:51 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-08 22:52:51 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:51 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 22:52:51 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-08 22:52:51 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:51 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-08 22:52:51 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-08 22:52:51 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 22:52:51 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-08 22:52:51 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.main - INFO - 爬取到 1300 条原始公告 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-08 22:52:51 - gx_gp_monitor.main - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-08 22:52:51 - gx_gp_monitor.main - INFO - 筛选出 1300 条新公告 +2026-01-08 22:52:51 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-08 22:52:52 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-08 22:52:52 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-08 22:52:52 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-08 22:52:52 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-08 22:52:52 - gx_gp_monitor.storage.md_generator - INFO - Markdown文件已保存到: onu.md (共 0 条公告) +2026-01-08 22:52:52 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': True, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1300, 'date_filtered': 0, 'duplicate_filtered': 1300, 'source_filtered': 0}} +2026-01-08 22:53:03 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:53:03 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: RM8+8Adm0+v3U+VeC3pYUsPGMh7hU6+GQQ3siCysk2Lr+4BDAi... +2026-01-08 22:53:03 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 8c299026026515349dad873316441d2b59595f02 +2026-01-08 22:53:03 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 8c299026026515349dad873316441d2b59595f02 +2026-01-08 22:53:03 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:53:03 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:53:03 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:53:03 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=WeiJueSen +2026-01-08 22:53:03 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: WeiJueSen +2026-01-08 22:53:03 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求关键词管理 +2026-01-08 22:53:16 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:53:16 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: HNNsfKsUgT/eocccVGhxxQp+h4E0HHhade8ngqLbvUrrKihYD5... +2026-01-08 22:53:16 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 384adc1af5915f0f96dbc112873c3ee37c94c7c2 +2026-01-08 22:53:16 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 384adc1af5915f0f96dbc112873c3ee37c94c7c2 +2026-01-08 22:53:16 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:53:16 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:53:16 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:53:16 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=system_status, user=WeiJueSen +2026-01-08 22:53:16 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: system_status, user: WeiJueSen +2026-01-08 22:53:16 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求系统状态 +2026-01-08 22:53:16 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 22:53:16 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 22:53:20 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:53:20 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: 6o5X2ptEGVJq1TSIcihlQbL+ZCmnHQH4ykJt5yG3MbT8Kg1wdh... +2026-01-08 22:53:20 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: a579045940e40f2c0d3a4f18e5ddf28772736280 +2026-01-08 22:53:20 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: a579045940e40f2c0d3a4f18e5ddf28772736280 +2026-01-08 22:53:20 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:53:20 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:53:20 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:53:20 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=clear_cache, user=WeiJueSen +2026-01-08 22:53:20 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: clear_cache, user: WeiJueSen +2026-01-08 22:53:20 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求清理缓存 +2026-01-08 22:53:20 - gx_gp_monitor.wechat.message_handler - WARNING - 数据库缓存清理失败: cannot import name 'clear_database_cache' from 'gx_gp_monitor.storage.postgresql' (/home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/storage/postgresql.py) +2026-01-08 22:53:27 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:53:27 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: HTQWr2Myo26r8aC/d2/aDTMtOCZs9bKotRzm7OZS3z383EOHrV... +2026-01-08 22:53:27 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 8756b68ff8a0c7a65138eea51d49c730c76dbfb3 +2026-01-08 22:53:27 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 8756b68ff8a0c7a65138eea51d49c730c76dbfb3 +2026-01-08 22:53:27 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:53:27 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:53:27 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:53:27 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=help_guide, user=WeiJueSen +2026-01-08 22:53:27 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: help_guide, user: WeiJueSen +2026-01-08 22:53:27 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求使用说明 +2026-01-08 22:53:38 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 22:53:38 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: GYWb0YmDz39zBpeXe6nn/uqEEHFZXpJ2rrCgooU1F1Tz3FJh/g... +2026-01-08 22:53:38 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 12961b1237b59bbf072dafd93b7cf758ae44346b +2026-01-08 22:53:38 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 12961b1237b59bbf072dafd93b7cf758ae44346b +2026-01-08 22:53:38 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 22:53:38 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 22:53:38 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 22:53:38 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=about_system, user=WeiJueSen +2026-01-08 22:53:38 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: about_system, user: WeiJueSen +2026-01-08 22:53:38 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求系统信息 +2026-01-08 23:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-08 23:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-08 23:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-08 23:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-08 23:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-08 23:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-08 23:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-08 23:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-08 23:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-08 23:02:06 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:06 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.52秒 +2026-01-08 23:02:06 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-08 23:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:07 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 23:02:07 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-08 23:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:07 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-08 23:02:07 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-08 23:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:07 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-08 23:02:07 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-08 23:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:07 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:02:07 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-08 23:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-08 23:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.36秒 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-08 23:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.25秒 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-08 23:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-08 23:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-08 23:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:09 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:02:09 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-08 23:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:09 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-08 23:02:09 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-08 23:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:02:09 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:02:09 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-08 23:02:09 - __main__ - INFO - 爬取到 1300 条原始公告 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-08 23:02:09 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-08 23:02:09 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-08 23:02:09 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-08 23:02:09 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-08 23:02:09 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-08 23:02:09 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-08 23:02:09 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-08 23:24:20 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:24:20 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: 29e+mJkgneFeo1ny28a6GEST9jWQZ520LjorzV4NOfgoH5QA/W... +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 79b6eafce857f4ef43b5e61edc1fe207cda31b3f +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 79b6eafce857f4ef43b5e61edc1fe207cda31b3f +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=WeiJueSen +2026-01-08 23:24:40 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: WeiJueSen +2026-01-08 23:24:40 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发立即搜索 +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - 版本: 1.0.0 +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 +2026-01-08 23:24:40 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-08 23:24:40 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-08 23:24:40 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-08 23:24:40 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-08 23:24:40 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - 应用初始化完成 +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False) +2026-01-08 23:24:40 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-08 23:24:40 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: 29e+mJkgneFeo1ny28a6GEST9jWQZ520LjorzV4NOfgoH5QA/W... +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 79b6eafce857f4ef43b5e61edc1fe207cda31b3f +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 79b6eafce857f4ef43b5e61edc1fe207cda31b3f +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=WeiJueSen +2026-01-08 23:24:45 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: WeiJueSen +2026-01-08 23:24:45 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发立即搜索 +2026-01-08 23:24:45 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False) +2026-01-08 23:24:45 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-08 23:24:45 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-08 23:24:45 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:45 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.43秒 +2026-01-08 23:24:45 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-08 23:24:46 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-08 23:24:46 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-08 23:24:46 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-08 23:24:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.61秒 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-08 23:24:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-08 23:24:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.43秒 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-08 23:24:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.30秒 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-08 23:24:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-08 23:24:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-08 23:24:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-08 23:24:49 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:49 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-08 23:24:49 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-08 23:24:49 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:49 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 23:24:49 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 筛选出 1300 条新公告 +2026-01-08 23:24:49 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-08 23:24:49 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.storage.md_generator - INFO - Markdown文件已保存到: onu.md (共 0 条公告) +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': True, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1300, 'date_filtered': 0, 'duplicate_filtered': 1300, 'source_filtered': 0}} +2026-01-08 23:25:11 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.49秒 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-08 23:25:11 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-08 23:25:11 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-08 23:25:11 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-08 23:25:12 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.27秒 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-08 23:25:12 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.24秒 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-08 23:25:12 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.36秒 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.15秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-08 23:25:13 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告 +2026-01-08 23:25:13 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-08 23:25:13 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:13 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-08 23:25:13 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:13 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.main - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-08 23:25:14 - gx_gp_monitor.main - INFO - 筛选出 1300 条新公告 +2026-01-08 23:25:14 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-08 23:25:14 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-08 23:25:14 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.storage.md_generator - INFO - Markdown文件已保存到: onu.md (共 0 条公告) +2026-01-08 23:25:14 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': True, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1300, 'date_filtered': 0, 'duplicate_filtered': 1300, 'source_filtered': 0}} +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: WrH7Jb1CJaRbTgRYnX0MmwszM4U7Ik/1SAqCWS1iq2QU8KyMML... +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 1bee1bed89a994b34b8572f926d6e545f045604e +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 1bee1bed89a994b34b8572f926d6e545f045604e +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=WeiJueSen +2026-01-08 23:26:07 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: WeiJueSen +2026-01-08 23:26:07 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求关键词管理 +2026-01-08 23:26:08 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 23:26:08 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单管理器初始化完成 +2026-01-08 23:26:08 - gx_gp_monitor.wechat.menu_manager - INFO - 开始创建企业微信菜单 +2026-01-08 23:26:08 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 23:26:08 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单创建成功 +2026-01-08 23:26:29 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 23:26:29 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单管理器初始化完成 +2026-01-08 23:26:29 - gx_gp_monitor.wechat.menu_manager - INFO - 开始获取企业微信菜单 +2026-01-08 23:26:29 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 23:26:29 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单获取成功 +2026-01-08 23:26:35 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 23:26:35 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单管理器初始化完成 +2026-01-08 23:26:35 - gx_gp_monitor.wechat.menu_manager - INFO - 开始创建企业微信菜单 +2026-01-08 23:26:35 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 23:26:35 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单创建成功 +2026-01-08 23:26:50 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:26:50 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: yWYKLWjpp1gWQZ4OUse8zPR3YaOQZ9wYUHaz8WIETXh3J9S9F/... +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: bb97c3ed9044e8f2966690372c8e2283c9597d82 +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: bb97c3ed9044e8f2966690372c8e2283c9597d82 +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=about_system, user=WeiJueSen +2026-01-08 23:27:36 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: about_system, user: WeiJueSen +2026-01-08 23:27:36 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求系统信息 +2026-01-08 23:29:39 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:29:39 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:29:46 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:29:46 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:29:59 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:29:59 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:30:12 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:30:12 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:30:53 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:30:53 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:31:23 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:31:23 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:31:40 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:31:40 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:31:57 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:31:57 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:37:16 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 23:37:16 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单管理器初始化完成 +2026-01-08 23:37:16 - gx_gp_monitor.wechat.menu_manager - INFO - 开始创建企业微信菜单 +2026-01-08 23:37:16 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 23:37:16 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单创建成功 +2026-01-08 23:37:24 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 23:37:24 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单管理器初始化完成 +2026-01-08 23:37:24 - gx_gp_monitor.wechat.menu_manager - INFO - 开始获取企业微信菜单 +2026-01-08 23:37:24 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 23:37:24 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单获取成功 +2026-01-08 23:37:44 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:37:44 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求关键词管理 +2026-01-08 23:40:42 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 23:40:42 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单管理器初始化完成 +2026-01-08 23:40:42 - gx_gp_monitor.wechat.menu_manager - INFO - 开始创建企业微信菜单 +2026-01-08 23:40:42 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 23:40:42 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单创建成功 +2026-01-08 23:40:52 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 23:40:52 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单管理器初始化完成 +2026-01-08 23:40:52 - gx_gp_monitor.wechat.menu_manager - INFO - 开始获取企业微信菜单 +2026-01-08 23:40:52 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 23:40:53 - gx_gp_monitor.wechat.menu_manager - INFO - 企业微信菜单获取成功 +2026-01-08 23:40:57 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:40:57 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求关键词管理 +2026-01-08 23:41:25 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:41:25 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: test_user +2026-01-08 23:41:25 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 触发立即搜索 +2026-01-08 23:41:25 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === +2026-01-08 23:41:25 - gx_gp_monitor.main - INFO - 版本: 1.0.0 +2026-01-08 23:41:25 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 +2026-01-08 23:41:25 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-08 23:41:25 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-08 23:41:25 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-08 23:41:25 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-08 23:41:25 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-08 23:41:25 - gx_gp_monitor.main - INFO - 应用初始化完成 +2026-01-08 23:41:25 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False) +2026-01-08 23:41:25 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-08 23:41:25 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-08 23:41:25 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:25 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.45秒 +2026-01-08 23:41:25 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-08 23:41:26 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-08 23:41:26 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-08 23:41:26 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-08 23:41:26 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-08 23:41:26 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-08 23:41:26 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-08 23:41:27 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.32秒 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-08 23:41:27 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-08 23:41:27 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.24秒 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-08 23:41:27 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-08 23:41:27 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:41:27 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-08 23:41:28 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:28 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-08 23:41:28 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-08 23:41:28 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:41:28 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.24秒 +2026-01-08 23:41:28 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.main - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-08 23:41:28 - gx_gp_monitor.main - INFO - 筛选出 1300 条新公告 +2026-01-08 23:41:28 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-08 23:41:28 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-08 23:41:28 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-08 23:41:28 - gx_gp_monitor.storage.md_generator - INFO - Markdown文件已保存到: onu.md (共 0 条公告) +2026-01-08 23:41:28 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': True, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1300, 'date_filtered': 0, 'duplicate_filtered': 1300, 'source_filtered': 0}} +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: today_stats, user: test_user +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求今日统计 +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_search, user: test_user +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 触发关键词搜索菜单 +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: latest_news, user: test_user +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求最新公告 +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: test_user +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求关键词管理 +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: system_status, user: test_user +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求系统状态 +2026-01-08 23:41:28 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-08 23:41:28 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: clear_cache, user: test_user +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求清理缓存 +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - WARNING - 数据库缓存清理失败: cannot import name 'clear_database_cache' from 'gx_gp_monitor.storage.postgresql' (/home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/storage/postgresql.py) +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: help_guide, user: test_user +2026-01-08 23:41:28 - gx_gp_monitor.wechat.message_handler - INFO - 用户 test_user 请求使用说明 +2026-01-08 23:52:07 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:52:07 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: n59OiXnRr3zM6BW5uVWSYT6UKG/jwApIhfJmwxnP9GpaH3WRsC... +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 887eba908c181e0228de54116517e004e6d673d3 +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 887eba908c181e0228de54116517e004e6d673d3 +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=today_stats, user=WeiJueSen +2026-01-08 23:52:13 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: today_stats, user: WeiJueSen +2026-01-08 23:52:13 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求今日统计 +2026-01-08 23:52:13 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === +2026-01-08 23:52:13 - gx_gp_monitor.main - INFO - 版本: 1.0.0 +2026-01-08 23:52:13 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 +2026-01-08 23:52:13 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-08 23:52:13 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-08 23:52:13 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-08 23:52:13 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-08 23:52:13 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-08 23:52:13 - gx_gp_monitor.main - INFO - 应用初始化完成 +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: byLoJ8C5/EIdNJGq7flLu3wK+9KeXhAbFlWGZ4SKbrq/jzVScQ... +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 0d4231a984a41081739519e49ef91e1a62af27c2 +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 0d4231a984a41081739519e49ef91e1a62af27c2 +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=WeiJueSen +2026-01-08 23:52:21 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: WeiJueSen +2026-01-08 23:52:21 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求关键词管理 +2026-01-09 00:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-09 00:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 00:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-09 00:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-09 00:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-09 00:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-09 00:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 00:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 00:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 00:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:07 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.47秒 +2026-01-09 00:02:07 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 00:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:07 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-09 00:02:07 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 00:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:07 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-09 00:02:07 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 00:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:07 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.28秒 +2026-01-09 00:02:07 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 00:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:08 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 00:02:08 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 00:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:08 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 00:02:08 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 00:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:08 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.33秒 +2026-01-09 00:02:08 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 00:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:08 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 00:02:08 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 00:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:09 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:02:09 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 00:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:09 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:02:09 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 00:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:09 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:02:09 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 00:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:09 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:02:09 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 00:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:02:09 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:02:09 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 00:02:09 - __main__ - INFO - 搜索到 1300 条原始公告 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-09 00:02:09 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-09 00:02:09 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-09 00:02:09 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-09 00:02:09 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-09 00:02:10 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-09 00:02:10 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 00:02:10 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-09 00:02:10 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-09 00:02:10 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: lD6k2bCX3whG0WVivcAAby7GwI0fzF4lElViOb36QW2etFd8aF... +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 8da1cb947170f3a975db580b0a1a03dc4fbc922a +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 8da1cb947170f3a975db580b0a1a03dc4fbc922a +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=大化..., user=WeiJueSen +2026-01-09 00:10:09 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 大化, user: WeiJueSen +2026-01-09 00:10:09 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 关键词搜索: ['大化'] +2026-01-09 00:10:09 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: True) +2026-01-09 00:10:09 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 00:10:09 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 00:10:09 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: lD6k2bCX3whG0WVivcAAby7GwI0fzF4lElViOb36QW2etFd8aF... +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 8da1cb947170f3a975db580b0a1a03dc4fbc922a +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 8da1cb947170f3a975db580b0a1a03dc4fbc922a +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=大化..., user=WeiJueSen +2026-01-09 00:10:14 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 大化, user: WeiJueSen +2026-01-09 00:10:14 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 关键词搜索: ['大化'] +2026-01-09 00:10:14 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: True) +2026-01-09 00:10:14 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 00:10:14 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.48秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: 2V3aU/4FO7zlAhJFhCe168paUJgMT77M+FAB4jNUk/NXWcWgDl... +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 971fef79a492b4102de1d93d6fc27160160dea60 +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 971fef79a492b4102de1d93d6fc27160160dea60 +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_search, user=WeiJueSen +2026-01-09 00:10:15 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_search, user: WeiJueSen +2026-01-09 00:10:15 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发关键词搜索菜单 +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.32秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 00:10:17 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 00:10:17 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 00:10:17 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-09 00:10:17 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 手动搜索模式:跳过数据库保存 +2026-01-09 00:10:17 - gx_gp_monitor.filters.filters - INFO - 日期筛选: 1300 -> 0 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 0 -> 0 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过筛选后公告的数据库保存 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': False, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 0, 'date_filtered': 1300, 'duplicate_filtered': 0, 'source_filtered': 0}, 'filtered_announcements': []} +2026-01-09 00:10:40 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.51秒 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 00:10:40 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 00:10:40 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.27秒 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 00:10:40 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 00:10:41 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 00:10:41 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 00:10:41 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.36秒 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 00:10:41 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 手动搜索模式:跳过数据库保存 +2026-01-09 00:10:42 - gx_gp_monitor.filters.filters - INFO - 日期筛选: 1300 -> 1 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 1 -> 0 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 0 -> 0 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过筛选后公告的数据库保存 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': False, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1, 'date_filtered': 1299, 'duplicate_filtered': 0, 'source_filtered': 0}, 'filtered_announcements': []} +2026-01-09 01:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-09 01:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 01:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-09 01:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-09 01:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-09 01:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-09 01:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 01:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 01:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 01:02:06 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:06 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.44秒 +2026-01-09 01:02:06 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 01:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 01:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 01:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 01:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 01:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 01:02:07 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 01:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.33秒 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 01:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 01:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 01:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 01:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 01:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 01:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:09 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 01:02:09 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 01:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 01:02:09 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 01:02:09 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 01:02:09 - __main__ - INFO - 搜索到 1300 条原始公告 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-09 01:02:09 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-09 01:02:09 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-09 01:02:09 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-09 01:02:09 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 01:02:09 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-09 01:02:09 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-09 01:02:09 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-09 02:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-09 02:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 02:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-09 02:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-09 02:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-09 02:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-09 02:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 02:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 02:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 02:02:36 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:36 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.49秒 +2026-01-09 02:02:36 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 02:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 02:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 02:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 02:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 02:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 02:02:37 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 02:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.33秒 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 02:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 02:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 02:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 02:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.15秒 +2026-01-09 02:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 02:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:39 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 02:02:39 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 02:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 02:02:39 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 02:02:39 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 02:02:39 - __main__ - INFO - 搜索到 1300 条原始公告 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-09 02:02:39 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-09 02:02:39 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-09 02:02:39 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-09 02:02:39 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 02:02:39 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-09 02:02:39 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-09 02:02:39 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-09 03:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-09 03:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 03:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-09 03:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-09 03:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-09 03:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-09 03:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 03:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 03:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 03:02:36 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:36 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.52秒 +2026-01-09 03:02:36 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 03:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 03:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 03:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 03:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 03:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 03:02:37 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 03:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:38 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.36秒 +2026-01-09 03:02:38 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 03:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:38 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 03:02:38 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 03:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:38 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.24秒 +2026-01-09 03:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 03:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:38 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 03:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 03:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:39 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 03:02:39 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 03:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:39 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 03:02:39 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 03:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 03:02:39 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-09 03:02:39 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 03:02:39 - __main__ - INFO - 搜索到 1300 条原始公告 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-09 03:02:39 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-09 03:02:39 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-09 03:02:39 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-09 03:02:39 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 03:02:39 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-09 03:02:39 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-09 03:02:39 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-09 04:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-09 04:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 04:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-09 04:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-09 04:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-09 04:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-09 04:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 04:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 04:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 04:02:06 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:06 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.47秒 +2026-01-09 04:02:06 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 04:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 04:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 04:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 04:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 04:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.14秒 +2026-01-09 04:02:07 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 04:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.40秒 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 04:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 04:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 04:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 04:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.15秒 +2026-01-09 04:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 04:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:09 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-09 04:02:09 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 04:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 04:02:09 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 04:02:09 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 04:02:09 - __main__ - INFO - 搜索到 1300 条原始公告 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-09 04:02:09 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-09 04:02:09 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-09 04:02:09 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-09 04:02:09 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 04:02:09 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-09 04:02:09 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-09 04:02:09 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-09 05:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-09 05:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 05:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-09 05:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-09 05:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-09 05:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-09 05:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 05:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 05:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 05:02:36 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:36 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.54秒 +2026-01-09 05:02:36 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 05:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 05:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 05:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 05:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 05:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 05:02:37 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 05:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:38 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.32秒 +2026-01-09 05:02:38 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 05:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:38 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 05:02:38 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 05:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:38 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.24秒 +2026-01-09 05:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 05:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:38 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 05:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 05:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:39 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 05:02:39 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 05:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:39 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 05:02:39 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 05:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 05:02:39 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 05:02:39 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 05:02:39 - __main__ - INFO - 搜索到 1300 条原始公告 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-09 05:02:39 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-09 05:02:39 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-09 05:02:39 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-09 05:02:39 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 05:02:39 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-09 05:02:39 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-09 05:02:39 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-09 06:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-09 06:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 06:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-09 06:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-09 06:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-09 06:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-09 06:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 06:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 06:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 06:02:06 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:06 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.49秒 +2026-01-09 06:02:06 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 06:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 06:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 06:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 06:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 06:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.15秒 +2026-01-09 06:02:07 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 06:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:08 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.39秒 +2026-01-09 06:02:08 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 06:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:08 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 06:02:08 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 06:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:08 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 06:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 06:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:08 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-09 06:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 06:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:09 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 06:02:09 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 06:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:09 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 06:02:09 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 06:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 06:02:09 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 06:02:09 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 06:02:09 - __main__ - INFO - 搜索到 1300 条原始公告 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-09 06:02:09 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-09 06:02:09 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-09 06:02:09 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-09 06:02:09 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 06:02:09 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-09 06:02:09 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-09 06:02:09 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-09 07:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-09 07:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 07:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-09 07:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-09 07:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-09 07:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-09 07:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 07:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 07:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 07:02:36 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:36 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.51秒 +2026-01-09 07:02:36 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 07:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 07:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 07:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 07:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 07:02:37 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.15秒 +2026-01-09 07:02:37 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 07:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.35秒 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 07:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 07:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 07:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 07:02:38 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 07:02:38 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 07:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:39 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 07:02:39 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 07:02:39 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 07:02:39 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 07:02:39 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 07:02:39 - __main__ - INFO - 搜索到 1300 条原始公告 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-09 07:02:39 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-09 07:02:39 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-09 07:02:39 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-09 07:02:39 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 07:02:39 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-09 07:02:39 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-09 07:02:39 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-09 08:02:06 - __main__ - INFO - === 开始定时搜索任务 === +2026-01-09 08:02:06 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 08:02:06 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-09 08:02:06 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-09 08:02:06 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-09 08:02:06 - __main__ - INFO - 开始执行搜索... +2026-01-09 08:02:06 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 08:02:06 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 08:02:06 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 08:02:06 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:06 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.54秒 +2026-01-09 08:02:06 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 08:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 08:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 08:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 08:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 08:02:07 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 08:02:07 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 08:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:08 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.33秒 +2026-01-09 08:02:08 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 08:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:08 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 08:02:08 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 08:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:08 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.16秒 +2026-01-09 08:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 08:02:08 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:08 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-09 08:02:08 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 08:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:09 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 08:02:09 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 08:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:09 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-09 08:02:09 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 08:02:09 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 08:02:09 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.24秒 +2026-01-09 08:02:09 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 08:02:09 - __main__ - INFO - 搜索到 1300 条原始公告 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-09 08:02:09 - __main__ - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-09 08:02:09 - __main__ - INFO - 筛选出 1300 条新公告 +2026-01-09 08:02:09 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-09 08:02:09 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 08:02:09 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-09 08:02:09 - __main__ - INFO - 关键词筛选后剩余 0 条公告 +2026-01-09 08:02:09 - __main__ - INFO - 没有匹配关键词的公告,任务完成 +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: tc4EfnaoWAMd6veuWP3h1KALIuMqFaseXjRRVx9vm8aHsfZaFX... +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 6367d32d17c91baf7f4e084d457653862e380d20 +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 6367d32d17c91baf7f4e084d457653862e380d20 +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=announcements_by_type, user=WeiJueSen +2026-01-09 08:09:44 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: announcements_by_type, user: WeiJueSen +2026-01-09 08:09:44 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求按类型查看公告 +2026-01-09 08:09:44 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: KNXRojaaOOvMXAn/bS/jCuXblPiK3JZlgYTa3ZkP/NIaRLHdgd... +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: f3151e52daaf7cd68feebc40d4c3be095a479eeb +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: f3151e52daaf7cd68feebc40d4c3be095a479eeb +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=today_count, user=WeiJueSen +2026-01-09 08:09:54 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: today_count, user: WeiJueSen +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: WQBIDFITyc25ID3VlassbD4P/na15LN12tS+UlIJNMoPt5OIWl... +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: c70c8e0f75d9e1e8673a812ba65eecc0fffefac0 +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: c70c8e0f75d9e1e8673a812ba65eecc0fffefac0 +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=system_status, user=WeiJueSen +2026-01-09 08:10:03 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: system_status, user: WeiJueSen +2026-01-09 08:10:03 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求系统状态 +2026-01-09 08:10:03 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-09 08:10:03 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 diff --git a/logs/uwsgi-wechat.log b/logs/uwsgi-wechat.log index a2c5bfc..1a276e6 100644 --- a/logs/uwsgi-wechat.log +++ b/logs/uwsgi-wechat.log @@ -1,119 +1,1234 @@ -Thu Jan 8 21:50:36 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 21:50:36 2026] *** -Thu Jan 8 21:50:36 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 -Thu Jan 8 21:50:36 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 -Thu Jan 8 21:50:36 2026 - nodename: ubserver -Thu Jan 8 21:50:36 2026 - machine: x86_64 -Thu Jan 8 21:50:36 2026 - clock source: unix -Thu Jan 8 21:50:36 2026 - pcre jit disabled -Thu Jan 8 21:50:36 2026 - detected number of CPU cores: 12 -Thu Jan 8 21:50:36 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify -Thu Jan 8 21:50:36 2026 - writing pidfile to ./uwsgi-wechat.pid -Thu Jan 8 21:50:36 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi -Thu Jan 8 21:50:36 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options -Thu Jan 8 21:50:36 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -Thu Jan 8 21:50:36 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify -Thu Jan 8 21:50:36 2026 - your processes number limit is 61306 -Thu Jan 8 21:50:36 2026 - your memory page size is 4096 bytes -Thu Jan 8 21:50:36 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** -Thu Jan 8 21:50:36 2026 - detected max file descriptor number: 1073741816 -Thu Jan 8 21:50:36 2026 - lock engine: pthread robust mutexes -Thu Jan 8 21:50:36 2026 - thunder lock: disabled (you can enable it with --thunder-lock) -Thu Jan 8 21:50:36 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 4 -Thu Jan 8 21:50:36 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:40181 (port auto-assigned) fd 3 -Thu Jan 8 21:50:36 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options -Thu Jan 8 21:50:36 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -Thu Jan 8 21:50:36 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] -Thu Jan 8 21:50:36 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv -Thu Jan 8 21:50:36 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv -Thu Jan 8 21:50:36 2026 - Python main interpreter initialized at 0x7eb9b7352d10 -Thu Jan 8 21:50:36 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options -Thu Jan 8 21:50:36 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -Thu Jan 8 21:50:36 2026 - python threads support enabled -Thu Jan 8 21:50:36 2026 - your server socket listen backlog is limited to 100 connections -Thu Jan 8 21:50:36 2026 - your mercy for graceful operations on workers is 60 seconds -Thu Jan 8 21:50:36 2026 - mapped 250032 bytes (244 KB) for 4 cores -Thu Jan 8 21:50:36 2026 - *** Operational MODE: preforking+threaded *** -2026-01-08 21:50:36 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 -2026-01-08 21:50:36 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 -Thu Jan 8 21:50:36 2026 - WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7eb9b7352d10 pid: 1560152 (default app) -Thu Jan 8 21:50:36 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options -Thu Jan 8 21:50:36 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -Thu Jan 8 21:50:36 2026 - *** uWSGI is running in multiple interpreter mode *** -Thu Jan 8 21:50:36 2026 - spawned uWSGI master process (pid: 1560152) -Thu Jan 8 21:50:36 2026 - spawned uWSGI worker 1 (pid: 1560188, cores: 2) -Thu Jan 8 21:50:36 2026 - spawned uWSGI worker 2 (pid: 1560190, cores: 2) -Thu Jan 8 21:50:36 2026 - Python auto-reloader enabled -Thu Jan 8 21:50:36 2026 - spawned uWSGI http 1 (pid: 1560194) -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: jiJ2j73W7wKovmd8M9YmBGuai+FUfQCGkPH1KYPM4mCA1q/3jr... -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: a62b23e0fce089e9ee78072a8467642588448e65 -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: a62b23e0fce089e9ee78072a8467642588448e65 -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text -2026-01-08 21:51:00 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=爬取 大化..., user=WeiJueSen -2026-01-08 21:51:00 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 爬取 大化, user: WeiJueSen -2026-01-08 21:51:00 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 手动爬取关键词: ['大化'] -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - 版本: 1.0.0 -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 -2026-01-08 21:51:00 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 -2026-01-08 21:51:00 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 -2026-01-08 21:51:00 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 -2026-01-08 21:51:00 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 -2026-01-08 21:51:00 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - 应用初始化完成 -2026-01-08 21:51:00 - gx_gp_monitor.main - INFO - 开始执行爬取任务 (手动爬取: True) -2026-01-08 21:51:00 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 -2026-01-08 21:51:00 - gx_gp_monitor - INFO - 开始爬取 采购公告 -2026-01-08 21:51:00 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:00 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.49秒 -2026-01-08 21:51:00 - gx_gp_monitor - INFO - 开始爬取 结果公告 -2026-01-08 21:51:01 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 开始爬取 合同公告 -2026-01-08 21:51:01 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.26秒 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 开始爬取 更正公告 -2026-01-08 21:51:01 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 -2026-01-08 21:51:01 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.26秒 -2026-01-08 21:51:01 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 -2026-01-08 21:51:02 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.20秒 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 -2026-01-08 21:51:02 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.39秒 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 -2026-01-08 21:51:02 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 开始爬取 工程类公告 -2026-01-08 21:51:02 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:02 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.25秒 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.20秒 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.19秒 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 -2026-01-08 21:51:03 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.23秒 -2026-01-08 21:51:03 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 爬取到 1300 条原始公告 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过数据库保存 -2026-01-08 21:51:03 - gx_gp_monitor.filters.filters - INFO - 日期筛选: 1300 -> 537 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 537 -> 2 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 2 -> 2 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 筛选后剩余 2 条公告 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过筛选后公告的数据库保存 -2026-01-08 21:51:03 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 2, 'saved': 0, 'markdown_generated': False, 'notification_sent': True, 'filter_stats': {'keyword_filtered': 535, 'date_filtered': 763, 'duplicate_filtered': 0, 'source_filtered': 0}, 'filtered_announcements': [Announcement(id=None, title='广西壮族自治区大化公路养护中心2026年3月至4月政府采购意向', publish_date=datetime.datetime(2026, 1, 8, 16, 55, 31), purchase_name='广西壮族自治区大化公路养护中心', content_url='https://zfcg.gxzf.gov.cn/site/detail?parentId=66485&articleId=aMzhKRWZyOvYpGoEA4k/8g==', source_code='61-266648', source_name='采购意向公开', announcement_type=, crawled_at=datetime.datetime(2026, 1, 8, 21, 51, 3, 530262), created_at=None, updated_at=None, content_hash='1895a00610c2dc0dfbcdb724260f4597', keyword_matched=True, date_filtered=True, is_new=True, is_today=True), Announcement(id=None, title='中国共产党大化瑶族自治县委员会组织部2026年2月至3月政府采购意向', publish_date=datetime.datetime(2026, 1, 8, 11, 41, 6), purchase_name='中国共产党大化瑶族自治县委员会组织部', content_url='https://zfcg.gxzf.gov.cn/site/detail?parentId=66485&articleId=Qgm7DlkoLsuw6Asij2HL8w==', source_code='61-266648', source_name='采购意向公开', announcement_type=, crawled_at=datetime.datetime(2026, 1, 8, 21, 51, 3, 530262), created_at=None, updated_at=None, content_hash='4a57bc4330c2885de63b8d96b8f686bb', keyword_matched=True, date_filtered=True, is_new=True, is_today=True)]} -2026-01-08 21:51:03 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 -2026-01-08 21:51:04 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 -2026-01-08 21:51:04 - gx_gp_monitor.notification.wechat - INFO - Markdown消息发送成功 -{address space usage: 241336320 bytes/230MB} {rss usage: 53772288 bytes/51MB} [pid: 1560190|app: 0|req: 1/1] 14.116.241.251 () {36 vars in 679 bytes} [Thu Jan 8 21:51:00 2026] POST /api/v1/wechat/callback?msg_signature=a62b23e0fce089e9ee78072a8467642588448e65×tamp=1767880260&nonce=1767803646 => generated 582 bytes in 4177 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 0) +Thu Jan 8 23:24:19 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:24:19 2026] *** +Thu Jan 8 23:24:19 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:24:19 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:24:19 2026 - nodename: ubserver +Thu Jan 8 23:24:19 2026 - machine: x86_64 +Thu Jan 8 23:24:19 2026 - clock source: unix +Thu Jan 8 23:24:19 2026 - pcre jit disabled +Thu Jan 8 23:24:19 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:24:19 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:24:19 2026 - writing pidfile to ./uwsgi-wechat.pid +Thu Jan 8 23:24:19 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:24:19 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:24:19 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:24:19 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:24:19 2026 - your processes number limit is 61306 +Thu Jan 8 23:24:19 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:24:19 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:24:19 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:24:19 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:24:19 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:24:19 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 4 +Thu Jan 8 23:24:19 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:42415 (port auto-assigned) fd 3 +Thu Jan 8 23:24:19 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:24:19 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:24:19 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:24:19 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:24:19 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:24:19 2026 - Python main interpreter initialized at 0x70efb4752d10 +Thu Jan 8 23:24:19 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:24:19 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:24:19 2026 - python threads support enabled +Thu Jan 8 23:24:19 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:24:19 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:24:19 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:24:19 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:24:20 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:24:20 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:24:20 2026 - WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x70efb4752d10 pid: 1602880 (default app) +Thu Jan 8 23:24:20 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:24:20 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:24:20 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:24:20 2026 - spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:24:20 2026 - spawned uWSGI worker 1 (pid: 1602899, cores: 2) +Thu Jan 8 23:24:20 2026 - spawned uWSGI worker 2 (pid: 1602900, cores: 2) +Thu Jan 8 23:24:20 2026 - spawned uWSGI http 1 (pid: 1602903) +Thu Jan 8 23:24:20 2026 - Python auto-reloader enabled +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: 29e+mJkgneFeo1ny28a6GEST9jWQZ520LjorzV4NOfgoH5QA/W... +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 79b6eafce857f4ef43b5e61edc1fe207cda31b3f +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 79b6eafce857f4ef43b5e61edc1fe207cda31b3f +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:24:40 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=WeiJueSen +2026-01-08 23:24:40 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: WeiJueSen +2026-01-08 23:24:40 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发立即搜索 +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - 版本: 1.0.0 +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 +2026-01-08 23:24:40 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-08 23:24:40 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-08 23:24:40 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-08 23:24:40 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-08 23:24:40 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - 应用初始化完成 +2026-01-08 23:24:40 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False) +2026-01-08 23:24:40 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-08 23:24:40 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: 29e+mJkgneFeo1ny28a6GEST9jWQZ520LjorzV4NOfgoH5QA/W... +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 79b6eafce857f4ef43b5e61edc1fe207cda31b3f +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 79b6eafce857f4ef43b5e61edc1fe207cda31b3f +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:24:45 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=WeiJueSen +2026-01-08 23:24:45 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: WeiJueSen +2026-01-08 23:24:45 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发立即搜索 +2026-01-08 23:24:45 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False) +2026-01-08 23:24:45 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-08 23:24:45 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-08 23:24:45 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:45 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.43秒 +2026-01-08 23:24:45 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-08 23:24:46 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-08 23:24:46 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-08 23:24:46 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-08 23:24:46 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-08 23:24:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.61秒 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-08 23:24:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-08 23:24:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.43秒 +2026-01-08 23:24:47 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-08 23:24:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.30秒 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-08 23:24:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-08 23:24:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-08 23:24:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:24:48 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-08 23:24:49 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:49 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-08 23:24:49 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-08 23:24:49 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:24:49 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 23:24:49 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 筛选出 1300 条新公告 +2026-01-08 23:24:49 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-08 23:24:49 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-08 23:24:49 - gx_gp_monitor.storage.md_generator - INFO - Markdown文件已保存到: onu.md (共 0 条公告) +2026-01-08 23:24:49 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': True, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1300, 'date_filtered': 0, 'duplicate_filtered': 1300, 'source_filtered': 0}} +{address space usage: 249786368 bytes/238MB} {rss usage: 67588096 bytes/64MB} [pid: 1602900|app: 0|req: 2/1] 106.55.202.215 () {36 vars in 679 bytes} [Thu Jan 8 23:24:45 2026] POST /api/v1/wechat/callback?msg_signature=79b6eafce857f4ef43b5e61edc1fe207cda31b3f×tamp=1767885880&nonce=1767448160 => generated 798 bytes in 4081 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 1) +2026-01-08 23:25:11 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.49秒 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-08 23:25:11 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-08 23:25:11 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-08 23:25:11 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:25:11 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-08 23:25:12 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.27秒 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-08 23:25:12 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.24秒 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-08 23:25:12 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.36秒 +2026-01-08 23:25:12 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.15秒 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-08 23:25:13 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-08 23:25:13 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-08 23:25:13 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告 +2026-01-08 23:25:13 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条 +2026-01-08 23:25:13 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:13 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告 +2026-01-08 23:25:13 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:13 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.main - INFO - 保存所有公告完成:共保存 0 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0} +2026-01-08 23:25:14 - gx_gp_monitor.main - INFO - 筛选出 1300 条新公告 +2026-01-08 23:25:14 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告 +2026-01-08 23:25:14 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0) +2026-01-08 23:25:14 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-08 23:25:14 - gx_gp_monitor.storage.md_generator - INFO - Markdown文件已保存到: onu.md (共 0 条公告) +2026-01-08 23:25:14 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': True, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1300, 'date_filtered': 0, 'duplicate_filtered': 1300, 'source_filtered': 0}} +{address space usage: 244609024 bytes/233MB} {rss usage: 62353408 bytes/59MB} [pid: 1602900|app: 0|req: 2/2] 183.47.98.168 () {36 vars in 678 bytes} [Thu Jan 8 23:24:40 2026] POST /api/v1/wechat/callback?msg_signature=79b6eafce857f4ef43b5e61edc1fe207cda31b3f×tamp=1767885880&nonce=1767448160 => generated 798 bytes in 33820 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 0) +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: WrH7Jb1CJaRbTgRYnX0MmwszM4U7Ik/1SAqCWS1iq2QU8KyMML... +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 1bee1bed89a994b34b8572f926d6e545f045604e +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 1bee1bed89a994b34b8572f926d6e545f045604e +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:26:07 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=WeiJueSen +2026-01-08 23:26:07 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: WeiJueSen +2026-01-08 23:26:07 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求关键词管理 +{address space usage: 234106880 bytes/223MB} {rss usage: 39456768 bytes/37MB} [pid: 1602899|app: 0|req: 1/3] 183.47.117.101 () {36 vars in 679 bytes} [Thu Jan 8 23:26:07 2026] POST /api/v1/wechat/callback?msg_signature=1bee1bed89a994b34b8572f926d6e545f045604e×tamp=1767885967&nonce=1767297702 => generated 1522 bytes in 6 msecs (HTTP/1.1 200) 2 headers in 81 bytes (1 switches on core 0) +Thu Jan 8 23:26:49 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/menu_manager.py has been modified +Thu Jan 8 23:26:49 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/menu_manager.py has been modified +Thu Jan 8 23:26:49 2026 - gateway "uWSGI http 1" has been buried (pid: 1602903) +Thu Jan 8 23:26:49 2026 - ...gracefully killing workers... +Thu Jan 8 23:26:49 2026 - Gracefully killing worker 2 (pid: 1602900)... +Thu Jan 8 23:26:49 2026 - Gracefully killing worker 1 (pid: 1602899)... +Thu Jan 8 23:26:50 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:26:50 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:26:50 2026 - binary reloading uWSGI... +Thu Jan 8 23:26:50 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:26:50 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:26:50 2026 - found fd 3 mapped to socket 0 (127.0.0.1:42415) +Thu Jan 8 23:26:50 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:26:50 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:26:50 2026] *** +Thu Jan 8 23:26:50 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:26:50 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:26:50 2026 - nodename: ubserver +Thu Jan 8 23:26:50 2026 - machine: x86_64 +Thu Jan 8 23:26:50 2026 - clock source: unix +Thu Jan 8 23:26:50 2026 - pcre jit disabled +Thu Jan 8 23:26:50 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:26:50 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:26:50 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:26:50 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:26:50 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:26:50 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:26:50 2026 - your processes number limit is 61306 +Thu Jan 8 23:26:50 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:26:50 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:26:50 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:26:50 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:26:50 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:26:50 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:26:50 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:37889 (port auto-assigned) fd 4 +Thu Jan 8 23:26:50 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:26:50 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:26:50 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:26:50 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:26:50 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:26:50 2026 - Python main interpreter initialized at 0x75999d552d10 +Thu Jan 8 23:26:50 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:26:50 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:26:50 2026 - python threads support enabled +Thu Jan 8 23:26:50 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:26:50 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:26:50 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:26:50 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:26:50 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:26:50 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:26:50 2026 - WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x75999d552d10 pid: 1602880 (default app) +Thu Jan 8 23:26:50 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:26:50 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:26:50 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:26:50 2026 - gracefully (RE)spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:26:50 2026 - spawned uWSGI worker 1 (pid: 1604595, cores: 2) +Thu Jan 8 23:26:50 2026 - spawned uWSGI worker 2 (pid: 1604596, cores: 2) +Thu Jan 8 23:26:50 2026 - spawned uWSGI http 1 (pid: 1604600) +Thu Jan 8 23:26:50 2026 - Python auto-reloader enabled +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: yWYKLWjpp1gWQZ4OUse8zPR3YaOQZ9wYUHaz8WIETXh3J9S9F/... +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: bb97c3ed9044e8f2966690372c8e2283c9597d82 +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: bb97c3ed9044e8f2966690372c8e2283c9597d82 +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:27:36 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=about_system, user=WeiJueSen +2026-01-08 23:27:36 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: about_system, user: WeiJueSen +2026-01-08 23:27:36 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求系统信息 +{address space usage: 234065920 bytes/223MB} {rss usage: 39223296 bytes/37MB} [pid: 1604596|app: 0|req: 1/1] 14.116.241.251 () {36 vars in 679 bytes} [Thu Jan 8 23:27:36 2026] POST /api/v1/wechat/callback?msg_signature=bb97c3ed9044e8f2966690372c8e2283c9597d82×tamp=1767886056&nonce=1767320388 => generated 2718 bytes in 10 msecs (HTTP/1.1 200) 2 headers in 81 bytes (1 switches on core 0) +Thu Jan 8 23:29:38 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:29:38 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:29:38 2026 - gateway "uWSGI http 1" has been buried (pid: 1604600) +Thu Jan 8 23:29:38 2026 - ...gracefully killing workers... +Thu Jan 8 23:29:38 2026 - Gracefully killing worker 1 (pid: 1604595)... +Thu Jan 8 23:29:38 2026 - Gracefully killing worker 2 (pid: 1604596)... +Thu Jan 8 23:29:39 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:29:39 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:29:39 2026 - binary reloading uWSGI... +Thu Jan 8 23:29:39 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:29:39 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:29:39 2026 - found fd 4 mapped to socket 0 (127.0.0.1:37889) +Thu Jan 8 23:29:39 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:29:39 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:29:39 2026] *** +Thu Jan 8 23:29:39 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:29:39 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:29:39 2026 - nodename: ubserver +Thu Jan 8 23:29:39 2026 - machine: x86_64 +Thu Jan 8 23:29:39 2026 - clock source: unix +Thu Jan 8 23:29:39 2026 - pcre jit disabled +Thu Jan 8 23:29:39 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:29:39 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:29:39 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:29:39 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:39 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:39 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:29:39 2026 - your processes number limit is 61306 +Thu Jan 8 23:29:39 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:29:39 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:29:39 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:29:39 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:29:39 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:29:39 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:29:39 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:39959 (port auto-assigned) fd 3 +Thu Jan 8 23:29:39 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:39 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:39 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:29:39 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:29:39 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:29:39 2026 - Python main interpreter initialized at 0x776a98952d10 +Thu Jan 8 23:29:39 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:39 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:39 2026 - python threads support enabled +Thu Jan 8 23:29:39 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:29:39 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:29:39 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:29:39 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:29:39 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:29:39 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:29:39 2026 - WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x776a98952d10 pid: 1602880 (default app) +Thu Jan 8 23:29:39 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:39 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:39 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:29:39 2026 - gracefully (RE)spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:29:39 2026 - spawned uWSGI worker 1 (pid: 1605499, cores: 2) +Thu Jan 8 23:29:39 2026 - spawned uWSGI worker 2 (pid: 1605500, cores: 2) +Thu Jan 8 23:29:39 2026 - spawned uWSGI http 1 (pid: 1605504) +Thu Jan 8 23:29:39 2026 - Python auto-reloader enabled +Thu Jan 8 23:29:44 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/menu_manager.py has been modified +Thu Jan 8 23:29:44 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/menu_manager.py has been modified +Thu Jan 8 23:29:44 2026 - gateway "uWSGI http 1" has been buried (pid: 1605504) +Thu Jan 8 23:29:44 2026 - ...gracefully killing workers... +Thu Jan 8 23:29:44 2026 - Gracefully killing worker 2 (pid: 1605500)... +Thu Jan 8 23:29:44 2026 - Gracefully killing worker 1 (pid: 1605499)... +Thu Jan 8 23:29:45 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:29:45 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:29:45 2026 - binary reloading uWSGI... +Thu Jan 8 23:29:45 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:29:45 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:29:45 2026 - found fd 3 mapped to socket 0 (127.0.0.1:39959) +Thu Jan 8 23:29:45 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:29:45 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:29:45 2026] *** +Thu Jan 8 23:29:45 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:29:45 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:29:45 2026 - nodename: ubserver +Thu Jan 8 23:29:45 2026 - machine: x86_64 +Thu Jan 8 23:29:45 2026 - clock source: unix +Thu Jan 8 23:29:45 2026 - pcre jit disabled +Thu Jan 8 23:29:45 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:29:45 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:29:45 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:29:45 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:45 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:45 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:29:45 2026 - your processes number limit is 61306 +Thu Jan 8 23:29:45 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:29:45 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:29:45 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:29:45 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:29:45 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:29:45 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:29:45 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:44777 (port auto-assigned) fd 4 +Thu Jan 8 23:29:45 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:45 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:45 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:29:45 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:29:45 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:29:45 2026 - Python main interpreter initialized at 0x7c1a39352d10 +Thu Jan 8 23:29:45 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:45 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:45 2026 - python threads support enabled +Thu Jan 8 23:29:45 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:29:45 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:29:45 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:29:45 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:29:46 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:29:46 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:29:46 2026 - WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7c1a39352d10 pid: 1602880 (default app) +Thu Jan 8 23:29:46 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:46 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:46 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:29:46 2026 - gracefully (RE)spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:29:46 2026 - spawned uWSGI worker 1 (pid: 1605532, cores: 2) +Thu Jan 8 23:29:46 2026 - spawned uWSGI worker 2 (pid: 1605534, cores: 2) +Thu Jan 8 23:29:46 2026 - Python auto-reloader enabled +Thu Jan 8 23:29:46 2026 - spawned uWSGI http 1 (pid: 1605536) +Thu Jan 8 23:29:58 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:29:58 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:29:58 2026 - gateway "uWSGI http 1" has been buried (pid: 1605536) +Thu Jan 8 23:29:58 2026 - ...gracefully killing workers... +Thu Jan 8 23:29:58 2026 - Gracefully killing worker 1 (pid: 1605532)... +Thu Jan 8 23:29:58 2026 - Gracefully killing worker 2 (pid: 1605534)... +Thu Jan 8 23:29:59 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:29:59 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:29:59 2026 - binary reloading uWSGI... +Thu Jan 8 23:29:59 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:29:59 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:29:59 2026 - found fd 4 mapped to socket 0 (127.0.0.1:44777) +Thu Jan 8 23:29:59 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:29:59 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:29:59 2026] *** +Thu Jan 8 23:29:59 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:29:59 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:29:59 2026 - nodename: ubserver +Thu Jan 8 23:29:59 2026 - machine: x86_64 +Thu Jan 8 23:29:59 2026 - clock source: unix +Thu Jan 8 23:29:59 2026 - pcre jit disabled +Thu Jan 8 23:29:59 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:29:59 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:29:59 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:29:59 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:59 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:59 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:29:59 2026 - your processes number limit is 61306 +Thu Jan 8 23:29:59 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:29:59 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:29:59 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:29:59 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:29:59 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:29:59 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:29:59 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:39661 (port auto-assigned) fd 3 +Thu Jan 8 23:29:59 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:59 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:59 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:29:59 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:29:59 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:29:59 2026 - Python main interpreter initialized at 0x7253cdf52d10 +Thu Jan 8 23:29:59 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:59 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:59 2026 - python threads support enabled +Thu Jan 8 23:29:59 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:29:59 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:29:59 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:29:59 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:29:59 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:29:59 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:29:59 2026 - WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7253cdf52d10 pid: 1602880 (default app) +Thu Jan 8 23:29:59 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:29:59 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:29:59 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:29:59 2026 - gracefully (RE)spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:29:59 2026 - spawned uWSGI worker 1 (pid: 1605566, cores: 2) +Thu Jan 8 23:29:59 2026 - spawned uWSGI worker 2 (pid: 1605567, cores: 2) +Thu Jan 8 23:29:59 2026 - spawned uWSGI http 1 (pid: 1605570) +Thu Jan 8 23:29:59 2026 - Python auto-reloader enabled +Thu Jan 8 23:30:11 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:30:11 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:30:11 2026 - gateway "uWSGI http 1" has been buried (pid: 1605570) +Thu Jan 8 23:30:11 2026 - ...gracefully killing workers... +Thu Jan 8 23:30:11 2026 - Gracefully killing worker 1 (pid: 1605566)... +Thu Jan 8 23:30:11 2026 - Gracefully killing worker 2 (pid: 1605567)... +Thu Jan 8 23:30:12 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:30:12 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:30:12 2026 - binary reloading uWSGI... +Thu Jan 8 23:30:12 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:30:12 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:30:12 2026 - found fd 3 mapped to socket 0 (127.0.0.1:39661) +Thu Jan 8 23:30:12 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:30:12 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:30:12 2026] *** +Thu Jan 8 23:30:12 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:30:12 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:30:12 2026 - nodename: ubserver +Thu Jan 8 23:30:12 2026 - machine: x86_64 +Thu Jan 8 23:30:12 2026 - clock source: unix +Thu Jan 8 23:30:12 2026 - pcre jit disabled +Thu Jan 8 23:30:12 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:30:12 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:30:12 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:30:12 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:30:12 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:30:12 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:30:12 2026 - your processes number limit is 61306 +Thu Jan 8 23:30:12 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:30:12 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:30:12 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:30:12 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:30:12 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:30:12 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:30:12 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:45953 (port auto-assigned) fd 4 +Thu Jan 8 23:30:12 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:30:12 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:30:12 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:30:12 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:30:12 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:30:12 2026 - Python main interpreter initialized at 0x7a48fed52d10 +Thu Jan 8 23:30:12 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:30:12 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:30:12 2026 - python threads support enabled +Thu Jan 8 23:30:12 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:30:12 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:30:12 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:30:12 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:30:12 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:30:12 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:30:12 2026 - WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7a48fed52d10 pid: 1602880 (default app) +Thu Jan 8 23:30:12 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:30:12 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:30:12 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:30:12 2026 - gracefully (RE)spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:30:12 2026 - spawned uWSGI worker 1 (pid: 1605779, cores: 2) +Thu Jan 8 23:30:12 2026 - spawned uWSGI worker 2 (pid: 1605780, cores: 2) +Thu Jan 8 23:30:12 2026 - spawned uWSGI http 1 (pid: 1605783) +Thu Jan 8 23:30:12 2026 - Python auto-reloader enabled +Thu Jan 8 23:30:52 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:30:52 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:30:52 2026 - gateway "uWSGI http 1" has been buried (pid: 1605783) +Thu Jan 8 23:30:52 2026 - ...gracefully killing workers... +Thu Jan 8 23:30:52 2026 - Gracefully killing worker 1 (pid: 1605779)... +Thu Jan 8 23:30:52 2026 - Gracefully killing worker 2 (pid: 1605780)... +Thu Jan 8 23:30:53 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:30:53 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:30:53 2026 - binary reloading uWSGI... +Thu Jan 8 23:30:53 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:30:53 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:30:53 2026 - found fd 4 mapped to socket 0 (127.0.0.1:45953) +Thu Jan 8 23:30:53 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:30:53 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:30:53 2026] *** +Thu Jan 8 23:30:53 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:30:53 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:30:53 2026 - nodename: ubserver +Thu Jan 8 23:30:53 2026 - machine: x86_64 +Thu Jan 8 23:30:53 2026 - clock source: unix +Thu Jan 8 23:30:53 2026 - pcre jit disabled +Thu Jan 8 23:30:53 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:30:53 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:30:53 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:30:53 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:30:53 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:30:53 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:30:53 2026 - your processes number limit is 61306 +Thu Jan 8 23:30:53 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:30:53 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:30:53 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:30:53 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:30:53 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:30:53 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:30:53 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:46579 (port auto-assigned) fd 3 +Thu Jan 8 23:30:53 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:30:53 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:30:53 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:30:53 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:30:53 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:30:53 2026 - Python main interpreter initialized at 0x78e340352d10 +Thu Jan 8 23:30:53 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:30:53 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:30:53 2026 - python threads support enabled +Thu Jan 8 23:30:53 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:30:53 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:30:53 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:30:53 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:30:53 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:30:53 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:30:53 2026 - WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x78e340352d10 pid: 1602880 (default app) +Thu Jan 8 23:30:53 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:30:53 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:30:53 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:30:53 2026 - gracefully (RE)spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:30:53 2026 - spawned uWSGI worker 1 (pid: 1606003, cores: 2) +Thu Jan 8 23:30:53 2026 - spawned uWSGI worker 2 (pid: 1606006, cores: 2) +Thu Jan 8 23:30:53 2026 - Python auto-reloader enabled +Thu Jan 8 23:30:53 2026 - spawned uWSGI http 1 (pid: 1606009) +Thu Jan 8 23:31:22 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:31:22 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:31:22 2026 - gateway "uWSGI http 1" has been buried (pid: 1606009) +Thu Jan 8 23:31:22 2026 - ...gracefully killing workers... +Thu Jan 8 23:31:22 2026 - Gracefully killing worker 2 (pid: 1606006)... +Thu Jan 8 23:31:22 2026 - Gracefully killing worker 1 (pid: 1606003)... +Thu Jan 8 23:31:23 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:31:23 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:31:23 2026 - binary reloading uWSGI... +Thu Jan 8 23:31:23 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:31:23 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:31:23 2026 - found fd 3 mapped to socket 0 (127.0.0.1:46579) +Thu Jan 8 23:31:23 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:31:23 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:31:23 2026] *** +Thu Jan 8 23:31:23 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:31:23 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:31:23 2026 - nodename: ubserver +Thu Jan 8 23:31:23 2026 - machine: x86_64 +Thu Jan 8 23:31:23 2026 - clock source: unix +Thu Jan 8 23:31:23 2026 - pcre jit disabled +Thu Jan 8 23:31:23 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:31:23 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:31:23 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:31:23 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:23 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:23 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:31:23 2026 - your processes number limit is 61306 +Thu Jan 8 23:31:23 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:31:23 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:31:23 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:31:23 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:31:23 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:31:23 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:31:23 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:42193 (port auto-assigned) fd 4 +Thu Jan 8 23:31:23 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:23 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:23 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:31:23 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:31:23 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:31:23 2026 - Python main interpreter initialized at 0x7f7b1e552d10 +Thu Jan 8 23:31:23 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:23 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:23 2026 - python threads support enabled +Thu Jan 8 23:31:23 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:31:23 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:31:23 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:31:23 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:31:23 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:31:23 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:31:23 2026 - WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7f7b1e552d10 pid: 1602880 (default app) +Thu Jan 8 23:31:23 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:23 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:23 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:31:23 2026 - gracefully (RE)spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:31:23 2026 - spawned uWSGI worker 1 (pid: 1606093, cores: 2) +Thu Jan 8 23:31:23 2026 - spawned uWSGI worker 2 (pid: 1606094, cores: 2) +Thu Jan 8 23:31:23 2026 - spawned uWSGI http 1 (pid: 1606098) +Thu Jan 8 23:31:23 2026 - Python auto-reloader enabled +Thu Jan 8 23:31:39 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:31:39 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:31:39 2026 - gateway "uWSGI http 1" has been buried (pid: 1606098) +Thu Jan 8 23:31:39 2026 - ...gracefully killing workers... +Thu Jan 8 23:31:39 2026 - Gracefully killing worker 1 (pid: 1606093)... +Thu Jan 8 23:31:39 2026 - Gracefully killing worker 2 (pid: 1606094)... +Thu Jan 8 23:31:40 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:31:40 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:31:40 2026 - binary reloading uWSGI... +Thu Jan 8 23:31:40 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:31:40 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:31:40 2026 - found fd 4 mapped to socket 0 (127.0.0.1:42193) +Thu Jan 8 23:31:40 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:31:40 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:31:40 2026] *** +Thu Jan 8 23:31:40 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:31:40 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:31:40 2026 - nodename: ubserver +Thu Jan 8 23:31:40 2026 - machine: x86_64 +Thu Jan 8 23:31:40 2026 - clock source: unix +Thu Jan 8 23:31:40 2026 - pcre jit disabled +Thu Jan 8 23:31:40 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:31:40 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:31:40 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:31:40 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:40 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:40 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:31:40 2026 - your processes number limit is 61306 +Thu Jan 8 23:31:40 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:31:40 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:31:40 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:31:40 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:31:40 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:31:40 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:31:40 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:35373 (port auto-assigned) fd 3 +Thu Jan 8 23:31:40 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:40 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:40 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:31:40 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:31:40 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:31:40 2026 - Python main interpreter initialized at 0x7b819db52d10 +Thu Jan 8 23:31:40 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:40 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:40 2026 - python threads support enabled +Thu Jan 8 23:31:40 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:31:40 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:31:40 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:31:40 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:31:40 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:31:40 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:31:40 2026 - WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7b819db52d10 pid: 1602880 (default app) +Thu Jan 8 23:31:40 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:40 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:40 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:31:40 2026 - gracefully (RE)spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:31:40 2026 - spawned uWSGI worker 1 (pid: 1606224, cores: 2) +Thu Jan 8 23:31:40 2026 - spawned uWSGI worker 2 (pid: 1606227, cores: 2) +Thu Jan 8 23:31:40 2026 - Python auto-reloader enabled +Thu Jan 8 23:31:40 2026 - spawned uWSGI http 1 (pid: 1606228) +Thu Jan 8 23:31:55 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:31:55 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:31:55 2026 - gateway "uWSGI http 1" has been buried (pid: 1606228) +Thu Jan 8 23:31:55 2026 - ...gracefully killing workers... +Thu Jan 8 23:31:55 2026 - Gracefully killing worker 2 (pid: 1606227)... +Thu Jan 8 23:31:55 2026 - Gracefully killing worker 1 (pid: 1606224)... +Thu Jan 8 23:31:56 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:31:56 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:31:56 2026 - binary reloading uWSGI... +Thu Jan 8 23:31:56 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:31:56 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:31:56 2026 - found fd 3 mapped to socket 0 (127.0.0.1:35373) +Thu Jan 8 23:31:56 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:31:56 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:31:56 2026] *** +Thu Jan 8 23:31:56 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:31:56 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:31:56 2026 - nodename: ubserver +Thu Jan 8 23:31:56 2026 - machine: x86_64 +Thu Jan 8 23:31:56 2026 - clock source: unix +Thu Jan 8 23:31:56 2026 - pcre jit disabled +Thu Jan 8 23:31:56 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:31:56 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:31:56 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:31:56 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:56 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:56 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:31:56 2026 - your processes number limit is 61306 +Thu Jan 8 23:31:56 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:31:56 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:31:56 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:31:56 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:31:56 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:31:56 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:31:56 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:43279 (port auto-assigned) fd 4 +Thu Jan 8 23:31:56 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:56 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:56 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:31:56 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:31:56 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:31:57 2026 - Python main interpreter initialized at 0x7b48c3b52d10 +Thu Jan 8 23:31:57 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:57 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:57 2026 - python threads support enabled +Thu Jan 8 23:31:57 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:31:57 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:31:57 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:31:57 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:31:57 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:31:57 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:31:57 2026 - WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7b48c3b52d10 pid: 1602880 (default app) +Thu Jan 8 23:31:57 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:31:57 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:31:57 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:31:57 2026 - gracefully (RE)spawned uWSGI master process (pid: 1602880) +Thu Jan 8 23:31:57 2026 - spawned uWSGI worker 1 (pid: 1606265, cores: 2) +Thu Jan 8 23:31:57 2026 - spawned uWSGI worker 2 (pid: 1606266, cores: 2) +Thu Jan 8 23:31:57 2026 - spawned uWSGI http 1 (pid: 1606269) +Thu Jan 8 23:31:57 2026 - Python auto-reloader enabled +Thu Jan 8 23:32:17 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:32:17 2026 - [uwsgi-python-reloader] module/file /home/v6ole/pyproject/GX-gp-notify/gx_gp_monitor/wechat/message_handler.py has been modified +Thu Jan 8 23:32:17 2026 - gateway "uWSGI http 1" has been buried (pid: 1606269) +Thu Jan 8 23:32:17 2026 - ...gracefully killing workers... +Thu Jan 8 23:32:17 2026 - Gracefully killing worker 2 (pid: 1606266)... +Thu Jan 8 23:32:17 2026 - Gracefully killing worker 1 (pid: 1606265)... +Thu Jan 8 23:32:18 2026 - worker 1 buried after 1 seconds +Thu Jan 8 23:32:18 2026 - worker 2 buried after 1 seconds +Thu Jan 8 23:32:18 2026 - binary reloading uWSGI... +Thu Jan 8 23:32:18 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:18 2026 - closing all non-uwsgi socket fds > 2 (max_fd = 1024)... +Thu Jan 8 23:32:18 2026 - found fd 4 mapped to socket 0 (127.0.0.1:43279) +Thu Jan 8 23:32:18 2026 - running /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +[uWSGI] getting INI configuration from /home/v6ole/pyproject/GX-gp-notify/uwsgi_wechat.ini +Thu Jan 8 23:32:18 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:32:18 2026] *** +Thu Jan 8 23:32:18 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:32:18 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:32:18 2026 - nodename: ubserver +Thu Jan 8 23:32:18 2026 - machine: x86_64 +Thu Jan 8 23:32:18 2026 - clock source: unix +Thu Jan 8 23:32:18 2026 - pcre jit disabled +Thu Jan 8 23:32:18 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:32:18 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:18 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:32:18 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:18 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:18 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:18 2026 - your processes number limit is 61306 +Thu Jan 8 23:32:18 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:32:18 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:32:18 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:32:18 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:32:18 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:32:18 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 5 +Thu Jan 8 23:32:18 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:45679 (port auto-assigned) fd 3 +Thu Jan 8 23:32:18 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:18 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:18 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:32:18 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:18 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:18 2026 - Python main interpreter initialized at 0x709a17952d10 +Thu Jan 8 23:32:18 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:18 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:18 2026 - python threads support enabled +Thu Jan 8 23:32:18 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:32:18 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:32:18 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:32:18 2026 - *** Operational MODE: preforking+threaded *** +应用创建失败: invalid character '🧹' (U+1F9F9) (message_handler.py, line 866) +Thu Jan 8 23:32:18 2026 - VACUUM: pidfile removed. +Thu Jan 8 23:32:20 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:32:20 2026] *** +Thu Jan 8 23:32:20 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:32:20 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:32:20 2026 - nodename: ubserver +Thu Jan 8 23:32:20 2026 - machine: x86_64 +Thu Jan 8 23:32:20 2026 - clock source: unix +Thu Jan 8 23:32:20 2026 - pcre jit disabled +Thu Jan 8 23:32:20 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:32:20 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:20 2026 - writing pidfile to ./uwsgi-wechat.pid +Thu Jan 8 23:32:20 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:32:20 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:20 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:20 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:20 2026 - your processes number limit is 61306 +Thu Jan 8 23:32:20 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:32:20 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:32:20 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:32:20 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:32:20 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:32:20 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 4 +Thu Jan 8 23:32:20 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:39829 (port auto-assigned) fd 3 +Thu Jan 8 23:32:20 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:20 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:20 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:32:20 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:20 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:20 2026 - Python main interpreter initialized at 0x78d37bf52d10 +Thu Jan 8 23:32:20 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:20 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:20 2026 - python threads support enabled +Thu Jan 8 23:32:20 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:32:20 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:32:20 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:32:20 2026 - *** Operational MODE: preforking+threaded *** +应用创建失败: invalid character '🧹' (U+1F9F9) (message_handler.py, line 866) +Thu Jan 8 23:32:20 2026 - VACUUM: pidfile removed. +Thu Jan 8 23:32:22 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:32:22 2026] *** +Thu Jan 8 23:32:22 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:32:22 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:32:22 2026 - nodename: ubserver +Thu Jan 8 23:32:22 2026 - machine: x86_64 +Thu Jan 8 23:32:22 2026 - clock source: unix +Thu Jan 8 23:32:22 2026 - pcre jit disabled +Thu Jan 8 23:32:22 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:32:22 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:22 2026 - writing pidfile to ./uwsgi-wechat.pid +Thu Jan 8 23:32:22 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:32:22 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:22 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:22 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:22 2026 - your processes number limit is 61306 +Thu Jan 8 23:32:22 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:32:22 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:32:22 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:32:22 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:32:22 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:32:22 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 4 +Thu Jan 8 23:32:22 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:40245 (port auto-assigned) fd 3 +Thu Jan 8 23:32:22 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:22 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:22 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:32:22 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:22 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:22 2026 - Python main interpreter initialized at 0x7eea4cd52d10 +Thu Jan 8 23:32:22 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:22 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:22 2026 - python threads support enabled +Thu Jan 8 23:32:22 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:32:22 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:32:22 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:32:22 2026 - *** Operational MODE: preforking+threaded *** +应用创建失败: invalid character '🧹' (U+1F9F9) (message_handler.py, line 866) +Thu Jan 8 23:32:22 2026 - VACUUM: pidfile removed. +Thu Jan 8 23:32:25 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:32:25 2026] *** +Thu Jan 8 23:32:25 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:32:25 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:32:25 2026 - nodename: ubserver +Thu Jan 8 23:32:25 2026 - machine: x86_64 +Thu Jan 8 23:32:25 2026 - clock source: unix +Thu Jan 8 23:32:25 2026 - pcre jit disabled +Thu Jan 8 23:32:25 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:32:25 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:25 2026 - writing pidfile to ./uwsgi-wechat.pid +Thu Jan 8 23:32:25 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:32:25 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:25 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:25 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:25 2026 - your processes number limit is 61306 +Thu Jan 8 23:32:25 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:32:25 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:32:25 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:32:25 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:32:25 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:32:25 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 4 +Thu Jan 8 23:32:25 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:43897 (port auto-assigned) fd 3 +Thu Jan 8 23:32:25 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:25 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:25 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:32:25 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:25 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:25 2026 - Python main interpreter initialized at 0x77e879f52d10 +Thu Jan 8 23:32:25 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:25 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:25 2026 - python threads support enabled +Thu Jan 8 23:32:25 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:32:25 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:32:25 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:32:25 2026 - *** Operational MODE: preforking+threaded *** +应用创建失败: invalid character '🧹' (U+1F9F9) (message_handler.py, line 866) +Thu Jan 8 23:32:25 2026 - VACUUM: pidfile removed. +Thu Jan 8 23:32:29 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:32:29 2026] *** +Thu Jan 8 23:32:29 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:32:29 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:32:29 2026 - nodename: ubserver +Thu Jan 8 23:32:29 2026 - machine: x86_64 +Thu Jan 8 23:32:29 2026 - clock source: unix +Thu Jan 8 23:32:29 2026 - pcre jit disabled +Thu Jan 8 23:32:29 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:32:29 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:29 2026 - writing pidfile to ./uwsgi-wechat.pid +Thu Jan 8 23:32:29 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:32:29 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:29 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:29 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:32:29 2026 - your processes number limit is 61306 +Thu Jan 8 23:32:29 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:32:29 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:32:29 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:32:29 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:32:29 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:32:29 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 4 +Thu Jan 8 23:32:29 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:39677 (port auto-assigned) fd 3 +Thu Jan 8 23:32:29 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:29 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:29 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:32:29 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:29 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:32:29 2026 - Python main interpreter initialized at 0x7afe74752d10 +Thu Jan 8 23:32:29 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:32:29 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:32:29 2026 - python threads support enabled +Thu Jan 8 23:32:29 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:32:29 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:32:29 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:32:29 2026 - *** Operational MODE: preforking+threaded *** +应用创建失败: invalid character '🧹' (U+1F9F9) (message_handler.py, line 866) +Thu Jan 8 23:32:29 2026 - VACUUM: pidfile removed. +Thu Jan 8 23:52:06 2026 - *** Starting uWSGI 2.0.31 (64bit) on [Thu Jan 8 23:52:06 2026] *** +Thu Jan 8 23:52:06 2026 - compiled with version: 14.2.0 on 06 January 2026 09:35:56 +Thu Jan 8 23:52:06 2026 - os: Linux-6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 +Thu Jan 8 23:52:06 2026 - nodename: ubserver +Thu Jan 8 23:52:06 2026 - machine: x86_64 +Thu Jan 8 23:52:06 2026 - clock source: unix +Thu Jan 8 23:52:06 2026 - pcre jit disabled +Thu Jan 8 23:52:06 2026 - detected number of CPU cores: 12 +Thu Jan 8 23:52:06 2026 - current working directory: /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:52:06 2026 - writing pidfile to ./uwsgi-wechat.pid +Thu Jan 8 23:52:06 2026 - detected binary path: /home/v6ole/pyproject/GX-gp-notify/venv/bin/uwsgi +Thu Jan 8 23:52:06 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:52:06 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:52:06 2026 - chdir() to /home/v6ole/pyproject/GX-gp-notify +Thu Jan 8 23:52:06 2026 - your processes number limit is 61306 +Thu Jan 8 23:52:06 2026 - your memory page size is 4096 bytes +Thu Jan 8 23:52:06 2026 - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** +Thu Jan 8 23:52:06 2026 - detected max file descriptor number: 1024 +Thu Jan 8 23:52:06 2026 - lock engine: pthread robust mutexes +Thu Jan 8 23:52:06 2026 - thunder lock: disabled (you can enable it with --thunder-lock) +Thu Jan 8 23:52:06 2026 - uWSGI http bound on 0.0.0.0:18001 # 指定 uWSGI 监听的 HTTP 地址和端口 fd 4 +Thu Jan 8 23:52:06 2026 - uwsgi socket 0 bound to TCP address 127.0.0.1:38137 (port auto-assigned) fd 3 +Thu Jan 8 23:52:06 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:52:06 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:52:06 2026 - Python version: 3.13.11 | packaged by Anaconda, Inc. | (main, Dec 10 2025, 21:39:52) [GCC 14.3.0] +Thu Jan 8 23:52:06 2026 - PEP 405 virtualenv detected: /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:52:06 2026 - Set PythonHome to /home/v6ole/pyproject/GX-gp-notify/venv +Thu Jan 8 23:52:06 2026 - Python main interpreter initialized at 0x7e4ab4d52d10 +Thu Jan 8 23:52:06 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:52:06 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:52:06 2026 - python threads support enabled +Thu Jan 8 23:52:06 2026 - your server socket listen backlog is limited to 100 connections +Thu Jan 8 23:52:06 2026 - your mercy for graceful operations on workers is 60 seconds +Thu Jan 8 23:52:06 2026 - mapped 250032 bytes (244 KB) for 4 cores +Thu Jan 8 23:52:06 2026 - *** Operational MODE: preforking+threaded *** +2026-01-08 23:52:07 - gx_gp_monitor.wechat.message_handler - INFO - 企业微信消息处理器初始化完成 +2026-01-08 23:52:07 - gx_gp_monitor.wechat.callback_server - INFO - 企业微信回调服务器初始化完成 +Thu Jan 8 23:52:07 2026 - WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7e4ab4d52d10 pid: 1616302 (default app) +Thu Jan 8 23:52:07 2026 - uWSGI running as root, you can use --uid/--gid/--chroot options +Thu Jan 8 23:52:07 2026 - *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** +Thu Jan 8 23:52:07 2026 - *** uWSGI is running in multiple interpreter mode *** +Thu Jan 8 23:52:07 2026 - spawned uWSGI master process (pid: 1616302) +Thu Jan 8 23:52:07 2026 - spawned uWSGI worker 1 (pid: 1616321, cores: 2) +Thu Jan 8 23:52:07 2026 - spawned uWSGI worker 2 (pid: 1616322, cores: 2) +Thu Jan 8 23:52:07 2026 - spawned uWSGI http 1 (pid: 1616325) +Thu Jan 8 23:52:07 2026 - Python auto-reloader enabled +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: n59OiXnRr3zM6BW5uVWSYT6UKG/jwApIhfJmwxnP9GpaH3WRsC... +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 887eba908c181e0228de54116517e004e6d673d3 +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 887eba908c181e0228de54116517e004e6d673d3 +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:52:13 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=today_stats, user=WeiJueSen +2026-01-08 23:52:13 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: today_stats, user: WeiJueSen +2026-01-08 23:52:13 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求今日统计 +2026-01-08 23:52:13 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 === +2026-01-08 23:52:13 - gx_gp_monitor.main - INFO - 版本: 1.0.0 +2026-01-08 23:52:13 - gx_gp_monitor.main - INFO - 配置文件: 默认配置 +2026-01-08 23:52:13 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-08 23:52:13 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +2026-01-08 23:52:13 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构 +2026-01-08 23:52:13 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成 +2026-01-08 23:52:13 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成 +2026-01-08 23:52:13 - gx_gp_monitor.main - INFO - 应用初始化完成 +{address space usage: 236015616 bytes/225MB} {rss usage: 47742976 bytes/45MB} [pid: 1616322|app: 0|req: 1/1] 14.116.241.251 () {36 vars in 679 bytes} [Thu Jan 8 23:52:13 2026] POST /api/v1/wechat/callback?msg_signature=887eba908c181e0228de54116517e004e6d673d3×tamp=1767887533&nonce=1767435597 => generated 966 bytes in 199 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 0) +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: byLoJ8C5/EIdNJGq7flLu3wK+9KeXhAbFlWGZ4SKbrq/jzVScQ... +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 0d4231a984a41081739519e49ef91e1a62af27c2 +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 0d4231a984a41081739519e49ef91e1a62af27c2 +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-08 23:52:21 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=WeiJueSen +2026-01-08 23:52:21 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: WeiJueSen +2026-01-08 23:52:21 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求关键词管理 +{address space usage: 236015616 bytes/225MB} {rss usage: 47742976 bytes/45MB} [pid: 1616322|app: 0|req: 2/2] 183.47.98.168 () {36 vars in 678 bytes} [Thu Jan 8 23:52:21 2026] POST /api/v1/wechat/callback?msg_signature=0d4231a984a41081739519e49ef91e1a62af27c2×tamp=1767887541&nonce=1767324070 => generated 1010 bytes in 1 msecs (HTTP/1.1 200) 2 headers in 81 bytes (1 switches on core 1) +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: lD6k2bCX3whG0WVivcAAby7GwI0fzF4lElViOb36QW2etFd8aF... +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 8da1cb947170f3a975db580b0a1a03dc4fbc922a +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 8da1cb947170f3a975db580b0a1a03dc4fbc922a +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text +2026-01-09 00:10:09 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=大化..., user=WeiJueSen +2026-01-09 00:10:09 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 大化, user: WeiJueSen +2026-01-09 00:10:09 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 关键词搜索: ['大化'] +2026-01-09 00:10:09 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: True) +2026-01-09 00:10:09 - gx_gp_monitor.core.reliability - INFO - 健康检查通过 +2026-01-09 00:10:09 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 00:10:09 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: lD6k2bCX3whG0WVivcAAby7GwI0fzF4lElViOb36QW2etFd8aF... +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 8da1cb947170f3a975db580b0a1a03dc4fbc922a +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 8da1cb947170f3a975db580b0a1a03dc4fbc922a +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text +2026-01-09 00:10:14 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=大化..., user=WeiJueSen +2026-01-09 00:10:14 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 大化, user: WeiJueSen +2026-01-09 00:10:14 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 关键词搜索: ['大化'] +2026-01-09 00:10:14 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: True) +2026-01-09 00:10:14 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源 +2026-01-09 00:10:14 - gx_gp_monitor - INFO - 开始爬取 采购公告 +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.48秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.22秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: 2V3aU/4FO7zlAhJFhCe168paUJgMT77M+FAB4jNUk/NXWcWgDl... +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 971fef79a492b4102de1d93d6fc27160160dea60 +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 971fef79a492b4102de1d93d6fc27160160dea60 +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-09 00:10:15 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_search, user=WeiJueSen +2026-01-09 00:10:15 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_search, user: WeiJueSen +2026-01-09 00:10:15 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发关键词搜索菜单 +{address space usage: 234016768 bytes/223MB} {rss usage: 39407616 bytes/37MB} [pid: 1616321|app: 0|req: 1/3] 183.47.98.227 () {36 vars in 678 bytes} [Fri Jan 9 00:10:15 2026] POST /api/v1/wechat/callback?msg_signature=971fef79a492b4102de1d93d6fc27160160dea60×tamp=1767888615&nonce=1767172344 => generated 1054 bytes in 6 msecs (HTTP/1.1 200) 2 headers in 81 bytes (1 switches on core 0) +2026-01-09 00:10:15 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:15 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.17秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.32秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 00:10:16 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 00:10:16 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 00:10:17 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 00:10:17 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 00:10:17 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:17 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-09 00:10:17 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 手动搜索模式:跳过数据库保存 +2026-01-09 00:10:17 - gx_gp_monitor.filters.filters - INFO - 日期筛选: 1300 -> 0 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 0 -> 0 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过筛选后公告的数据库保存 +2026-01-09 00:10:17 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': False, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 0, 'date_filtered': 1300, 'duplicate_filtered': 0, 'source_filtered': 0}, 'filtered_announcements': []} +{address space usage: 250101760 bytes/238MB} {rss usage: 68210688 bytes/65MB} [pid: 1616322|app: 0|req: 4/4] 106.55.202.215 () {36 vars in 679 bytes} [Fri Jan 9 00:10:14 2026] POST /api/v1/wechat/callback?msg_signature=8da1cb947170f3a975db580b0a1a03dc4fbc922a×tamp=1767888609&nonce=1767456212 => generated 798 bytes in 3065 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 1) +2026-01-09 00:10:40 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.51秒 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 开始爬取 结果公告 +2026-01-09 00:10:40 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 开始爬取 合同公告 +2026-01-09 00:10:40 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.27秒 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 开始爬取 更正公告 +2026-01-09 00:10:40 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.26秒 +2026-01-09 00:10:40 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示 +2026-01-09 00:10:41 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.19秒 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 开始爬取 单一来源公示 +2026-01-09 00:10:41 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.23秒 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示 +2026-01-09 00:10:41 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.36秒 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 开始爬取 履约验收公示 +2026-01-09 00:10:41 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:41 - gx_gp_monitor - INFO - 开始爬取 工程类公告 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.20秒 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.21秒 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 开始爬取 采购意向公开 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录 +2026-01-09 00:10:42 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.18秒 +2026-01-09 00:10:42 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 手动搜索模式:跳过数据库保存 +2026-01-09 00:10:42 - gx_gp_monitor.filters.filters - INFO - 日期筛选: 1300 -> 1 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 1 -> 0 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 0 -> 0 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过筛选后公告的数据库保存 +2026-01-09 00:10:42 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': False, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1, 'date_filtered': 1299, 'duplicate_filtered': 0, 'source_filtered': 0}, 'filtered_announcements': []} +{address space usage: 242388992 bytes/231MB} {rss usage: 60600320 bytes/57MB} [pid: 1616322|app: 0|req: 4/5] 14.116.241.251 () {36 vars in 679 bytes} [Fri Jan 9 00:10:09 2026] POST /api/v1/wechat/callback?msg_signature=8da1cb947170f3a975db580b0a1a03dc4fbc922a×tamp=1767888609&nonce=1767456212 => generated 798 bytes in 33363 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 0) +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: tc4EfnaoWAMd6veuWP3h1KALIuMqFaseXjRRVx9vm8aHsfZaFX... +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 6367d32d17c91baf7f4e084d457653862e380d20 +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 6367d32d17c91baf7f4e084d457653862e380d20 +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-09 08:09:44 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=announcements_by_type, user=WeiJueSen +2026-01-09 08:09:44 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: announcements_by_type, user: WeiJueSen +2026-01-09 08:09:44 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求按类型查看公告 +2026-01-09 08:09:44 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功 +{address space usage: 234016768 bytes/223MB} {rss usage: 44326912 bytes/42MB} [pid: 1616321|app: 0|req: 2/6] 183.47.98.227 () {36 vars in 678 bytes} [Fri Jan 9 08:09:44 2026] POST /api/v1/wechat/callback?msg_signature=6367d32d17c91baf7f4e084d457653862e380d20×tamp=1767917384&nonce=1768231335 => generated 754 bytes in 31 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 1) +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: KNXRojaaOOvMXAn/bS/jCuXblPiK3JZlgYTa3ZkP/NIaRLHdgd... +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: f3151e52daaf7cd68feebc40d4c3be095a479eeb +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: f3151e52daaf7cd68feebc40d4c3be095a479eeb +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-09 08:09:54 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=today_count, user=WeiJueSen +2026-01-09 08:09:54 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: today_count, user: WeiJueSen +{address space usage: 242388992 bytes/231MB} {rss usage: 60600320 bytes/57MB} [pid: 1616322|app: 0|req: 5/7] 183.47.98.227 () {36 vars in 677 bytes} [Fri Jan 9 08:09:54 2026] POST /api/v1/wechat/callback?msg_signature=f3151e52daaf7cd68feebc40d4c3be095a479eeb×tamp=1767917394&nonce=1768669935 => generated 582 bytes in 1 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 1) +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472 +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: WQBIDFITyc25ID3VlassbD4P/na15LN12tS+UlIJNMoPt5OIWl... +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: c70c8e0f75d9e1e8673a812ba65eecc0fffefac0 +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: c70c8e0f75d9e1e8673a812ba65eecc0fffefac0 +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名... +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event +2026-01-09 08:10:03 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=system_status, user=WeiJueSen +2026-01-09 08:10:03 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: system_status, user: WeiJueSen +2026-01-09 08:10:03 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求系统状态 +2026-01-09 08:10:03 - gx_gp_monitor.notification.wechat - INFO - 企业微信服务初始化完成 +2026-01-09 08:10:03 - gx_gp_monitor.notification.wechat - INFO - 成功获取企业微信访问令牌 +{address space usage: 242388992 bytes/231MB} {rss usage: 60600320 bytes/57MB} [pid: 1616322|app: 0|req: 6/8] 183.47.98.168 () {36 vars in 678 bytes} [Fri Jan 9 08:10:03 2026] POST /api/v1/wechat/callback?msg_signature=c70c8e0f75d9e1e8673a812ba65eecc0fffefac0×tamp=1767917402&nonce=1768910559 => generated 1138 bytes in 330 msecs (HTTP/1.1 200) 2 headers in 81 bytes (1 switches on core 0) diff --git a/onu.md b/onu.md new file mode 100644 index 0000000..b412db0 --- /dev/null +++ b/onu.md @@ -0,0 +1,8 @@ +📋 关键词搜索: `未知` - 总公告数: `0` + +**更新时间: 2026-01-08 23:41:28** + + +## 无匹配公告 + +在指定时间范围内没有找到符合条件的公告。 diff --git a/run_cron_crawl.sh b/run_cron_crawl.sh index 43e624f..92bd715 100755 --- a/run_cron_crawl.sh +++ b/run_cron_crawl.sh @@ -1,6 +1,6 @@ #!/bin/bash -# 定时爬取脚本启动器 -# 用于启动广西政府采购网公告定时爬取任务 +# 定时搜索脚本启动器 +# 用于启动广西政府采购网公告定时搜索任务 # 自动激活项目虚拟环境并运行Python脚本 # 设置脚本遇到错误时退出 @@ -11,7 +11,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$SCRIPT_DIR" echo "========================================" -echo "🕒 广西政府采购网公告定时爬取任务" +echo "🕒 广西政府采购网公告定时搜索任务" echo "📂 项目目录: $PROJECT_ROOT" echo "⏰ 开始时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "========================================" @@ -66,7 +66,7 @@ if [ ! -f "$CRON_SCRIPT" ]; then fi echo "✅ 环境检查通过" -echo "🚀 启动定时爬取脚本..." +echo "🚀 启动定时搜索脚本..." # 切换到项目根目录 cd "$PROJECT_ROOT" diff --git a/test_menu_fix.py b/test_menu_fix.py new file mode 100644 index 0000000..6ba50b2 --- /dev/null +++ b/test_menu_fix.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +""" +测试修复后的菜单功能 +""" + +import sys +import os + +# 添加项目路径 +sys.path.insert(0, os.path.dirname(__file__)) + +try: + from gx_gp_monitor.wechat.message_handler import WeChatMessageHandler + from gx_gp_monitor.core.config_manager import load_config + + def test_menu_keys(): + """测试菜单key处理""" + print("🧪 测试菜单key处理...") + + handler = WeChatMessageHandler() + + # 测试旧菜单key + test_cases = [ + ("latest_announcements", "最新公告(兼容旧key)"), + ("announcements_by_type", "按类型查看公告"), + ("search_announcements", "搜索公告(兼容旧key)"), + ("latest_news", "最新公告"), + ("keyword_search", "关键词搜索"), + ("system_status", "系统状态"), + ("help_guide", "使用说明"), + ] + + results = {} + for key, description in test_cases: + try: + # 模拟事件处理 + result = handler.handle_event('click', key, 'test_user') + results[key] = result is not None and "未知菜单项" not in (result or "") + print(f"✅ {description}: {'通过' if results[key] else '失败'}") + except Exception as e: + print(f"❌ {description}: 异常 - {str(e)}") + results[key] = False + + success_count = sum(1 for success in results.values() if success) + print(f"\n📊 菜单key测试结果: {success_count}/{len(test_cases)} 通过") + + return success_count == len(test_cases) + + def test_text_commands(): + """测试文本命令处理""" + print("\n🧪 测试文本命令处理...") + + handler = WeChatMessageHandler() + + # 测试公告类型查询 + test_cases = [ + ("采购公告", "采购公告查询"), + ("结果公告", "结果公告查询"), + ("更正公告", "更正公告查询"), + ] + + results = {} + for command, description in test_cases: + try: + result = handler.handle_text_message(command, 'test_user') + results[command] = result is not None + print(f"✅ {description}: {'通过' if results[command] else '失败'}") + except Exception as e: + print(f"❌ {description}: 异常 - {str(e)}") + results[command] = False + + success_count = sum(1 for success in results.values() if success) + print(f"\n📊 文本命令测试结果: {success_count}/{len(test_cases)} 通过") + + return success_count == len(test_cases) + + def main(): + """主测试函数""" + # 加载配置 + try: + load_config() + print("✅ 配置加载成功") + except Exception as e: + print(f"❌ 配置加载失败: {e}") + return False + + print("🚀 测试修复后的菜单功能...") + print("=" * 50) + + # 测试菜单key + test1_passed = test_menu_keys() + + # 测试文本命令 + test2_passed = test_text_commands() + + print("\n" + "=" * 50) + + if test1_passed and test2_passed: + print("🎉 所有菜单功能修复测试通过!") + print("✅ 旧菜单key现在可以正常工作") + print("✅ 新增了公告类型查询功能") + else: + print("⚠️ 部分测试失败,请检查上述错误信息") + + return test1_passed and test2_passed + + if __name__ == "__main__": + main() + +except ImportError as e: + print(f"❌ 导入失败: {e}", file=sys.stderr) + sys.exit(1) +except Exception as e: + print(f"❌ 测试失败: {e}", file=sys.stderr) + sys.exit(1) diff --git a/test_wechat_menu.py b/test_wechat_menu.py new file mode 100644 index 0000000..5543983 --- /dev/null +++ b/test_wechat_menu.py @@ -0,0 +1,168 @@ +#!/usr/bin/env python3 +""" +测试企业微信菜单功能 +""" + +import sys +import os + +# 添加项目路径 +sys.path.insert(0, os.path.dirname(__file__)) + +try: + from gx_gp_monitor.wechat.menu_manager import WeChatMenuManager + from gx_gp_monitor.wechat.message_handler import WeChatMessageHandler + from gx_gp_monitor.core.config_manager import load_config + + def test_menu_manager(): + """测试菜单管理器""" + print("🧪 测试菜单管理器...") + + try: + # 加载配置 + load_config() + + # 创建菜单管理器 + menu_manager = WeChatMenuManager() + + # 测试菜单信息获取 + menu_info = menu_manager.get_menu_info() + print("✅ 菜单信息获取成功") + print(f" 菜单按钮数量: {menu_info['menu_structure']['total_buttons']}") + + # 打印菜单结构 + for button in menu_info['menu_structure']['buttons']: + sub_count = len(button.get('sub_buttons', [])) if isinstance(button.get('sub_buttons'), list) else button.get('sub_buttons', 0) + print(f" • {button['name']} ({sub_count}个子菜单)") + + return True + + except Exception as e: + print(f"❌ 菜单管理器测试失败: {str(e)}") + return False + + def test_message_handler(): + """测试消息处理器""" + print("🧪 测试消息处理器...") + + try: + # 创建消息处理器 + handler = WeChatMessageHandler() + + # 测试各种菜单功能 + test_results = {} + + # 测试帮助功能 + result = handler._handle_help_guide("test_user") + test_results["help_guide"] = result is not None and "广西政府采购网" in result + + # 测试联系信息 + result = handler._handle_contact_info("test_user") + test_results["contact_info"] = result is not None and "联系我们" in result + + # 测试关于系统 + result = handler._handle_about_system("test_user") + test_results["about_system"] = result is not None and "关于系统" in result + + # 测试关键词搜索菜单 + result = handler._handle_keyword_search_menu("test_user") + test_results["keyword_search"] = result is not None and "关键词搜索" in result + + # 打印测试结果 + success_count = sum(1 for success in test_results.values() if success) + print(f"✅ 消息处理器测试完成: {success_count}/{len(test_results)} 项通过") + + for func_name, success in test_results.items(): + status = "✅" if success else "❌" + print(f" {status} {func_name}") + + return success_count == len(test_results) + + except Exception as e: + print(f"❌ 消息处理器测试失败: {str(e)}") + return False + + def test_menu_structure(): + """测试菜单结构合理性""" + print("🧪 测试菜单结构...") + + try: + menu_manager = WeChatMenuManager() + menu_data = menu_manager.menu_data + + # 检查菜单结构 + checks = { + "has_buttons": len(menu_data.get("button", [])) > 0, + "max_buttons": len(menu_data.get("button", [])) <= 3, # 企业微信最多3个一级菜单 + "has_sub_buttons": all("sub_button" in btn for btn in menu_data.get("button", [])), + "sub_buttons_limit": all(len(btn.get("sub_button", [])) <= 5 for btn in menu_data.get("button", [])), + "valid_keys": True + } + + # 检查所有按钮都有有效的key + all_keys = [] + for button in menu_data.get("button", []): + for sub_btn in button.get("sub_button", []): + key = sub_btn.get("key") + if key: + all_keys.append(key) + else: + checks["valid_keys"] = False + + # 检查key唯一性 + checks["unique_keys"] = len(all_keys) == len(set(all_keys)) + + # 打印检查结果 + success_count = sum(1 for success in checks.values() if success) + print(f"✅ 菜单结构检查完成: {success_count}/{len(checks)} 项通过") + + for check_name, success in checks.items(): + status = "✅" if success else "❌" + print(f" {status} {check_name}") + + return success_count == len(checks) + + except Exception as e: + print(f"❌ 菜单结构测试失败: {str(e)}") + return False + + def main(): + """主测试函数""" + print("🚀 开始测试企业微信菜单功能...") + print("=" * 60) + + # 测试菜单管理器 + test1_passed = test_menu_manager() + print() + + # 测试消息处理器 + test2_passed = test_message_handler() + print() + + # 测试菜单结构 + test3_passed = test_menu_structure() + print() + + print("=" * 60) + + # 总体结果 + all_passed = test1_passed and test2_passed and test3_passed + if all_passed: + print("🎉 所有测试通过!企业微信菜单功能正常") + print("💡 您可以运行以下命令创建菜单:") + print(" python -c \"from gx_gp_monitor.wechat.menu_manager import WeChatMenuManager; m = WeChatMenuManager(); m.create_menu()\"") + else: + print("⚠️ 部分测试失败,请检查上述错误信息") + + return all_passed + + if __name__ == "__main__": + main() + +except ImportError as e: + print(f"❌ 导入失败: {e}", file=sys.stderr) + print("请确保已安装所有依赖: pip install -r gx_gp_monitor/requirements.txt", file=sys.stderr) + sys.exit(1) +except Exception as e: + print(f"❌ 测试失败: {e}", file=sys.stderr) + sys.exit(1) diff --git a/uwsgi-wechat.pid b/uwsgi-wechat.pid index 4bc0bb6..5d0f8cd 100644 --- a/uwsgi-wechat.pid +++ b/uwsgi-wechat.pid @@ -1 +1 @@ -1560152 +1616302