AutomationFlowsAI & RAG › N8nflow Zhtw

N8nflow Zhtw

N8Nflow Zhtw. Uses executeCommand, readBinaryFiles, httpRequest, googleGemini. Scheduled trigger; 28 nodes.

Cron / scheduled trigger★★★★☆ complexityAI-powered28 nodesExecute CommandRead Binary FilesHTTP RequestGoogle GeminiGmail
AI & RAG Trigger: Cron / scheduled Nodes: 28 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

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 —

Stop And Error, Google Sheets, HTTP Request +2
AI & RAG

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

HTTP Request, Google Gemini, Gmail +1
AI & RAG

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

HTTP Request, Google Gemini, Gmail +1
AI & RAG

&gt; n8n, Gemini AI, Nifty 50 API & Gmail

HTTP Request, Google Gemini, Gmail
AI & RAG

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

HTTP Request, Google Gemini, Gmail +1