This workflow follows the Executecommand → 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 →
{
"nodes": [
{
"parameters": {
"content": "~# docker exec -it n8n_core sh\nrm -f /root/.n8n-files/.processing\nclear the flag manually\n\u624b\u52d5\u9664flag\n(wsl)",
"width": 336
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-9552,
1136
],
"id": "7f0a7d38-1a16-4430-a48b-b6b0513e1b59",
"name": "Sticky Note"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 1
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-10640,
1168
],
"id": "97aa2a49-7d7c-4084-8af1-7ca18f7f7b78",
"name": "Schedule Trigger"
},
{
"parameters": {
"command": "find /root/.n8n-files \\( -name \"*.wav\" -o -name \"*.m4a\" \\) -not -path \"*/temp_chunks/*\" -not -name \"*.done.*\" -not -name \"temp_input_course.wav\" | head -1"
},
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-10544,
1168
],
"id": "e931ecc2-09d3-4e70-a9bf-a7a507ac7e05",
"name": "Execute Command",
"notesInFlow": true,
"notes": "\u4e0d\u9650\u6642\u9593\uff0c\u53ea\u770b\u6709\u7121 .done.\uff0c\u6392\u9664 temp_input_course.wav"
},
{
"parameters": {
"jsCode": "const stdout = $input.first().json.stdout?.trim();\nif (!stdout) return [];\n\nconst filePath = stdout;\nconst parts = filePath.split('/');\nconst filename = parts[parts.length - 1];\nlet category = parts[parts.length - 2];\n\n// \u5982\u679c\u5728 \u6703\u8b70 \u5b50\u8cc7\u6599\u593e\u4e0b\uff0ccategory \u88dc\u4e0a \u6703\u8b70_ \u524d\u7db4\nif (parts.includes('\u6703\u8b70') && category !== '\u6703\u8b70') {\n category = `\u6703\u8b70_${category}`;\n}\n\nconsole.log(`\u627e\u5230\u5f85\u8655\u7406\u6a94\u6848\uff1a${category}/${filename}`);\nreturn [{ json: { body: { category, filename }, filePath } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-10448,
1168
],
"id": "afb360d2-3845-498e-96a0-360fadb492de",
"name": "Code in JavaScript1"
},
{
"parameters": {
"command": "=SOURCE=\"{{ $json.filePath }}\"\nif [ ! -f \"$SOURCE\" ]; then\n echo \"ERROR: \u4f86\u6e90\u6a94\u6848\u4e0d\u5b58\u5728 $SOURCE\"\n exit 1\nfi\nif [ -f /root/.n8n-files/.processing ]; then\n AGE=$(find /root/.n8n-files/.processing -mmin +180 | wc -l)\n if [ \"$AGE\" -gt 0 ]; then\n rm -f /root/.n8n-files/.processing\n echo \"\u820a flag \u8d85\u6642\u5df2\u6e05\u9664\uff0c\u7e7c\u7e8c\u57f7\u884c\"\n else\n echo \"BUSY\"\n exit 0\n fi\nfi\ntouch /root/.n8n-files/.processing\nmkdir -p /root/.n8n-files/temp_chunks\ncp \"$SOURCE\" /root/.n8n-files/temp_input_course.wav\nif [ $? -ne 0 ]; then\n rm -f /root/.n8n-files/.processing\n echo \"ERROR: \u8907\u88fd\u5931\u6557\"\n exit 1\nfi\nmv \"$SOURCE\" \"${SOURCE}.done\"\necho \"OK\""
},
"id": "b8dfbee9-230c-4875-9c10-f9d2905862b6",
"name": "\u8907\u88fd\u97f3\u6a94\u5230\u5b89\u5168\u53401",
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-10352,
1264
],
"notesInFlow": true,
"onError": "continueErrorOutput",
"notes": "\u9632\u5446\u7248\uff1a\u4f86\u6e90\u5b58\u5728\u2192flag\u6aa2\u67e5\u2192\u8907\u88fd\u2192\u6a19\u8a18done\uff0c\u5931\u6557\u81ea\u52d5\u6e05flag"
},
{
"parameters": {
"jsCode": "const result = $input.first().json;\nconst stdout = result.stdout?.trim() || '';\nconst exitCode = result.exitCode;\nif (exitCode !== 0 || stdout.startsWith('ERROR') || stdout === 'BUSY') {\n console.log('\u505c\u6b62\u539f\u56e0\uff1a', stdout || `exitCode=${exitCode}`);\n return [];\n}\nconsole.log('\u97f3\u6a94\u8907\u88fd\u6210\u529f\uff0c\u7e7c\u7e8c\u6d41\u7a0b');\nreturn $input.all();"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-10256,
1264
],
"id": "0b06876b-3a38-4b5a-93f7-8c7294477955",
"name": "Code in JavaScript",
"notesInFlow": true,
"notes": "\u7528 exitCode \u5224\u65b7\uff0c\u6bd4\u5b57\u4e32\u6bd4\u5c0d\u66f4\u7a69\u5b9a"
},
{
"parameters": {
"command": "touch /root/.n8n-files/.last_check"
},
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-10160,
1264
],
"id": "791127b2-802c-4fd0-9233-fe14b8fee559",
"name": "touch"
},
{
"parameters": {
"command": "rm -f /root/.n8n-files/temp_chunks/part_*.wav /root/.n8n-files/temp_chunks/part_*.m4a && echo \"\u5df2\u6e05\u7a7a\u820a\u5207\u7247\""
},
"id": "e03894cb-2632-40b9-92e0-49ea82d08925",
"name": "\u6e05\u7a7a\u820a\u5207\u72471",
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-10048,
1344
]
},
{
"parameters": {
"command": "INPUT=\"/root/.n8n-files/temp_input_course.wav\"\nif [ ! -f \"$INPUT\" ]; then echo \"ERROR: temp_input_course.wav \u4e0d\u5b58\u5728\"; exit 1; fi\nffmpeg -y -i \"$INPUT\" -f segment -segment_time 600 -c:a pcm_s16le /root/.n8n-files/temp_chunks/part_%03d.wav 2>&1 | tail -3\necho \"FFmpeg \u5b8c\u6210\""
},
"id": "337f82da-982f-4ffa-9794-c2996252649c",
"name": "FFmpeg \u81ea\u52d5\u5207\u72471",
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-9952,
1344
],
"onError": "continueErrorOutput"
},
{
"parameters": {
"command": "sync && FILE_COUNT=$(ls /root/.n8n-files/temp_chunks/part_*.wav 2>/dev/null | wc -l)\nif [ \"$FILE_COUNT\" -eq 0 ]; then echo \"ERROR: \u6c92\u6709\u5207\u7247\u7522\u751f\"; exit 1; fi\necho \"\u5207\u7247\u5b8c\u6210\uff0c\u5171 $FILE_COUNT \u500b\"\nls -lh /root/.n8n-files/temp_chunks/part_*.wav"
},
"id": "f76a36d6-4184-4cff-9e66-6e925d388936",
"name": "\u78ba\u8a8d\u5207\u7247\u5b8c\u62101",
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-9856,
1344
],
"onError": "continueErrorOutput"
},
{
"parameters": {
"fileSelector": "/root/.n8n-files/temp_chunks/part_*.wav"
},
"id": "b2db4452-89f9-4775-8c37-77ae3224a54b",
"name": "\u8b80\u53d6\u6240\u6709\u5207\u72471",
"type": "n8n-nodes-base.readBinaryFiles",
"typeVersion": 1,
"position": [
-9696,
1344
]
},
{
"parameters": {
"jsCode": "const items = $input.all();\nconst wfStatic = $getWorkflowStaticData('global');\nwfStatic['current_run'] = { totalChunks: items.length, completedCount: 0, results: [] };\nconsole.log(`\u521d\u59cb\u5316\u5b8c\u6210\uff0c\u5171 ${items.length} \u500b\u5207\u7247`);\nreturn items.map((item, index) => ({\n json: { chunkIndex: index, totalChunks: items.length },\n binary: { data: Object.values(item.binary)[0] }\n}));"
},
"id": "cd4b0052-45b8-4bf7-bf91-306e300e19b5",
"name": "\u521d\u59cb\u5316\u975c\u614b\u5bb9\u56681",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-9568,
1344
]
},
{
"parameters": {
"options": {}
},
"id": "caf356b9-009a-4669-9ce6-aa42f30a2f73",
"name": "Loop \u5207\u7247\u8655\u74061",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
-9408,
1344
]
},
{
"parameters": {
"method": "POST",
"url": "http://whisper:8000/v1/audio/transcriptions",
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"parameterType": "formBinaryData",
"name": "file",
"inputDataFieldName": "data"
},
{
"name": "model",
"value": "Systran/faster-whisper-large-v3"
},
{
"name": "response_format",
"value": "json"
},
{
"name": "condition_on_previous_text",
"value": "false"
},
{
"name": "temperature",
"value": "0.0"
},
{
"name": "vad_filter",
"value": "true"
},
{
"name": "compression_ratio_threshold",
"value": "2.0"
},
{
"name": "logprob_threshold",
"value": "-1.0"
},
{
"name": "no_speech_threshold",
"value": "0.6"
}
]
},
"options": {
"timeout": 600000
}
},
"id": "bf3bb7d9-4b11-4a54-bc0e-4bf0da973e15",
"name": "Whisper ASR \u8fa8\u8b58",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
-9232,
1360
],
"onError": "continueErrorOutput"
},
{
"parameters": {
"jsCode": "const items = $input.all();\nconst wfStatic = $getWorkflowStaticData('global');\nif (!wfStatic['current_run']) {\n wfStatic['current_run'] = { totalChunks: 0, completedCount: 0, results: [] };\n}\nif (items[0]?.json?.error) {\n wfStatic['current_run'].completedCount += 1;\n return [{ json: { completed: wfStatic['current_run'].completedCount, total: wfStatic['current_run'].totalChunks } }];\n}\nlet text = items[0]?.json?.text || '';\nconst lines = text.split(/[\uff0c\u3002\uff1f\uff01\\n]/);\nconst seen = {};\nlet cleanLines = [];\nfor (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n seen[trimmed] = (seen[trimmed] || 0) + 1;\n if (seen[trimmed] <= 3) cleanLines.push(trimmed);\n}\ntext = cleanLines.join('\uff0c');\nwfStatic['current_run'].results.push(text);\nwfStatic['current_run'].completedCount += 1;\nconst completed = wfStatic['current_run'].completedCount;\nconst total = wfStatic['current_run'].totalChunks;\nconsole.log(`\u5df2\u5b8c\u6210 ${completed} / ${total} \u500b\u5207\u7247`);\nreturn [{ json: { completed, total } }];"
},
"id": "3aacacd8-35e5-4460-9786-3ab7c0658479",
"name": "\u7d2f\u7a4d ASR \u7d50\u679c1",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-9072,
1360
]
},
{
"parameters": {
"jsCode": "const wfStatic = $getWorkflowStaticData('global');\nconst container = wfStatic['current_run'] || { results: [] };\nfunction cleanHallucinations(text) {\n if (!text) return '';\n let cleaned = text.replace(/(.{2,10}?)\\1{3,}/g, '$1');\n cleaned = cleaned.replace(/(.)\\1{5,}/g, '$1');\n return cleaned.trim();\n}\nconst fullText = container.results\n .filter(t => t && t.trim().length > 0)\n .map(t => cleanHallucinations(t))\n .join('\\n\\n');\nconsole.log(`\u9010\u5b57\u7a3f\u7d44\u5408\u5b8c\u6210\uff0c\u5171 ${container.results.length} \u6bb5`);\nreturn [{ json: { fullText } }];"
},
"id": "d0813160-bfa0-4b3b-9f33-2fefb6890f1a",
"name": "\u7d44\u5408\u5b8c\u6574\u9010\u5b57\u7a3f",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-9040,
1200
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 1
},
"conditions": [
{
"id": "meeting-01",
"leftValue": "={{ $('Code in JavaScript1').item.json.body.category }}",
"rightValue": "\u6703\u8b70",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "87c9180e-4492-479d-8d97-ef6335491207",
"name": "IF \u6703\u8b70\u5224\u65b7",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
-8624,
1152
]
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "models/gemini-3-flash-preview",
"mode": "list",
"cachedResultName": "models/gemini-3-flash-preview"
},
"messages": {
"values": [
{
"content": "=\u4f60\u662f\u4e00\u4f4d\u5c08\u696d\u7684\u8ab2\u7a0b\u52a9\u6559\u3002\u8acb\u5e6b\u6211\u6839\u64da\u4ee5\u4e0b\u7684\u8ab2\u7a0b\u9010\u5b57\u7a3f\uff0c\u6574\u7406\u51fa\u4e00\u4efd\u7d50\u69cb\u5316\u7684\u91cd\u9ede\u6458\u8981\uff0c\u4e26\u51fa\u6e2c\u9a57\u984c\u8feb\u4f7f\u5b78\u751f\u4e3b\u52d5\u56de\u61b6\uff0815\u984c\u55ae\u9078\u30015\u984c\u7c21\u7b54\uff09\uff0c\u4e26\u5728\u6700\u5f8c\u63d0\u4f9b\u53c3\u8003\u7b54\u6848\u8207\u7c21\u55ae\u89e3\u6790\n\n**\u5167\u5bb9\uff1a**\n{{ $('\u7d44\u5408\u5b8c\u6574\u9010\u5b57\u7a3f').item.json.fullText }}\n\n\u8acb\u7528\u7e41\u9ad4\u4e2d\u6587\u8207\u53f0\u7063\u7528\u8a9e\u8f38\u51fa\uff0c\u4e26\u4f7f\u7528 Markdown \u683c\u5f0f\u9032\u884c\u512a\u7f8e\u6392\u7248\uff08\u5982\u6a19\u984c\u3001\u7c97\u9ad4\u3001\u689d\u5217\u5f0f\uff09\n\n\u7279\u5225\u6ce8\u610f\uff1a\u56e0\u70ba\u6b64\u7b46\u8a18\u6703\u900f\u904e Gmail \u5bc4\u9001\uff0cGmail \u4e0d\u652f\u63f4 LaTeX \u6578\u5b78\u6e32\u67d3\u3002\n\u8acb\u300c\u7d55\u5c0d\u7981\u6b62\u300d\u4f7f\u7528 $ \u7b26\u865f\u5305\u88f9\u516c\u5f0f\u3002\n\u6240\u6709\u6578\u5b78\u5f0f\u8acb\u6539\u7528\u7d14\u6587\u5b57\u8868\u9054\uff08\u4f8b\u5982\u7528 ^ \u4ee3\u8868\u6b21\u65b9\u3001sqrt \u4ee3\u8868\u6839\u865f\u3001/ \u4ee3\u8868\u5206\u6578\uff09\uff0c\u78ba\u4fdd\u5728\u4e0d\u652f\u63f4\u6578\u5b78\u6392\u7248\u7684\u96fb\u5b50\u90f5\u4ef6\u4e2d\u4e5f\u80fd\u6e05\u6670\u95b1\u8b80\u3002"
}
]
},
"builtInTools": {},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"typeVersion": 1.1,
"position": [
-8656,
1344
],
"id": "11930bfd-db84-4262-9d8e-eb1bc3b50b75",
"name": "Gemini \u7b46\u8a18\u8207\u51fa\u984c1",
"retryOnFail": true,
"waitBetweenTries": 5000,
"maxTries": 5,
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"onError": "continueErrorOutput"
},
{
"parameters": {
"command": "=mkdir -p \"/data/obsidian_vault/{{ $('Code in JavaScript1').item.json.body.category }}\" && cat > \"/data/obsidian_vault/{{ $('Code in JavaScript1').item.json.body.category }}/AI_\u7b46\u8a18_{{ $now.format('yyyy-MM-dd_HHmm') }}.md\" <<'EOF'\n{{ $json.content.parts[0].text }}\nEOF"
},
"id": "772a2b27-41b8-481b-808c-88a95bdc27a4",
"name": "\u5beb\u5165 Obsidian1",
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-8304,
1328
]
},
{
"parameters": {
"mode": "markdownToHtml",
"markdown": "={{ $('Gemini \u7b46\u8a18\u8207\u51fa\u984c1').item.json.content.parts[0].text }}",
"options": {}
},
"id": "659e45d3-9a44-464f-97f4-5a998e74d88f",
"name": "Markdown \u8f49 HTML1",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"position": [
-8144,
1360
]
},
{
"parameters": {
"sendTo": "411421246@gms.ndhu.edu.tw",
"subject": "=\ud83d\udcda {{ $('Code in JavaScript1').item.json.body.category }}\u8ab2\u7a0b\u7b46\u8a18 - {{ $now.format('yyyy-MM-dd') }}",
"message": "=<h2>\ud83d\udcda {{ $('Code in JavaScript1').item.json.body.category }} \u8ab2\u7a0b\u7b46\u8a18</h2>\n<p><strong>\u9304\u97f3\u6642\u9593\uff1a</strong>{{ $now.format('yyyy-MM-dd HH:mm') }}</p>\n<hr>\n{{ $json.data }}",
"options": {}
},
"id": "444a6314-806d-4c23-9b44-c7df801479ab",
"name": "\u5bc4\u9001 Gmail \u8907\u7fd2\u4fe1",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
-8000,
1360
],
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"executeOnce": false,
"command": "rm -f /root/.n8n-files/temp_chunks/part_*.wav\nrm -f /root/.n8n-files/temp_chunks/part_*.m4a\nrm -f /root/.n8n-files/temp_input_course.wav\nrm -f /root/.n8n-files/.processing\necho \"\u6e05\u7406\u5b8c\u6210\uff08\u4e00\u822c\u8ab2\u7a0b\uff09\""
},
"id": "33140e3d-7335-46cd-bb2c-0467319008a8",
"name": "\u6e05\u7406\u66ab\u5b58\u6a94",
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-7872,
1360
],
"notesInFlow": true,
"notes": "\u4e00\u822c\u8ab2\u7a0b\u6d41\u7a0b\u7d50\u675f\uff0c\u6e05\u7406\u5168\u90e8\u66ab\u5b58 + flag"
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "models/gemini-3-flash-preview",
"mode": "list",
"cachedResultName": "models/gemini-3-flash-preview"
},
"messages": {
"values": [
{
"content": "=\u4f60\u662f\u4e00\u4f4d\u5c08\u696d\u7684\u6703\u8b70\u8a18\u9304\u52a9\u7406\u3002\u8acb\u6839\u64da\u4ee5\u4e0b\u6703\u8b70\u9010\u5b57\u7a3f\uff0c\u6574\u7406\u51fa\u4e00\u4efd\u7d50\u69cb\u6e05\u6670\u7684\u6703\u8b70\u7d00\u9304\u3002\n\n\u3010\u91cd\u8981\u8aaa\u660e\u3011\n\u9019\u4efd\u9010\u5b57\u7a3f\u7531 AI \u8a9e\u97f3\u8fa8\u8b58\u751f\u6210\uff0c\u53ef\u80fd\u5305\u542b\u5c11\u91cf\u8fa8\u8b58\u932f\u8aa4\u6216\u91cd\u8907\u5b57\u53e5\uff0c\u8acb\u81ea\u884c\u5224\u65b7\u4e26\u904e\u6ffe\u7121\u610f\u7fa9\u5167\u5bb9\uff0c\u805a\u7126\u5728\u5be6\u8cea\u8a0e\u8ad6\u4e0a\u3002\n\n\u8acb\u4f9d\u7167\u4ee5\u4e0b\u683c\u5f0f\u8f38\u51fa\uff0c\u4f7f\u7528 Markdown \u6392\u7248\uff1a\n\n---\n\n## \ud83d\udccb \u57fa\u672c\u8cc7\u8a0a\n- **\u6703\u8b70\u540d\u7a31**\uff1a{{ $('Code in JavaScript1').item.json.body.category }}\n- **\u65e5\u671f**\uff1a{{ $now.format('yyyy-MM-dd') }}\n- **\u6703\u8b70\u76ee\u7684**\uff1a\uff08\u5f9e\u9010\u5b57\u7a3f\u5224\u65b7\uff09\n\n---\n\n## \ud83c\udfaf \u8a0e\u8ad6\u91cd\u9ede\n\uff08\u689d\u5217\u4e3b\u8981\u8a0e\u8ad6\u8b70\u984c\uff0c\u7279\u5225\u6a19\u6ce8\u6709\u4e0d\u540c\u610f\u898b\u6216\u722d\u8ad6\u7684\u5730\u65b9\uff09\n\n---\n\n## \u2696\ufe0f \u95dc\u9375\u7406\u7531 / \u53d6\u6368\n\uff08\u5404\u65b9\u89c0\u9ede\u8207\u9078\u64c7\u67d0\u500b\u65b9\u5411\u7684\u7406\u7531\uff09\n\n---\n\n## \ud83d\udca1 \u5f71\u97ff\u5f8c\u7e8c\u6c7a\u7b56\u7684\u89c0\u9ede\n\uff08\u54ea\u4e9b\u60f3\u6cd5\u6216\u8cc7\u8a0a\u6703\u5de6\u53f3\u63a5\u4e0b\u4f86\u7684\u65b9\u5411\uff09\n\n---\n\n## \u2705 \u6c7a\u8b70\u4e8b\u9805\n\uff08\u660e\u78ba\u5217\u51fa\u6700\u7d42\u6c7a\u5b9a\u4e86\u4ec0\u9ebc\uff0c\u7528\u689d\u5217\u5f0f\uff09\n\n---\n\n## \ud83d\udccc \u884c\u52d5\u9805\u76ee\n| \u8ca0\u8cac\u4eba | \u4efb\u52d9\u5167\u5bb9 | \u671f\u9650 |\n|--------|---------|------|\n\uff08\u82e5\u9010\u5b57\u7a3f\u672a\u660e\u78ba\u63d0\u5230\u8ca0\u8cac\u4eba\u6216\u671f\u9650\uff0c\u586b\u300c\u5f85\u78ba\u8a8d\u300d\uff09\n\n---\n\n## \ud83d\udcc5 \u4e0b\u6b21\u6703\u8b70\u5b89\u6392\n\uff08\u82e5\u6709\u63d0\u5230\u5247\u586b\u5165\uff0c\u5426\u5247\u586b\u300c\u672a\u5b89\u6392\u300d\uff09\n\n---\n\n## \ud83d\uddd2\ufe0f \u88dc\u5145\u5099\u8a3b\n\uff08\u5176\u4ed6\u503c\u5f97\u8a18\u9304\u4f46\u672a\u6b78\u985e\u7684\u8cc7\u8a0a\uff09\n\n---\n\n> \u6703\u8b70\u8a18\u9304 = \u6c7a\u5b9a + \u884c\u52d5 + \u8cac\u4efb\n\n\u8acb\u7528\u7e41\u9ad4\u4e2d\u6587\u8207\u53f0\u7063\u7528\u8a9e\u8f38\u51fa\u3002\u7981\u6b62\u4f7f\u7528 $ \u7b26\u865f\u5305\u88f9\u4efb\u4f55\u5167\u5bb9\u3002\n\n\u3010\u9010\u5b57\u7a3f\u5167\u5bb9\u5982\u4e0b\u3011\uff1a\n{{ $('\u7d44\u5408\u5b8c\u6574\u9010\u5b57\u7a3f').item.json.fullText }}"
}
]
},
"builtInTools": {},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"typeVersion": 1.1,
"position": [
-8384,
1152
],
"id": "6e6d9de9-ec18-46ff-a36e-e86f9efaed74",
"name": "Gemini \u6703\u8b70\u7d00\u9304",
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"command": "=CATEGORY=\"{{ $('Code in JavaScript1').item.json.body.category }}\"\nmkdir -p \"/data/obsidian_vault/\u6703\u8b70/${CATEGORY}\" && cat > \"/data/obsidian_vault/\u6703\u8b70/${CATEGORY}/\u6703\u8b70\u7d00\u9304_{{ $now.format('yyyy-MM-dd_HHmm') }}.md\" <<'OBSEOF'\n{{ $json.content.parts[0].text }}\nOBSEOF"
},
"id": "433ec0b6-6d8b-426d-8412-642a8eb938b2",
"name": "\u6703\u8b70_\u5beb\u5165Obsidian",
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-8144,
1152
]
},
{
"parameters": {
"mode": "markdownToHtml",
"markdown": "={{ $('Gemini \u6703\u8b70\u7d00\u9304').item.json.content.parts[0].text }}",
"options": {}
},
"id": "512d4f5d-d857-4e5d-af55-8efedf5e4661",
"name": "\u6703\u8b70_Markdown\u8f49HTML",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"position": [
-8048,
1152
]
},
{
"parameters": {
"sendTo": "411421246@gms.ndhu.edu.tw",
"subject": "=\ud83d\udcdd \u6703\u8b70\u7d00\u9304\uff5c{{ $('Code in JavaScript1').item.json.body.category }} - {{ $now.format('yyyy-MM-dd') }}",
"message": "=<h2>\ud83d\udcdd \u6703\u8b70\u7d00\u9304</h2>\n<p><strong>\u6703\u8b70\uff1a</strong>{{ $('Code in JavaScript1').item.json.body.category }}</p>\n<p><strong>\u6642\u9593\uff1a</strong>{{ $now.format('yyyy-MM-dd HH:mm') }}</p>\n<hr>\n{{ $json.data }}",
"options": {}
},
"id": "1f769179-8fe5-4088-9ebd-e33680c2c55f",
"name": "\u6703\u8b70_\u5bc4\u9001Gmail",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
-7872,
1152
],
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"command": "rm -f /root/.n8n-files/temp_chunks/part_*.wav\nrm -f /root/.n8n-files/temp_input_course.wav\nrm -f /root/.n8n-files/.processing\necho \"\u6e05\u7406\u5b8c\u6210\uff08\u6703\u8b70\u6d41\u7a0b\uff09\""
},
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
-7712,
1152
],
"id": "e6200166-2388-4cbe-987e-e016c9692884",
"name": "\u6e05\u7406\u66ab\u5b58\u6a94_\u6703\u8b70",
"notesInFlow": true,
"notes": "\u6703\u8b70\u6d41\u7a0b\u7d50\u675f\uff0c\u6e05\u7406\u66ab\u5b58 + flag"
},
{
"parameters": {
"sendTo": "411421246@gms.ndhu.edu.tw",
"subject": "=\ud83d\udcdd {{ $('Code in JavaScript1').item.json.body.category }} \u8ab2\u5802\u9010\u5b57\u7a3f - {{ $now.format('yyyy-MM-dd') }}",
"message": "=<h2>\ud83d\udcdd {{ $('Code in JavaScript1').item.json.body.category }} \u8ab2\u5802\u9010\u5b57\u7a3f</h2>\n<p><strong>\u9304\u97f3\u6642\u9593\uff1a</strong>{{ $now.format('yyyy-MM-dd HH:mm') }}</p>\n<hr>\n<pre style=\"font-family: monospace; white-space: pre-wrap; font-size: 13px; background: #f5f5f5; padding: 16px; border-radius: 4px;\">\n{{ $('\u7d44\u5408\u5b8c\u6574\u9010\u5b57\u7a3f').item.json.fullText }}\n</pre>",
"options": {}
},
"id": "2790a906-2d77-4f99-8fa9-5d21cf2f833c",
"name": "\u5bc4\u9001\u8ab2\u5802\u9010\u5b57\u7a3f",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
-8928,
1200
],
"notesInFlow": true,
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"notes": "\u5e38\u99d0\u529f\u80fd\uff1a\u6240\u6709\u8ab2\u7a0b\u90fd\u5bc4\u9010\u5b57\u7a3f"
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Execute Command",
"type": "main",
"index": 0
}
]
]
},
"Execute Command": {
"main": [
[
{
"node": "Code in JavaScript1",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript1": {
"main": [
[
{
"node": "\u8907\u88fd\u97f3\u6a94\u5230\u5b89\u5168\u53401",
"type": "main",
"index": 0
}
]
]
},
"\u8907\u88fd\u97f3\u6a94\u5230\u5b89\u5168\u53401": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
],
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "touch",
"type": "main",
"index": 0
}
]
]
},
"touch": {
"main": [
[
{
"node": "\u6e05\u7a7a\u820a\u5207\u72471",
"type": "main",
"index": 0
}
]
]
},
"\u6e05\u7a7a\u820a\u5207\u72471": {
"main": [
[
{
"node": "FFmpeg \u81ea\u52d5\u5207\u72471",
"type": "main",
"index": 0
}
]
]
},
"FFmpeg \u81ea\u52d5\u5207\u72471": {
"main": [
[
{
"node": "\u78ba\u8a8d\u5207\u7247\u5b8c\u62101",
"type": "main",
"index": 0
}
]
]
},
"\u78ba\u8a8d\u5207\u7247\u5b8c\u62101": {
"main": [
[
{
"node": "\u8b80\u53d6\u6240\u6709\u5207\u72471",
"type": "main",
"index": 0
}
]
]
},
"\u8b80\u53d6\u6240\u6709\u5207\u72471": {
"main": [
[
{
"node": "\u521d\u59cb\u5316\u975c\u614b\u5bb9\u56681",
"type": "main",
"index": 0
}
]
]
},
"\u521d\u59cb\u5316\u975c\u614b\u5bb9\u56681": {
"main": [
[
{
"node": "Loop \u5207\u7247\u8655\u74061",
"type": "main",
"index": 0
}
]
]
},
"Loop \u5207\u7247\u8655\u74061": {
"main": [
[
{
"node": "\u7d44\u5408\u5b8c\u6574\u9010\u5b57\u7a3f",
"type": "main",
"index": 0
}
],
[
{
"node": "Whisper ASR \u8fa8\u8b58",
"type": "main",
"index": 0
}
]
]
},
"Whisper ASR \u8fa8\u8b58": {
"main": [
[
{
"node": "\u7d2f\u7a4d ASR \u7d50\u679c1",
"type": "main",
"index": 0
}
],
[
{
"node": "\u7d2f\u7a4d ASR \u7d50\u679c1",
"type": "main",
"index": 0
}
]
]
},
"\u7d2f\u7a4d ASR \u7d50\u679c1": {
"main": [
[
{
"node": "Loop \u5207\u7247\u8655\u74061",
"type": "main",
"index": 0
}
]
]
},
"\u7d44\u5408\u5b8c\u6574\u9010\u5b57\u7a3f": {
"main": [
[
{
"node": "\u5bc4\u9001\u8ab2\u5802\u9010\u5b57\u7a3f",
"type": "main",
"index": 0
}
]
]
},
"IF \u6703\u8b70\u5224\u65b7": {
"main": [
[
{
"node": "Gemini \u6703\u8b70\u7d00\u9304",
"type": "main",
"index": 0
}
]
]
},
"Gemini \u7b46\u8a18\u8207\u51fa\u984c1": {
"main": [
[
{
"node": "\u5beb\u5165 Obsidian1",
"type": "main",
"index": 0
}
]
]
},
"\u5beb\u5165 Obsidian1": {
"main": [
[
{
"node": "Markdown \u8f49 HTML1",
"type": "main",
"index": 0
}
]
]
},
"Markdown \u8f49 HTML1": {
"main": [
[
{
"node": "\u5bc4\u9001 Gmail \u8907\u7fd2\u4fe1",
"type": "main",
"index": 0
}
]
]
},
"\u5bc4\u9001 Gmail \u8907\u7fd2\u4fe1": {
"main": [
[
{
"node": "\u6e05\u7406\u66ab\u5b58\u6a94",
"type": "main",
"index": 0
}
]
]
},
"Gemini \u6703\u8b70\u7d00\u9304": {
"main": [
[
{
"node": "\u6703\u8b70_\u5beb\u5165Obsidian",
"type": "main",
"index": 0
}
]
]
},
"\u6703\u8b70_\u5beb\u5165Obsidian": {
"main": [
[
{
"node": "\u6703\u8b70_Markdown\u8f49HTML",
"type": "main",
"index": 0
}
]
]
},
"\u6703\u8b70_Markdown\u8f49HTML": {
"main": [
[
{
"node": "\u6703\u8b70_\u5bc4\u9001Gmail",
"type": "main",
"index": 0
}
]
]
},
"\u6703\u8b70_\u5bc4\u9001Gmail": {
"main": [
[
{
"node": "\u6e05\u7406\u66ab\u5b58\u6a94_\u6703\u8b70",
"type": "main",
"index": 0
}
]
]
},
"\u5bc4\u9001\u8ab2\u5802\u9010\u5b57\u7a3f": {
"main": [
[
{
"node": "Gemini \u7b46\u8a18\u8207\u51fa\u984c1",
"type": "main",
"index": 0
},
{
"node": "IF \u6703\u8b70\u5224\u65b7",
"type": "main",
"index": 0
}
]
]
}
},
"meta": {
"templateCredsSetupCompleted": true
}
}
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.
gmailOAuth2googlePalmApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
N8Nflow Zhtw. Uses executeCommand, readBinaryFiles, httpRequest, googleGemini. Scheduled trigger; 28 nodes.
Source: https://github.com/3rskine/lecture-autonoter/blob/96731762589f9e0cd5730df705b91a5bc8fed642/n8nflow_zhTW.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 is a complete outbound automation system that discovers local businesses, extracts contact emails, generates personalized cold emails using AI, and runs a multi-step follow-up sequence —
This workflow automatically fetches the latest business news, analyzes its impact on clients using AI and sends alerts for high-impact articles while logging all processed data in Google Sheets. It en
This workflow automatically fetches daily stock market news, analyzes sentiment using Gemini AI, calculates impact scores, sends alerts for high-impact news and stores structured results in Google She
> n8n, Gemini AI, Nifty 50 API & Gmail
This workflow automatically generates a weekly financial advisory briefing every Monday at 8 AM. It fetches live market data (SPY), collects top financial news, uses Google Gemini AI to generate clien