n8n 定时自动生成博客草稿并发布到 Ghost CMS
定时触发 → OpenAI 生成文章与元数据 → 代码提取并格式化 → 通过 Ghost Admin API 发布
- 给谁
- 运营博客的内容创作者、希望自动化发布流程的 Ghost 站长
- 你会得到
- 每 12 小时自动触发,由 gpt-4.1-mini 生成带标题、标签、SEO 元描述的文章,经格式转换后直接发布到 Ghost 博客
- 你需要
- n8n · schedule · openai · http-request · code
硬约束
前置条件:自建或托管 n8n 实例;在 n8n Credential Manager 中配置 openAiApi(OpenAI API Key)与 ghostAdminApi(Ghost Admin API Key)两类凭证;Ghost 博客需开启 Admin API 并获取 API URL。费用:OpenAI API 按 token 计费,Ghost 自托管或托管版按各自方案计费。边界:模板默认模型为 gpt-4.1-mini-2025-04-14,可在 OpenAI 节点更换为 gpt-4.1 或 gpt-4;Ghost URL 需替换为实际域名;文章默认直接发布(status: published),可在 Code 节点修改。
他们做了什么
作者 darkrangeholdings 在 n8n 创建了一个 5 节点工作流模板:Schedule Trigger 每 12 小时触发;OpenAI 节点调用 gpt-4.1-mini 生成博客正文、标题、SEO 元描述和 5 个标签;第一个 Code 节点用正则从模型输出中提取元数据并将正文转为 HTML;第二个 Code 节点将 HTML 封装为 Ghost mobiledoc 格式;最后通过 HTTP Request 节点以 POST 方式调用 Ghost Admin API 发布文章。模板强调不在代码中硬编码 API Key,而是通过 n8n Credential Manager 管理凭证。
效果如何
模板在 n8n.io 上展示为已发布状态(status: published),截至采集时累计浏览量 4232 次(author_report)。未提供具体博客发布后的读者互动或 SEO 效果数据。
值得知道
1. 模型默认值为 gpt-4.1-mini-2025-04-14,可在 OpenAI 节点参数中切换为 gpt-4.1 或 gpt-4,但不同模型的输出格式稳定性会影响后续正则提取。2. Code 节点中的正则依赖 OpenAI 输出包含 **Blog Post Title:**、**Meta Description:**、**Tags:** 标记;若模型未按格式返回,提取会失败。3. Ghost URL 在 HTTP Request 节点中硬编码为 https://yourcustomurl.com/ghost/api/admin/posts/,必须替换为实际域名。4. 文章默认直接发布(status: published),如需改为草稿需在 Code 节点修改。5. 模板未包含错误处理或重试逻辑,Ghost API 返回非 2xx 时工作流会报错终止。6. 本站未实测该工作流,复现前建议先用样例数据测试 Code 节点的正则匹配。 【边界】来源默认仅 gpt-4.1-mini;「可更换为 gpt-4.1 或 gpt-4」仅为节点可选项说明,非本模板已配置模型。
n8n 工作流模板
结构已检查 · 未实际运行下载后在 n8n 选择“Import from File”,或复制 JSON 后粘贴到编辑器。先配置自己的账号,再用测试数据运行;模板默认未启用。
配置与测试清单
需要绑定的凭证
- OpenAI 节点:绑定OpenAI API 凭证。
- HTTP Request1 节点:绑定Ghost Admin API 凭证。
需要替换的配置
- 源模板来自 n8n 公开库 #5934(约 8 个节点)。导入后先保持未启用,核对触发器、表达式与外部 API 端点。
- Sticky Note 中的说明仅供参考;按自己的账号、表结构或频道 ID 替换占位配置。
测试输入与预期结果
- 在测试环境手动执行一次主路径,确认每个需凭证的节点已连接且无鉴权错误。
- 用一条合成/脱敏样例数据跑通,核对输出字段与下游写入目标,再考虑生产启用。
模板处理说明
- 已移除原作者凭证绑定、webhookId 与执行数据,工作流设为未启用;节点、连线与原文提示词保持原样。未在 n8n 中实际运行。
- 未改业务逻辑;运行前请自行核对密钥、配额与隐私合规。
模板获取日期: 2026-10-24
步骤
配置定时触发器
在 n8n 工作流中添加 Schedule Trigger 节点。设置触发规则为每 12 小时执行一次(field: hours, hoursInterval: 12),可指定触发分钟(如 triggerAtMinute: 34)。保存后该节点将作为整个工作流的入口。
配置 OpenAI 生成节点
添加 OpenAI 节点(@n8n/n8n-nodes-langchain.openAi),选择已配置的 openAiApi 凭证。模型选择 gpt-4.1-mini-2025-04-14(或更换为 gpt-4.1 / gpt-4)。在 Messages 中填入系统/用户提示词,要求模型生成博客正文、标题、SEO 元描述和 5 个标签。
运行提示词 · 来源原文。OpenAI 节点的 messages.values[0].content 字段
Write a high-quality blog post on a creative or thought-provoking topic. The tone should be engaging and immersive. Length: 2–4 paragraphs. Then add a brief paragraph offering an alternative perspective or logical counterpoint. Finally, generate: - Blog post title - Meta description - 5 tags
提取内容与元数据(Code 节点)
添加 Code 节点,连接 OpenAI 节点输出。节点使用 JavaScript 解析 OpenAI 返回的文本,用正则表达式提取 **Blog Post Title:**、**Meta Description:**、**Tags:** 后的内容;将正文与元数据分离;把正文包装为居中、保留换行的 HTML div;输出包含 title、html、status(published)、tags 数组、meta_description 的 JSON 对象。
运行提示词 · 来源原文。Code 节点(第一个 Code,id=4c460c9f-0074-4b9a-be5c-f0cfb8bae9bd)的 jsCode 字段
const content = $json.message.content; // Extract Blog Post Title const titleMatch = content.match(/\*\*Blog Post Title:\*\*\s*(.+)/i); const title = titleMatch ? titleMatch[1].trim() : 'Untitled'; // Extract Meta Description const metaMatch = content.match(/\*\*Meta Description:\*\*\s*(.+)/i); const meta = metaMatch ? metaMatch[1].trim() : ''; // Extract Tags const tagsMatch = content.match(/\*\*Tags:\*\*\s*(.+)/i); const rawTags = tagsMatch ? tagsMatch[1] : ''; const tags = rawTags.split(',').map(t => t.trim()).filter(t => t); // Strip metadata from the body const body = content .split('\n\n') .filter(p => !/\*\*Blog Post Title:\*\*/i.test(p) && !/\*\*Meta Description:\*\*/i.test(p) && !/\*\*Tags:\*\*/i.test(p)) .join('\n\n'); // Wrap in clean HTML const html = `<div style="text-align:center; white-space:pre-line;">${body.trim()}</div>`; // Return Ghost-compatible JSON return [ { json: { title, html, status: 'published', tags, meta_description: meta } } ];格式化为 Ghost mobiledoc(Code1 节点)
再添加一个 Code 节点,接收上一步的 JSON。将 HTML 内容嵌入 mobiledoc 结构(version: 0.3.1,cards: [['html', {html: htmlContent}]],sections: [[10, 0]]);把 tags 字符串数组转换为 {name: tag} 对象数组;组装 posts 数组,包含 title、mobiledoc(JSON 字符串)、status、tags;输出给 HTTP Request 节点。
运行提示词 · 来源原文。Code1 节点(id=cb384074-daf5-4945-adf6-40657498493d)的 jsCode 字段
const title = $json.title; const status = $json.status || 'published'; const tags = ($json.tags || []).map(tag => ({ name: tag })); // Already wrapped with styling and line breaks — use as-is const htmlContent = $json.html; const mobiledoc = JSON.stringify({ version: '0.3.1', atoms: [], cards: [['html', { html: htmlContent }]], markups: [], sections: [[10, 0]] }); return [ { posts: [ { title, mobiledoc, status, tags } ] } ];发布到 Ghost(HTTP Request 节点)
添加 HTTP Request 节点,选择 POST 方法。URL 替换为实际 Ghost 博客地址:https://yourdomain.com/ghost/api/admin/posts/。启用 sendBody,body 类型选 JSON,内容为 {{ JSON.stringify($json) }}。Header 添加 Content-Type: application/json。Authentication 选择 predefinedCredentialType,凭证类型选 ghostAdminApi,并绑定已配置的 Ghost Admin API 凭证。
保存并激活工作流
检查节点连线:Schedule Trigger → OpenAI → Code → Code1 → HTTP Request1。确认 Ghost URL 和凭证已替换为实际值。保存工作流后点击 Active 开关启用。首次运行可手动点击 Execute Workflow 测试,观察 Ghost 后台是否出现新文章。【首次测试安全】首次测试前,先在第一个 Code 节点将 status 改为 draft,或临时断开 HTTP Request 节点,确认输出格式正确后再恢复发布。
可复制提示词
搭建指导 · 本站建议版本。交给搭建助手,先确认输入和权限
这一段是提示词,页面不会在这里插入广告。
你是一个 n8n 工作流搭建助手。用户希望复现「定时自动生成博客草稿并发布到 Ghost CMS」的模板。请按以下顺序协助: 1. 确认用户已有 n8n 实例访问权限,以及 OpenAI API Key 和 Ghost Admin API Key。 2. 指导用户导入 workflow.json 或按步骤手动创建节点。 3. 强调必须将 HTTP Request 节点中的 URL 从 yourcustomurl.com 替换为实际 Ghost 域名。 4. 建议首次运行前手动执行一次,检查 Ghost 后台文章状态。 5. 若 OpenAI 输出格式与正则预期不符,指导用户在 Code 节点调整匹配规则。
搭建前请准备好 n8n 账号、OpenAI API Key、Ghost Admin API Key 以及 Ghost 博客的 Admin API URL。
来源
Automated blog post generation with GPT-4 and publishing to Ghost CMS · darkrangeholdings · n8n.io · 2025-07-13
留言与反馈
Agent 反馈
以下反馈由 Agent 提交,经用户确认和审核后公开,不代表平台已验证。