内容
# 内容自动化
使用人工智能驱动的内容生成和调度,实现Pinterest和Instagram的自动化内容发布。
## 功能
- ✅ **MCP集成** ⭐ - 通过AI助手进行自然语言控制(主要工作方式)
- 📖 [MCP详细描述](./MCP.md) - 设置、提示示例、故障排除
- ✅ **TypeScript** - 完整的类型安全性,以提高可靠性和更好的IDE支持
- ✅ **Late API** - 通过统一的API发布到Instagram和Pinterest
- ✅ **本地图像处理** - 自动转换(HEIC/PNG/GIF → JPG)和裁剪到平台宽高比,通过`sharp`
- ✅ **SCP上传到CDN** - 处理后的图像通过`scp`自动上传到您的CDN服务器
- ✅ 适用于Pinterest和Instagram的独特AI驱动内容生成(OpenAI,带有可自定义的提示)
- ✅ 通过Late API进行发布调度(无需本地调度器)
- ✅ **Instagram故事支持** - 通过Late API发布故事
- ✅ **Instagram轮播** - 在一个帖子中发布2-10张照片(通过MCP)
- ✅ 发布到两个平台,单次请求
- ✅ 处理后的图像跟踪
- ✅ OpenAI集成,用于内容生成(可选)
- ✅ CLI命令 - 替代终端工作方式
## 安装
1. 安装依赖项:
```bash
npm install
```
2. 构建TypeScript项目:
```bash
npm run build
```
3. 复制`.env.example`到`.env`并填写:
```bash
cp .env.example .env
```
4. 在`.env`中配置环境变量:
- **Late API** (必需):在[getlate.dev](https://getlate.dev)获取API密钥
- **CDN基准URL** (必需):指定托管图像的CDN基准URL
- **SCP上传** (可选):配置SCP以自动将处理后的本地图像上传到CDN
- **OpenAI API** (可选):用于AI驱动的内容生成
- **内容提示** (可选):通过复制`prompts/content-prompt.example.txt`到`prompts/content-prompt.txt`并编辑来自定义内容生成
## 获取API密钥
### Late API(必需)⭐
该项目仅使用**Late API**发布到Instagram和Pinterest。
1. 在[getlate.dev](https://getlate.dev)注册
2. 获取API密钥
3. 连接Instagram和Pinterest账户
4. 从仪表板获取个人资料ID和账户ID
5. 添加到`.env`:
```
LATE_API_KEY=您的密钥
LATE_PROFILE_ID=您的个人资料ID
LATE_INSTAGRAM_ACCOUNT_ID=您的Instagram账户ID
LATE_PINTEREST_ACCOUNT_ID=您的Pinterest账户ID
```
**Late API优势:**
- ✅ 无需本地调度器 - Late API自动按计划发布
- ✅ Late服务器上的可靠调度
- ✅ **通过单个请求发布到Instagram和Pinterest** - 节省API请求!
- ✅ 免费计划(60个请求/分钟)
- ✅ 支持13个平台(Instagram,Pinterest,Facebook,LinkedIn,Twitter/X,TikTok,YouTube,Reddit,Bluesky,Threads,Google Business,Telegram,Snapchat)
**支持的平台:** Instagram,Pinterest,Facebook,LinkedIn,Twitter/X,TikTok,YouTube,Reddit,Bluesky,Threads,Google Business,Telegram,Snapchat
## 用法
该项目支持**两种工作方式**:
1. **通过MCP代理**(推荐)- 通过AI助手进行自然语言控制
2. **通过CLI命令** - 通过终端的传统方式
### 设置检查
开始前,检查API连接:
```bash
npm run check
```
这将检查:
- Late API连接(必需)
- CDN配置(必需)
- SCP上传配置(可选)
- OpenAI API可用性(可选)
### CLI命令
#### 发布图像
```bash
npm run publish -- --image=IMG_5857.jpg [选项]
```
**图像输入:**
- **本地文件**(推荐):将源图像(HEIC,JPG,PNG,GIF)放在图像目录中。默认情况下,系统在`images/`(相对于项目根目录)查找;您可以通过在`.env`中设置`IMAGES_SOURCE_DIR`来覆盖(例如,绝对路径,如`/path/to/story-matcher`)。系统将转换为JPG,裁剪到平台宽高比,上传到CDN,并使用CDN URL发布。
- **CDN URL**:如果图像已经在CDN上,请传递完整URL - 跳过处理。
- **仅文件名**:如果未配置SCP,则文件名直接在`CDN_BASE_URL`下解析(现有行为)。
**示例:**
```bash
# 本地图像:自动处理 + 上传 + 发布到所有平台
npm run publish -- --image=IMG_5857.HEIC
# 1小时后发布
npm run publish -- --image=IMG_5857.jpg 1
# 草稿发布日期
npm run publish -- --image=IMG_5857.jpg --date="明天 18:00" --draft
# 带上下文
npm run publish -- --image=IMG_5857.jpg 1 --context="城市中心"
# 仅限Instagram帖子
npm run publish -- --image=IMG_5857.jpg --post
# 仅限Instagram故事
npm run publish -- --image=IMG_5857.jpg --story
# Instagram故事 + Pinterest图钉(逗号分隔)
npm run publish -- --image=IMG_5857.jpg --types=story,pin
# Instagram帖子 + Pinterest图钉
npm run publish -- --image=IMG_5857.jpg --types=post,pin
# 仅限Pinterest图钉
npm run publish -- --image=IMG_5857.jpg --pin
# 带草稿
npm run publish -- --image=IMG_5857.jpg --story --draft
```
**选项:**
- `--image=<文件名>` - 图片文件名(CLI模式下必填)
- `--context=<文本>` - 内容生成的上下文
- `--types=<列表>` - 内容类型(逗号分隔):`post`、`story`、`pin`(例如,`--types=story,pin`)
- `--post` - 仅限Instagram帖子(`--types=post`的简写)
- `--story` - 仅限Instagram故事(`--types=story`的简写)
- `--pin` - 仅限Pinterest图钉(`--types=pin`的简写)
- (无标志)- 所有三种类型(默认):Instagram帖子、Instagram故事、Pinterest图钉
- `--date=<日期>` - 发布时间(YYYY-MM-DD HH:MM或"tomorrow 18:00")
- `<小时>` - `--date`的替代:距当前时刻的小时数
- `--draft`或`-d` - 创建为草稿
**内容类型:**
- 默认(未指定)- 发布所有三种类型:Instagram帖子、Instagram故事、Pinterest图钉
- `--types=post,story,pin` - 指定类型(逗号分隔)(例如,`--types=story,pin`)
- `--post` - 仅发布Instagram帖子
- `--story` - 仅发布Instagram故事
- `--pin` - 仅发布Pinterest图钉(无Instagram)
**详细文档:**
- [CLI.md](./CLI.md) - 详细的CLI描述和用法示例
### 构建项目
```bash
# 将TypeScript构建为JavaScript
npm run build
# 构建并监听更改(自动重新编译)
npm run watch
```
### 在开发模式下使用MCP
在MCP开发时,使用自动重新编译:
```bash
# 终端:运行监听以自动重新编译
npm run watch
```
**工作原理:**
1. `watch`在文件更改时自动重新编译TypeScript
2. Cursor在`dist/mcp/mcp-server.js`更改时自动重启MCP服务器
3. 您可以在Cursor聊天中使用更新的MCP工具
**重要:**更改`src/mcp/`或相关模块中的代码后,更改将通过监听 + Cursor中的MCP重启自动应用。
**开发模式(dry-run):**
- 在`watch`模式下,自动启用`DEV_MODE=true`
- **不会发送到Late API的请求** - 而是输出准备发送的JSON
- 这允许在不进行实际发布的情况下测试逻辑
- 对于实际请求,请使用`npm run watch:prod`或简单的`npm run build` + 命令
### 使用MCP代理(推荐)⭐
**MCP(模型上下文协议)** - 这是与项目合作的主要推荐方式。通过Cursor、Claude或其他AI工具中的AI助手使用自然语言直接管理发布。
#### 使用MCP的快速入门
1. **构建项目:**
```bash
npm run build
```
2. **MCP服务器在Cursor中自动可用**(通过`.cursor/mcp.json`)
3. **使用自然语言:**
```
"明天18:00发布IMG_0802.HEIC,上下文为'音乐厅,晚上'"
"显示可用图像列表"
"为IMG_1460.JPG生成内容"
"今天20:00为IMG_2228.JPG安排故事"
```
**MCP优势:**
- ✅ **自然语言** - 无需记住命令
- ✅ **AI集成** - 直接在Cursor/Claude中工作
- ✅ **智能自动化** - AI可以自行计划发布
- ✅ **上下文理解** - AI理解您的意图
**详细文档:**
- [MCP.md](./MCP.md) - 设置、提示示例、故障排除
### 使用CLI命令
通过终端工作的替代方式。详细文档: [CLI.md](./CLI.md)
## 本地图像处理
系统可以自动处理本地源图像 - 转换格式、裁剪到平台宽高比并上传到CDN。
### 工作原理
```
IMG_123.HEIC (源图像来自IMAGES_SOURCE_DIR)
│
├─ sharp:读取 → 中心裁剪 4:5 → .processed/post/IMG_123.jpg
├─ sharp:读取 → 中心裁剪 9:16 → .processed/story/IMG_123.jpg
├─ sharp:读取 → 中心裁剪 2:3 → .processed/pin/IMG_123.jpg
│
├─ scp:上传到CDN服务器
│
└─ 使用CDN URL通过Late API发布
```
### 支持的源格式
HEIC,JPG,JPEG,PNG,GIF - 全部转换为JPEG(质量90)。
### 宽高比(中心裁剪)
| 内容类型 | 宽高比 | 示例分辨率 |
|---|---|---|
| Instagram帖子(`post`) | 4:5 | 1080×1350 |
| Instagram故事(`story`) | 9:16 | 1080×1920 |
| Pinterest图钉(`pin`) | 2:3 | 1000×1500 |
### 设置
1. **将源图像放在**图像目录中(默认为`images/`,可通过`.env`中的`IMAGES_SOURCE_DIR`覆盖)。
2. **在`.env`中配置SCP上传**(所有4个变量必须一起配置):
```
SCP_HOST=cdn.example.com
SCP_USER=deploy
SCP_KEY_PATH=~/.ssh/id_rsa
SCP_REMOTE_BASE_PATH=/var/www/cdn/images
```
3. **确保设置了CDN_BASE_URL** - 用于从上传文件构建公共URL。
### 缓存
处理后的图像缓存在`.processed/`中。如果输出文件已经存在,则跳过处理。删除`.processed/`以强制重新处理。
### 无SCP(仅URL模式)
如果未配置SCP,则系统的工作方式与以前一样 - 直接传递图像文件名或URL,并从`CDN_BASE_URL`构建CDN URL。仅当提供本地文件名且配置了SCP时,才触发本地图像处理。
## 项目结构
该项目基于**模块化原则**组织,以提高可扩展性和支持。
### 主要模块:
- **`src/core/`** - 核心基础设施(带有LRU逐出、指数退避重试、速率限制、日志记录、错误定义、配置、验证模式)
- **`src/services/`** - API服务(Late API、CDN上传器)
- **`src/generators/`** - 内容生成器(AI驱动,可自定义提示)
- **`src/processors/`** - 数据处理器(图像管道、sharp处理器)
- **`src/utils/`** - 实用程序(CDN URL构建器、调度、日期和共享帮助程序)
- **`src/cli/`** - CLI命令和入口点
- **`src/mcp/`** - MCP集成,用于AI助手
- **`src/types/`** - TypeScript类型和接口
- **`prompts/`** - 内容生成提示(可自定义)
- **`.processed/`** - 处理后的图像缓存(gitignored)
### 模块化结构优势:
✅ **关注点分离** - 每个模块负责其领域
✅ **单例模式** - 服务作为单例实例导出
✅ **直接导入** - 简化结构,无中间index.ts
✅ **可扩展性** - 易于添加新服务
✅ **可测试性** - 每个模块可以单独测试
## 内容格式
### Pinterest
- **标题**:SEO优化的标题
- **描述**:带有关键词的描述
- **关键词**:关键词列表
- **CTA**:行动号召(引导至Instagram)
### Instagram帖子
- **标题**:情感故事文本
- **哈希标签**:3-5个相关哈希标签(可通过内容提示自定义)
### Instagram故事
- 故事不支持长标题
- 可以使用文本叠加层(通过API)
- 支持用户提及(user_tags)
- 自动在24小时后消失
## 限制和能力
### Late API
- ✅ **仅使用Late API**发布到Instagram和Pinterest
- ✅ 通过Late API进行原生调度
- ✅ 不需要本地调度器
- ✅ 发布到两个平台,单次请求
- ✅ 支持媒体文件上传或使用公共CDN URL
- ✅ **支持故事** - 可以通过Late API发布故事
- ⚠️ **故事限制**:只能在接下来的24小时内安排
- ⚠️ 免费计划:60个请求/分钟
### CDN图像
两种操作模式:
**1. 本地处理 + SCP上传(推荐):**
- 将源图像放在图像目录中(默认为`images/`,可通过`IMAGES_SOURCE_DIR`配置)
- 在`.env`中配置SCP变量
- 系统自动转换、裁剪、上传并构建CDN URL
- 支持HEIC、JPG、PNG、GIF输入格式
**2. 直接CDN URL(无本地处理):**
- 图像必须已经在CDN上以正确的宽高比存在
- 指定`.env`中的`CDN_BASE_URL`
- 传递文件名或完整URL
- 系统按内容类型构建CDN URL:
- `post` → `{CDN_BASE_URL}/post/{filename}`
- `story` → `{CDN_BASE_URL}/story/{filename}`
- `pin` → `{CDN_BASE_URL}/pin/{filename}`
- **重要:**文件名区分大小写 - 使用与CDN上相同的确切大小写(例如,`IMG_5857.jpg` ≠ `img_5857.jpg`)
- **重要:** 文件名区分大小写 - 使用与CDN上相同的确切大小写(例如,`IMG_5857.jpg` ≠ `img_5857.jpg`)
## 内容生成自定义
内容生成提示可以自定义以匹配您的品牌语气和目标受众:
1. **复制示例提示:**
```bash
cp prompts/content-prompt.example.txt prompts/content-prompt.txt
```
2. **编辑`prompts/content-prompt.txt`**您的自定义指令:
- 调整语气和风格
- 修改哈希标签要求
- 更改内容焦点和目标
- 根据需要更新输出格式
3. **自定义提示自动加载** - 无需更改代码!
**注意:** `prompts/content-prompt.txt`被git忽略,因此您的自定义内容保持私有。示例文件(`content-prompt.example.txt`)作为模板并受版本控制。
## 安全
- 永远不要提交`.env`文件
- 永远不要提交`prompts/content-prompt.txt`(已在`.gitignore`中)
- 将API密钥存储在安全位置
- 定期检查Late API密钥过期
- 不要公开分享API密钥
- `SCP_KEY_PATH`指向您的SSH密钥 - 确保它具有正确的权限(`chmod 600`)
## 故障排除
### Late API连接错误
- 检查API密钥正确性:`npm run check`
- 确保两个账户(Instagram和Pinterest)都在Late中连接
- 检查API密钥过期
### 发布错误
- 确保Instagram和Pinterest账户在Late中连接
- 检查账户访问权限
- 确保图像在指定的URL上可用于CDN
### 图像未处理
- 检查文件格式(支持:HEIC,JPG,PNG,GIF)
- 确保文件未损坏
- **检查文件名** - 文件名区分大小写(例如,`IMG_5857.jpg` ≠ `img_5857.jpg`)
- 验证源文件存在于图像源目录(默认为`images/`或`IMAGES_SOURCE_DIR`(如果设置))
- 检查`.processed/`中的缓存输出 - 删除以强制重新处理
### SCP上传失败
- 验证`.env`中设置了所有4个SCP变量:`SCP_HOST`、`SCP_USER`、`SCP_KEY_PATH`、`SCP_REMOTE_BASE_PATH`
- 确保您的SSH密钥存在于指定的`SCP_KEY_PATH`并具有正确的权限(`chmod 600`)
- 测试SSH连接性:`ssh -i ~/.ssh/id_rsa user@host`
- 检查远程基路径是否存在且可写
### CDN不工作
- 确保`CDN_BASE_URL`正确指定
- 检查指定URL上的图像是否可用
- 确保URL可公开访问
## 许可证
MIT