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's Discord Automation with Github and AI Chatbot ",
"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,
"id": "AI-Agent-0"
},
{
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
160,
208
],
"parameters": {
"options": {}
},
"typeVersion": 1,
"id": "Google-Gemini-Chat-Model-1"
},
{
"name": "날짜 및 시간",
"type": "n8n-nodes-base.dateTimeTool",
"position": [
992,
272
],
"parameters": {
"options": {
"timezone": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Timezone', ``, 'string') }}"
}
},
"typeVersion": 2,
"id": "--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,
"id": "GitHub--3"
},
{
"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,
"id": "GitHub--4"
},
{
"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,
"id": "GitHub--5"
},
{
"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,
"id": "GitHub--6"
},
{
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
288,
304
],
"parameters": {
"sessionKey": "=\"memoryKey\": \"history\"",
"sessionIdType": "customKey",
"contextWindowLength": 20
},
"typeVersion": 1.3,
"id": "Simple-Memory-7"
},
{
"name": "Discord 메시지 리더",
"type": "n8n-nodes-discord-trigger.discordTrigger",
"position": [
0,
0
],
"parameters": {
"pattern": "every",
"additionalFields": {}
},
"typeVersion": 1,
"id": "Discord--8"
},
{
"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,
"id": "Discord--9"
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"connections": {
"AI-Agent-0": {
"main": [
[
{
"node": "Discord--9",
"type": "main",
"index": 0
}
]
]
},
"--2": {
"ai_tool": [
[
{
"node": "AI-Agent-0",
"type": "ai_tool",
"index": 0
}
]
]
},
"Simple-Memory-7": {
"ai_memory": [
[
{
"node": "AI-Agent-0",
"type": "ai_memory",
"index": 0
}
]
]
},
"GitHub--4": {
"ai_tool": [
[
{
"node": "AI-Agent-0",
"type": "ai_tool",
"index": 0
}
]
]
},
"GitHub--5": {
"ai_tool": [
[
{
"node": "AI-Agent-0",
"type": "ai_tool",
"index": 0
}
]
]
},
"GitHub--6": {
"ai_tool": [
[
{
"node": "AI-Agent-0",
"type": "ai_tool",
"index": 0
}
]
]
},
"Discord--8": {
"main": [
[
{
"node": "AI-Agent-0",
"type": "main",
"index": 0
}
]
]
},
"GitHub--3": {
"ai_tool": [
[
{
"node": "AI-Agent-0",
"type": "ai_tool",
"index": 0
}
]
]
},
"Google-Gemini-Chat-Model-1": {
"ai_languageModel": [
[
{
"node": "AI-Agent-0",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - AI 챗봇, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
챗봇 웹훅
Gemini 채팅 인터페이스를 통합한 AI 기반 Gmail 및 캘린더 어시스턴트
Set
Webhook
Gmail Tool
+
Set
Webhook
Gmail Tool
19 노드Praneel S
기타
Google Calendar+Gmail 관리자
Gemini/GPT 드라이브드 AI 어시스턴트를 사용하여 Google 일정과 Gmail 관리
Gmail Tool
Date Time Tool
Agent
+
Gmail Tool
Date Time Tool
Agent
16 노드Praneel S
AI 챗봇
Gemini와 Discord의 재무 분석 보고서 채팅 로봇 대리
Gemini 2.5 Flash과 Discord을 기반으로 한 재무 분석 보고서 채팅 로봇 대리자를 구성합니다.
Set
Code
Discord
+
Set
Code
Discord
19 노드aditya vadaganadam
AI 챗봇
Notion
Gemini AI를 통해 Telegram에서 Notion으로 콘텐츠 요청 자동화
If
Telegram
Notion Tool
+
If
Telegram
Notion Tool
16 노드Miftah Rahmat
AI 챗봇
Gmail 에이전트
Gemini AI 어시스턴트와 연락처 관리를 사용한 Gmail 작업 자동화
Gmail Tool
Agent
Google Sheets Tool
+
Gmail Tool
Agent
Google Sheets Tool
12 노드Rakin Jakaria
AI 챗봇
WHMCS 지원 티켓 자동 생성을 위한 AI 기반 챗봇
Gemini AI 챗봇을 사용한 WHMCS 지원 티켓 생성 자동화
Agent
Http Request Tool
Chat Trigger
+
Agent
Http Request Tool
Chat Trigger
6 노드Muhammad Omer Fayyaz
AI 챗봇