一、项目背景
传统内容发布流程通常包括:
- 编辑输入选题或素材;
- 查找资料、整理结构;
- 撰写文章;
- 生成标题、摘要和配图;
- 登录内容管理系统;
- 复制内容并发布。
如果将 GPT 接入内容管理系统,用户只需要输入一句话,例如:
写一篇关于新能源汽车发展的科普文章,适合发布到公众号,字数 1500 字。
或者上传一张图片,例如产品图、活动海报、新闻现场图片,系统即可自动完成:
- 图片内容识别;
- 文章主题提取;
- 标题和正文生成;
- 摘要、关键词生成;
- HTML 或 Markdown 格式转换;
- 自动保存草稿;
- 审核后发布到网站、公众号或 WordPress。
本文介绍一套完整的自动发布文章接口方案。
二、整体系统架构
系统可以拆分为以下几个模块:
objectivec
用户端
│
├── 输入文字
├── 上传图片
└── 选择发布平台
│
▼
后端 API 服务
│
├── 参数校验
├── 图片上传
├── 调用 GPT
├── 内容审核
├── 格式转换
├── 保存文章
└── 发布到 CMS
│
├── MySQL / PostgreSQL
├── 对象存储 OSS / COS / S3
├── OpenAI API
└── WordPress / 自建 CMS / 公众号平台
建议使用以下技术:
| 模块 | 推荐技术 |
|---|---|
| 前端 | Vue、React、Next.js |
| 后端 | Node.js + NestJS/Express |
| 数据库 | MySQL 或 PostgreSQL |
| 文件存储 | 阿里云 OSS、腾讯云 COS、S3 |
| AI 接口 | OpenAI Responses API |
| 任务队列 | Redis + BullMQ |
| 内容管理 | 自建 CMS、WordPress |
| 部署 | Docker + Nginx |
三、核心业务流程
1. 用户输入文字生成文章
用户输入:
markdown
写一篇介绍智能家居未来发展的文章,面向普通消费者,字数约 1200 字,语气通俗易懂。
后端接收到请求后:
- 校验用户身份;
- 校验提示词长度;
- 拼接系统提示词;
- 调用 GPT;
- 获取结构化文章结果;
- 保存为草稿;
- 返回文章内容;
- 用户确认后发布。
2. 用户上传图片生成文章
用户上传一张商品图或活动现场图后:
- 后端接收图片;
- 检查图片格式和大小;
- 上传到对象存储;
- 获取图片访问地址;
- 将图片地址和用户提示词传给 GPT;
- GPT 分析图片中的主体、场景和文字;
- 生成文章;
- 返回文章标题、正文、摘要和关键词。
例如用户上传一张咖啡产品图,并输入:
markdown
根据这张图片,写一篇适合小红书发布的产品介绍文案。
系统可能生成:
- 标题:适合上班族的高品质便携咖啡;
- 正文:产品卖点、饮用场景、目标人群;
- 关键词:咖啡、便携、上班族、早餐;
- 建议标签:#咖啡推荐 #办公室好物。
四、推荐的文章数据结构
不要只让 GPT 返回一段普通文本,而应该要求它返回结构化 JSON。
swift
{
"title": "智能家居正在改变我们的生活方式",
"summary": "本文介绍智能家居的发展趋势、核心技术以及普通消费者的使用场景。",
"content": "<h2>一、智能家居的发展背景</h2><p>...</p>",
"markdown": "## 一、智能家居的发展背景\n\n...",
"keywords": [
"智能家居",
"物联网",
"人工智能"
],
"category": "科技",
"tags": [
"智能设备",
"家庭生活"
],
"cover_image": "",
"seo_title": "智能家居发展趋势及应用场景",
"seo_description": "了解智能家居的发展趋势、核心技术和实际应用场景。"
}
这样做有几个好处:
- 前端可以单独展示标题和正文;
- CMS 可以分别保存摘要、标签和分类;
- 可以生成 SEO 信息;
- 后续方便接入多个发布平台;
- 避免从一整段文本中再次解析标题和正文。
五、提示词设计
GPT 输出质量很大程度上取决于提示词设计。
1. 系统提示词
可以设置一段固定的系统提示词:
markdown
你是一名专业内容编辑,负责根据用户提供的主题、文字或图片生成高质量文章。
要求:
1. 内容真实、自然、逻辑清晰;
2. 不编造无法确认的事实;
3. 文章结构完整,包含标题、摘要、正文、关键词;
4. 正文使用中文;
5. 根据用户指定的平台调整语言风格;
6. 不输出违法、欺诈、色情、仇恨或侵权内容;
7. 必须按照指定 JSON 格式返回结果;
8. 正文可以使用 HTML 标签,但不要使用 script、iframe 等危险标签。
2. 用户提示词模板
javascript
请根据以下信息生成一篇文章:
主题:
{{topic}}
发布平台:
{{platform}}
目标读者:
{{audience}}
文章风格:
{{style}}
文章长度:
{{wordCount}} 字左右
补充要求:
{{requirements}}
请返回以下 JSON 字段:
{
"title": "文章标题",
"summary": "文章摘要",
"content": "HTML 格式正文",
"markdown": "Markdown 格式正文",
"keywords": ["关键词1", "关键词2"],
"category": "文章分类",
"tags": ["标签1", "标签2"],
"seo_title": "SEO 标题",
"seo_description": "SEO 描述"
}
六、后端接口设计
建议设计以下接口。
1. 创建文章生成任务
bash
POST /api/articles/generate
Content-Type: application/json
Authorization: Bearer TOKEN
请求参数:
json
{
"prompt": "写一篇关于人工智能办公应用的文章",
"platform": "website",
"style": "专业、通俗",
"audience": "普通职场人",
"wordCount": 1200,
"autoPublish": false
}
返回结果:
json
{
"success": true,
"taskId": "task_202501010001",
"status": "processing"
}
建议采用异步任务模式,而不是让接口一直等待 GPT 返回结果。
2. 图片生成文章接口
bash
POST /api/articles/generate-from-image
Content-Type: multipart/form-data
Authorization: Bearer TOKEN
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| image | File | 上传的图片 |
| prompt | String | 用户补充提示 |
| platform | String | 发布平台 |
| style | String | 文章风格 |
| wordCount | Number | 文章字数 |
| autoPublish | Boolean | 是否自动发布 |
返回:
json
{
"success": true,
"taskId": "task_202501010002",
"status": "processing"
}
3. 查询任务状态
sql
GET /api/articles/tasks/:taskId
Authorization: Bearer TOKEN
返回:
json
{
"taskId": "task_202501010001",
"status": "completed",
"articleId": 1001,
"article": {
"title": "人工智能正在重新定义办公方式",
"summary": "人工智能正在从多个方面提升办公效率。",
"content": "<h2>一、人工智能办公的应用现状</h2><p>...</p>",
"keywords": ["人工智能", "办公效率"]
}
}
任务状态可以包括:
markdown
pending 等待处理
processing 正在生成
completed 生成完成
review 等待审核
published 已发布
failed 处理失败
4. 发布文章接口
bash
POST /api/articles/:id/publish
Authorization: Bearer TOKEN
请求参数:
json
{
"platform": "wordpress",
"publishType": "draft"
}
其中:
draft:保存为草稿;publish:立即发布;schedule:定时发布。
七、Node.js 调用 GPT 的示例
以下示例使用 Node.js 调用 GPT 生成结构化文章。实际项目中建议使用官方 SDK,并将 API Key 放在服务端环境变量中。
markdown
npm install openai express multer
环境变量:
ini
OPENAI_API_KEY=你的_OPENAI_API_KEY
示例代码:
javascript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
const systemPrompt = `
你是一名专业中文内容编辑。
请根据用户提供的主题或图片生成文章。
要求:
1. 内容逻辑清晰、语言自然;
2. 不编造无法确认的事实;
3. 返回合法 JSON;
4. 正文使用 HTML 格式;
5. 不允许输出 script、iframe 等危险标签。
返回字段:
title、summary、content、markdown、keywords、category、tags、seo_title、seo_description
`;
export async function generateArticle({
prompt,
imageUrl,
platform = "website",
style = "专业、通俗",
audience = "普通用户",
wordCount = 1000
}) {
const userText = `
发布平台:${platform}
目标读者:${audience}
文章风格:${style}
文章长度:约 ${wordCount} 字
用户要求:
${prompt || "请根据图片内容生成一篇合适的文章"}
`;
const content = [
{
type: "input_text",
text: userText
}
];
if (imageUrl) {
content.push({
type: "input_image",
image_url: imageUrl
});
}
const response = await client.responses.create({
model: "gpt-4.1",
instructions: systemPrompt,
input: [
{
role: "user",
content
}
],
text: {
format: {
type: "json_object"
}
}
});
return JSON.parse(response.output_text);
}
注意:模型名称、结构化输出参数可能会随着 SDK 版本变化,正式开发时应以当前官方接口文档为准。
八、图片处理方案
图片不要直接永久存储在业务服务器上,建议使用对象存储。
图片处理流程
markdown
用户上传图片
│
▼
检查扩展名和 MIME 类型
│
▼
限制文件大小
│
▼
图片病毒扫描
│
▼
压缩、裁剪、去除 EXIF
│
▼
上传 OSS / COS / S3
│
▼
生成临时访问地址
│
▼
传给 GPT 分析
建议限制:
yaml
允许格式:jpg、jpeg、png、webp
单张大小:不超过 10MB
最大尺寸:建议不超过 4096 × 4096
访问方式:使用带过期时间的签名 URL
如果图片中存在隐私信息,例如身份证、手机号、住址或人脸,应在上传或分析前进行脱敏处理。
九、发布到 WordPress 的方案
如果发布平台是 WordPress,可以通过 WordPress REST API 发布文章。
WordPress 请求示例
javascript
export async function publishToWordPress(article) {
const response = await fetch(
`${process.env.WP_URL}/wp-json/wp/v2/posts`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization":
"Basic " +
Buffer.from(
`${process.env.WP_USERNAME}:${process.env.WP_APP_PASSWORD}`
).toString("base64")
},
body: JSON.stringify({
title: article.title,
content: article.content,
excerpt: article.summary,
status: "draft",
tags: article.tags
})
}
);
if (!response.ok) {
throw new Error(`WordPress 发布失败:${response.status}`);
}
return await response.json();
}
建议初期默认使用:
json
{
"status": "draft"
}
经过人工确认后再改为:
json
{
"status": "publish"
}
十、自动发布不等于直接上线
虽然可以实现全自动发布,但不建议所有内容都直接上线,尤其是以下内容:
- 新闻资讯;
- 医疗健康;
- 金融投资;
- 法律相关;
- 商品宣传;
- 涉及真实人物的文章;
- 可能产生版权风险的内容。
推荐采用以下审核流程:
markdown
GPT 生成
│
▼
敏感词检测
│
▼
内容安全审核
│
▼
重复度检测
│
▼
人工审核
│
▼
发布到 CMS
可以将文章状态设计为:
markdown
generated 已生成
reviewing 审核中
approved 审核通过
rejected 审核驳回
published 已发布
对于低风险内容,例如内部知识库、产品说明、普通生活文章,可以设置自动发布;对于高风险内容,则必须人工审核。
十一、数据库设计
articles 表
scss
CREATE TABLE articles (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
summary TEXT,
content LONGTEXT,
markdown LONGTEXT,
cover_image VARCHAR(500),
category VARCHAR(100),
keywords JSON,
tags JSON,
platform VARCHAR(50),
status VARCHAR(30) DEFAULT 'generated',
source_prompt TEXT,
source_image VARCHAR(500),
external_id VARCHAR(255),
error_message TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
article_tasks 表
sql
CREATE TABLE article_tasks (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id VARCHAR(100) UNIQUE NOT NULL,
user_id BIGINT NOT NULL,
status VARCHAR(30) DEFAULT 'pending',
progress INT DEFAULT 0,
article_id BIGINT,
error_message TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
十二、异步任务处理
GPT 生成文章可能需要数秒甚至更长时间,因此建议使用队列。
markdown
API 接收请求
│
├── 创建任务记录
├── 返回 taskId
└── 写入 Redis 队列
│
▼
Worker 处理任务
│
├── 上传图片
├── 调用 GPT
├── 内容审核
├── 保存文章
└── 发布或进入审核
前端可以通过以下方式获取结果:
方式一:轮询
bash
每 2 秒请求一次 /api/articles/tasks/:taskId
方式二:WebSocket
服务端实时推送:
json
{
"taskId": "task_10001",
"status": "completed",
"progress": 100
}
方式三:Server-Sent Events
适合展示文章生成进度。
十三、安全设计
1. API Key 不能放在前端
错误做法:
ini
// 不要在浏览器代码中直接调用
const apiKey = "sk-xxxx";
正确做法:
markdown
前端 → 自己的后端 → GPT API
2. 防止接口滥用
需要增加:
- 用户登录验证;
- 请求频率限制;
- 单用户每日额度;
- 单次最大字数限制;
- 图片大小限制;
- 生成任务超时;
- 失败重试机制。
3. 防止 HTML 注入
GPT 生成的 HTML 必须经过清洗,只允许安全标签,例如:
css
h1、h2、h3、p、strong、em、ul、ol、li、blockquote、img、a
禁止:
css
script
iframe
object
embed
style
onerror
onclick
可以使用 DOMPurify 或后端 HTML 清洗库。
4. 做好幂等处理
发布接口需要防止重复发布。
例如客户端重复点击发布按钮时,后端应通过 taskId、articleId 或幂等键判断是否已经发布。
十四、成本控制
自动写作系统的成本主要来自:
- GPT 文本生成;
- 图片理解;
- 图片存储;
- 数据库和服务器;
- CMS 发布接口。
建议采用以下方式控制成本:
- 对相同提示词做缓存;
- 限制文章最大长度;
- 先使用较低成本模型进行初稿;
- 对重要文章再使用高质量模型润色;
- 图片先压缩;
- 避免重复发送过长系统提示词;
- 限制每日生成次数;
- 记录每次调用的 Token 使用量。
数据库中可以增加调用记录表:
sql
CREATE TABLE ai_usage_logs (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT,
model VARCHAR(100),
input_tokens INT,
output_tokens INT,
estimated_cost DECIMAL(10, 4),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
十五、推荐的 MVP 开发计划
第一阶段:基础版本
实现:
- 用户输入一句话;
- GPT 生成文章;
- 返回标题和正文;
- 保存为草稿;
- 前端可以编辑文章。
第二阶段:图片生成
实现:
- 上传图片;
- 图片存储;
- GPT 图片理解;
- 根据图片生成文章;
- 自动生成封面描述和标签。
第三阶段:CMS 发布
实现:
- 对接 WordPress;
- 对接自建 CMS;
- 支持草稿和立即发布;
- 支持定时发布;
- 支持发布结果回调。
第四阶段:企业级能力
实现:
- 多用户和权限管理;
- 多模型切换;
- 内容安全审核;
- 敏感词检测;
- 文章查重;
- 数据统计;
- 任务队列;
- 失败重试;
- 操作日志。
十六、最终推荐方案
整体推荐采用以下模式:
css
Vue / React 前端
│
▼
Node.js + NestJS 后端
│
├── OpenAI Responses API
├── MySQL
├── Redis + BullMQ
├── OSS / COS / S3
└── WordPress REST API
核心业务流程:
markdown
文字或图片输入
│
▼
文件上传与参数校验
│
▼
创建异步任务
│
▼
调用 GPT 生成结构化文章
│
▼
内容安全检查
│
▼
保存为草稿
│
▼
人工审核或自动审核
│
▼
发布到指定平台
这套方案既可以支持"输入一句话生成文章",也可以支持"上传一张图片结合提示词生成文章",同时具备扩展到 WordPress、自建 CMS、公众号后台以及多平台发布的能力。
在实际项目中,建议不要一开始就追求完全无人审核,而是先实现:
AI 生成文章 → 人工修改 → 一键发布
当内容质量、审核规则和发布稳定性得到验证之后,再逐步开放自动审核和自动发布功能。