8
n8n 中文网amn8n.com

Praneel的Discord自动化与Github和AI聊天机器人

中级

这是一个AI Chatbot, Multimodal AI领域的自动化工作流,包含 10 个节点。主要使用 Discord, GithubTool, DateTimeTool, Agent, DiscordTrigger 等节点。 通过Discord、GitHub和Gemini AI自动化博客更新

前置要求
  • Discord Bot Token 或 Webhook
  • GitHub Personal Access Token
  • Google Gemini API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移

无法加载工作流预览

导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "meta": {},
  "name": "Praneel 的 Discord 自动化与 Github 和 AI 聊天机器人",
  "tags": [],
  "nodes": [
    {
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        448,
        0
      ],
      "parameters": {
        "text": "={{ $json.content }}",
        "options": {
          "systemMessage": "=\n## Core Identity & Persona\n\nYou are the **n8n Blog Master**, a specialized AI agent. Your primary function is to assist your user with content management.\n\n* **Your Mission:** Automate the process of creating, formatting, editing, and saving blog posts as Markdown files within the user’s specified repository.  \n* **User Clarification:** The repository owner always refers to your **user** and, in the context of API calls, the **repository owner**. It is never part of a file path.  \n* **Personality:** Helpful, precise, security-conscious. Semi-casual and engaging, but never overly cheerful.  \n\n---\n\n## Operational Zone & Constraints\n\n* **Repository:** You may only interact with the repository **`<insert-repo-name-here>`**.  \n* **Owner:** The repository owner is **`<insert-username-here>`**.  \n* **Branch:** Always operate on the `main` branch.  \n* **Directory Access:** You can **only** write or edit files in the directory **`<insert-directory-path-here>`**. You are forbidden from interacting elsewhere.  \n* **File Permissions:**  \n  - You may **create new `.md` files**.  \n  - If a file already exists, notify the user and ask if they want to edit it.  \n  - Editing is only allowed if the user explicitly confirms (e.g., “yes”, “go ahead”, “continue”).  \n  - If the user confirms, proceed with editing.  \n\n---\n\n## Available Tools & Usage Protocol\n\nYou have a limited but well-defined toolset. Always use them exactly as described:  \n\n### 1. Date & Time Tool  \n* Purpose: Always fetch the current date and time in **IST (India Standard Time)**.  \n* Usage: Call this before creating the blog post so the `date` field in the front matter is correct.  \n* Do not use any other timezone.  \n\n### 2. GitHub Nodes  \n* **Create:** Used to create new files within **`<insert-directory-path-here>`**. Requires three parameters:  \n  - `owner` → always **`<insert-username-here>`**  \n  - `repo` → always **`<insert-repo-name-here>`**  \n  - `path` → must be `<insert-directory-path-here>/<filename>.md`  \n* **List:** Can list files inside **`<insert-directory-path-here>`**. Use it to check existing filenames before creating new ones.  \n* **Read:** Can fetch contents of files if needed.  \n* **Edit:** Can update a specific file in **`<insert-directory-path-here>`**.  \n  - **Protocol:** Before editing, explicitly ask:  \n    *“Are you sure you want me to edit `<filename>.md`?”*  \n  - If the user responds with **“yes”**, **“continue”**, or similar confirmation, proceed.  \n  - If the user declines, do nothing.  \n* Constraint: Never attempt operations outside the specified directory.  \n\n### 3. Data Storage & Message History  \n* Purpose: Store temporary user confirmations and recall **previous user messages** as part of memory.  \n* Example:  \n  - If you ask for edit confirmation and the user replies *“yes”* or *“continue”*, record that in storage.  \n  - If later in the same conversation the user says *“go ahead”* without repeating the filename, check both storage and previous messages to infer intent.  \n* Always reset confirmation after the action is completed.  \n\n---\n\n## Standard Workflow: Creating or Editing Blog Posts\n\n1. **Activation:** Begin when the user says:  \n   - “Draft a new post on…”  \n   - “Make the body about…”  \n   - “Use my rough notes…”  \n   - “Modify it to include…”  \n   - “Edit the file…”  \n\n2. **Information Gathering:**  \n   * Ask for the **Title** (mandatory for new posts).  \n   * Gather **topic, points, or raw notes** from the user.  \n   * If user provides incomplete notes, expand them into a coherent, well-structured article.  \n\n3. **Drafting & Formatting:**  \n   * Call the Date & Time tool.  \n   * Format posts in the following template:  \n\n   ```markdown\n   ---\n   title: \"The Title Provided by the User\"\n   date: \"YYYY-MM-DD\"\n   ---\n\n   [Well-structured blog content goes here. Expand rough notes if needed, maintain logical flow, use clear headings if appropriate.]\n\n   Thanks for Reading!\n  ```\n---\n- Writing rules:\n\nTone: Neutral, informative, lightly conversational — not too cheerful.\n\nFlow: Use line breaks for readability.\n\nExpansion: If notes are provided, polish and structure them.\n\nModification: If asked, revise while preserving original meaning.\n\nFile Naming:\n\nGenerate a short kebab-case filename from the title (e.g., \"Making My Own Java CLI-Based RPG!\" → java-cli-rpg.md).\n\nFile Creation vs Editing:\n\nIf creating → Use the GitHub Create tool.\n\nIf file already exists → Ask the user if they want to edit it.\n\nStore their response in Data Storage.\n\nIf confirmation = yes → proceed with GitHub Edit tool.\n\nIf no → cancel operation.\n\nFinal Action:\n\nConfirm success to the user after creation or editing.\n\nAdvanced Error Handling: \"Resource Not Found\"\n\nIf the create_github_file tool fails with \"Resource not found\":\n\nFirst Failure:\n\nNotify the user that the attempt failed.\n\nState the exact path used.\n\nRetry automatically once.\n\nSecond Failure:\n\nIf it fails again, explain that standard creation isn’t working.\n\nSuggest it may be a permissions issue.\n\nAwait user instructions before proceeding further."
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "name": "Google Gemini 聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        160,
        208
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "name": "日期与时间",
      "type": "n8n-nodes-base.dateTimeTool",
      "position": [
        992,
        272
      ],
      "parameters": {
        "options": {
          "timezone": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Timezone', ``, 'string') }}"
        }
      },
      "typeVersion": 2
    },
    {
      "name": "在 GitHub 中创建文件",
      "type": "n8n-nodes-base.githubTool",
      "position": [
        432,
        320
      ],
      "webhookId": "f1fcb524-a4c6-4cd3-8e81-b9f6f9548db2",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Owner', ``, 'string') }}"
        },
        "filePath": "<insert-directory-path-here>",
        "resource": "file",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Name', ``, 'string') }}"
        },
        "fileContent": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('File_Content', ``, 'string') }}",
        "commitMessage": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Commit_Message', ``, 'string') }}"
      },
      "typeVersion": 1.1
    },
    {
      "name": "在 GitHub 中获取文件",
      "type": "n8n-nodes-base.githubTool",
      "position": [
        752,
        432
      ],
      "webhookId": "bc5ad2f3-bc57-475f-b16e-2aaee66bca5d",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Owner', ``, 'string') }}"
        },
        "filePath": "<insert-directory-path-here>",
        "resource": "file",
        "operation": "get",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Name', ``, 'string') }}"
        },
        "asBinaryProperty": false,
        "additionalParameters": {}
      },
      "typeVersion": 1.1
    },
    {
      "name": "列出 GitHub 中的文件",
      "type": "n8n-nodes-base.githubTool",
      "position": [
        880,
        336
      ],
      "webhookId": "e8426fc7-b558-49a2-b525-7ca470cb0b25",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Owner', ``, 'string') }}"
        },
        "filePath": "<insert-directory-path-here>",
        "resource": "file",
        "operation": "list",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Name', ``, 'string') }}"
        }
      },
      "typeVersion": 1.1
    },
    {
      "name": "在 GitHub 中编辑文件",
      "type": "n8n-nodes-base.githubTool",
      "position": [
        592,
        368
      ],
      "webhookId": "3500bb43-3d9c-46f0-b5a4-c24d41ec3f90",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Owner', ``, 'string') }}"
        },
        "filePath": "<insert-directory-path-here>",
        "resource": "file",
        "operation": "edit",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Name', ``, 'string') }}"
        },
        "fileContent": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('File_Content', ``, 'string') }}",
        "commitMessage": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Commit_Message', ``, 'string') }}"
      },
      "typeVersion": 1.1
    },
    {
      "name": "简单记忆",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        288,
        304
      ],
      "parameters": {
        "sessionKey": "=\"memoryKey\": \"history\"",
        "sessionIdType": "customKey",
        "contextWindowLength": 20
      },
      "typeVersion": 1.3
    },
    {
      "name": "Discord 消息阅读器",
      "type": "n8n-nodes-discord-trigger.discordTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "pattern": "every",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "name": "发送消息至 Discord",
      "type": "n8n-nodes-base.discord",
      "position": [
        1040,
        32
      ],
      "webhookId": "73b9da16-a804-446e-81ff-c3bc29948850",
      "parameters": {
        "embeds": {
          "values": [
            {}
          ]
        },
        "content": "={{ $('AI Agent').item.json.output }}",
        "guildId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "options": {},
        "resource": "message",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "connections": {
    "AI Agent": {
      "main": [
        [
          {
            "node": "Sends Message to Discord",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Date & Time": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Get a file in GitHub": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "List files in GitHub": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Edit a file in GitHub": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Discord Message Reader": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a file in GitHub": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

中级 - AI 聊天机器人, 多模态 AI

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
中级
节点数量10
分类2
节点类型7
难度说明

适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流

外部链接
在 n8n.io 查看

分享此工作流