基于 GPT 的自动发布文章接口方案:从一句话或一张图片生成并发布内容

一、项目背景

传统内容发布流程通常包括:

  1. 编辑输入选题或素材;
  2. 查找资料、整理结构;
  3. 撰写文章;
  4. 生成标题、摘要和配图;
  5. 登录内容管理系统;
  6. 复制内容并发布。

如果将 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 字,语气通俗易懂。
        
      

后端接收到请求后:

  1. 校验用户身份;
  2. 校验提示词长度;
  3. 拼接系统提示词;
  4. 调用 GPT;
  5. 获取结构化文章结果;
  6. 保存为草稿;
  7. 返回文章内容;
  8. 用户确认后发布。

2. 用户上传图片生成文章

用户上传一张商品图或活动现场图后:

  1. 后端接收图片;
  2. 检查图片格式和大小;
  3. 上传到对象存储;
  4. 获取图片访问地址;
  5. 将图片地址和用户提示词传给 GPT;
  6. GPT 分析图片中的主体、场景和文字;
  7. 生成文章;
  8. 返回文章标题、正文、摘要和关键词。

例如用户上传一张咖啡产品图,并输入:

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 或幂等键判断是否已经发布。


十四、成本控制

自动写作系统的成本主要来自:

  1. GPT 文本生成;
  2. 图片理解;
  3. 图片存储;
  4. 数据库和服务器;
  5. 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 生成文章 → 人工修改 → 一键发布

当内容质量、审核规则和发布稳定性得到验证之后,再逐步开放自动审核和自动发布功能。

相关推荐
其实防守也摸鱼2 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
风若飞2 小时前
Spring Ai 入门遇到问题1
java·后端·spring
AI入职记3 小时前
Spring AI 结构化输出:结构 100% 通过,严格准确率只有 57%
后端·ai编程
朱涛的自习室3 小时前
212 个需求、22 万行代码:Agent 接管开源项目的 19 天
android·前端·人工智能
aZhe的全栈知识分享3 小时前
AI 还原 Figma 效果总达不到预期?先别急着让它写代码
前端·后端·面试
review445433 小时前
Codex Hooks 入门实战:生命周期事件、matcher 与5分钟跑通一个钩子
前端·agent·vibecoding
码事漫谈3 小时前
WorkBuddy 一直更新卡死?两个毛病,一套处理办法
后端
函数小陈3 小时前
阿里云部署DSH与RAM完成运维
前端·后端
aurora_zjj3 小时前
一次持续 3 年的 OpenResty 死循环排查:最终定位到 LuaJIT ARM64 的一条汇编指令
后端