AutomationFlowsAI & RAG › Scheduled Auto-Post to Blogger

Scheduled Auto-Post to Blogger

Original n8n title: Blogger Auto Post - Scheduled

Blogger Auto Post - Scheduled. Uses httpRequest. Scheduled trigger; 8 nodes.

Cron / scheduled trigger★★★★☆ complexity8 nodesHTTP Request
AI & RAG Trigger: Cron / scheduled Nodes: 8 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "Blogger Auto Post - Scheduled",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 */3 * * *"
            }
          ]
        }
      },
      "id": "schedule-trigger",
      "name": "Every 3 Hours Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "method": "GET",
        "url": "https://newsapi.org/v2/top-headlines",
        "authentication": "none",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "country",
              "value": "kr"
            },
            {
              "name": "category",
              "value": "technology"
            },
            {
              "name": "pageSize",
              "value": "5"
            },
            {
              "name": "apiKey",
              "value": "={{ $env.NEWS_API_KEY || 'YOUR_NEWS_API_KEY' }}"
            }
          ]
        },
        "options": {}
      },
      "id": "fetch-news",
      "name": "Fetch News (Optional)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        460,
        200
      ],
      "disabled": true
    },
    {
      "parameters": {
        "method": "GET",
        "url": "=https://www.googleapis.com/blogger/v3/blogs/{{ $env.BLOGGER_BLOG_ID }}/posts",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleOAuth2Api",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "maxResults",
              "value": "1"
            },
            {
              "name": "orderBy",
              "value": "UPDATED"
            }
          ]
        },
        "options": {}
      },
      "id": "check-recent-posts",
      "name": "Check Recent Posts",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        460,
        400
      ],
      "credentials": {
        "googleOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// \uc790\ub3d9 \ube14\ub85c\uadf8 \ud3ec\uc2a4\ud2b8 \uc0dd\uc131\n// \uc774 \ub178\ub4dc\ub97c \uc218\uc815\ud558\uc5ec \uc6d0\ud558\ub294 \ucf58\ud150\uce20\ub97c \uc0dd\uc131\ud558\uc138\uc694\n\nconst today = new Date();\nconst dateStr = today.toISOString().split('T')[0];\nconst dayNames = ['\uc77c', '\uc6d4', '\ud654', '\uc218', '\ubaa9', '\uae08', '\ud1a0'];\nconst dayName = dayNames[today.getDay()];\n\n// --- \ucf58\ud150\uce20 \ud15c\ud50c\ub9bf ---\n// \uc5ec\uae30\ub97c \uc218\uc815\ud558\uc5ec \uc6d0\ud558\ub294 \ud3ec\uc2a4\ud2b8 \ub0b4\uc6a9\uc744 \uc124\uc815\ud558\uc138\uc694\nconst templates = [\n  {\n    title: `[${dateStr}] \uc624\ub298\uc758 \uae30\uc220 \ud2b8\ub80c\ub4dc`,\n    content: `<h2>\ud83d\udcc5 ${dateStr} (${dayName}\uc694\uc77c) \uae30\uc220 \ud2b8\ub80c\ub4dc</h2>\n<p>\uc624\ub298\uc758 \uc8fc\uc694 \uae30\uc220 \ub3d9\ud5a5\uc744 \uc815\ub9ac\ud569\ub2c8\ub2e4.</p>\n<h3>\ud83d\udd25 \uc8fc\uc694 \ub274\uc2a4</h3>\n<ul>\n<li>AI \uae30\uc220 \ubc1c\uc804 \ub3d9\ud5a5</li>\n<li>\ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305 \ud2b8\ub80c\ub4dc</li>\n<li>\uc624\ud508\uc18c\uc2a4 \ud504\ub85c\uc81d\ud2b8 \uc5c5\ub370\uc774\ud2b8</li>\n</ul>\n<h3>\ud83d\udca1 \uc778\uc0ac\uc774\ud2b8</h3>\n<p>\uae30\uc220 \ud2b8\ub80c\ub4dc\uc5d0 \ub300\ud55c \ubd84\uc11d\uacfc \uc758\uacac\uc744 \uacf5\uc720\ud569\ub2c8\ub2e4.</p>\n<hr>\n<p><em>\uc774 \ud3ec\uc2a4\ud2b8\ub294 n8n \uc790\ub3d9\ud654\ub97c \ud1b5\ud574 \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.</em></p>`,\n    labels: ['\uae30\uc220', '\ud2b8\ub80c\ub4dc', '\uc790\ub3d9\ud654', dateStr]\n  },\n  {\n    title: `[${dateStr}] AI & \ud504\ub85c\uadf8\ub798\ubc0d \uc778\uc0ac\uc774\ud2b8`,\n    content: `<h2>\ud83e\udd16 ${dateStr} AI & \ud504\ub85c\uadf8\ub798\ubc0d</h2>\n<p>\uc778\uacf5\uc9c0\ub2a5\uacfc \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \uc624\ub298\uc758 \uc778\uc0ac\uc774\ud2b8\uc785\ub2c8\ub2e4.</p>\n<h3>\ud83d\udcca AI \ub3d9\ud5a5</h3>\n<ul>\n<li>\ub300\ud615 \uc5b8\uc5b4 \ubaa8\ub378(LLM) \uc5c5\ub370\uc774\ud2b8</li>\n<li>AI \ucf54\ub529 \uc5b4\uc2dc\uc2a4\ud134\ud2b8 \ud65c\uc6a9\ubc95</li>\n<li>\uba38\uc2e0\ub7ec\ub2dd \uc2e4\uc804 \ud301</li>\n</ul>\n<h3>\ud83d\udcbb \uac1c\ubc1c \ud301</h3>\n<p>\uc2e4\ubb34\uc5d0\uc11c \uc720\uc6a9\ud55c \uac1c\ubc1c \ud301\uc744 \uacf5\uc720\ud569\ub2c8\ub2e4.</p>\n<hr>\n<p><em>\uc774 \ud3ec\uc2a4\ud2b8\ub294 n8n \uc790\ub3d9\ud654\ub97c \ud1b5\ud574 \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.</em></p>`,\n    labels: ['AI', '\ud504\ub85c\uadf8\ub798\ubc0d', '\uc790\ub3d9\ud654', dateStr]\n  },\n  {\n    title: `[${dateStr}] \uc0dd\uc0b0\uc131 & \uc790\ub3d9\ud654 \uac00\uc774\ub4dc`,\n    content: `<h2>\u26a1 ${dateStr} \uc0dd\uc0b0\uc131 \uac00\uc774\ub4dc</h2>\n<p>\uc5c5\ubb34 \ud6a8\uc728\uc744 \ub192\uc774\ub294 \uc790\ub3d9\ud654 \ud301\uc744 \uacf5\uc720\ud569\ub2c8\ub2e4.</p>\n<h3>\ud83d\udee0 \uc790\ub3d9\ud654 \ub3c4\uad6c</h3>\n<ul>\n<li>n8n \uc6cc\ud06c\ud50c\ub85c\uc6b0 \ud65c\uc6a9</li>\n<li>API \ud1b5\ud569 \uc790\ub3d9\ud654</li>\n<li>\uc2a4\ucf00\uc904\ub9c1 \ucd5c\uc801\ud654</li>\n</ul>\n<h3>\ud83d\udcc8 \uc0dd\uc0b0\uc131 \ud5a5\uc0c1</h3>\n<p>\ub354 \uc801\uc740 \uc2dc\uac04\uc73c\ub85c \ub354 \ub9ce\uc740 \uacb0\uacfc\ub97c \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4.</p>\n<hr>\n<p><em>\uc774 \ud3ec\uc2a4\ud2b8\ub294 n8n \uc790\ub3d9\ud654\ub97c \ud1b5\ud574 \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.</em></p>`,\n    labels: ['\uc0dd\uc0b0\uc131', '\uc790\ub3d9\ud654', '\uac00\uc774\ub4dc', dateStr]\n  }\n];\n\n// \uc694\uc77c\uc5d0 \ub530\ub77c \ub2e4\ub978 \ud15c\ud50c\ub9bf \uc120\ud0dd\nconst templateIndex = today.getDay() % templates.length;\nconst selectedTemplate = templates[templateIndex];\n\nreturn [{\n  json: {\n    title: selectedTemplate.title,\n    content: selectedTemplate.content,\n    labels: selectedTemplate.labels,\n    generatedAt: today.toISOString()\n  }\n}];"
      },
      "id": "generate-content",
      "name": "Generate Blog Content",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        700,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://www.googleapis.com/blogger/v3/blogs/{{ $env.BLOGGER_BLOG_ID }}/posts",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleOAuth2Api",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"kind\": \"blogger#post\",\n  \"title\": {{ JSON.stringify($json.title) }},\n  \"content\": {{ JSON.stringify($json.content) }},\n  \"labels\": {{ JSON.stringify($json.labels) }}\n}",
        "options": {
          "response": {
            "response": {
              "fullResponse": true
            }
          }
        }
      },
      "id": "publish-to-blogger",
      "name": "Publish to Blogger",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        940,
        300
      ],
      "credentials": {
        "googleOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "log-status",
              "name": "status",
              "value": "published",
              "type": "string"
            },
            {
              "id": "log-post-id",
              "name": "postId",
              "value": "={{ $json.body.id || $json.id }}",
              "type": "string"
            },
            {
              "id": "log-post-url",
              "name": "postUrl",
              "value": "={{ $json.body.url || $json.url }}",
              "type": "string"
            },
            {
              "id": "log-title",
              "name": "title",
              "value": "={{ $json.body.title || $json.title }}",
              "type": "string"
            },
            {
              "id": "log-time",
              "name": "publishedAt",
              "value": "={{ $now.toISO() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "log-result",
      "name": "Log Result",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1160,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "check-success",
              "leftValue": "={{ $json.statusCode }}",
              "rightValue": 200,
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            }
          ],
          "combinator": "or"
        },
        "options": {}
      },
      "id": "check-success",
      "name": "Published OK?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        940,
        500
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "error-msg",
              "name": "error",
              "value": "={{ $json.body.error.message || $json.error || 'Blogger API \ud638\ucd9c \uc2e4\ud328' }}",
              "type": "string"
            },
            {
              "id": "error-code",
              "name": "statusCode",
              "value": "={{ $json.statusCode || 500 }}",
              "type": "number"
            }
          ]
        },
        "options": {}
      },
      "id": "handle-error",
      "name": "Handle Error",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1160,
        500
      ]
    }
  ],
  "connections": {
    "Daily 9AM Trigger": {
      "main": [
        [
          {
            "node": "Check Recent Posts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Recent Posts": {
      "main": [
        [
          {
            "node": "Generate Blog Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Blog Content": {
      "main": [
        [
          {
            "node": "Publish to Blogger",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Publish to Blogger": {
      "main": [
        [
          {
            "node": "Published OK?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Published OK?": {
      "main": [
        [
          {
            "node": "Log Result",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Handle Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "callerPolicy": "workflowsFromSameOwner"
  },
  "staticData": null,
  "tags": [
    {
      "name": "blogger",
      "id": "1"
    },
    {
      "name": "scheduled",
      "id": "2"
    },
    {
      "name": "automation",
      "id": "3"
    }
  ],
  "triggerCount": 1
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Blogger Auto Post - Scheduled. Uses httpRequest. Scheduled trigger; 8 nodes.

Source: https://github.com/dh914/Agent/blob/3ac876e6be29a19f188c0a9a359f5fc125739ede/x-automation/n8n-workflows/blogger-auto-post-schedule.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Master Agent - Orchestrator. Uses httpRequest, telegram, telegramTrigger. Scheduled trigger; 46 nodes.

HTTP Request, Telegram, Telegram Trigger
AI & RAG

Reputation Engine — Content Research Agent. Uses httpRequest. Scheduled trigger; 45 nodes.

HTTP Request
AI & RAG

Master Agent - Orchestrator. Uses httpRequest, telegram, telegramTrigger. Scheduled trigger; 43 nodes.

HTTP Request, Telegram, Telegram Trigger
AI & RAG

Linkedin Workflow. Uses httpRequest, googleSheets. Scheduled trigger; 39 nodes.

HTTP Request, Google Sheets
AI & RAG

I prepared a detailed guide that shows the whole process of building an AI tool to analyze Instagram Reels using n8n.

HTTP Request, Airtable, Execute Workflow Trigger