8
n8n ํ•œ๊ตญ์–ดamn8n.com

๐Ÿ’ฅ ๋น„๋””์˜ค ๋งํฌ์—์„œ YouTube ์ธ๋„ค์ผ ์ž๋™ ์ƒ์„ฑ

๊ณ ๊ธ‰

์ด๊ฒƒ์€Content Creation, Multimodal AI๋ถ„์•ผ์˜์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ๋กœ, 25๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.์ฃผ๋กœ Set, Code, Wait, Gmail, Telegram ๋“ฑ์˜ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ. Templated.io ๋ฐ Blotato๋ฅผ ์‚ฌ์šฉํ•œ YouTube ์ธ๋„ค์ผ ์ƒ์„ฑ ๋ฐ ์†Œ์…œ ๋ฏธ๋””์–ด ๊ฒŒ์‹œ ์ž๋™ํ™”

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ
  • โ€ขGoogle ๊ณ„์ • ๋ฐ Gmail API ์ธ์ฆ ์ •๋ณด
  • โ€ขTelegram Bot Token
  • โ€ขGoogle Drive API ์ธ์ฆ ์ •๋ณด
  • โ€ข๋Œ€์ƒ API์˜ ์ธ์ฆ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ
  • โ€ขGoogle Sheets API ์ธ์ฆ ์ •๋ณด
  • โ€ขOpenAI API Key
