8
n8n 中文网amn8n.com

💥 使用Veo 3.1和Blotato自动化AI视频创作与多平台发布 - 视频

高级

这是一个Content Creation, Multimodal AI领域的自动化工作流,包含 25 个节点。主要使用 Set, Code, Merge, GoogleDrive, HttpRequest 等节点。 使用GPT-4、Veo 3.1和Blotato自动化AI视频创作与多平台发布

前置要求
  • Google Drive API 凭证
  • 可能需要目标 API 的认证凭证
  • Google Sheets API 凭证
  • OpenAI API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "Zwz315okMu0UwtRQ",
  "meta": {
    "instanceId": "de822f81f3a2367cef7d9549771a77783236bc9596481be2ae65c05fbcc4b4fd",
    "templateCredsSetupCompleted": true
  },
  "name": "💥 使用Veo 3.1和Blotato自动化AI视频创作与多平台发布 - 视频",
  "tags": [],
  "nodes": [
    {
      "id": "f614b82e-a053-403d-afb5-b6c9cf9d6fd6",
      "name": "工作流配置",
      "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": "解析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": "为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": "GPT-4 API调用",
      "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": "下载视频",
      "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": "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": "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": "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": "解析表格输入",
      "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": "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": "准备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": "提取视频数据",
      "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": "步骤5 - 发布",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1536,
        1376
      ],
      "parameters": {
        "color": 5,
        "width": 796,
        "height": 1316,
        "content": "# 📤 步骤5:发布与跟踪"
      },
      "typeVersion": 1
    },
    {
      "id": "98ea7ae3-a917-42bf-9872-c9a212281224",
      "name": "将视频上传到 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": "便签 - 接收",
      "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": "合并1",
      "type": "n8n-nodes-base.merge",
      "position": [
        2128,
        2160
      ],
      "parameters": {
        "mode": "chooseBranch",
        "numberInputs": 6
      },
      "typeVersion": 3.2
    },
    {
      "id": "21eedebf-5b84-4ee6-ac5d-9bdadaba1211",
      "name": "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": "步骤1 - 先决条件",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        1376
      ],
      "parameters": {
        "color": 5,
        "width": 598,
        "height": 1316,
        "content": "# 🎬 AI视频生成器 - VEO 3.1"
      },
      "typeVersion": 1
    },
    {
      "id": "d844cb16-6387-4745-8aaa-c5aa1b073c99",
      "name": "步骤3 - API密钥配置",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        1376
      ],
      "parameters": {
        "color": 5,
        "width": 550,
        "height": 584,
        "content": "# 🔑 步骤3:API密钥配置"
      },
      "typeVersion": 1
    },
    {
      "id": "12c2de0c-cfc0-4e9d-8508-eebb22c9b094",
      "name": "步骤4 - 工作流激活",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        976,
        1376
      ],
      "parameters": {
        "color": 6,
        "width": 550,
        "height": 582,
        "content": "# 🚀 步骤4:工作流激活"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "3bc03c0c-d6bb-4851-b83b-9d6c223d02bb",
  "connections": {
    "Merge1": {
      "main": [
        [
          {
            "node": "Google Sheets Append1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tiktok": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Youtube": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 5
          }
        ]
      ]
    },
    "Facebook": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Linkedin": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Instagram": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Twitter (X)": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 4
          }
        ]
      ]
    },
    "Download Video": {
      "main": [
        [
          {
            "node": "Google Drive Upload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GPT-4 API Call": {
      "main": [
        [
          {
            "node": "Parse GPT Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Veo Generation1": {
      "main": [
        [
          {
            "node": "Extract Video Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Sheet Input": {
      "main": [
        [
          {
            "node": "Workflow Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Video Data": {
      "main": [
        [
          {
            "node": "Download Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse GPT Response": {
      "main": [
        [
          {
            "node": "Optimize Prompt for Veo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive Upload": {
      "main": [
        [
          {
            "node": "Google Sheets Append",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets Append": {
      "main": [
        [
          {
            "node": "Upload Video to BLOTATO",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets Trigger": {
      "main": [
        [
          {
            "node": "Parse Sheet Input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Workflow Configuration": {
      "main": [
        [
          {
            "node": "GPT-4 API Call",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Optimize Prompt for Veo": {
      "main": [
        [
          {
            "node": "Prepare Veo Request Body",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload Video to BLOTATO": {
      "main": [
        [
          {
            "node": "Tiktok",
            "type": "main",
            "index": 0
          },
          {
            "node": "Linkedin",
            "type": "main",
            "index": 0
          },
          {
            "node": "Facebook",
            "type": "main",
            "index": 0
          },
          {
            "node": "Instagram",
            "type": "main",
            "index": 0
          },
          {
            "node": "Twitter (X)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Youtube",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Veo Request Body": {
      "main": [
        [
          {
            "node": "Veo Generation1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 内容创作, 多模态 AI

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量25
分类2
节点类型10
难度说明

适合高级用户,包含 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 查看

分享此工作流