# GX-GP-Notify 广西政府采购公告监控系统,自动爬取广西政府采购网和大化县政府网的公告,通过企业微信推送关键词匹配的公告。 ## 功能 - **定时爬取**:按 cron 规则自动爬取,工作日 8:00-21:00 每小时执行 - **关键词过滤**:广西政采网公告按关键词过滤(默认:`大化`),大化县政府网全量爬取 - **企微推送**:新公告实时推送到企业微信应用 - **去重**:基于内容 hash 去重,避免重复入库和推送 - **节假日感知**:非工作日自动跳过爬取 ## 数据来源 | 来源 | 说明 | 过滤 | |------|------|------| | 广西政府采购网 | 采购公告、结果公告、合同公告等 13 个分类 | 关键词过滤 | | 大化县政府网 | 大化县门户网站采购公告 | 全量爬取 | ## 企微菜单功能 | 菜单 | 说明 | |------|------| | 最新公告 | 触发一次爬取,推送两个来源合并后最新 6 条(时间升序) | | 手动爬取 | 立即触发全量爬取并推送新公告 | | 今日统计 | 查看今日新增和累计公告数 | | 系统状态 | 查看待推送数量、定时任务状态 | | 监控配置 | 查看关键词、爬取页数、定时规则 | | 工作日状态 | 查看今天是否为工作日 | | 同步节假日 | 同步当年节假日数据 | | 暂停/恢复任务 | 控制定时爬取任务 | ## 快速部署 ### 1. 配置环境变量 复制 `.env.example` 为 `.env` 并填写: ```env # 数据库 DATABASE_URL=postgresql+asyncpg://user:password@host:5432/gx-gp-notify # 企业微信 WECHAT_CORP_ID=your_corp_id WECHAT_AGENT_ID=your_agent_id WECHAT_SECRET=your_secret WECHAT_TOKEN=your_token WECHAT_ENCODING_AES_KEY=your_aes_key # 爬虫 CRAWLER_KEYWORDS=["大化"] CRAWLER_MAX_PAGES=10 SCHEDULER_CRON=0 8-21 * * 1-5 ``` ### 2. 启动服务 ```bash docker compose -f docker/docker-compose.yml up -d ``` ### 3. 数据库迁移 ```bash docker compose -f docker/docker-compose.yml exec app alembic upgrade head ``` ### 4. 配置企微回调 在企业微信后台将回调 URL 设置为: ``` http://your-server:18001/wechat/callback ``` ## 开发 ```bash # 安装依赖 pip install -e ".[dev]" # 运行测试 pytest # 代码检查 ruff check . ``` ## 技术栈 - **框架**:FastAPI + uvicorn - **数据库**:PostgreSQL + SQLAlchemy (async) + Alembic - **爬虫**:httpx + BeautifulSoup4 - **定时任务**:APScheduler - **推送**:企业微信应用消息 API - **部署**:Docker ## 项目结构 ``` app/ ├── api/ # HTTP 接口(公告查询、手动触发爬取等) ├── crawler/ # 爬虫(广西政采网、大化县政府网) ├── models/ # 数据库模型 ├── scheduler/ # 定时任务 ├── services/ # 业务逻辑(pipeline、过滤、通知) └── wechat/ # 企业微信(消息处理、推送客户端) ```