From 72dc40186d90fcbf8e7ab0aad6698f6ed6b1b55c Mon Sep 17 00:00:00 2001 From: v6ole Date: Fri, 9 Jan 2026 08:19:09 +0800 Subject: [PATCH] Refactor the cron job functionality to transition from a crawling to a searching model. Update related documentation and scripts to reflect the new terminology and functionality, including changes in the README and script comments. Enhance WeChat menu and message handling to support the new search features, ensuring clarity in user interactions and logging. --- CRON_README.md | 14 +- README_企业微信.md | 97 +- create_wechat_menu.py | 73 + .../__pycache__/main.cpython-313.pyc | Bin 21176 -> 21176 bytes gx_gp_monitor/cron_crawl.py | 22 +- gx_gp_monitor/main.py | 18 +- .../__pycache__/wechat.cpython-313.pyc | Bin 34897 -> 34897 bytes .../__pycache__/menu_manager.cpython-313.pyc | Bin 10532 -> 10757 bytes .../message_handler.cpython-313.pyc | Bin 18156 -> 37877 bytes gx_gp_monitor/wechat/menu_manager.py | 42 +- gx_gp_monitor/wechat/message_handler.py | 1005 ++++++--- .../wechat/message_handler.py.backup | 970 +++++++++ gx_gp_monitor/wechat/message_handler_clean.py | 824 ++++++++ logs/gx_gp_monitor.log | 1811 ++++++++++++++++- logs/uwsgi-wechat.log | 1353 ++++++++++-- onu.md | 8 + run_cron_crawl.sh | 8 +- test_menu_fix.py | 115 ++ test_wechat_menu.py | 168 ++ uwsgi-wechat.pid | 2 +- 20 files changed, 5935 insertions(+), 595 deletions(-) create mode 100644 create_wechat_menu.py create mode 100644 gx_gp_monitor/wechat/message_handler.py.backup create mode 100644 gx_gp_monitor/wechat/message_handler_clean.py create mode 100644 onu.md create mode 100644 test_menu_fix.py create mode 100644 test_wechat_menu.py 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 c64809af2a2f1f5d71355759477b2c847622c236..dbed077d8d6d1a0670ab2d5a072389e95ee6a0f6 100644 GIT binary patch delta 113 zcmdn7lyS#WMy}7iyj%=GPg$f$a mI=i2Ct$>JGDcoYzER_Hn0M+?RR0pP0N30#n+`Lolzcm1k!#Ab? delta 110 zcmdn7lyS#WMy}7iyj%=Gu%Ue;7rQ9i^Nux7`=?D77j1?y7l;~YK}4VI-u<*|p@PP< o&hDpOD0JE?&=>Px# 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 8ccbeb298bf6ce4214afd0bb6eb2871cbf8ce16f..d0a612a77f8d4f2475ad7ca89233854f628caf1a 100644 GIT binary patch delta 21 bcmcaOf$8D|Ca%xCyj%=GAiaMhmwN{QOzH+q delta 21 bcmcaOf$8D|Ca%xCyj%=Gu(@?3mwN{QPgn-3 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 6b03f7dbff1be091af66a7e432818b65cf6f3cf0..70e218e5a89a5bd58ead4ea36f4e20d09da2f281 100644 GIT binary patch delta 1558 zcmZWo-%lJ>6yCct`*UD{wXpoyh1u?IVWBRy6eU=R5GhHC7?~!0P_tcjr?9%rEO%xE zo{A4Nia*l!s%g_k12Hj8T3R!WF{%GR6Jv}|^qOeYz*ghKw)H`4OuXj~Akj(Y%XiQH z?m6E%bLW%EJXS?DKsFu;}qdmsKm9=Yd_D}o{^HHtSQ^omMt z#;t@{q)w@a2xAROc$+<@?Bgnds~Xu}lM>+(1d(2Wd>}lYXzoW)&*hR`)2?*O1oci? zrm1UI4U1JSpWk}#Q}Tn*?Al zpG`wEv&91SV|C7AlQyVW)(sPPK#D`45vEm>21Xb1YS}F68Wq^?RUb}(;2;-RxP*Iw zu_Q)W*9?_<8M8_zC2vV}C`m3!z37yEN4h4m$-Q1b9_fM883tF~{3w0`0*A>)y>?m# z>a+l?58wy@^n&{Vo&zMH2^Wy z?5wI;D8%NC`r6K5s-DGU#O$)2+ujwG)MPoJlAq9dII7!4XRjJRpU7fK6!!l3C*HM#-4>f zlbmRf+NPpW)efpq;m|`bfe3;2(#q<&Qq@DnDa?tM{BU%j>VaN5Z#E=VyV8Do`{tWB z-}m;-Co|ul3qK2mf*$%@k&3l@+56!?_+Ws33iN&U06*vFGI^mO<@kbJ5DK9}xZukP zH0mtugDB6#TAs%(Vff9+C&~@}WoK(?b>qu#uqvwWZhqX_YGD$xj7n*tXxfcN2`$*2l=|ee+Z%VkUH|cOmrdld zZCXa7SVpC}y2_&{<&dCh&lcSi@vv7-!WmB%uWvc6&84r_TdO2kHgv00wu-iC58*}W z6jiazd-ySmdui6Av6FB zfl^h|tzxZ00!X`TYo=uqv1ynVQlP{zaD=L6k&cP^vevX}hE4>!y5dK@Ku{UMMs;)u zB3i_38oH?wAC2s~MQ}~-N0jae1eR88 zXuACoP^0*+eA6kslmnetV-x#!b)pk=oeAv0f5j$aC*kw|MD{Q}+C(I-r%x+D;XdtFR+|fWy zCi~x^zCP%GD6!FDjqJwb0~2F?ltjc?!>A*s3FIIz0QA@$9w_80oP=l^;4FZKe;!B- zWgvukLedL>Q_LF_KJ`2lvrolg?+LE`K8HI8uf-T0m}(SVf(>j`NAdkZJqNl`6@a;B j^>p~$J%a?^Y8Vx}u8koJpHbiTUl6(2Q_lr_UA_DdK^;+O 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 9d72ad3f037771a6ae8511c716537e98ed8cd09a..04cfa4ea2ee833f5ee875e9946e4fa237e4914ed 100644 GIT binary patch literal 37877 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

eKP$mMDS^*PlqX=5)~KcTCHEZb`a*~jFlL>5 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 dXn9=R7jdTLcH4R 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 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