N
n8n Store
Workflow Market
Generate blog articles from RSS feeds with AI review

Generate blog articles from RSS feeds with AI review

by daiki-ai0 views

Description

Categories

🤖 AI & Machine Learning

Nodes Used

n8n-nodes-base.ifn8n-nodes-base.coden8n-nodes-base.coden8n-nodes-base.noOpn8n-nodes-base.noOpn8n-nodes-base.slackn8n-nodes-base.googleDocsn8n-nodes-base.googleDocsn8n-nodes-base.stickyNoten8n-nodes-base.stickyNote
PriceFree
Views0
Last Updated11/28/2025
workflow.json
{
  "id": "HI2iE8VwG75jxXJH",
  "meta": {
    "instanceId": "062f0e1ec3617ffb26cbc1b3c3518f28f3e57f08ddc210c471f532bb0bd6cf07"
  },
  "name": "Generate blog articles from RSS feeds with AI review",
  "tags": [],
  "nodes": [
    {
      "id": "d11df7cb-6c60-42a6-9a24-de65390adf7a",
      "name": "Sticky Note - Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -656,
        -16
      ],
      "parameters": {
        "width": 640,
        "height": 792,
        "content": "## 📰 RSS to Blog Article Generator with Human Approval\n\n### What This Workflow Does\nAutomatically converts RSS feed articles into detailed blog posts using AI, sends them for human review, and publishes approved articles to Google Docs with Slack notifications.\n\n### How It Works\n1. **Schedule Trigger** - Runs every 6 hours to check for new articles\n2. **RSS Feed** - Fetches latest articles from your RSS source\n3. **Data Processing** - Extracts key information (title, keywords, description)\n4. **AI Generation** - Creates detailed blog post using GPT-4\n5. **Human Review** - Sends article to reviewer via gotoHuman\n6. **Approval Check** - Routes approved/rejected articles\n7. **Google Docs** - Creates document with approved content\n8. **Slack Notification** - Alerts team of published article\n\n### Setup Requirements\n- OpenAI API key (GPT-4 access)\n- Google Docs account\n- gotoHuman account (for human-in-the-loop approval)\n- Slack workspace (for notifications)\n- RSS feed URL\n\n### Customization\n- Change RSS feed URL in \"RSS Read\" node\n- Adjust article length, tone, and keywords in \"Format RSS Data\" node\n- Modify AI prompt in \"Generate Article with AI\" node\n- Configure approval template in gotoHuman node\n- Set schedule frequency in \"Schedule Trigger\" node\n\n### Target Users\nContent teams, bloggers, news sites, marketing agencies who want to automate content creation while maintaining quality control."
      },
      "typeVersion": 1
    },
    {
      "id": "ef01e50e-5e8b-454b-b77c-1efbea20db43",
      "name": "Sticky Note - Step 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        16,
        432
      ],
      "parameters": {
        "color": 7,
        "height": 128,
        "content": "### 1️⃣ Scheduled Trigger\nRuns workflow every 6 hours to check for new RSS articles. Adjust the interval based on your content needs."
      },
      "typeVersion": 1
    },
    {
      "id": "45e8be75-c5d1-46da-b5e0-f66e47e0c4c3",
      "name": "Sticky Note - Step 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        208,
        160
      ],
      "parameters": {
        "color": 7,
        "height": 112,
        "content": "### 2️⃣ Fetch RSS Feed\nReads articles from your RSS feed. Replace the URL with your own RSS feed source."
      },
      "typeVersion": 1
    },
    {
      "id": "9c0ed906-df38-4b1d-842f-985bf8b615b1",
      "name": "Sticky Note - Step 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        448,
        432
      ],
      "parameters": {
        "color": 7,
        "height": 96,
        "content": "### 3️⃣ Process Data\nExtracts title, keywords, and description from RSS feed. Formats data for AI processing."
      },
      "typeVersion": 1
    },
    {
      "id": "606c9ace-1003-44da-b72e-f6b2f062c5a7",
      "name": "Sticky Note - Step 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        736,
        160
      ],
      "parameters": {
        "color": 7,
        "height": 112,
        "content": "### 4️⃣ AI Article Generation\nUses OpenAI to generate a detailed, structured blog article based on RSS content."
      },
      "typeVersion": 1
    },
    {
      "id": "72bd534f-a617-4d5e-bcff-f908b8ca9793",
      "name": "Sticky Note - Step 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        976,
        464
      ],
      "parameters": {
        "color": 7,
        "height": 112,
        "content": "### 5️⃣ Format Article Data\nStructures the AI-generated content with title, body, metadata, and word count."
      },
      "typeVersion": 1
    },
    {
      "id": "a1d59531-72b7-44c5-a86f-2f7777a5825d",
      "name": "Sticky Note - Step 6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1168,
        144
      ],
      "parameters": {
        "color": 7,
        "height": 128,
        "content": "### 6️⃣ Human Review Request\nSends article to designated reviewer via gotoHuman. Waits for approval/rejection."
      },
      "typeVersion": 1
    },
    {
      "id": "71db4973-03b3-47ca-b7d4-54e3c5e46c82",
      "name": "Sticky Note - Step 7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1392,
        448
      ],
      "parameters": {
        "color": 7,
        "height": 112,
        "content": "### 7️⃣ Approval Check\nRoutes workflow based on review decision. Approved articles proceed to publishing."
      },
      "typeVersion": 1
    },
    {
      "id": "5d87deaa-82bb-45f2-b69d-0996eba75eef",
      "name": "Sticky Note - Step 8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1744,
        112
      ],
      "parameters": {
        "color": 7,
        "height": 144,
        "content": "### 8️⃣ Publish to Google Docs\nCreates new Google Doc with article title and content, including metadata."
      },
      "typeVersion": 1
    },
    {
      "id": "0101e6ba-48c1-42c7-8ad1-9b6f3fd24a80",
      "name": "Sticky Note - Step 9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2064,
        144
      ],
      "parameters": {
        "color": 7,
        "height": 96,
        "content": "### 9️⃣ Team Notification\nSends formatted message to Slack with article details and approval information."
      },
      "typeVersion": 1
    },
    {
      "id": "aa539528-6344-4b14-9845-9b50212bbca9",
      "name": "Format RSS Data",
      "type": "n8n-nodes-base.code",
      "position": [
        496,
        288
      ],
      "parameters": {
        "jsCode": "// Extract and format RSS feed data for article generation\nconst items = $input.all();\n\nif (items.length === 0) {\n  throw new Error('No articles found in RSS feed');\n}\n\n// Process latest article (modify to process multiple articles if needed)\nconst rssData = items[0].json;\n\n// Extract topic from RSS title\nconst topic = rssData.title || rssData.headline || 'Untitled';\n\n// Get article description/summary\nconst description = rssData.content || rssData.description || rssData.summary || '';\n\n// Extract keywords from title (simple word extraction)\nconst keywords = topic\n  .replace(/[「」『』()()、。!?]/g, ' ')\n  .split(/\\s+/)\n  .filter(word => word.length > 2)\n  .slice(0, 5)\n  .join(', ');\n\nreturn [{\n  json: {\n    topic: topic,\n    keywords: keywords || 'Technology, News',\n    target_length: '1500-2000 words',\n    tone: 'Professional and accessible',\n    keywords_array: keywords.split(',').map(k => k.trim()).filter(k => k),\n    original_url: rssData.link || rssData.url || '',\n    original_title: topic,\n    original_description: description.substring(0, 200),\n    pub_date: rssData.pubDate || new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "fc26315d-54be-4d57-ab71-dbec113a0d3f",
      "name": "Generate Article with AI",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        736,
        288
      ],
      "parameters": {
        "text": "=You are a professional content writer. Based on the following news article, create a detailed and engaging blog post.\n\n【Source Article】\nTitle: {{ $json.original_title }}\nSummary: {{ $json.original_description }}\nSource URL: {{ $json.original_url }}\n\n【Writing Requirements】\n- Topic: {{ $json.topic }}\n- Keywords: {{ $json.keywords }}\n- Target length: {{ $json.target_length }}\n- Tone: {{ $json.tone }}\n\n【Article Structure】\nPlease create the article with the following structure:\n\n# Compelling Title (specific and engaging)\n\n## Introduction (200 words)\n- Background of this news\n- Why it matters\n\n## Detailed Analysis\n### Point 1: Overview\n- What happened\n\n### Point 2: Impact\n- What are the implications\n\n### Point 3: Future Outlook\n- What's next\n\n## Summary (150 words)\n- Key takeaways\n\n---\nMeta Description (120 characters max)",
        "options": {
          "systemMessage": "You are a professional content writer who creates valuable, detailed articles based on news sources."
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "a553796b-fbc8-40a5-8183-a464cd7beb6c",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        736,
        496
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o",
          "cachedResultName": "gpt-4o"
        },
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "ad35b96a-db22-4ee9-805a-a9934a651060",
      "name": "Create Google Doc",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1696,
        272
      ],
      "parameters": {
        "title": "={{ $('Format RSS Data').item.json.original_title }}",
        "driveId": "=",
        "folderId": "="
      },
      "typeVersion": 2
    },
    {
      "id": "47080e37-1411-4c11-a2da-1ae9d39cbaac",
      "name": "Add Article Content",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1920,
        272
      ],
      "parameters": {
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ $('Structure Article Data').item.json.article_body }}",
              "action": "insert"
            },
            {
              "text": "=\\n\\n---\\n【Article Information】\\nSource: {{ $('Structure Article Data').item.json.original_url }}\\nOriginal Title: {{ $('Structure Article Data').item.json.original_title }}\\nReviewer: {{ $('Request Human Review').item.json.reviewer_name }}\\nApproval Date: {{ $now.toLocaleString('en-US') }}\\nWord Count: {{ $('Structure Article Data').item.json.word_count }} words",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ $json.id }}"
      },
      "typeVersion": 2
    },
    {
      "id": "c2010b96-cc13-4347-b2cb-2ca2d9acb4bd",
      "name": "Article Published",
      "type": "n8n-nodes-base.noOp",
      "position": [
        2448,
        272
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "d2995df2-e9aa-499d-accf-63fc84c9757e",
      "name": "Article Rejected",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1696,
        464
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "096749ba-d451-4e52-a32c-db1c15b27e58",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        64,
        288
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "1bd48d89-2933-4af7-bdaf-99b7a240ca17",
      "name": "RSS Read",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        272,
        288
      ],
      "parameters": {
        "url": "https://example.com/rss-feed.xml",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "781ba339-0ab9-45f1-891f-613f5102cbbf",
      "name": "Structure Article Data",
      "type": "n8n-nodes-base.code",
      "position": [
        1024,
        288
      ],
      "parameters": {
        "jsCode": "// Structure AI-generated article with metadata\nconst aiOutput = $input.item.json.output || $input.item.json.text || '';\nconst inputData = $input.item.json;\n\n// Extract title (first # line)\nconst titleMatch = aiOutput.match(/^#\\s+(.+)$/m);\nconst title = titleMatch ? titleMatch[1] : inputData.original_title;\n\n// Extract meta description\nconst metaMatch = aiOutput.match(/---\\s*\\n([\\s\\S]+)$/);\nconst metaDescription = metaMatch ? metaMatch[1].trim() : '';\n\n// Article body (excluding meta description)\nconst articleBody = metaDescription ? aiOutput.replace(/---\\s*\\n[\\s\\S]+$/, '').trim() : aiOutput;\n\nreturn {\n  json: {\n    topic: inputData.topic,\n    keywords: inputData.keywords,\n    keywords_array: inputData.keywords_array,\n    target_length: inputData.target_length,\n    tone: inputData.tone,\n    title: title,\n    article_body: articleBody,\n    meta_description: metaDescription,\n    word_count: articleBody.replace(/[#\\s]/g, '').length,\n    original_url: inputData.original_url,\n    original_title: inputData.original_title,\n    pub_date: inputData.pub_date,\n    created_at: new Date().toISOString()\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "75f63a4a-250a-4066-a615-16c70a3ca1f4",
      "name": "Request Human Review",
      "type": "@gotohuman/n8n-nodes-gotohuman.gotoHuman",
      "position": [
        1232,
        288
      ],
      "webhookId": "rss-blog-template",
      "parameters": {
        "fields": {
          "value": {
            "topic": "={{ $json.topic }}",
            "keywords": "={{ $json.keywords }}",
            "word_count": "={{ $json.word_count }}",
            "article_body": "={{ $json.article_body }}",
            "original_url": "{{ $json.original_url }}",
            "article_title": "={{ $json.title }}",
            "meta_description": "={{ $json.meta_description }}"
          },
          "schema": [
            {
              "id": "topic",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "topic (text)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "keywords",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "keywords (text)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "article_title",
              "type": "string",
              "display": true,
              "removed": false,
              "required": true,
              "displayName": "article_title (text)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "article_body",
              "type": "string",
              "display": true,
              "removed": false,
              "required": true,
              "displayName": "article_body (longText)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "meta_description",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "meta_description (text)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "word_count",
              "type": "number",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "word_count (number)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "original_url",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "original_url (text)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "assignments": [
            {
              "id": "topic",
              "value": "={{ $json.topic }}"
            },
            {
              "id": "keywords",
              "value": "={{ $json.keywords }}"
            },
            {
              "id": "article_title",
              "value": "={{ $json.title }}"
            },
            {
              "id": "article_body",
              "value": "={{ $json.article_body }}"
            },
            {
              "id": "meta_description",
              "value": "={{ $json.meta_description }}"
            },
            {
              "id": "word_count",
              "value": "={{ $json.word_count }}"
            },
            {
              "id": "original_url",
              "value": "={{ $json.original_url }}"
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "additionalFields": {},
        "reviewTemplateID": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOTOHUMAN_TEMPLATE_ID",
          "cachedResultName": "Article Review Template"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4c680e9e-6405-4505-8db7-73a66480b594",
      "name": "Check Approval Status",
      "type": "n8n-nodes-base.if",
      "position": [
        1456,
        288
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "condition-approval-1",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.response }}",
              "rightValue": "approved"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "149e2699-ff1f-40a0-873c-b4f9e26416fc",
      "name": "Send Slack Notification",
      "type": "n8n-nodes-base.slack",
      "position": [
        2128,
        272
      ],
      "webhookId": "rss-blog-template-slack",
      "parameters": {
        "text": "=✅ New blog article published from RSS feed!\n📝 Title: {{ $('Structure Article Data').item.json.title }}\n📊 Word Count: {{ $('Structure Article Data').item.json.word_count }} words\n🎯 Keywords: {{ $('Structure Article Data').item.json.keywords || 'Technology, News' }}\n👤 Reviewer: {{ $('Request Human Review').item.json.respondingUser || 'Team' }}\n📅 Approval Date: {{ $now.toLocaleString('en-US') }}\n🌐 *Source URL:* {{ $('Structure Article Data').item.json.original_url || 'https://example.com' }}\n💬 Meta Description:\n{{ $('Structure Article Data').item.json.meta_description }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_SLACK_CHANNEL_ID",
          "cachedResultName": "Your Slack Channel"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.2
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c81976c3-4fda-4118-8efb-043d941627f8",
  "connections": {
    "RSS Read": {
      "main": [
        [
          {
            "node": "Format RSS Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format RSS Data": {
      "main": [
        [
          {
            "node": "Generate Article with AI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "RSS Read",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Google Doc": {
      "main": [
        [
          {
            "node": "Add Article Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Article with AI",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Add Article Content": {
      "main": [
        [
          {
            "node": "Send Slack Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Request Human Review": {
      "main": [
        [
          {
            "node": "Check Approval Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Approval Status": {
      "main": [
        [
          {
            "node": "Create Google Doc",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Article Rejected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structure Article Data": {
      "main": [
        [
          {
            "node": "Request Human Review",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Slack Notification": {
      "main": [
        [
          {
            "node": "Article Published",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Article with AI": {
      "main": [
        [
          {
            "node": "Structure Article Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

相关工作流