์›Œํฌํ”Œ๋กœ์šฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
๋…ธ๋“œ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉฐ, ํ™•๋Œ€/์ถ•์†Œ ๋ฐ ์ด๋™์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค
์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด๋ณด๋‚ด๊ธฐ
๋‹ค์Œ JSON ๊ตฌ์„ฑ์„ ๋ณต์‚ฌํ•˜์—ฌ n8n์— ๊ฐ€์ ธ์˜ค๋ฉด ์ด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
{
  "id": "OJZHlaGLkOyFR7ut",
  "meta": {
    "instanceId": "de822f81f3a2367cef7d9549771a77783236bc9596481be2ae65c05fbcc4b4fd",
    "templateCredsSetupCompleted": true
  },
  "name": "๐Ÿ’ฅ  Automate YouTube thumbnail creation from video links -vide",
  "tags": [],
  "nodes": [
    {
      "id": "41092605-3611-4017-828a-3c7bb41a2eb6",
      "name": "Telegram ํŠธ๋ฆฌ๊ฑฐ",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        4016,
        864
      ],
      "webhookId": "71c3ceda-ca60-42bd-beb6-845035069dc2",
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "id": "zT2gC4wPXibPyra1",
          "name": "Telegram - templated"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "dec01d59-d7a5-4a53-9971-e62a276cbbfb",
      "name": "์›Œํฌํ”Œ๋กœ์šฐ ์„ค์ •",
      "type": "n8n-nodes-base.set",
      "position": [
        4256,
        864
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "youtubeApiKey",
              "type": "string",
              "value": "YOUR_YOUTUBE_API_KEY"
            },
            {
              "id": "id-3",
              "name": "templatedTemplateId",
              "type": "string",
              "value": "YOUR_TEMPLATE_ID"
            },
            {
              "id": "id-4",
              "name": "googleDriveFolderId",
              "type": "string",
              "value": "YOUR_DRIVE_FOLDER_ID"
            },
            {
              "id": "id-5",
              "name": "googleSheetsId",
              "type": "string",
              "value": "YOUR_SHEETS_ID"
            },
            {
              "id": "id-6",
              "name": "emailRecipient",
              "type": "string",
              "value": "YOUR_EMAIL_ADDRESS"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "7bda8d47-fc97-4372-a447-c23bc0bd3c8f",
      "name": "๋™์˜์ƒ ID ์ถ”์ถœ",
      "type": "n8n-nodes-base.code",
      "position": [
        4480,
        864
      ],
      "parameters": {
        "jsCode": "// Extract YouTube video ID from Telegram message\nconst items = $input.all();\nconst outputItems = [];\n\nfor (const item of items) {\n  const messageText = item.json.message?.text || '';\n  \n  // Regex patterns for various YouTube URL formats\n  const patterns = [\n    /(?:youtube\\.com\\/watch\\?v=)([a-zA-Z0-9_-]{11})/,\n    /(?:youtu\\.be\\/)([a-zA-Z0-9_-]{11})/,\n    /(?:youtube\\.com\\/embed\\/)([a-zA-Z0-9_-]{11})/,\n    /(?:youtube\\.com\\/v\\/)([a-zA-Z0-9_-]{11})/,\n    /(?:youtube\\.com\\/shorts\\/)([a-zA-Z0-9_-]{11})/\n  ];\n  \n  let videoId = null;\n  \n  // Try each pattern until we find a match\n  for (const pattern of patterns) {\n    const match = messageText.match(pattern);\n    if (match && match[1]) {\n      videoId = match[1];\n      break;\n    }\n  }\n  \n  if (videoId) {\n    outputItems.push({\n      json: {\n        videoId: videoId,\n        videoUrl: `https://www.youtube.com/watch?v=${videoId}`,\n        originalMessage: messageText\n      }\n    });\n  } else {\n    // If no video ID found, pass through with error flag\n    outputItems.push({\n      json: {\n        error: 'No valid YouTube URL found in message',\n        originalMessage: messageText\n      }\n    });\n  }\n}\n\nreturn outputItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "0cc8b6fe-9fe9-41ac-aa66-4a90e1995f70",
      "name": "YouTube ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4768,
        864
      ],
      "parameters": {
        "url": "https://www.googleapis.com/youtube/v3/videos",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "part",
              "value": "snippet"
            },
            {
              "name": "id",
              "value": "={{ $json.videoId }}"
            },
            {
              "name": "key",
              "value": "={{ $('Workflow Configuration').first().json.youtubeApiKey }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "6f6ed14b-0e3c-45e3-8e78-72cc4748db90",
      "name": "ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ค€๋น„",
      "type": "n8n-nodes-base.code",
      "position": [
        5040,
        864
      ],
      "parameters": {
        "jsCode": "// Normalize YouTube API responses and extract fields for thumbnail generation\n\nconst inputItems = $input.all();\nconst out = [];\n\nfor (const item of inputItems) {\n  // Handle string payloads (if HTTP node returned text)\n  let root = item.json ?? {};\n  if (typeof root === 'string') {\n    try { root = JSON.parse(root); } catch (e) { root = {}; }\n  }\n\n  // Build a uniform array of \"video\" records to iterate\n  let videos = [];\n  if (Array.isArray(root.items)) {\n    videos = root.items; // videoListResponse (videos.list) or search.list\n  } else if (root.kind === 'youtube#video') {\n    videos = [root]; // single video object shape\n  } else {\n    // Fallback: maybe the current item itself is a snippet\n    if (root.snippet) videos = [root];\n  }\n\n  for (const v of videos) {\n    const snippet = v.snippet || {};\n    // videoId can be under v.id (videos.list) or v.id.videoId (search.list)\n    const videoId = (v.id && typeof v.id === 'object') ? (v.id.videoId || '') : (v.id || '');\n\n    // Title (trim to 60 chars max)\n    let title = snippet.title || '';\n    if (title.length > 60) title = title.slice(0, 57) + '...';\n\n    const description = snippet.description || '';\n    const channelTitle = snippet.channelTitle || '';\n    const publishedAt = snippet.publishedAt || '';\n\n    // Choose best available thumbnail\n    const t = snippet.thumbnails || {};\n    const thumbnailUrl =\n      (t.maxres && t.maxres.url) ||\n      (t.standard && t.standard.url) ||\n      (t.high && t.high.url) ||\n      (t.medium && t.medium.url) ||\n      (t.default && t.default.url) ||\n      '';\n\n    out.push({\n      json: {\n        title,\n        description,\n        videoId,\n        channelTitle,\n        publishedAt,\n        thumbnailUrl,\n      },\n    });\n  }\n}\n\n// If nothing matched, still return a single empty item to avoid node errors\nif (out.length === 0) {\n  out.push({ json: { title: '', description: '', videoId: '', channelTitle: '', publishedAt: '', thumbnailUrl: '' } });\n}\n\nreturn out;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "f391676c-8826-4a3e-b19a-2e58c7e7c796",
      "name": "๋ Œ๋”๋ง ๋Œ€๊ธฐ",
      "type": "n8n-nodes-base.wait",
      "position": [
        4768,
        1152
      ],
      "webhookId": "853c0ca8-14b7-4854-878f-89d5787e9fc8",
      "parameters": {
        "unit": "minutes",
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "ca6a5f90-4174-42dc-a4f5-f1c14d4f2f40",
      "name": "Google ๋“œ๋ผ์ด๋ธŒ ์—…๋กœ๋“œ",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        4256,
        1440
      ],
      "parameters": {
        "name": "={{ $('Extract Video ID').first().json.videoId }}_thumbnail_{{ $('Prepare Text Data').first().json.title }}.png",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.googleDriveFolderId }}"
        },
        "inputDataFieldName": "thumbnail"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "odf7JAwyqVFVZBhQ",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "7ea4143c-b953-4430-908b-e7b13a8ff7eb",
      "name": "Gmail ์ „์†ก",
      "type": "n8n-nodes-base.gmail",
      "position": [
        4768,
        1440
      ],
      "webhookId": "17c8a017-1821-4519-be49-1ee16ef91109",
      "parameters": {
        "sendTo": "={{ $('Workflow Configuration').first().json.emailRecipient }}",
        "message": "=<h2>YouTube Thumbnail Generated Successfully</h2>\n<p>A new thumbnail has been generated for your YouTube video.</p>\n<h3>Video Details:</h3>\n<ul>\n  <li><strong>Title:</strong> {{ $('Prepare Text Data').first().json.title }}</li>\n  <li><strong>Channel:</strong> {{ $('Prepare Text Data').first().json.channelTitle }}</li>\n  <li><strong>Video ID:</strong> {{ $('Extract Video ID').first().json.videoId }}</li>\n</ul>\n<h3>Thumbnail:</h3>\n<p>The thumbnail has been uploaded to Google Drive and is attached to this email.</p>\n<p><strong>Google Drive Link:</strong> <a href=\"{{ $('Upload to Google Drive').first().json.webViewLink }}\">View in Google Drive</a></p>\n<p>Thank you for using our YouTube Thumbnail Generator!</p>",
        "options": {},
        "subject": "=YouTube Thumbnail Generated: {{ $('Prepare Text Data').first().json.title }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "SYGi4mCMfmxi8gK3",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "e52e1427-e362-4731-9a4c-92a5e4610687",
      "name": "Telegram ์•Œ๋ฆผ ์ „์†ก",
      "type": "n8n-nodes-base.telegram",
      "position": [
        5040,
        1440
      ],
      "webhookId": "4424fef6-e1c1-4b7f-b599-9239c8b0ca82",
      "parameters": {
        "file": "={{ $('Downloading files').item.json.url }}",
        "chatId": "={{ $('Telegram Trigger').first().json.message.chat.id }}",
        "operation": "sendPhoto",
        "additionalFields": {
          "caption": "=โœ… Thumbnail generated for: {{ $('Prepare Text Data').first().json.title }}\n\n๐Ÿ”— Google Drive: {{ $('Upload to Google Drive').first().json.webViewLink }}"
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "zT2gC4wPXibPyra1",
          "name": "Telegram - templated"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "b5ee3daa-64ce-4782-837d-142bc5ee3c77",
      "name": "OpenAI ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ฑ",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        4016,
        1728
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "id",
          "value": "gpt-4o-mini"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are a social media expert creating viral posts for YouTube promotions. Write engaging, platform-optimized captions."
            },
            {
              "content": "=Create a compelling social media post for: {{ $('Prepare Text Data').first().json.title }}\n\nContext: {{ $('Prepare Text Data').first().json.description }}\n\nRequirements:\n- Start with attention-grabbing hook\n- Highlight 2-3 key points\n- Include strong call-to-action\n- Add 5-8 relevant hashtags\n- Format: Keep under 1000 characters for LinkedIn\n- Include video URL: {{ $('Extract Video ID').first().json.videoUrl }}"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "QmtwfFk8iBkuCXOX",
          "name": "n8n free OpenAI API credits"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "5210d570-ac35-4175-b783-af582160befa",
      "name": "BLOTATO์— ๋™์˜์ƒ ์—…๋กœ๋“œ",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        4352,
        1728
      ],
      "parameters": {
        "mediaUrl": "={{ $('Downloading files').item.json.url }}",
        "resource": "media"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "9d78b633-b9d3-47a4-bcd7-0e48739cf0eb",
      "name": "Linkedin",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        4768,
        1728
      ],
      "parameters": {
        "options": {},
        "platform": "linkedin",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "1446",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/1446",
          "cachedResultName": "Samuel Amalric"
        },
        "postContentText": "={{ $('OpenAI Post Generation').item.json.message.content }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "caadaf4e-8b06-41b6-950c-41846f684915",
      "name": "Facebook",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        4560,
        1728
      ],
      "parameters": {
        "options": {},
        "platform": "facebook",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "1759",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/1759",
          "cachedResultName": "Firass Ben"
        },
        "facebookPageId": {
          "__rl": true,
          "mode": "list",
          "value": "101603614680195",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/1759/subaccounts/101603614680195",
          "cachedResultName": "Dr. Firas"
        },
        "postContentText": "={{ $('OpenAI Post Generation').item.json.message.content }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "06b1aa18-c78f-4d52-9ddb-6532eae175f4",
      "name": "Twitter (X)",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        5024,
        1728
      ],
      "parameters": {
        "options": {},
        "platform": "twitter",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "1289",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/1289",
          "cachedResultName": "Docteur_Firas"
        },
        "postContentText": "={{ $('OpenAI Post Generation').item.json.message.content }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "0b9bc493-3327-429e-88d8-4de803f4c800",
      "name": "OpenAI ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ฑ1",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        4016,
        1152
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "id",
          "value": "gpt-4o-mini"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are an expert French copywriter who specializes in creating short, punchy, and visually effective YouTube thumbnail texts.\nYour goal is to write 4 concise and impactful text elements in French, based on the provided YouTube video title, description, and channel context.\nKeep the phrasing visually strong and emotionally engaging โ€” it must capture attention at first glance.\nAvoid emojis, hashtags, and punctuation except when necessary for readability.\nEach phrase should be formatted as plain text (no markdown, no quotes)."
            },
            {
              "content": "=Based on the following information:\n\nVideo Title: {{ $json.title }}\n\nVideo Description: {{ $json.description }}\n\nChannel Name: {{ $json.channelTitle }}\n\nGenerate 4 text elements for a YouTube thumbnail in French:\n\nMain Title (Top) โ€” 3 strong words maximum that summarize the main idea or hook. maximum 20 characters.\n\nSecondary Title (Center) โ€” 4 words maximum that create curiosity or highlight the benefit of the video. maximum 20 characters.\n\nBottom Title (Footer) โ€” a short supportive phrase or promise related to the topic. maximum 20 characters.\n\nLabel (Top-Right) โ€” one single keyword describing the type of content (e.g. โ€œTutorielโ€, โ€œAstuceโ€, โ€œWorkflowโ€, โ€œCoursโ€, โ€œFormationโ€).\n\nConstraints:\n\nAll outputs must be in French.\n\nUse natural, human language that feels like it belongs on a modern YouTube thumbnail.\n\nAvoid repeating the exact same words as in the video title โ€” paraphrase creatively.\n\nOutput in this JSON structure:\n\n{\n  \"main_title\": \"...\",\n  \"center_title\": \"...\",\n  \"bottom_title\": \"...\",\n  \"label\": \"...\"\n}"
            }
          ]
        },
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "id": "QmtwfFk8iBkuCXOX",
          "name": "n8n free OpenAI API credits"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "17b9ee87-c823-4eab-9f6a-63cd3926ea2e",
      "name": "์ธ๋„ค์ผ ๋‹ค์šด๋กœ๋“œ",
      "type": "n8n-nodes-templated.templated",
      "position": [
        5040,
        1152
      ],
      "parameters": {
        "renderId": "={{ $json.id }}",
        "operation": "retrieveRender",
        "requestOptions": {}
      },
      "credentials": {
        "templatedApi": {
          "id": "N8DKDKLktjraHiaQ",
          "name": "Templated account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3b65e073-31be-4bcf-bcf2-f126a3199ca7",
      "name": "Templated.io๋ฅผ ํ†ตํ•œ ์ธ๋„ค์ผ ์ƒ์„ฑ",
      "type": "n8n-nodes-templated.templated",
      "position": [
        4480,
        1152
      ],
      "parameters": {
        "layers": {
          "layer": [
            {
              "text": "={{ $json.message.content.main_title }}",
              "layerName": "title-1"
            },
            {
              "text": "={{ $json.message.content.center_title }}",
              "layerName": "title-2"
            },
            {
              "text": "={{ $json.message.content.label }}",
              "layerName": "word"
            },
            {
              "text": "={{ $json.message.content.bottom_title }}",
              "layerName": "episode"
            }
          ]
        },
        "template": {
          "__rl": true,
          "mode": "list",
          "value": "e97fb8b6-d548-4e19-8783-d924f1a93af3",
          "cachedResultName": "Thumbnail YT n8n"
        },
        "requestOptions": {}
      },
      "credentials": {
        "templatedApi": {
          "id": "N8DKDKLktjraHiaQ",
          "name": "Templated account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1f2550f0-076a-4f7d-9b88-f84767527a9e",
      "name": "ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ์ค‘",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4032,
        1440
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file",
              "outputPropertyName": "thumbnail"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "fc02c5c7-c022-47fd-9c1a-44e6b76df0a1",
      "name": "Google ์‹œํŠธ์— ์ €์žฅ",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4480,
        1440
      ],
      "parameters": {
        "columns": {
          "value": {
            "STATUS": "created",
            "ID VIDEO": "={{ $('Prepare Text Data').first().json.videoId }}",
            "YOUTUBE URL": "={{ $('Extract Video ID').first().json.videoUrl }}",
            "YOUTUBE TITLE": "={{ $('Prepare Text Data').first().json.title }}",
            "GOOGLE DRIVE URL": "={{ $json.webContentLink }}"
          },
          "schema": [
            {
              "id": "ID VIDEO",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "ID VIDEO",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "YOUTUBE URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "YOUTUBE URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "YOUTUBE TITLE",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "YOUTUBE TITLE",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "GOOGLE DRIVE URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "GOOGLE DRIVE URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "POST DESCRIPTION",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "POST DESCRIPTION",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "STATUS",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "STATUS",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "YouTube"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.googleSheetsId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "YlIXFU6zUDsqwmRG",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "9e85c26f-b85a-49a0-89b0-97743e5dcdd9",
      "name": "๐Ÿ“‹ ์›Œํฌํ”Œ๋กœ์šฐ ๊ฐœ์š”",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3120,
        784
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 652,
        "content": "# ๐Ÿš€ Automate YouTube thumbnail creation\n\n### ๐ŸŽฅ Watch This Tutorial\n\n@[youtube](CenAtzPceQU)\n\nThis workflow automates YouTube thumbnail generation and social media distribution. Send a YouTube URL via Telegram, and the workflow will:\n\nโœ… Extract video metadata from YouTube API\nโœ… Generate custom thumbnail using [templated.io](https://templated.io/?utm_campaign=drfiras)\nโœ… Store thumbnail in Google Drive\nโœ… Log activity in Google Sheets\nโœ… Create AI-powered social media posts\nโœ… Publish to LinkedIn, Facebook, and Twitter\nโœ… Send notifications via Email and Telegram"
      },
      "typeVersion": 1
    },
    {
      "id": "f15bdc4e-5493-4de8-b3b7-66d3e0fbbe01",
      "name": "๐Ÿ”ง 1๋‹จ๊ณ„: ์„ค์ •",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3536,
        784
      ],
      "parameters": {
        "color": 4,
        "width": 1680,
        "height": 270,
        "content": "## ๐Ÿ“ค STEP 1: ๐Ÿ“ฑ Telegram Trigger: Receives YouTube URLs from users\n\nโš™๏ธ Workflow Configuration: Central hub for all API keys and settings\n\nRequired fields:\nโ€ข youtubeApiKey - Get from Google Cloud Console\nโ€ข templatedApiKey - Get from [templated.io](https://templated.io/?utm_campaign=drfiras) dashboard\nโ€ข templatedTemplateId - Your thumbnail template ID\nโ€ข googleDriveFolderId - Target folder for thumbnails\nโ€ข googleSheetsId - Spreadsheet for logging\nโ€ข emailRecipient - Notification email address\nโ€ข blotatoApiKey - Blotato API credentials\nโ€ข linkedinAccountId, facebookPageId, twitterAccountId"
      },
      "typeVersion": 1
    },
    {
      "id": "84d95f0c-9c9f-4e23-9161-aa3631a6c27b",
      "name": "๐ŸŽจ 3๋‹จ๊ณ„: ์ธ๋„ค์ผ ์ƒ์„ฑ",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3536,
        1072
      ],
      "parameters": {
        "color": 5,
        "width": 1680,
        "height": 264,
        "content": "## ๐Ÿ“ค STEP 2: ๐ŸŽจ Generate Thumbnail: Sends POST request to [templated.io](https://templated.io/?utm_campaign=drfiras) \nAPI with video title and description to generate custom thumbnail\n\nโณ Wait for Rendering: Pauses workflow for 5 minutes \nto allow [templated.io](https://templated.io/?utm_campaign=drfiras) to complete thumbnail generation\n\nโฌ‡๏ธ Download Thumbnail: Fetches the generated thumbnail image \nfile from [templated.io](https://templated.io/?utm_campaign=drfiras) response URL and stores as binary data\n\nNote: Adjust wait time based on your template complexity"
      },
      "typeVersion": 1
    },
    {
      "id": "57361e93-16f1-4a1b-9369-99952249a7f9",
      "name": "๐Ÿ“ข 5๋‹จ๊ณ„: ์•Œ๋ฆผ",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3536,
        1360
      ],
      "parameters": {
        "color": 2,
        "width": 1680,
        "height": 264,
        "content": "## ๐Ÿ“ค STEP 3: ๐Ÿ“ง Send Gmail: Sends email notification with:\nโ€ข Subject: YouTube Thumbnail Generated + video title\nโ€ข HTML body with video details\nโ€ข Thumbnail attachment\nโ€ข Google Drive link\n\nโ˜๏ธ Upload to Google Drive: Uploads thumbnail to specified \n\n๐Ÿ’ฌ Send Telegram Notification: Sends thumbnail with:\nโ€ข Video title\nโ€ข Google Drive link\nโ€ข Success confirmation message"
      },
      "typeVersion": 1
    },
    {
      "id": "844d603f-3246-48da-a899-6e30022df65e",
      "name": "โš™๏ธ ์„ค์น˜ ๊ฐ€์ด๋“œ",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3120,
        1456
      ],
      "parameters": {
        "color": 7,
        "width": 402,
        "height": 448,
        "content": "๐Ÿ“‹ INSTALLATION CHECKLIST\n\n1๏ธโƒฃ Get YouTube Data API v3 key from Google Cloud Console\n2๏ธโƒฃ Create [templated.io](https://templated.io/?utm_campaign=drfiras) account and get API key + template ID\n3๏ธโƒฃ Set up Telegram bot using @BotFather\n4๏ธโƒฃ Create Google Drive folder and copy folder ID from URL\n5๏ธโƒฃ Create Google Sheets with columns: Date, Video ID, Video URL, Title, Thumbnail Link, Status\n6๏ธโƒฃ Get Blotato API key from dashboard\n7๏ธโƒฃ Connect social media accounts to Blotato and get account IDs\n8๏ธโƒฃ Fill all values in Workflow Configuration node\n9๏ธโƒฃ Test with a YouTube URL via Telegram\n\n## ๐Ÿ“ฌ Need Help or Want to Customize This?\n**Contact me for consulting and support:** [LinkedIn](https://www.linkedin.com/in/dr-firas/) / [YouTube](https://www.youtube.com/@DRFIRASS)  / [๐Ÿš€ Mes Ateliers n8n  ](https://hotm.art/formation-n8n)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "1579f6a0-8326-4c06-b5bf-29c0b1d0fafd",
      "name": "5๋‹จ๊ณ„ - ๊ฒŒ์‹œ",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3536,
        1648
      ],
      "parameters": {
        "color": 5,
        "width": 1692,
        "height": 260,
        "content": "## ๐Ÿ“ค STEP 4: PUBLISHING\n\n### Install the Blotato [Blotato](https://blotato.com/?ref=firas) Node in n8n (Community Nodes)\n1. In n8n, open **Settings โ†’ Community Nodes**.  \n2. Click **Install**, then add: `@blotato/n8n-nodes-blotato`.  \n3. Log in to **Blotato**.  \n4. Go to **Settings โ†’ API Keys**.  \n5. In n8n โ†’ **Credentials โ†’ New**.  \n6. Choose **Blotato API** \n(provided by the community node you installed).  "
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "387ca33f-5a76-458f-a9f2-81ff3af75d1b",
  "connections": {
    "caadaf4e-8b06-41b6-950c-41846f684915": {
      "main": [
        []
      ]
    },
    "9d78b633-b9d3-47a4-bcd7-0e48739cf0eb": {
      "main": [
        []
      ]
    },
    "7ea4143c-b953-4430-908b-e7b13a8ff7eb": {
      "main": [
        [
          {
            "node": "e52e1427-e362-4731-9a4c-92a5e4610687",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "06b1aa18-c78f-4d52-9ddb-6532eae175f4": {
      "main": [
        []
      ]
    },
    "7bda8d47-fc97-4372-a447-c23bc0bd3c8f": {
      "main": [
        [
          {
            "node": "0cc8b6fe-9fe9-41ac-aa66-4a90e1995f70",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "41092605-3611-4017-828a-3c7bb41a2eb6": {
      "main": [
        [
          {
            "node": "dec01d59-d7a5-4a53-9971-e62a276cbbfb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1f2550f0-076a-4f7d-9b88-f84767527a9e": {
      "main": [
        [
          {
            "node": "ca6a5f90-4174-42dc-a4f5-f1c14d4f2f40",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6f6ed14b-0e3c-45e3-8e78-72cc4748db90": {
      "main": [
        [
          {
            "node": "0b9bc493-3327-429e-88d8-4de803f4c800",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "17b9ee87-c823-4eab-9f6a-63cd3926ea2e": {
      "main": [
        [
          {
            "node": "1f2550f0-076a-4f7d-9b88-f84767527a9e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0cc8b6fe-9fe9-41ac-aa66-4a90e1995f70": {
      "main": [
        [
          {
            "node": "6f6ed14b-0e3c-45e3-8e78-72cc4748db90",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f391676c-8826-4a3e-b19a-2e58c7e7c796": {
      "main": [
        [
          {
            "node": "17b9ee87-c823-4eab-9f6a-63cd3926ea2e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fc02c5c7-c022-47fd-9c1a-44e6b76df0a1": {
      "main": [
        [
          {
            "node": "7ea4143c-b953-4430-908b-e7b13a8ff7eb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b5ee3daa-64ce-4782-837d-142bc5ee3c77": {
      "main": [
        [
          {
            "node": "5210d570-ac35-4175-b783-af582160befa",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ca6a5f90-4174-42dc-a4f5-f1c14d4f2f40": {
      "main": [
        [
          {
            "node": "fc02c5c7-c022-47fd-9c1a-44e6b76df0a1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "dec01d59-d7a5-4a53-9971-e62a276cbbfb": {
      "main": [
        [
          {
            "node": "7bda8d47-fc97-4372-a447-c23bc0bd3c8f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0b9bc493-3327-429e-88d8-4de803f4c800": {
      "main": [
        [
          {
            "node": "3b65e073-31be-4bcf-bcf2-f126a3199ca7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5210d570-ac35-4175-b783-af582160befa": {
      "main": [
        [
          {
            "node": "9d78b633-b9d3-47a4-bcd7-0e48739cf0eb",
            "type": "main",
            "index": 0
          },
          {
            "node": "caadaf4e-8b06-41b6-950c-41846f684915",
            "type": "main",
            "index": 0
          },
          {
            "node": "06b1aa18-c78f-4d52-9ddb-6532eae175f4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e52e1427-e362-4731-9a4c-92a5e4610687": {
      "main": [
        [
          {
            "node": "b5ee3daa-64ce-4782-837d-142bc5ee3c77",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3b65e073-31be-4bcf-bcf2-f126a3199ca7": {
      "main": [
        [
          {
            "node": "f391676c-8826-4a3e-b19a-2e58c7e7c796",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

์ด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?

์œ„์˜ JSON ๊ตฌ์„ฑ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ n8n ์ธ์Šคํ„ด์Šค์—์„œ ์ƒˆ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  "JSON์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ"๋ฅผ ์„ ํƒํ•œ ํ›„, ๊ตฌ์„ฑ์„ ๋ถ™์—ฌ๋„ฃ๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ธ์ฆ ์„ค์ •์„ ์ˆ˜์ •ํ•˜์„ธ์š”.

์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์–ด๋–ค ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉํ•œ๊ฐ€์š”?

๊ณ ๊ธ‰ - ์ฝ˜ํ…์ธ  ์ œ์ž‘, ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ AI

์œ ๋ฃŒ์ธ๊ฐ€์š”?

์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์™„์ „ํžˆ ๋ฌด๋ฃŒ์ด๋ฉฐ ์ง์ ‘ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์‚ฌ ์„œ๋น„์Šค(์˜ˆ: OpenAI API)๋Š” ์‚ฌ์šฉ์ž ์ง์ ‘ ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ์›Œํฌํ”Œ๋กœ์šฐ ์ถ”์ฒœ

๐Ÿ’ฅ NanoBanana, Seedream 4, ChatGPT Image ๋ฐ Veo 3๋ฅผ ์‚ฌ์šฉํ•œ ๋™์˜์ƒ ๊ด‘๊ณ  ์ž๋™ํ™” - VIDE
AI(NanoBanana, Seedream, GPT-4o, Veo 3)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋””์˜ค ๊ด‘๊ณ  ์บ ํŽ˜์ธ ์ž๋™ํ™” ๋ฐ ๊ฒŒ์‹œ
Set
Code
Wait
+
Set
Code
Wait
63 ๋…ธ๋“œDr. Firas
์ฝ˜ํ…์ธ  ์ œ์ž‘
๋ฐ”์ด๋Ÿด TikTok ๋น„๋””์˜ค ์ƒ์„ฑ๊ธฐ: VEED ์•„๋ฐ”ํƒ€๋ฅผ ์‚ฌ์šฉํ•œ UGC ๋น„๋””์˜ค ์ž๋™ ์ƒ์„ฑ
VEED.io AI ์•„๋ฐ”ํƒ€, ElevenLabs, GPT-4๋กœ TikTok ๋น„๋””์˜ค ์ž๋™ ์ƒ์„ฑ
Set
Code
Wait
+
Set
Code
Wait
35 ๋…ธ๋“œDr. Firas
์ฝ˜ํ…์ธ  ์ œ์ž‘
๐Ÿ’ฅ HeyGen II - ๋‚˜๋ฅผ ๋ณต์ œํ•˜๋ผ - ์•„์ด๋””์–ด๋ถ€ํ„ฐ ๊ฒŒ์‹œ๊นŒ์ง€: YouTube, TikTok, Instagram์„ ์œ„ํ•œ GPT-5 ๋น„๋””์˜ค ์ž๋™ํ™” - ๋น„๋””์˜ค
HeyGen, GPT-5 ๋ฐ ์†Œ์…œ ๊ฒŒ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ ์Œ์„ฑ ์ž…๋ ฅ ๋น„๋””์˜ค ์ œ์ž‘ ์ž๋™ํ™”
If
Set
Wait
+
If
Set
Wait
41 ๋…ธ๋“œDr. Firas
์ฝ˜ํ…์ธ  ์ œ์ž‘
HeyGen๊ณผ Google Sheets ํ†ตํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ AI ๊ฐ€์ƒ ์ด๋ฏธ์ง€ ๋น„๋””์˜ค ์ƒ์„ฑ
GPT-5์„ ์‚ฌ์šฉํ•˜์—ฌ AI ๊ฐ€์ƒ ์ธ๋ฌผ ๋น„๋””์˜ค ์ƒ์„ฑ ๋ฐ ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ์— ๊ฒŒ์‹œ
If
Set
Wait
+
If
Set
Wait
41 ๋…ธ๋“œDr. Firas
์ฝ˜ํ…์ธ  ์ œ์ž‘
๐Ÿ’ฅ NanoBanana์™€ VEO3๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AI ๋ฐ”์ด๋Ÿฌ์Šค ๋น„๋””์˜ค ์ƒ์„ฑํ•˜๊ณ  Blotato๋ฅผ ํ†ตํ•ด ์†Œ์…œ ํ”Œ๋žซํผ์— ๊ณต์œ  - ๋น„๋””์˜ค
NanoBanana์™€ VEO3์„ ์‚ฌ์šฉํ•˜์—ฌ AI ๋ฐ”์ด๋Ÿฌ์Šค ๋น„๋””์˜ค ์ƒ์„ฑํ•˜๊ณ  Blotato๋ฅผ ํ†ตํ•ด ์†Œ์…œ ๋ฏธ๋””์–ด์—์„œ ๊ณต์œ 
Set
Code
Wait
+
Set
Code
Wait
47 ๋…ธ๋“œDr. Firas
๊ธฐํƒ€
๐Ÿ’ฅ Blotato์™€ Sora 2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ปค๋จธ์Šค UGC ํ”„๋กœ๋ชจ์…˜ ๋น„๋””์˜ค ์ƒ์„ฑ
OpenAI, Sora 2, Blotato๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ž์ƒ๊ฑฐ๋ž˜์—์„œ UGC ํ”„๋กœ๋ชจ์…˜ ๋น„๋””์˜ค ์ƒ์„ฑ
If
Set
Code
+
If
Set
Code
34 ๋…ธ๋“œDr. Firas
์ฝ˜ํ…์ธ  ์ œ์ž‘
์›Œํฌํ”Œ๋กœ์šฐ ์ •๋ณด
๋‚œ์ด๋„
๊ณ ๊ธ‰
๋…ธ๋“œ ์ˆ˜25
์นดํ…Œ๊ณ ๋ฆฌ2
๋…ธ๋“œ ์œ ํ˜•13
๋‚œ์ด๋„ ์„ค๋ช…

๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ 16+๊ฐœ ๋…ธ๋“œ์˜ ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ

์ €์ž
Dr. Firas

Dr. Firas

@drfiras

Automation expert and certified trainer. I create hands-on courses to master automation with n8n. Contact me to access my exclusive training and start building powerful workflows today. ๐Ÿš€

์™ธ๋ถ€ ๋งํฌ
n8n.io์—์„œ ๋ณด๊ธฐ โ†’

์ด ์›Œํฌํ”Œ๋กœ์šฐ ๊ณต์œ 

์นดํ…Œ๊ณ ๋ฆฌ

์นดํ…Œ๊ณ ๋ฆฌ: 34