Files
2026-05-12 18:16:56 +08:00

109 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/ # 企业微信(消息处理、推送客户端)
```