💥 Automatisation de la création de vidéos AI et de la publication multiplateforme avec Veo 3.1 et Blotato - Vidéo

Avancé

Ceci est unContent Creation, Multimodal AIworkflow d'automatisation du domainecontenant 25 nœuds.Utilise principalement des nœuds comme Set, Code, Merge, GoogleDrive, HttpRequest. Utiliser GPT-4, Veo 3.1 et Blotato pour automatiser la création de vidéos IA et leur publication multiplateforme

Prérequis
  • Informations d'identification Google Drive API
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Informations d'identification Google Sheets API
  • Clé API OpenAI
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "Zwz315okMu0UwtRQ",
  "meta": {
    "instanceId": "de822f81f3a2367cef7d9549771a77783236bc9596481be2ae65c05fbcc4b4fd",
    "templateCredsSetupCompleted": true
  },
  "name": "💥 Automate AI Video Creation & Multi-Platform Publishing with Veo 3.1 & Blotato - vide",
  "tags": [],
  "nodes": [
    {
      "id": "f614b82e-a053-403d-afb5-b6c9cf9d6fd6",
      "name": "Configuration du workflow",
      "type": "n8n-nodes-base.set",
      "position": [
        896,
        2000
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "openai_api_key",
              "type": "string",
              "value": "YOUR_OPENAI_API_KEY"
            },
            {
              "id": "id-2",
              "name": "min_idea_length",
              "type": "number",
              "value": 5
            },
            {
              "id": "id-3",
              "name": "required_photos",
              "type": "number",
              "value": 3
            },
            {
              "id": "id-5",
              "name": "fal_api_key",
              "type": "string",
              "value": "key YOUR_FAL_API_KEY"
            },
            {
              "id": "id-6",
              "name": "google_drive_folder_id",
              "type": "string",
              "value": "YOUR_GOOGLE_DRIVE_FOLDER_ID"
            },
            {
              "id": "id-7",
              "name": "google_sheet_id",
              "type": "string",
              "value": "YOUR_GOOGLE_SHEETS_ID"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "19a1188d-dbbd-48e5-a3ef-6da21410c3ec",
      "name": "Analyser la réponse GPT",
      "type": "n8n-nodes-base.code",
      "position": [
        1376,
        2000
      ],
      "parameters": {
        "jsCode": "// Parse OpenAI-style responses into { prompt, caption, hashtags[], hashtags_string }\nreturn $input.all().map(item => {\n  const data = item.json || {};\n  \n  // Try to locate \"content\" in the common places\n  let content =\n    data?.choices?.[0]?.message?.content ??\n    data?.message?.content ??\n    data?.content ??\n    null;\n\n  let prompt = \"\";\n  let caption = \"\";\n  let hashtagsArr = [];\n\n  // If content is an object (your current input case)\n  if (content && typeof content === \"object\") {\n    prompt = content.prompt ?? \"\";\n    caption = content.caption ?? \"\";\n    if (Array.isArray(content.hashtags)) {\n      hashtagsArr = content.hashtags;\n    } else if (typeof content.hashtags === \"string\") {\n      // Support comma/space separated string\n      hashtagsArr = content.hashtags.split(/[,\\s]+/).filter(Boolean);\n    }\n  }\n  // If content is a string (some models return JSON as string)\n  else if (typeof content === \"string\" && content.trim()) {\n    try {\n      const parsed = JSON.parse(content);\n      prompt = parsed.prompt ?? \"\";\n      caption = parsed.caption ?? \"\";\n      if (Array.isArray(parsed.hashtags)) {\n        hashtagsArr = parsed.hashtags;\n      } else if (typeof parsed.hashtags === \"string\") {\n        hashtagsArr = parsed.hashtags.split(/[,\\s]+/).filter(Boolean);\n      }\n    } catch {\n      // Not a JSON string — leave fields empty\n      prompt = \"\";\n      caption = \"\";\n      hashtagsArr = [];\n    }\n  }\n\n  // Normalize hashtags: ensure leading '#', dedupe, no empties\n  const norm = Array.from(\n    new Set(\n      (hashtagsArr || [])\n        .map(h => (h ?? \"\").toString().trim())\n        .filter(Boolean)\n        .map(h => (h.startsWith(\"#\") ? h : `#${h}`))\n    )\n  );\n  const hashtags_string = norm.join(\" \");\n\n  return {\n    json: {\n      prompt,\n      caption,\n      hashtags: norm,\n      hashtags_string\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "b9dfa37c-082f-431d-9494-aa620892b134",
      "name": "Optimiser le prompt pour Veo",
      "type": "n8n-nodes-base.set",
      "position": [
        672,
        2224
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "veo_prompt",
              "type": "string",
              "value": "={{ $json.prompt }} consistent character throughout, photorealistic quality, professional cinematography, 8 seconds duration, 9:16 aspect ratio, 24fps"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "f73ea354-b40b-4dac-9ecc-687b315a4a84",
      "name": "Appel API GPT-4",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1072,
        2000
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "id",
          "value": "gpt-4o-mini"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are a viral video content creator"
            },
            {
              "content": "=Create viral video content for {{ $json.niche }} about {{ $json.idea }}. Return JSON with: prompt (150-200 word cinematic Veo 3.1 description), caption (50-100 word social media text with emojis), hashtags (array of 8-10 tags)"
            }
          ]
        },
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "id": "QmtwfFk8iBkuCXOX",
          "name": "n8n free OpenAI API credits"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "44c68f8d-0a12-4f9b-83fa-ca3b939bb223",
      "name": "Télécharger la vidéo",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        672,
        2464
      ],
      "parameters": {
        "url": "={{ $json.video_url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "b8a019e2-af8d-4818-ad6d-86a31462e2a1",
      "name": "Upload Google Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        896,
        2464
      ],
      "parameters": {
        "name": "={{ 'AI_Video_' + $json.user_id + '_' + $json.timestamp + '.mp4' }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.google_drive_folder_id }}"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "odf7JAwyqVFVZBhQ",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "563e682a-708e-4268-953b-0cc2df993632",
      "name": "Ajout Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1136,
        2464
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "id",
          "value": "="
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.google_sheet_id }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "YlIXFU6zUDsqwmRG",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "2e1a8319-95b3-43c7-b279-94bfd3b4afaf",
      "name": "Déclencheur Google Sheets",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        464,
        2000
      ],
      "parameters": {
        "event": "rowAdded",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyX",
              "unit": "minutes",
              "value": 30
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/10yrKcdX92Yxauixzl58RDN6yNKfxAk0zX5avPy0uqAE/edit#gid=0",
          "cachedResultName": "Video_Requests"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "10yrKcdX92Yxauixzl58RDN6yNKfxAk0zX5avPy0uqAE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/10yrKcdX92Yxauixzl58RDN6yNKfxAk0zX5avPy0uqAE/edit?usp=drivesdk",
          "cachedResultName": "Video_Requests"
        }
      },
      "credentials": {
        "googleSheetsTriggerOAuth2Api": {
          "id": "76v1LGA3Gdhk2uFH",
          "name": "Google Sheets Trigger account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "76a152e7-6aa1-4859-94bf-4470fe79c51d",
      "name": "Analyser l'entrée de la feuille",
      "type": "n8n-nodes-base.code",
      "position": [
        672,
        2000
      ],
      "parameters": {
        "jsCode": "// Parse Google Sheets Input (headers) and Validate for Veo 3.1 workflow\nconst items = $input.all();\nconst results = [];\n\n// Helper to read and trim a field safely\nfunction getField(data, key) {\n  const v = (data[key] ?? data[key?.toUpperCase?.()] ?? \"\").toString();\n  return v.trim();\n}\n\nfor (const item of items) {\n  const data = item.json || {};\n\n  // Read by header names\n  const id_video  = getField(data, \"id_video\");\n  const niche     = getField(data, \"niche\");\n  const idea      = getField(data, \"idea\");\n  const url_1     = getField(data, \"url_1\");\n  const url_2     = getField(data, \"url_2\");\n  const url_3     = getField(data, \"url_3\");\n  const url_final = getField(data, \"url_final\");   // peut être vide au départ\n  const status    = getField(data, \"status\");      // ex: pending|processing|completed|failed\n  const row_number = data.row ?? data._row ?? \"\";\n\n  // Validation\n  const errors = [];\n\n  // niche & idea\n  if (!niche || niche.length <= 2) {\n    errors.push(\"niche must be longer than 2 characters\");\n  }\n  if (!idea || idea.length <= 5) {\n    errors.push(\"idea must be longer than 5 characters\");\n  }\n\n  // URLs images requises\n  if (!url_1 || !url_1.startsWith(\"http\")) {\n    errors.push(\"url_1 is missing or invalid - must start with http\");\n  }\n  if (!url_2 || !url_2.startsWith(\"http\")) {\n    errors.push(\"url_2 is missing or invalid - must start with http\");\n  }\n  if (!url_3 || !url_3.startsWith(\"http\")) {\n    errors.push(\"url_3 is missing or invalid - must start with http\");\n  }\n\n  // url_final si présent\n  if (url_final && !url_final.startsWith(\"http\")) {\n    errors.push(\"url_final is invalid - must start with http if provided\");\n  }\n\n  // status optionnel : normalisation (facultatif)\n  const allowedStatus = new Set([\"\", \"pending\", \"processing\", \"completed\", \"failed\", \"draft\"]);\n  if (!allowedStatus.has(status.toLowerCase?.() ?? \"\")) {\n    errors.push(`status '${status}' is not recognized (use: pending|processing|completed|failed|draft)`);\n  }\n\n  // Build output item\n  const image_urls = [url_1, url_2, url_3];\n\n  const out = {\n    json: {\n      id_video,\n      niche,\n      idea,\n      image_urls,\n      url_final: url_final || \"\",\n      status: (status || \"pending\").toLowerCase(),\n      row_number,\n      timestamp: new Date().toISOString(),\n    },\n  };\n\n  // Valid flag + errors\n  if (errors.length) {\n    out.json.valid = false;\n    out.json.validation_errors = errors;\n  } else {\n    out.json.valid = true;\n  }\n\n  results.push(out);\n}\n\nreturn results;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "65a7f4ed-10d7-44e0-8997-631991fc0bf3",
      "name": "Génération Veo 1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1136,
        2224
      ],
      "parameters": {
        "url": "https://fal.run/fal-ai/veo3.1/reference-to-video",
        "method": "POST",
        "options": {
          "timeout": 600000,
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        },
        "jsonBody": "={{ JSON.stringify($json.veo_request_body) }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "={{ $('Workflow Configuration').item.json.fal_api_key }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "a403778d-de47-4132-9e4a-4982dcd1f06e",
      "name": "Préparer le corps de requête Veo",
      "type": "n8n-nodes-base.code",
      "position": [
        896,
        2224
      ],
      "parameters": {
        "jsCode": "const prompt = $input.item.json.veo_prompt || $input.item.json.prompt;\nlet imageUrls = $('Parse Sheet Input').item.json.image_urls;\n\nfunction convertGoogleDriveUrl(url) {\n  if (!url) return url;\n  if (url.includes('drive.google.com/file/d/')) {\n    const match = url.match(/\\/d\\/([a-zA-Z0-9_-]+)/);\n    if (match && match[1]) {\n      return `https://drive.google.com/uc?export=download&id=${match[1]}`;\n    }\n  }\n  return url;\n}\n\nif (!prompt || prompt.length < 10) {\n  throw new Error('Prompt required');\n}\n\nif (!Array.isArray(imageUrls) || imageUrls.length !== 3) {\n  throw new Error('Need 3 image URLs');\n}\n\nconst directImageUrls = imageUrls.map(url => convertGoogleDriveUrl(url));\n\ndirectImageUrls.forEach((url, index) => {\n  if (!url || !url.startsWith('http')) {\n    throw new Error('Invalid image URL at position ' + (index + 1));\n  }\n});\n\nreturn {\n  json: {\n    veo_request_body: {\n      prompt: prompt,\n      image_urls: directImageUrls,\n      duration: 8,\n      aspect_ratio: \"9:16\"\n    },\n    ...($input.item.json)\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "f65730da-04f6-4e63-9a38-b9b3354a3b02",
      "name": "Extraire les données vidéo",
      "type": "n8n-nodes-base.code",
      "position": [
        1376,
        2224
      ],
      "parameters": {
        "jsCode": "// Extract video data from Veo Generation response\nconst items = $input.all();\nconst results = [];\n\nfor (const item of items) {\n  const data = item.json || {};\n  \n  // Extract video data from current node\n  const video_url = data.video?.url || '';\n  const video_content_type = data.video?.content_type || '';\n  const video_file_size = data.video?.file_size || 0;\n  const video_file_name = data.video?.file_name || '';\n  \n  // Preserve data from previous nodes\n  const niche = $('Parse Sheet Input').item.json.niche || '';\n  const idea = $('Parse Sheet Input').item.json.idea || '';\n  const caption = $('Parse GPT Response').item.json.caption || '';\n  const hashtags_string = $('Parse GPT Response').item.json.hashtags_string || '';\n  const veo_prompt = $('Optimize Prompt for Veo').item.json.veo_prompt || '';\n  const id_video = $('Parse Sheet Input').item.json.id_video || '';\n  const row_number = $('Parse Sheet Input').item.json.row_number || '';\n  \n  results.push({\n    json: {\n      video_url,\n      video_content_type,\n      video_file_size,\n      video_file_name,\n      generation_completed_at: new Date().toISOString(),\n      niche,\n      idea,\n      caption,\n      hashtags_string,\n      veo_prompt,\n      id_video,\n      row_number\n    }\n  });\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "3b65094d-10e0-42a2-af60-ce4110d81f35",
      "name": "Étape 5 - Publication",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1536,
        1376
      ],
      "parameters": {
        "color": 5,
        "width": 796,
        "height": 1316,
        "content": "# 📤 STEP 5: PUBLISHING & TRACKING\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).  \n\n✅ **Activate Workflow:**\n- Toggle workflow to **Active** state\n- Ensure trigger is enabled\n\n✅ **Monitor Executions:**\n- Check execution history regularly\n- Review error logs if failures occur\n"
      },
      "typeVersion": 1
    },
    {
      "id": "98ea7ae3-a917-42bf-9872-c9a212281224",
      "name": "Upload vidéo vers BLOTATO",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1376,
        2464
      ],
      "parameters": {
        "mediaUrl": "={{ $json.url_final }}",
        "resource": "media"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "950a3e4f-52d5-4124-8c70-bc1b0da6cc00",
      "name": "Youtube",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1856,
        2464
      ],
      "parameters": {
        "options": {},
        "platform": "youtube",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "8047",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/8047",
          "cachedResultName": "DR FIRASS (Dr. Firas)"
        },
        "postContentText": "={{ $('Save to Google Sheets').item.json.CAPTION }}",
        "postContentMediaUrls": "={{ $json.url }}",
        "postCreateYoutubeOptionTitle": "={{ $('Save to Google Sheets').item.json.IDEA }}",
        "postCreateYoutubeOptionPrivacyStatus": "private",
        "postCreateYoutubeOptionShouldNotifySubscribers": false
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "62cf18fb-818d-40a8-be61-b08aecdebdec",
      "name": "Tiktok",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1632,
        2000
      ],
      "parameters": {
        "options": {},
        "platform": "tiktok",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "9332",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/9332",
          "cachedResultName": "docteur.firas"
        },
        "postContentText": "={{ $('Save to Google Sheets').item.json.CAPTION }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "f250b454-e081-49b6-abf8-9ebe04cd152f",
      "name": "Linkedin",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1840,
        2000
      ],
      "parameters": {
        "options": {},
        "platform": "linkedin",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "1446",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/1446",
          "cachedResultName": "Samuel Amalric"
        },
        "postContentText": "={{ $('Save to Google Sheets').item.json.CAPTION }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "6075fdc3-f2ae-43b8-9429-3f138f6a506c",
      "name": "Facebook",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1632,
        2224
      ],
      "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": "={{ $('Save to Google Sheets').item.json.CAPTION }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "fb35a6e6-8d5b-44f8-894c-3cd64cf43009",
      "name": "Instagram",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1840,
        2224
      ],
      "parameters": {
        "options": {},
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "1687",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/1687",
          "cachedResultName": "acces.a.vie"
        },
        "postContentText": "={{ $('Save to Google Sheets').item.json.CAPTION }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "4177dca6-53a5-4b32-9796-b526302ecc17",
      "name": "Twitter (X)",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1632,
        2464
      ],
      "parameters": {
        "options": {},
        "platform": "twitter",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "1289",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/1289",
          "cachedResultName": "Docteur_Firas"
        },
        "postContentText": "={{ $('Save to Google Sheets').item.json.CAPTION }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {
        "blotatoApi": {
          "id": "wozsYJYLfCZO37j8",
          "name": "Blotato account"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "6d972b56-f5eb-423d-9215-21ce753564a3",
      "name": "Fusion 1",
      "type": "n8n-nodes-base.merge",
      "position": [
        2128,
        2160
      ],
      "parameters": {
        "mode": "chooseBranch",
        "numberInputs": 6
      },
      "typeVersion": 3.2
    },
    {
      "id": "21eedebf-5b84-4ee6-ac5d-9bdadaba1211",
      "name": "Ajout Google Sheets 1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2128,
        2464
      ],
      "parameters": {
        "columns": {
          "value": {
            "status": "Published",
            "id_video": "={{ $('Google Sheets Trigger').first().json.id_video }}"
          },
          "schema": [
            {
              "id": "id_video",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id_video",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "niche",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "niche",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "idea",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "idea",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "url_1",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "url_1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "url_2",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "url_2",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "url_3",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "url_3",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "url_final",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "url_final",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id_video"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/10yrKcdX92Yxauixzl58RDN6yNKfxAk0zX5avPy0uqAE/edit#gid=0",
          "cachedResultName": "Video_Requests"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "=10yrKcdX92Yxauixzl58RDN6yNKfxAk0zX5avPy0uqAE"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "YlIXFU6zUDsqwmRG",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "a6cd7ba1-36a7-4807-9b47-1112da74a6ac",
      "name": "Étape 1 - Prérequis",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        1376
      ],
      "parameters": {
        "color": 5,
        "width": 598,
        "height": 1316,
        "content": "# 🎬 AI VIDEO GENERATOR - VEO 3.1\n\n**Workflow Steps:**\n1. Monitor Google Sheets for new video requests\n2. Generate content with GPT-4\n3. Create video with Veo 3.1\n4. Upload to Google Drive\n5. Publish to social media via Blotato\n# 📋 STEP 1: PREREQUISITES\n\n1. **OpenAI (GPT-4)**\n   - Sign up: [platform.openai.com](https://platform.openai.com)\n   - Get API key: [platform.openai.com/api-keys](https://platform.openai.com/api-keys)\n   - Estimated cost: ~$0.01-0.05 per video\n\n2. **fal.ai (Veo 3.1)**\n   - Sign up: [fal.ai](https://fal.ai)\n   - Get API key: [fal.ai/dashboard/keys](https://fal.ai/dashboard/keys)\n   - Estimated cost: ~$0.50-2.00 per video\n\n3. **Google Account**\n   - Google Sheets (trigger & tracking)\n   - Google Drive (video storage)\n   - Free tier available\n\n4. **Blotato (Social Media Publishing)**\n   - Sign up: [blotato.com](https://blotato.com)\n   - Get API key from Settings → API Keys\n   - Multi-platform publishing support\n\n# 📊 STEP 2: GOOGLE SHEETS\n\n### Create Video_Requests Sheet\n1. Create a new Google Sheet named **Video_Requests**\n2. Add the following columns (A through H):\n   - **A: id_video** - Unique video ID (auto-generated or sequential)\n   - **B: niche** - Content niche or category (e.g. Tech, Fashion, Fitness)\n   - **C: idea** - Short video idea or concept (min 5 characters)\n   - **D: url_1** - First reference image (scene, product, or creator)\n   - **E: url_2** - Second reference image\n   - **F: url_3** - Third reference image\n   - **G: url_final** - Final generated video URL (auto-filled by n8n)\n   - **H: status** - Processing status (pending / processing / completed / failed)\n\n\n### Image URL Requirements\n- All image URLs must start with `http://` or `https://`\n- Google Drive URLs will be automatically converted to direct download links\n- Minimum 3 images required per video request\n\n### Google Drive Setup\n1. Create a folder in Google Drive for video storage\n2. Copy the folder ID from the URL\n3. Update the `google_drive_folder_id` in Workflow Configuration node"
      },
      "typeVersion": 1
    },
    {
      "id": "d844cb16-6387-4745-8aaa-c5aa1b073c99",
      "name": "Étape 3 - Configuration des clés API",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        1376
      ],
      "parameters": {
        "color": 5,
        "width": 550,
        "height": 584,
        "content": "# 🔑 STEP 3: API KEYS CONFIGURATION\n\n\n## ⚠️ Important Warnings\n\n**Timeout:** Veo video generation can take 5-10 minutes. HTTP request timeout is set to 10 minutes (600,000ms).\n\n**Estimated Costs Per Video:**\n- GPT-4 API call: ~$0.01-0.05\n- Fal.ai Veo 3.1 generation: ~$0.50-1.00\n- Total per video: ~$0.51-1.05\n\n**Rate Limits:** Be mindful of API rate limits for all services."
      },
      "typeVersion": 1
    },
    {
      "id": "12c2de0c-cfc0-4e9d-8508-eebb22c9b094",
      "name": "Étape 4 - Activation du workflow",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        976,
        1376
      ],
      "parameters": {
        "color": 6,
        "width": 550,
        "height": 582,
        "content": "# 🚀 STEP 4: WORKFLOW ACTIVATION\n\n## Pre-Activation Checklist\n\n✅ **Verify All Credentials:**\n- OpenAI API key configured\n- Fal.ai API key set\n- Google Sheets OAuth connected\n- Google Drive OAuth connected\n- Blotato API key added (if publishing)\n\n✅ **Test Workflow:**\n1. Add a test row in your Google Sheets:\n   - id_video: TEST_001\n   - niche: Health\n   - idea: Benefits of morning exercise\n   - url_1, url_2, url_3: Valid image URLs\n   - status: pending\n2. Wait for trigger to fire (30 min polling)\n3. Monitor execution in n8n dashboard\n\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "3bc03c0c-d6bb-4851-b83b-9d6c223d02bb",
  "connections": {
    "6d972b56-f5eb-423d-9215-21ce753564a3": {
      "main": [
        [
          {
            "node": "21eedebf-5b84-4ee6-ac5d-9bdadaba1211",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "62cf18fb-818d-40a8-be61-b08aecdebdec": {
      "main": [
        [
          {
            "node": "6d972b56-f5eb-423d-9215-21ce753564a3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "950a3e4f-52d5-4124-8c70-bc1b0da6cc00": {
      "main": [
        [
          {
            "node": "6d972b56-f5eb-423d-9215-21ce753564a3",
            "type": "main",
            "index": 5
          }
        ]
      ]
    },
    "6075fdc3-f2ae-43b8-9429-3f138f6a506c": {
      "main": [
        [
          {
            "node": "6d972b56-f5eb-423d-9215-21ce753564a3",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "f250b454-e081-49b6-abf8-9ebe04cd152f": {
      "main": [
        [
          {
            "node": "6d972b56-f5eb-423d-9215-21ce753564a3",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "fb35a6e6-8d5b-44f8-894c-3cd64cf43009": {
      "main": [
        [
          {
            "node": "6d972b56-f5eb-423d-9215-21ce753564a3",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "4177dca6-53a5-4b32-9796-b526302ecc17": {
      "main": [
        [
          {
            "node": "6d972b56-f5eb-423d-9215-21ce753564a3",
            "type": "main",
            "index": 4
          }
        ]
      ]
    },
    "44c68f8d-0a12-4f9b-83fa-ca3b939bb223": {
      "main": [
        [
          {
            "node": "b8a019e2-af8d-4818-ad6d-86a31462e2a1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f73ea354-b40b-4dac-9ecc-687b315a4a84": {
      "main": [
        [
          {
            "node": "19a1188d-dbbd-48e5-a3ef-6da21410c3ec",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "65a7f4ed-10d7-44e0-8997-631991fc0bf3": {
      "main": [
        [
          {
            "node": "f65730da-04f6-4e63-9a38-b9b3354a3b02",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "76a152e7-6aa1-4859-94bf-4470fe79c51d": {
      "main": [
        [
          {
            "node": "f614b82e-a053-403d-afb5-b6c9cf9d6fd6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f65730da-04f6-4e63-9a38-b9b3354a3b02": {
      "main": [
        [
          {
            "node": "44c68f8d-0a12-4f9b-83fa-ca3b939bb223",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "19a1188d-dbbd-48e5-a3ef-6da21410c3ec": {
      "main": [
        [
          {
            "node": "b9dfa37c-082f-431d-9494-aa620892b134",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b8a019e2-af8d-4818-ad6d-86a31462e2a1": {
      "main": [
        [
          {
            "node": "563e682a-708e-4268-953b-0cc2df993632",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "563e682a-708e-4268-953b-0cc2df993632": {
      "main": [
        [
          {
            "node": "98ea7ae3-a917-42bf-9872-c9a212281224",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2e1a8319-95b3-43c7-b279-94bfd3b4afaf": {
      "main": [
        [
          {
            "node": "76a152e7-6aa1-4859-94bf-4470fe79c51d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f614b82e-a053-403d-afb5-b6c9cf9d6fd6": {
      "main": [
        [
          {
            "node": "f73ea354-b40b-4dac-9ecc-687b315a4a84",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b9dfa37c-082f-431d-9494-aa620892b134": {
      "main": [
        [
          {
            "node": "a403778d-de47-4132-9e4a-4982dcd1f06e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "98ea7ae3-a917-42bf-9872-c9a212281224": {
      "main": [
        [
          {
            "node": "62cf18fb-818d-40a8-be61-b08aecdebdec",
            "type": "main",
            "index": 0
          },
          {
            "node": "f250b454-e081-49b6-abf8-9ebe04cd152f",
            "type": "main",
            "index": 0
          },
          {
            "node": "6075fdc3-f2ae-43b8-9429-3f138f6a506c",
            "type": "main",
            "index": 0
          },
          {
            "node": "fb35a6e6-8d5b-44f8-894c-3cd64cf43009",
            "type": "main",
            "index": 0
          },
          {
            "node": "4177dca6-53a5-4b32-9796-b526302ecc17",
            "type": "main",
            "index": 0
          },
          {
            "node": "950a3e4f-52d5-4124-8c70-bc1b0da6cc00",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a403778d-de47-4132-9e4a-4982dcd1f06e": {
      "main": [
        [
          {
            "node": "65a7f4ed-10d7-44e0-8997-631991fc0bf3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Création de contenu, IA Multimodale

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Workflows recommandés

💥 Automatisation des publicités vidéo avec NanoBanana, Seedream 4, ChatGPT Image et Veo 3 - VIDE
Utiliser l'IA (NanoBanana, Seedream, GPT-4o, Veo 3) pour automatiser et publier des campagnes publicitaires vidéo
Set
Code
Wait
+
Set
Code
Wait
63 NœudsDr. Firas
Création de contenu
Générateur de vidéos TikTok virales : création automatique de vidéos UGC avec des avatars VEED
Utiliser VEED.io AI avatar, ElevenLabs et GPT-4 pour créer automatiquement des vidéos TikTok
Set
Code
Wait
+
Set
Code
Wait
35 NœudsDr. Firas
Création de contenu
💥 HeyGen II - Clone-moi - De l'idée à la publication : Automatisation de vidéos GPT-5 pour YouTube, TikTok et Instagram - Vidéo
Automatiser la création de vidéos à partir d'entrées vocales avec HeyGen, GPT-5 et la publication sociale
If
Set
Wait
+
If
Set
Wait
41 NœudsDr. Firas
Création de contenu
💥 Création automatique de miniatures YouTube à partir de liens vidéo
Création automatisée de miniatures YouTube et publication sur les réseaux sociaux avec Templated.io et Blotato
Set
Code
Wait
+
Set
Code
Wait
25 NœudsDr. Firas
Création de contenu
💥 HeyGen - De l'idée à la publication : Automatisation de vidéo GPT-5 pour YouTube, TikTok et Instagram - Vidéo
Générer et publier des vidéos d'avatar IA avec GPT-5 sur les plateformes de médias sociaux
If
Set
Wait
+
If
Set
Wait
41 NœudsDr. Firas
Création de contenu
💥 Générer des vidéos virales IA avec NanoBanana et VEO3, les partager sur les réseaux sociaux avec Blotato - Vidéo
Générez des vidéos virales IA avec NanoBanana et VEO3, et partagez-les sur les réseaux sociaux via Blotato
Set
Code
Wait
+
Set
Code
Wait
47 NœudsDr. Firas
Divers
Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds25
Catégorie2
Types de nœuds10
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
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. 🚀

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34