YouTube-Transkript-API verwenden, um Untertitel von YouTube-Videos zu extrahieren

Fortgeschritten

Dies ist ein Market Research, Miscellaneous, Multimodal AI-Bereich Automatisierungsworkflow mit 13 Nodes. Hauptsächlich werden Code, Webhook, HttpRequest, GoogleSheets, RespondToWebhook und andere Nodes verwendet. YouTube-Untertitel über Google Sheets oder API Webhook extrahieren

Voraussetzungen
  • HTTP Webhook-Endpunkt (wird von n8n automatisch generiert)
  • Möglicherweise sind Ziel-API-Anmeldedaten erforderlich
  • Google Sheets API-Anmeldedaten
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
  "name": "Extract YouTube video transcripts using YouTube Transcript API",
  "nodes": [
    {
      "id": "main-explanation-note",
      "name": "Hauptvorlage Erklärung",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        -200
      ],
      "parameters": {
        "color": 7,
        "width": 700,
        "height": 800,
        "content": "# YouTube Transcript Extractor\n\nThis n8n template demonstrates how to extract transcripts from YouTube videos using two different approaches: automated Google Sheets monitoring and direct webhook API calls.\n\n**Use cases:** Content creation, research, accessibility, meeting notes, content repurposing, SEO analysis, or building transcript databases for analysis.\n\n## How it works\n- **Google Sheets Integration:** Monitor a sheet for new YouTube URLs and automatically extract transcripts\n- **Direct API Access:** Send YouTube URLs via webhook and get instant transcript responses\n- **Smart Parsing:** Extracts video ID from various YouTube URL formats (youtube.com, youtu.be, embed)\n- **Rich Metadata:** Returns video title, channel, publish date, duration, and category alongside transcript\n- **Fallback Handling:** Gracefully handles videos without available transcripts\n\n## Two Workflow Paths\n1. **Automated Sheet Processing:** Add URLs to Google Sheet → Auto-extract → Save results to sheet\n2. **Webhook API:** Send POST request with video URL → Get instant transcript response\n\n## How to set up\n1. Replace \"Dummy YouTube Transcript API\" credentials with your YouTube Transcript API key\n2. Create your own Google Sheet with columns: \"url\" (input sheet) and \"video title\", \"transcript\" (results sheet)\n3. Update Google Sheets credentials to connect your sheets\n4. Test each workflow path separately\n5. Customize the webhook path and authentication as needed\n\n## Requirements\n- YouTube Transcript API access (youtube-transcript.io or similar)\n- Google Sheets API credentials (for automated workflow)\n- n8n instance (cloud or self-hosted)\n- YouTube videos with available transcripts\n\n## How to customize\n- Modify transcript processing in the Code nodes\n- Add additional metadata extraction\n- Connect to other storage solutions (databases, CMS)\n- Add text analysis or summarization steps\n- Set up notifications for new transcripts"
      },
      "typeVersion": 1
    },
    {
      "id": "sheets-workflow-note",
      "name": "Sheets-Workflow Hinweis",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -128
      ],
      "parameters": {
        "color": 3,
        "width": 600,
        "height": 100,
        "content": "## Google Sheets Automated Processing\n\nMonitors Google Sheet for new YouTube URLs and processes them automatically"
      },
      "typeVersion": 1
    },
    {
      "id": "webhook-workflow-note",
      "name": "Webhook Workflow Hinweis",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        320
      ],
      "parameters": {
        "color": 4,
        "width": 600,
        "height": 100,
        "content": "## Webhook Direct Processing\n\nSend POST request with YouTube URL to get instant transcript response"
      },
      "typeVersion": 1
    },
    {
      "id": "sheets-trigger",
      "name": "Überwachen der Google Tabelle auf URLs",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        528,
        32
      ],
      "parameters": {
        "event": "rowAdded",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "urls",
          "cachedResultName": "urls"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultName": "Your YouTube Transcript Sheet"
        }
      },
      "credentials": {
        "googleSheetsTriggerOAuth2Api": {
          "id": "google-sheets-credentials",
          "name": "Google Sheets API"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "extract-video-id-sheets",
      "name": "YouTube Video-ID extrahieren (Sheets)",
      "type": "n8n-nodes-base.code",
      "position": [
        768,
        32
      ],
      "parameters": {
        "jsCode": "// Get the URL from n8n input\nconst url = $input.first().json.url;\n\n// Function to extract YouTube video ID\nfunction getVideoId(url) {\n  if (!url) return null;\n  const match = url.match(/(?:v=|youtu\\.be\\/|embed\\/)([^&\\n?#]+)/);\n  return match ? match[1] : null;\n}\n\n// Extract the video ID\nconst videoId = getVideoId(url);\n\n// Return the result for n8n\nreturn {\n  json: {\n    url: url,\n    videoId: videoId,\n    success: videoId ? true : false\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "fetch-transcript-sheets",
      "name": "Video-Transkriptdaten abrufen (Sheets)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1008,
        32
      ],
      "parameters": {
        "url": "https://www.youtube-transcript.io/api/transcripts",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"ids\": [\n    \"{{ $json.videoId }}\"\n  ]\n} ",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "={{ $credentials.youtubeTranscriptApi.token }}"
            }
          ]
        }
      },
      "credentials": {
        "youtubeTranscriptApi": {
          "id": "youtube-transcript-api",
          "name": "Dummy YouTube Transcript API"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "parse-transcript-sheets",
      "name": "Transkripttext parsen (Sheets)",
      "type": "n8n-nodes-base.code",
      "position": [
        1232,
        32
      ],
      "parameters": {
        "jsCode": "const data = $input.first().json;\n\nreturn {\n  json: {\n    fullTranscript: data.tracks[0].transcript.map(segment => segment.text).join(' ')\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "save-to-sheet",
      "name": "Transkript in Tabelle speichern",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1440,
        32
      ],
      "parameters": {
        "columns": {
          "value": {
            "transcript": "={{ $json.fullTranscript }}",
            "video title": "={{ $('Fetch Video Transcript Data (Sheets)').item.json.microformat.playerMicroformatRenderer.title.simpleText }}"
          },
          "schema": [
            {
              "id": "video title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "video title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "transcript",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "transcript",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "transcripts",
          "cachedResultName": "transcripts"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultName": "Your YouTube Transcript Sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "google-sheets-credentials",
          "name": "Google Sheets API"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "webhook-trigger",
      "name": "Webhook Trigger (Direkteingabe)",
      "type": "n8n-nodes-base.webhook",
      "position": [
        512,
        464
      ],
      "webhookId": "extract-youtube-transcript",
      "parameters": {
        "path": "extract-youtube-transcript",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "extract-video-id-webhook",
      "name": "YouTube Video-ID extrahieren (Webhook)",
      "type": "n8n-nodes-base.code",
      "position": [
        752,
        464
      ],
      "parameters": {
        "jsCode": "// Get the video_url from n8n input\nconst url = $input.first().json.body.video_url;\n\n// Function to extract YouTube video ID\nfunction getVideoId(url) {\n  if (!url) return null;\n  const match = url.match(/(?:v=|youtu\\.be\\/|embed\\/)([^&\\n?#]+)/);\n  return match ? match[1] : null;\n}\n\n// Extract the video ID\nconst videoId = getVideoId(url);\n\n// Return the result for n8n\nreturn {\n  json: {\n    url: url,\n    videoId: videoId,\n    success: !!videoId\n  }\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "fetch-transcript-webhook",
      "name": "Video-Transkriptdaten abrufen (Webhook)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1008,
        464
      ],
      "parameters": {
        "url": "https://www.youtube-transcript.io/api/transcripts",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"ids\": [\n    \"{{ $json.videoId }}\"\n  ]\n} ",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "={{ $credentials.youtubeTranscriptApi.token }}"
            }
          ]
        }
      },
      "credentials": {
        "youtubeTranscriptApi": {
          "id": "youtube-transcript-api",
          "name": "Dummy YouTube Transcript API"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "parse-transcript-webhook",
      "name": "Transkripttext parsen (Webhook)",
      "type": "n8n-nodes-base.code",
      "position": [
        1264,
        464
      ],
      "parameters": {
        "jsCode": "const data = $input.first().json;\n\nlet fullTranscript = null;\n\n// ✅ If transcript exists in POST response\nif (data.tracks && data.tracks.length > 0) {\n  fullTranscript = data.tracks[0].transcript\n    .map(segment => segment.text)\n    .join(' ');\n}\n\n// ✅ Fallback if transcript missing\nif (!fullTranscript && data.microformat?.playerMicroformatRenderer?.description?.simpleText) {\n  fullTranscript = data.microformat.playerMicroformatRenderer.description.simpleText;\n}\n\nreturn {\n  json: {\n    id: data.id,\n    title: data.title,\n    channel: data.microformat?.playerMicroformatRenderer?.ownerChannelName,\n    publishDate: data.microformat?.playerMicroformatRenderer?.publishDate,\n    duration: data.microformat?.playerMicroformatRenderer?.lengthSeconds,\n    category: data.microformat?.playerMicroformatRenderer?.category,\n    fullTranscript,\n    hasTranscript: (data.tracks?.length ?? 0) > 0\n  }\n};\n\n"
      },
      "typeVersion": 2
    },
    {
      "id": "return-transcript",
      "name": "Transkript-Antwort zurückgeben",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1488,
        464
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={\n  \"success\": true,\n  \"video\": {\n    \"id\": \"{{ $json.id }}\",\n    \"title\": \"{{ $json.title }}\",\n    \"channel\": \"{{ $json.channel }}\",\n    \"duration\": \"{{ $json.duration }}\",\n    \"hasTranscript\": {{ $json.hasTranscript }}\n  },\n  \"transcript\": \"{{ $json.fullTranscript }}\"\n}"
      },
      "typeVersion": 1.4
    }
  ],
  "connections": {
    "sheets-trigger": {
      "main": [
        [
          {
            "node": "extract-video-id-sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "parse-transcript-sheets": {
      "main": [
        [
          {
            "node": "save-to-sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "webhook-trigger": {
      "main": [
        [
          {
            "node": "extract-video-id-webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "parse-transcript-webhook": {
      "main": [
        [
          {
            "node": "return-transcript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "extract-video-id-sheets": {
      "main": [
        [
          {
            "node": "fetch-transcript-sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "extract-video-id-webhook": {
      "main": [
        [
          {
            "node": "fetch-transcript-webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fetch-transcript-sheets": {
      "main": [
        [
          {
            "node": "parse-transcript-sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fetch-transcript-webhook": {
      "main": [
        [
          {
            "node": "parse-transcript-webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Häufig gestellte Fragen

Wie verwende ich diesen Workflow?

Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.

Für welche Szenarien ist dieser Workflow geeignet?

Fortgeschritten - Marktforschung, Verschiedenes, Multimodales KI

Ist es kostenpflichtig?

Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.

Verwandte Workflows

Workflow-Informationen
Schwierigkeitsgrad
Fortgeschritten
Anzahl der Nodes13
Kategorie3
Node-Typen7
Schwierigkeitsbeschreibung

Für erfahrene Benutzer, mittelkomplexe Workflows mit 6-15 Nodes

Autor
Dahiana

Dahiana

@mssporto

No-Code Specialist with more than 10 years of experience in Digital Marketing. Currently working with Bubble. Webflow, AI, Agents and N8N.

Externe Links
Auf n8n.io ansehen

Diesen Workflow teilen

Kategorien

Kategorien: 34