136941d84e
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
109 lines
2.8 KiB
Markdown
109 lines
2.8 KiB
Markdown
# 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/ # 企业微信(消息处理、推送客户端)
|
||
```
|