feat: 添加封面图压字花功能和启动脚本

- 新增封面图本地化压字花处理(深褐色文字+白色描边,居中显示)
- 支持Linux/Windows跨平台字体加载
- 新增启动脚本 start_article_auto_image_matching.sh
- 优化图片生成策略(0张图/1张图/多张图不同处理)
- 绕过网络接口IncompleteRead问题,本地化处理更稳定
- 更新README文档,完善使用说明
This commit is contained in:
2026-02-05 20:25:23 +08:00
parent 1436129845
commit 97dcff8c8b
9 changed files with 3292 additions and 1093 deletions

283
README.md
View File

@@ -1,69 +1,87 @@
# 文字匹配图片项目
# 文章图片智能匹配系统
AI驱动的文章与图片智能匹配系统支持从数据库读取文章数据,自动匹配图片或使用Gemini生成图片并批量发布文章。
AI驱动的文章与图片智能匹配系统支持自动匹配现有图片、Gemini生成图片、封面图压字花处理,并批量发布文章。
## 项目概述
本项目实现了以下核心功能:
- 从数据库读取待处理的文章数据
- 基于文章标签智能匹配现有图片库
- 使用通义千问大模型评估文章与图片的匹配度
- 匹配失败时自动调用Gemini API生成相关图片
- 将生成的图片信息插入数据库ai_images、ai_image_tags、ai_article_images
- 上传图片到服务器
- 批量发布处理完成的文章
- 从数据库读取待处理的文章数据status='pending_review' 且 review_user_id=152
- 基于文章标签和科室智能匹配现有图片库(优先实拍图,后模板图)
- 使用通义千问大模型评估文章与图片的匹配度阈值0.6
- 匹配失败时自动调用Gemini API生成图片0张图1封面+2详情1张图补充缺失类型
- **封面图压字花处理**:本地化图片文字融合(深褐色文字+白色描边,居中显示
- 将图片信息插入数据库并上传到服务器
- 所有图片生成完成后统一调用RPA审核接口
## 技术栈
- **Python 3.12**
- **运行平台**: Linux 服务器不支持Windows
- **数据库**: MySQL (PyMySQL)
- **AI服务**:
- Google Gemini API (图片生成)
- 通义千问 API (文章图片匹配评估)
- **依赖库**:
- Google Gemini API (图片生成模型gemini-3-pro-image-preview)
- 通义千问 API (文章图片匹配评估模型qwen-max)
- **核心依赖库**:
- `requests==2.31.0` - HTTP请求
- `google-genai==0.1.0` - Gemini API调用
- `pymysql` - MySQL数据库连接
- `Pillow==10.0.0` - 图片处理
- `Pillow==10.0.0` - 图片处理和文字融合
## 项目结构
```
文字匹配图片/
├── match_article_images.py # 主程序:文章图片匹配
├── database_config.py # 数据库配置管理
├── log_config.py # 日志配置
├── export_approved_articles.py # 导出审核通过的文章
├── export_image_tags.py # 导出图片标签数据
├── push_article_published.py # 文章发布监控脚本
├── requirements.txt # 项目依赖
├── setup_env.bat # Windows环境初始化脚本
├── setup_env.sh # Linux/macOS环境初始化脚本
├── db/ # 数据库表结构
│ ├── split_tables/ # 按表拆分的SQL文件
── ai_articles.sql # 完整数据库结构
└── logs/ # 日志目录
├── article_auto_image_matching.py # 主程序:文章图片智能匹配
├── start_article_auto_image_matching.sh # 启动脚本
├── database_config.py # 数据库配置管理
├── log_config.py # 日志配置
├── export_approved_articles.py # 导出审核通过的文章
├── export_image_tags.py # 导出图片标签数据
├── push_article_published.py # 文章发布监控脚本
├── requirements.txt # 项目依赖
├── setup_env.bat # Windows环境初始化脚本
├── setup_env.sh # Linux/macOS环境初始化脚本
├── db/ # 数据库表结构
── split_tables/ # 按表拆分的SQL文件24个表
│ └── ai_articles.sql # 完整数据库结构
└── logs/ # 日志目录
├── article_image_matching.log # 匹配日志
├── article_image_matching_error.log # 错误日志
└── start_*.log # 启动日志
```
## 环境配置
### 1. 创建虚拟环境
### 1. Linux 中文字体安装(必需)
**Windows**:
封面图压字花功能需要中文字体支持,请先安装:
**Ubuntu/Debian**:
```bash
python -m venv venv
venv\Scripts\activate
sudo apt-get update
sudo apt-get install fonts-wqy-zenhei fonts-wqy-microhei
```
**Linux/macOS**:
**CentOS/RHEL**:
```bash
python3 -m venv venv
source venv/bin/activate
sudo yum install wqy-zenhei-fonts wqy-microhei-fonts
# 或安装 Google Noto 字体
sudo yum install google-noto-sans-cjk-fonts
```
### 2. 安装依赖
**验证字体安装**:
```bash
fc-list :lang=zh
```
### 2. Python 虚拟环境
本项目使用共享虚拟环境:`/home/work/keyword_crawl/venv`
如需创建新环境:
```bash
python3 -m venv /home/work/keyword_crawl/venv
source /home/work/keyword_crawl/venv/bin/activate
pip install -r requirements.txt
```
@@ -75,23 +93,45 @@ DB_CONFIG = {
'host': 'your_host',
'user': 'your_user',
'password': 'your_password',
'database': 'ai_article',
'database': 'ai_articles',
'charset': 'utf8mb4'
}
```
## 使用方法
### 文章图片匹配
### 快速启动(推荐)
**测试模式**处理前N篇文章:
**1. 赋予执行权限**:
```bash
python match_article_images.py --test 3
chmod +x start_article_auto_image_matching.sh
```
**正常模式**(处理所有文章:
**2. 前台运行**(查看实时输出:
```bash
python match_article_images.py
./start_article_auto_image_matching.sh
```
**3. 后台运行**:
```bash
nohup ./start_article_auto_image_matching.sh > /dev/null 2>&1 &
```
**4. 查看运行状态**:
```bash
# 查看进程
ps aux | grep article_auto_image_matching
# 查看最新日志
ls -lt logs/start_*.log | head -1
tail -f logs/start_*.log
```
### 手动运行
```bash
source /home/work/keyword_crawl/venv/bin/activate
python article_auto_image_matching.py
```
### 导出数据
@@ -110,25 +150,57 @@ python export_image_tags.py
### 1. 文章图片匹配流程
1. 从数据库读取状态为 `approved` 的文章
2. 根据文章标签匹配图片库中的图片image_attached_article_count < 5
3. 使用通义千问API评估匹配质量
4. 匹配成功更新图片使用计数
5. 匹配失败调用Gemini生成新图片
1. **查询待匹配文章**status='pending_review' 且 review_user_id=152无图片关联
2. **获取可用图片**根据文章科室ID查询可用图片image_attached_article_count < 5 status='generate'
3. **图片优先级排序**实拍图image_source=2> 模板图image_source=1按挂载次数升序
4. **通义千问评估**调用API评估匹配度阈值0.6
5. **匹配成功**插入关联记录更新图片状态为published
6. **匹配失败**:根据当前图片数量采用不同策略生成图片
### 2. Gemini图片生成流程
### 2. 图片生成策略
- **0张图**生成1张封面图image_source=12+ 2张详情图image_source=13
- **1张图**
- 缺少实拍图生成1张封面图image_source=12
- 缺少AI生成图补充详情图至2张image_source=13
- **≥2张图**:检查并补充缺失类型图片
### 3. 封面图压字花处理(本地化)
**核心特性**
- ✅ 文字居中显示:自动计算居中坐标
- ✅ 深褐色文字RGB(180, 60, 50)
- ✅ 白色描边效果3像素宽度
- ✅ 自适应字体大小基础120px根据图片尺寸调整40-150px
- ✅ 自动换行每行最多12个字符
- ✅ 跨平台支持:自动检测操作系统并加载对应字体
**处理流程**
1. Gemini生成封面图片
2. 本地压字花处理(添加文章标题)
3. 上传到通用图片接口
4. 插入数据库关联记录image_source=12
**技术优势**
- 绕过网络接口的 IncompleteRead 问题
- 本地处理更快更稳定
- 完全符合视觉规范
### 4. Gemini图片生成流程
1. 根据文章标题和标签生成提示词
2. 调用Gemini API生成图片
3. 将图片信息插入 `ai_images`
4. 将图片标签信息插入 `ai_image_tags` image_source=3表示AI生成
5. 上传图片到服务器
6. 将文章与图片关联信息插入 `ai_article_images` image_source=0
7. sort_order自动设置为当前文章下最大值+1
2. 调用Gemini API生成图片模型gemini-3-pro-image-preview
3. 插入 `ai_images`
4. 插入 `ai_image_tags` 表(image_source=3表示AI生成
5. 上传图片到服务器获取真实URL
6. 更新数据库中的图片URL
7. 插入 `ai_article_images`sort_order自动递增
### 3. 批量发布
### 5. RPA审核接口
处理完成后自动调用 `/api/articles/batch-publish-auto` 接口批量发布文章
所有图片1封面+2详情生成完成后统一调用RPA审核接口
- 端点:`POST /api/articles/rpa/review`
- 参数:`article_ids`文章ID列表`image_source`(图片来源类型)
## 数据库表结构
@@ -142,29 +214,100 @@ python export_image_tags.py
- **ai_keywords**: 关键词表
- **ai_departments**: 部门表
## API配置
## 配置参数
### Gemini API
- 端点: `https://work.poloapi.com`
- 模型: `gemini-3-pro-image-preview`
### 核心常量
### 文章发布API
- 登录: `http://47.99.184.230:8324/api/auth/login`
- 图片上传: `http://47.99.184.230:8324/api/images/upload`
- 批量发布: `http://47.99.184.230:8324/api/articles/batch-publish-auto`
```python
WORKER_COUNT = 4 # 并行处理worker数量
BATCH_SIZE = 50 # 每批处理的文章数量
MATCH_THRESHOLD = 0.6 # 匹配分数阈值0-1
```
## 日志
### API配置
**Gemini API**:
- 端点:`https://work.poloapi.com`
- 模型:`gemini-3-pro-image-preview`
- API Key配置在代码中
**通义千问 API**:
- 端点:`https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation`
- 模型:`qwen-max`
- API Key配置在代码中
**后端服务 API**:
- 登录:`http://47.99.184.230:8324/api/auth/login`
- 图片上传:`http://47.99.184.230:8324/api/images/upload`
- RPA审核`http://47.99.184.230:8324/api/articles/rpa/review`
## 日志说明
### 日志文件位置
日志文件存储在 `logs/` 目录下:
- `article_matching.log` - 文章匹配日志
- `article_matching_error.log` - 错误日志
- `article_image_matching.log` - 文章匹配日志
- `article_image_matching_error.log` - 错误日志
- `start_YYYYMMDD_HHMMSS.log` - 启动脚本日志
### 日志级别
- **INFO**:正常流程信息
- **WARNING**:警告信息(如字体加载失败)
- **ERROR**:错误信息(如图片生成失败)
### 数据库日志
系统会将关键操作记录到 `ai_logs` 表:
- 启动/停止服务
- 文章匹配成功/失败
- 图片生成成功/失败
- API调用结果
## 注意事项
1. 虚拟环境 (`venv/`) 已在 `.gitignore` 中排除
2. API密钥和数据库密码请妥善保管
3. 生产环境建议使用环境变量管理敏感信息
4. 测试模式不会触发批量发布操作
1. **运行平台**仅支持Linux服务器不支持Windows
2. **中文字体**:封面图压字花功能必须安装中文字体(文泉驿正黑/微米黑)
3. **虚拟环境**:使用共享虚拟环境 `/home/work/keyword_crawl/venv`
4. **API密钥**妥善保管Gemini和通义千问的API密钥
5. **数据库密码**:生产环境建议使用环境变量管理敏感信息
6. **并发控制**默认4个worker并行处理可根据服务器性能调整
7. **图片生成策略**所有图片生成完成后才调用RPA审核接口
8. **网络稳定性**:封面图上传已本地化处理,避免 IncompleteRead 错误
## 常见问题
### 1. 字体加载失败
**错误**`无法加载任何中文字体`
**解决**
```bash
# Ubuntu/Debian
sudo apt-get install fonts-wqy-zenhei fonts-wqy-microhei
# CentOS/RHEL
sudo yum install wqy-zenhei-fonts
# 验证安装
fc-list :lang=zh
```
### 2. 虚拟环境未找到
**错误**`[警告] 未找到虚拟环境`
**解决**检查虚拟环境路径是否正确或使用系统Python
### 3. 图片上传失败
**原因**:网络不稳定导致的 IncompleteRead 错误
**解决**:已通过本地化处理解决,封面图使用本地压字花+通用上传接口
### 4. Gemini生成超时
**解决**检查网络连接和API密钥配置
## 许可证