diff --git a/README.md b/README.md new file mode 100644 index 0000000..217d3dd --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +# 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/ # 企业微信(消息处理、推送客户端) +```