YouTube-Transkript-API verwenden, um Untertitel von YouTube-Videos zu extrahieren
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
- •HTTP Webhook-Endpunkt (wird von n8n automatisch generiert)
- •Möglicherweise sind Ziel-API-Anmeldedaten erforderlich
- •Google Sheets API-Anmeldedaten
Verwendete Nodes (13)
{
"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
}
]
]
}
}
}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
Dahiana
@mssportoNo-Code Specialist with more than 10 years of experience in Digital Marketing. Currently working with Bubble. Webflow, AI, Agents and N8N.
Diesen Workflow teilen