first commit
This commit is contained in:
247
backend/PUBLISH_FEATURE_SUMMARY.md
Normal file
247
backend/PUBLISH_FEATURE_SUMMARY.md
Normal file
@@ -0,0 +1,247 @@
|
||||
# 小红书发布脚本 - 功能总结
|
||||
|
||||
## 🎉 最新更新(v1.1.0)
|
||||
|
||||
已成功增强发布脚本,现在支持**网络图片 URL**!
|
||||
|
||||
## ✨ 核心功能
|
||||
|
||||
### 1. Cookie 认证
|
||||
- 支持验证码登录
|
||||
- 支持 Cookie 注入
|
||||
- 自动验证登录状态
|
||||
|
||||
### 2. 内容发布
|
||||
- ✅ 标题和正文
|
||||
- ✅ 多图上传(最多 9 张)
|
||||
- ✅ 标签自动添加
|
||||
- ✅ 发布状态追踪
|
||||
|
||||
### 3. 图片支持(新增)
|
||||
- ✅ **本地文件路径**(绝对/相对路径)
|
||||
- ✅ **网络图片 URL**(HTTP/HTTPS)
|
||||
- ✅ **混合使用**(本地 + 网络)
|
||||
- ✅ **自动下载**网络图片
|
||||
- ✅ **自动清理**临时文件
|
||||
|
||||
## 📝 使用示例
|
||||
|
||||
### 基础使用
|
||||
|
||||
```json
|
||||
{
|
||||
"cookies": [...],
|
||||
"title": "笔记标题",
|
||||
"content": "笔记内容",
|
||||
"images": [
|
||||
"https://picsum.photos/800/600?random=1",
|
||||
"D:/local/image.jpg"
|
||||
],
|
||||
"tags": ["标签1", "标签2"]
|
||||
}
|
||||
```
|
||||
|
||||
### 命令行
|
||||
|
||||
```bash
|
||||
# 安装依赖
|
||||
pip install -r requirements.txt
|
||||
|
||||
# 从配置文件发布
|
||||
python xhs_publish.py --config my_config.json
|
||||
|
||||
# 测试网络图片功能
|
||||
python test_network_images.py
|
||||
```
|
||||
|
||||
## 🔧 技术实现
|
||||
|
||||
### 图片处理流程
|
||||
|
||||
```python
|
||||
1. 判断是否为网络 URL
|
||||
↓ 是
|
||||
2. 使用 aiohttp 下载图片
|
||||
↓
|
||||
3. 保存到 temp_downloads/
|
||||
↓
|
||||
4. 返回本地路径
|
||||
↓
|
||||
5. 上传到小红书
|
||||
↓
|
||||
6. 发布完成后清理临时文件
|
||||
```
|
||||
|
||||
### 关键代码
|
||||
|
||||
```python
|
||||
class XHSPublishService:
|
||||
async def download_image(self, url: str) -> str:
|
||||
"""下载网络图片"""
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(url, timeout=30) as response:
|
||||
content = await response.read()
|
||||
# 保存文件
|
||||
return local_path
|
||||
|
||||
async def process_images(self, images: List[str]) -> List[str]:
|
||||
"""处理图片列表(下载网络图片)"""
|
||||
local_images = []
|
||||
for img in images:
|
||||
if self.is_url(img):
|
||||
local_path = await self.download_image(img)
|
||||
local_images.append(local_path)
|
||||
else:
|
||||
local_images.append(img)
|
||||
return local_images
|
||||
```
|
||||
|
||||
## 📦 文件结构
|
||||
|
||||
```
|
||||
backend/
|
||||
├── xhs_publish.py # 发布脚本(已增强)
|
||||
├── xhs_login.py # 登录服务
|
||||
├── xhs_cli.py # 命令行工具
|
||||
├── test_publish.py # 基础测试
|
||||
├── test_network_images.py # 网络图片测试(新增)
|
||||
├── publish_config_example.json # 配置示例(已更新)
|
||||
├── requirements.txt # 依赖列表(已更新)
|
||||
├── temp_downloads/ # 临时下载目录(自动创建)
|
||||
└── 文档/
|
||||
├── XHS_PUBLISH_README.md # 发布脚本文档
|
||||
├── NETWORK_IMAGE_SUPPORT.md # 网络图片文档(新增)
|
||||
└── PUBLISH_FEATURE_SUMMARY.md # 功能总结(本文档)
|
||||
```
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 安装依赖
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
pip install -r requirements.txt
|
||||
playwright install chromium
|
||||
```
|
||||
|
||||
### 2. 获取 Cookie
|
||||
|
||||
```bash
|
||||
python xhs_cli.py login 13800138000 123456
|
||||
```
|
||||
|
||||
### 3. 准备配置文件
|
||||
|
||||
```bash
|
||||
cp publish_config_example.json my_publish.json
|
||||
# 编辑 my_publish.json,填入实际数据
|
||||
```
|
||||
|
||||
### 4. 执行发布
|
||||
|
||||
```bash
|
||||
python xhs_publish.py --config my_publish.json
|
||||
```
|
||||
|
||||
## 📊 性能指标
|
||||
|
||||
| 指标 | 数值 |
|
||||
|------|------|
|
||||
| 图片下载超时 | 30 秒/张 |
|
||||
| 最大图片数 | 9 张 |
|
||||
| 建议图片大小 | < 5MB |
|
||||
| 临时文件清理 | 自动 |
|
||||
|
||||
## 🔍 实际应用
|
||||
|
||||
### 从数据库获取图片 URL 发布
|
||||
|
||||
```python
|
||||
# 查询文章信息
|
||||
article = db.query("SELECT * FROM ai_articles WHERE id = ?", article_id)
|
||||
images = db.query("SELECT image_url FROM ai_article_images WHERE article_id = ?", article_id)
|
||||
tags = db.query("SELECT coze_tag FROM ai_article_tags WHERE article_id = ?", article_id)
|
||||
|
||||
# 准备发布
|
||||
publisher = XHSPublishService(cookies)
|
||||
result = await publisher.publish(
|
||||
title=article['title'],
|
||||
content=article['content'],
|
||||
images=[img['image_url'] for img in images], # 使用数据库中的 URL
|
||||
tags=tags[0]['coze_tag'].split(',') if tags else []
|
||||
)
|
||||
```
|
||||
|
||||
### Go 后端调用示例
|
||||
|
||||
```go
|
||||
func PublishArticle(articleID int) error {
|
||||
// 1. 查询文章信息
|
||||
article := db.GetArticle(articleID)
|
||||
images := db.GetArticleImages(articleID)
|
||||
|
||||
// 2. 构造配置
|
||||
config := map[string]interface{}{
|
||||
"cookies": loadCookies(),
|
||||
"title": article.Title,
|
||||
"content": article.Content,
|
||||
"images": images, // 直接使用 URL 数组
|
||||
"tags": splitTags(article.Tags),
|
||||
}
|
||||
|
||||
// 3. 保存配置文件
|
||||
configFile := fmt.Sprintf("temp/publish_%d.json", articleID)
|
||||
saveJSON(configFile, config)
|
||||
|
||||
// 4. 调用 Python 脚本
|
||||
cmd := exec.Command("python", "backend/xhs_publish.py", "--config", configFile)
|
||||
output, err := cmd.CombinedOutput()
|
||||
|
||||
// 5. 解析结果
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(output, &result)
|
||||
|
||||
return checkResult(result)
|
||||
}
|
||||
```
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
### 1. 网络图片
|
||||
- 确保 URL 可公开访问
|
||||
- 避免使用需要认证的图片
|
||||
- 注意图片服务器的访问速度
|
||||
|
||||
### 2. 临时文件
|
||||
- 默认保存在 `temp_downloads/`
|
||||
- 发布完成后自动清理
|
||||
- 可设置 `cleanup=False` 保留文件
|
||||
|
||||
### 3. 错误处理
|
||||
- 单张图片下载失败不影响其他图片
|
||||
- 会跳过失败的图片继续发布
|
||||
- 详细的错误日志输出
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [XHS_PUBLISH_README.md](XHS_PUBLISH_README.md) - 详细使用文档
|
||||
- [NETWORK_IMAGE_SUPPORT.md](NETWORK_IMAGE_SUPPORT.md) - 网络图片支持文档
|
||||
- [XHS_CLI_README.md](XHS_CLI_README.md) - 命令行工具文档
|
||||
|
||||
## 🐛 问题反馈
|
||||
|
||||
如遇到问题,请检查:
|
||||
1. 是否安装了 `aiohttp` 库
|
||||
2. 网络连接是否正常
|
||||
3. Cookie 是否有效
|
||||
4. 图片 URL 是否可访问
|
||||
5. 磁盘空间是否充足
|
||||
|
||||
## 🎯 下一步计划
|
||||
|
||||
- [ ] 支持视频发布
|
||||
- [ ] 批量发布功能
|
||||
- [ ] 定时发布功能
|
||||
- [ ] 发布结果追踪
|
||||
- [ ] 图片压缩优化
|
||||
- [ ] 并发下载优化
|
||||
Reference in New Issue
Block a user