feat: 添加封面图压字花功能和启动脚本
- 新增封面图本地化压字花处理(深褐色文字+白色描边,居中显示) - 支持Linux/Windows跨平台字体加载 - 新增启动脚本 start_article_auto_image_matching.sh - 优化图片生成策略(0张图/1张图/多张图不同处理) - 绕过网络接口IncompleteRead问题,本地化处理更稳定 - 更新README文档,完善使用说明
This commit is contained in:
283
README.md
283
README.md
@@ -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密钥配置
|
||||
|
||||
## 许可证
|
||||
|
||||
|
||||
Reference in New Issue
Block a user