This workflow follows the Google Drive → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "\uc218\ub2ec \uc1fc\uce20 \uc790\ub3d9\ud654 \uc6cc\ud06c\ud50c\ub85c\uc6b0",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * *"
}
]
}
},
"id": "node-trigger",
"name": "\ub9e4\uc77c \uc624\uc804 9\uc2dc \ud2b8\ub9ac\uac70",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
240,
300
]
},
{
"parameters": {
"method": "POST",
"url": "https://api.anthropic.com/v1/messages",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "x-api-key",
"value": "={{ $credentials.httpHeaderAuth.value }}"
},
{
"name": "anthropic-version",
"value": "2023-06-01"
},
{
"name": "content-type",
"value": "application/json"
}
]
},
"sendBody": true,
"bodyParameters": {
"parameters": []
},
"specifyBody": "json",
"jsonBody": "{\n \"model\": \"claude-sonnet-4-5\",\n \"max_tokens\": 2000,\n \"system\": \"\ub2f9\uc2e0\uc740 '\ucde8\uc900\ud558\ub294 \uc218\ub2ec\uc774' \uc1fc\uce20 \uc601\uc0c1 \ucf58\ud150\uce20 \ud06c\ub9ac\uc5d0\uc774\ud130\uc785\ub2c8\ub2e4.\\n\\n[\uce90\ub9ad\ud130 \uc124\uc815]\\n- \uc774\ub984: \uc218\ub2ec\uc774\\n- \ucee8\uc149: \ucde8\uc5c5 \uc900\ube44 \uc911\uc778 \uadc0\uc5ec\uc6b4 3D \uc218\ub2ec\\n- \ub9d0\ud22c: \uacf5\uac10\uac00\uace0 \uadc0\uc5fd\uace0 \ub530\ub73b\ud55c \ud1a4\\n- \ud0c0\uac9f: \ucde8\uc900\uc0dd, \uc9c1\uc7a5\uc778 \uacf5\uac10 \ucf58\ud150\uce20\\n\\n[\ucd9c\ub825 \ud615\uc2dd - \ubc18\ub4dc\uc2dc JSON\uc73c\ub85c\ub9cc \uc751\ub2f5]\\n{\\n \\\"title\\\": \\\"\uc601\uc0c1 \uc81c\ubaa9\\\",\\n \\\"concept\\\": \\\"\uc624\ub298\uc758 \ucee8\uc149 \ud55c \uc904 \uc124\uba85\\\",\\n \\\"bgm_mood\\\": \\\"bgm \ubd84\uc704\uae30 \ud0a4\uc6cc\ub4dc (\uc608: lofi, \ub530\ub73b\ud55c, \uac10\uc131\uc801)\\\",\\n \\\"scenes\\\": [\\n {\\n \\\"scene_number\\\": 1,\\n \\\"duration_sec\\\": 4,\\n \\\"narration\\\": \\\"\ub098\ub808\uc774\uc158 \ud14d\uc2a4\ud2b8\\\",\\n \\\"image_prompt_en\\\": \\\"Gemini \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc6a9 \uc601\uc5b4 \ud504\ub86c\ud504\ud2b8. \ubc18\ub4dc\uc2dc \ud3ec\ud568: cute 3D otter with big dark eyes, brown fur, white cheeks, chubby face, Pixar-style animation, warm soft lighting, vertical 9:16 format\\\",\\n \\\"subtitle\\\": \\\"\uc601\uc0c1\uc5d0 \ud45c\uc2dc\ub420 \uc790\ub9c9 \ud14d\uc2a4\ud2b8\\\"\\n }\\n ],\\n \\\"srt_content\\\": \\\"SRT \uc790\ub9c9 \ud30c\uc77c \uc804\uccb4 \ub0b4\uc6a9\\\"\\n}\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"\uc624\ub298 \ub0a0\uc9dc: {{ $now.toFormat('yyyy-MM-dd') }}\\n\\n\ucde8\uc900\ud558\ub294 \uc218\ub2ec\uc774 \uc1fc\uce20 \uc601\uc0c1 1\ud3b8\uc744 \uae30\ud68d\ud574\uc8fc\uc138\uc694.\\n- \ucd1d 4~5\uac1c \uc52c\\n- \uac01 \uc52c 4~5\ucd08\\n- \uc804\uccb4 \uc601\uc0c1 15~20\ucd08\\n- \uc624\ub298\uc758 \ucde8\uc900 \uacf5\uac10 \uc8fc\uc81c\ub85c \uc2a4\ud1a0\ub9ac \uad6c\uc131\\n- SRT \uc790\ub9c9 \ud30c\uc77c\ub3c4 \ud568\uaed8 \uc0dd\uc131 (\uac01 \uc52c \ud0c0\uc784\ucf54\ub4dc \ud3ec\ud568)\\n\\nJSON \ud615\uc2dd\uc73c\ub85c\ub9cc \uc751\ub2f5\ud558\uc138\uc694. \ub9c8\ud06c\ub2e4\uc6b4 \ucf54\ub4dc\ube14\ub85d \uc5c6\uc774 \uc21c\uc218 JSON\ub9cc.\"\n }\n ]\n}",
"options": {}
},
"id": "node-claude",
"name": "Claude - \uc2a4\ud06c\ub9bd\ud2b8 \uc0dd\uc131",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
460,
300
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// Claude \uc751\ub2f5\uc5d0\uc11c JSON \ud30c\uc2f1\nconst response = $input.first().json;\nconst content = response.content[0].text;\n\n// JSON \ud30c\uc2f1 (\ub9c8\ud06c\ub2e4\uc6b4 \ucf54\ub4dc\ube14\ub85d \uc81c\uac70 \ud6c4)\nconst cleanJson = content\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\nlet scriptData;\ntry {\n scriptData = JSON.parse(cleanJson);\n} catch(e) {\n throw new Error('Claude \uc751\ub2f5 \ud30c\uc2f1 \uc2e4\ud328: ' + content);\n}\n\n// \uc52c\ubcc4\ub85c \uac1c\ubcc4 \uc544\uc774\ud15c \uc0dd\uc131 (Gemini \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc6a9)\nconst scenes = scriptData.scenes;\nconst results = [];\n\nfor (const scene of scenes) {\n results.push({\n json: {\n // \uc804\uccb4 \uc2a4\ud06c\ub9bd\ud2b8 \ub370\uc774\ud130\n title: scriptData.title,\n concept: scriptData.concept,\n bgm_mood: scriptData.bgm_mood,\n srt_content: scriptData.srt_content,\n total_scenes: scenes.length,\n // \ud604\uc7ac \uc52c \ub370\uc774\ud130\n scene_number: scene.scene_number,\n duration_sec: scene.duration_sec,\n narration: scene.narration,\n image_prompt_en: scene.image_prompt_en,\n subtitle: scene.subtitle,\n // \ud30c\uc77c\uba85\uc6a9 \ub0a0\uc9dc\n date_str: new Date().toISOString().split('T')[0]\n }\n });\n}\n\nreturn results;"
},
"id": "node-parse",
"name": "\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
680,
300
]
},
{
"parameters": {
"method": "POST",
"url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image-preview:generateContent",
"authentication": "genericCredentialType",
"genericAuthType": "httpQueryAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\n \"contents\": [\n {\n \"parts\": [\n {\n \"text\": \"{{ $json.image_prompt_en }}, vertical 9:16 aspect ratio, for YouTube Shorts\"\n }\n ]\n }\n ],\n \"generationConfig\": {\n \"responseModalities\": [\"IMAGE\", \"TEXT\"],\n \"responseMimeType\": \"image/png\"\n }\n}",
"options": {}
},
"id": "node-gemini",
"name": "Gemini - \uc774\ubbf8\uc9c0 \uc0dd\uc131",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
900,
300
],
"credentials": {
"httpQueryAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// Gemini \uc751\ub2f5\uc5d0\uc11c base64 \uc774\ubbf8\uc9c0 \ucd94\ucd9c\nconst response = $input.first().json;\nconst sceneData = $input.first().json;\n\n// Gemini \uc774\ubbf8\uc9c0 \uc751\ub2f5 \ud30c\uc2f1\nlet base64Image = null;\nlet mimeType = 'image/png';\n\ntry {\n const parts = response.candidates[0].content.parts;\n for (const part of parts) {\n if (part.inlineData) {\n base64Image = part.inlineData.data;\n mimeType = part.inlineData.mimeType || 'image/png';\n break;\n }\n }\n} catch(e) {\n throw new Error('Gemini \uc774\ubbf8\uc9c0 \ud30c\uc2f1 \uc2e4\ud328: ' + JSON.stringify(response));\n}\n\nif (!base64Image) {\n throw new Error('\uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4');\n}\n\nreturn [{\n json: {\n title: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.title,\n concept: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.concept,\n bgm_mood: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.bgm_mood,\n srt_content: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.srt_content,\n scene_number: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.scene_number,\n subtitle: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.subtitle,\n date_str: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.date_str,\n total_scenes: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.total_scenes,\n image_base64: base64Image,\n mime_type: mimeType,\n file_name: `scene_${ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.scene_number }_${ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.date_str }.png`\n },\n binary: {\n image: {\n data: base64Image,\n mimeType: mimeType,\n fileName: `scene_${ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.scene_number }_${ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.date_str }.png`\n }\n }\n}];"
},
"id": "node-extract-image",
"name": "\uc774\ubbf8\uc9c0 \ucd94\ucd9c",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1120,
300
]
},
{
"parameters": {
"operation": "upload",
"name": "={{ $json.file_name }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"folderId": {
"__rl": true,
"mode": "list",
"value": "GOOGLE_DRIVE_FOLDER_ID"
},
"binaryData": true,
"binaryPropertyName": "image",
"options": {}
},
"id": "node-drive-image",
"name": "Google Drive - \uc774\ubbf8\uc9c0 \uc800\uc7a5",
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
1340,
180
],
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "last-scene-check",
"leftValue": "={{ $json.scene_number }}",
"rightValue": "={{ $json.total_scenes }}",
"operator": {
"type": "number",
"operation": "equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "node-if-last",
"name": "\ub9c8\uc9c0\ub9c9 \uc52c?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
1560,
300
]
},
{
"parameters": {
"operation": "upload",
"name": "={{ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.date_str }}_subtitle.srt",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"folderId": {
"__rl": true,
"mode": "list",
"value": "GOOGLE_DRIVE_FOLDER_ID"
},
"binaryData": false,
"fileContent": "={{ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.srt_content }}",
"options": {}
},
"id": "node-drive-srt",
"name": "Google Drive - \uc790\ub9c9 \uc800\uc7a5",
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
1780,
180
],
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// BGM \uc120\ud0dd \ub85c\uc9c1 - \ubd84\uc704\uae30 \ud0a4\uc6cc\ub4dc\ub85c \ub9e4\uce6d\nconst bgmMood = $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.bgm_mood;\nconst dateStr = $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.date_str;\nconst title = $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.title;\nconst concept = $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.concept;\n\n// BGM \ud480 (Drive\uc5d0 \ubbf8\ub9ac \uc800\uc7a5\ud574\ub454 \ud30c\uc77c\uba85 \ubaa9\ub85d)\n// \u26a0\ufe0f \uc18c\uc815\ub2d8\uc774 Suno\uc5d0\uc11c \ub9cc\ub4e0 BGM \ud30c\uc77c\uba85\uc73c\ub85c \uad50\uccb4\ud574\uc8fc\uc138\uc694\nconst bgmPool = {\n lofi: 'bgm_lofi_chill.mp3',\n \uac10\uc131: 'bgm_emotional_warm.mp3',\n \ub530\ub73b\ud55c: 'bgm_warm_cozy.mp3',\n \uc2e0\ub098\ub294: 'bgm_upbeat_fun.mp3',\n \uc794\uc794\ud55c: 'bgm_calm_peaceful.mp3',\n default: 'bgm_lofi_chill.mp3'\n};\n\n// \ud0a4\uc6cc\ub4dc \ub9e4\uce6d\nlet selectedBgm = bgmPool.default;\nfor (const [keyword, filename] of Object.entries(bgmPool)) {\n if (bgmMood && bgmMood.includes(keyword)) {\n selectedBgm = filename;\n break;\n }\n}\n\nreturn [{\n json: {\n date_str: dateStr,\n title: title,\n concept: concept,\n bgm_mood: bgmMood,\n selected_bgm: selectedBgm,\n total_scenes: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.total_scenes\n }\n}];"
},
"id": "node-bgm",
"name": "BGM \ub9e4\uce6d",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1780,
420
]
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83e\udda6 \uc218\ub2ec\uc774 \ucf58\ud150\uce20 \uc900\ube44 \uc644\ub8cc!\n\n\ud83d\udcc5 \ub0a0\uc9dc: {{ $('BGM \ub9e4\uce6d').item.json.date_str }}\n\ud83c\udfac \uc81c\ubaa9: {{ $('BGM \ub9e4\uce6d').item.json.title }}\n\ud83d\udca1 \ucee8\uc149: {{ $('BGM \ub9e4\uce6d').item.json.concept }}\n\ud83c\udfb5 BGM \ubd84\uc704\uae30: {{ $('BGM \ub9e4\uce6d').item.json.bgm_mood }}\n\ud83c\udfb6 \uc120\ud0dd\ub41c BGM: {{ $('BGM \ub9e4\uce6d').item.json.selected_bgm }}\n\n\ud83d\udcc1 \uad6c\uae00 \ub4dc\ub77c\uc774\ube0c \ud655\uc778\n\u2192 \uc774\ubbf8\uc9c0 {{ $('BGM \ub9e4\uce6d').item.json.total_scenes }}\uc7a5 \uc800\uc7a5 \uc644\ub8cc\n\u2192 \uc790\ub9c9 \ud30c\uc77c(.srt) \uc800\uc7a5 \uc644\ub8cc\n\n\u2705 \ub2e4\uc74c \ub2e8\uacc4\n1. Drive\uc5d0\uc11c \uc774\ubbf8\uc9c0 \ud655\uc778\n2. Genspark R2V\ub85c \ud074\ub9bd \uc0dd\uc131\n3. CapCut\uc5d0\uc11c .srt \uc790\ub9c9 \uc784\ud3ec\ud2b8 \ud6c4 \ud3b8\uc9d1\n4. BGM \ucd94\uac00 \ud6c4 \uc5c5\ub85c\ub4dc",
"additionalFields": {}
},
"id": "node-telegram",
"name": "Telegram - \uc644\ub8cc \uc54c\ub9bc",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2000,
300
],
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
}
],
"connections": {
"\ub9e4\uc77c \uc624\uc804 9\uc2dc \ud2b8\ub9ac\uac70": {
"main": [
[
{
"node": "Claude - \uc2a4\ud06c\ub9bd\ud2b8 \uc0dd\uc131",
"type": "main",
"index": 0
}
]
]
},
"Claude - \uc2a4\ud06c\ub9bd\ud2b8 \uc0dd\uc131": {
"main": [
[
{
"node": "\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac",
"type": "main",
"index": 0
}
]
]
},
"\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac": {
"main": [
[
{
"node": "Gemini - \uc774\ubbf8\uc9c0 \uc0dd\uc131",
"type": "main",
"index": 0
}
]
]
},
"Gemini - \uc774\ubbf8\uc9c0 \uc0dd\uc131": {
"main": [
[
{
"node": "\uc774\ubbf8\uc9c0 \ucd94\ucd9c",
"type": "main",
"index": 0
}
]
]
},
"\uc774\ubbf8\uc9c0 \ucd94\ucd9c": {
"main": [
[
{
"node": "Google Drive - \uc774\ubbf8\uc9c0 \uc800\uc7a5",
"type": "main",
"index": 0
}
]
]
},
"Google Drive - \uc774\ubbf8\uc9c0 \uc800\uc7a5": {
"main": [
[
{
"node": "\ub9c8\uc9c0\ub9c9 \uc52c?",
"type": "main",
"index": 0
}
]
]
},
"\ub9c8\uc9c0\ub9c9 \uc52c?": {
"main": [
[
{
"node": "Google Drive - \uc790\ub9c9 \uc800\uc7a5",
"type": "main",
"index": 0
},
{
"node": "BGM \ub9e4\uce6d",
"type": "main",
"index": 0
}
],
[]
]
},
"Google Drive - \uc790\ub9c9 \uc800\uc7a5": {
"main": [
[
{
"node": "Telegram - \uc644\ub8cc \uc54c\ub9bc",
"type": "main",
"index": 0
}
]
]
},
"BGM \ub9e4\uce6d": {
"main": [
[
{
"node": "Telegram - \uc644\ub8cc \uc54c\ub9bc",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"staticData": null,
"tags": [
"\uc218\ub2ec\uc774",
"\uc1fc\uce20\uc790\ub3d9\ud654"
],
"triggerCount": 1,
"updatedAt": "2026-05-19T00:00:00.000Z",
"versionId": "1"
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleDriveOAuth2ApihttpHeaderAuthhttpQueryAuthtelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
수달 쇼츠 자동화 워크플로우. Uses httpRequest, googleDrive, telegram. Scheduled trigger; 10 nodes.
Source: https://github.com/sjeong722/EDUTECH/blob/61c19739fd4c645e76f9bf21923d7770a8b1d3b6/otter_shorts_automation/otter_shorts_workflow.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow runs daily at 9 AM, uses Perplexity to compile vaping industry news, optionally captures article screenshots via Browserless, and generates a HeyGen avatar video from a template. It then
MindFrame Psychology - FREE Complete Workflow. Uses httpRequest, googleDrive, telegram. Scheduled trigger; 25 nodes.
Renta Vehículos Workflow. Uses telegram, telegramTrigger, googleDrive, httpRequest. Scheduled trigger; 10 nodes.
Auto Hunt. Uses httpRequest, googleSheets, rssFeedRead, telegram. Scheduled trigger; 78 nodes.
Auto-Hunt. Uses httpRequest, googleSheets, rssFeedRead, telegram. Scheduled trigger; 78 nodes.