8
n8n 한국어amn8n.com

OpenAI와 Gmail을 사용하는 매일 긍정적인 뉴스 요약

중급

이것은Personal Productivity, AI Summarization분야의자동화 워크플로우로, 9개의 노드를 포함합니다.주로 If, Cron, Gmail, OpenAi, RssFeed 등의 노드를 사용하며. OpenAI와 Gmail을 사용한 매일 긍정적인 뉴스 요약

사전 요구사항
  • Google 계정 및 Gmail API 인증 정보
  • OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
  "nodes": [
    {
      "name": "매일 아침 트리거 (오전 7시)",
      "type": "n8n-nodes-base.cron",
      "notes": {
        "text": "### 1. Daily Morning Trigger (7 AM)\n\nThis `Cron` node triggers the workflow automatically every **day at 7:00 AM** (based on your n8n server's local time zone).\n\n**To change the schedule:** Adjust the 'Hour' and 'Minute' fields to your preferred time for receiving the news digest.",
        "position": "right"
      },
      "position": [
        240,
        300
      ],
      "parameters": {
        "mode": "everyDay",
        "value": {
          "hour": [
            7
          ],
          "minute": [
            0
          ]
        },
        "options": {}
      },
      "typeVersion": 1,
      "id": "-7--0"
    },
    {
      "name": "긍정 뉴스 가져오기 (RSS)",
      "type": "n8n-nodes-base.rssFeed",
      "notes": {
        "text": "### 2. Fetch Positive News (RSS)\n\nThis `RSS Feed` node fetches the latest articles from the Good News Network, a reliable source for positive stories.\n\n**Setup:**\n1.  **URL:** Pre-filled with `https://www.goodnewsnetwork.org/feed/`.\n2.  **To add more sources:** You can add more `RSS Feed` nodes in parallel and then use an `Item Lists` node set to 'Merge Items' to combine their outputs before the 'Prepare for AI' node.",
        "position": "right"
      },
      "position": [
        480,
        300
      ],
      "parameters": {
        "url": "https://www.goodnewsnetwork.org/feed/",
        "options": {}
      },
      "typeVersion": 1,
      "id": "-RSS--1"
    },
    {
      "name": "AI 처리 준비",
      "type": "n8n-nodes-base.function",
      "notes": {
        "text": "### 3. Prepare for AI\n\nThis `Function` node formats the news articles' titles and descriptions into a single `articleText` field, which is easier for the AI to process.\n\nIt also preserves the original title, description, and link for the final summary.\n\n**No configuration needed**; it automatically processes the RSS feed items.",
        "position": "right"
      },
      "position": [
        720,
        300
      ],
      "parameters": {
        "options": {},
        "function": "const preparedItems = [];\n\nfor (const item of items) {\n  const title = item.json.title || 'No Title';\n  const description = item.json.contentSnippet || item.json.description || 'No Description';\n  const link = item.json.link || '#';\n\n  preparedItems.push({\n    json: {\n      originalTitle: title,\n      originalDescription: description,\n      originalLink: link,\n      articleText: `Title: ${title}\\nDescription: ${description}`\n    }\n  });\n}\n\nreturn preparedItems;"
      },
      "typeVersion": 1,
      "id": "AI--2"
    },
    {
      "name": "AI: 긍정 뉴스 요약",
      "type": "n8n-nodes-base.openAi",
      "notes": {
        "text": "### 4. AI: Summarize Positive News\n\nThis `OpenAI` node is the core of the 'positive news' filtering and summarization.\n\n**Setup:**\n1.  **OpenAI Credential:** Click 'Credentials' and select 'New Credential'. Provide your OpenAI API Key (starts with `sk-`). Save it.\n2.  **Model:** `gpt-3.5-turbo` is pre-selected. For higher quality summaries and better sentiment discernment, consider `gpt-4o` (may incur higher costs).\n3.  **Prompts:** The 'System' prompt guides the AI to only summarize positive/neutral-to-positive articles and output 'SKIP' otherwise.\n\n**Output:** The AI's summary or the word 'SKIP'.",
        "position": "right"
      },
      "position": [
        960,
        300
      ],
      "parameters": {
        "model": "gpt-3.5-turbo",
        "options": {},
        "messages": [
          {
            "role": "system",
            "content": "You are a news summarizer focused only on positive and uplifting news. Read the provided article text. If it is clearly positive or neutral-to-positive, summarize its core message in 2-3 concise sentences, focusing on the positive aspects. If it is negative, neutral, or not news (e.g., ads), output the single word 'SKIP'."
          },
          {
            "role": "user",
            "content": "Article:\n{{ $json.articleText }}"
          }
        ]
      },
      "credentials": {
        "openAiApi": {
          "id": "YOUR_OPENAI_CREDENTIAL_ID",
          "resolve": false
        }
      },
      "typeVersion": 1,
      "id": "AI--3"
    },
    {
      "name": "긍정 요약 필터링 및 준비",
      "type": "n8n-nodes-base.function",
      "notes": {
        "text": "### 5. Filter & Prepare Positive Summaries\n\nThis `Function` node filters out any items where the AI responded with 'SKIP' (meaning the news was not positive enough).\n\nFor the remaining items, it prepares a clean object containing the original title, link, and the AI-generated positive summary.\n\n**No configuration needed**; it automatically processes the AI output.",
        "position": "right"
      },
      "position": [
        1200,
        300
      ],
      "parameters": {
        "options": {},
        "function": "const positiveSummaries = [];\n\nfor (const item of items) {\n  const aiResponse = item.json.choices[0].message.content.trim();\n\n  if (aiResponse.toUpperCase() !== 'SKIP') {\n    positiveSummaries.push({\n      json: {\n        originalTitle: item.json.originalTitle,\n        originalLink: item.json.originalLink,\n        summary: aiResponse\n      }\n    });\n  }\n}\n\nreturn positiveSummaries;"
      },
      "typeVersion": 1,
      "id": "--4"
    },
    {
      "name": "긍정 뉴스 발견 시",
      "type": "n8n-nodes-base.if",
      "notes": {
        "text": "### 6. If Positive News Found\n\nThis `If` node checks if any positive news articles were actually found and summarized after filtering.\n\n* **'True' branch:** If positive news exists, the workflow proceeds to format and send the email.\n* **'False' branch:** If no positive news was found for the day, the workflow will still send an email, but with a message indicating no positive news was found (handled by the 'Format No Positive News Message' node).\n\n**No configuration needed**; it checks if the array of items is not empty.",
        "position": "right"
      },
      "position": [
        1440,
        300
      ],
      "parameters": {
        "conditions": [
          {
            "value1": "={{ $json.length }}",
            "value2": "0",
            "operation": "notEqual"
          }
        ]
      },
      "typeVersion": 1,
      "id": "--5"
    },
    {
      "name": "긍정 뉴스 이메일 형식화",
      "type": "n8n-nodes-base.function",
      "notes": {
        "text": "### 7. Format Positive News Email\n\nThis `Function` node compiles all the positive news summaries into a single, formatted email body.\n\n**Customization:**\n* You can customize the greeting, closing, and the way each news item is presented.\n* The email body is formatted using Markdown for bolding and line breaks, which Gmail supports.\n\n**No configuration needed** if your previous node's output matches expectations.",
        "position": "right"
      },
      "position": [
        1680,
        220
      ],
      "parameters": {
        "options": {},
        "function": "let emailBody = \"\";\n\nemailBody += \"Good morning! Here's your daily dose of positive news:\\n\\n\";\n\nfor (const item of items) {\n  emailBody += `**${item.json.originalTitle}**\\n` +\n               `${item.json.summary}\\n` +\n               `Read more: ${item.json.originalLink}\\n\\n---\\n\\n`;\n}\n\nemailBody += \"Have a wonderful day!\\n\\nThis digest was brought to you by n8n.\";\n\nreturn [{ json: { emailSubject: \"☀️ Your Daily Positive News Digest!\", emailBody: emailBody } }];"
      },
      "typeVersion": 1,
      "id": "--6"
    },
    {
      "name": "긍정 뉴스 없음 메시지 형식화",
      "type": "n8n-nodes-base.function",
      "notes": {
        "text": "### 7. Format No Positive News Message\n\nThis `Function` node creates a fallback message for your email if the workflow doesn't find any positive news articles after filtering.\n\n**No configuration needed**; it provides a default message when there's no positive news.",
        "position": "right"
      },
      "position": [
        1680,
        380
      ],
      "parameters": {
        "options": {},
        "function": "return [{ json: { emailSubject: \"☁️ Daily Positive News Digest: No Positive News Today\", emailBody: \"Good morning!\\n\\nUnfortunately, I couldn't find any predominantly positive news articles for your digest today.\\n\\nStay positive, and check back tomorrow!\\n\\nThis digest was brought to you by n8n.\" } }];"
      },
      "typeVersion": 1,
      "id": "--7"
    },
    {
      "name": "일일 요약 이메일 발송",
      "type": "n8n-nodes-base.gmail",
      "notes": {
        "text": "### 8. Send Daily Digest Email\n\nThis `Gmail` node sends the final email digest (either with positive news or the 'no news found' message) to your mailbox.\n\n**Setup:**\n1.  **Gmail Credential:** Select your Gmail API credential.\n2.  **From Email:** Enter your Gmail address (must match the authenticated account).\n3.  **To Email:** **IMPORTANT: Change `YOUR_RECIPIENT_EMAIL@example.com` to your actual email address!**\n4.  **Subject & Text:** These fields pull the formatted subject and body from the previous 'Format' nodes.\n\n**Test this node by running the workflow** to ensure you receive the email.",
        "position": "right"
      },
      "position": [
        1920,
        300
      ],
      "parameters": {
        "text": "={{ $json.emailBody }}",
        "options": {},
        "subject": "={{ $json.emailSubject }}",
        "toEmail": "YOUR_RECIPIENT_EMAIL@example.com",
        "fromEmail": "YOUR_GMAIL_EMAIL@gmail.com"
      },
      "credentials": {
        "gmailApi": {
          "id": "YOUR_GMAIL_CREDENTIAL_ID",
          "resolve": false
        }
      },
      "typeVersion": 2,
      "id": "--8"
    }
  ],
  "pinData": {},
  "version": 1,
  "connections": {
    "AI--2": {
      "main": [
        [
          {
            "node": "AI--3",
            "type": "main"
          }
        ]
      ]
    },
    "--5": {
      "main": [
        [
          {
            "node": "--6",
            "type": "main"
          }
        ],
        [
          {
            "node": "--7",
            "type": "main"
          }
        ]
      ]
    },
    "-RSS--1": {
      "main": [
        [
          {
            "node": "AI--2",
            "type": "main"
          }
        ]
      ]
    },
    "--6": {
      "main": [
        [
          {
            "node": "--8",
            "type": "main"
          }
        ]
      ]
    },
    "AI--3": {
      "main": [
        [
          {
            "node": "--4",
            "type": "main"
          }
        ]
      ]
    },
    "-7--0": {
      "main": [
        [
          {
            "node": "-RSS--1",
            "type": "main"
          }
        ]
      ]
    },
    "--7": {
      "main": [
        [
          {
            "node": "--8",
            "type": "main"
          }
        ]
      ]
    },
    "--4": {
      "main": [
        [
          {
            "node": "--5",
            "type": "main"
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

이 워크플로우를 어떻게 사용하나요?

위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.

이 워크플로우는 어떤 시나리오에 적합한가요?

중급 - 개인 생산성, AI 요약

유료인가요?

이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
중급
노드 수9
카테고리2
노드 유형6
난이도 설명

일정 경험을 가진 사용자를 위한 6-15개 노드의 중간 복잡도 워크플로우

저자
Piotr Sobolewski

Piotr Sobolewski

@piotrsobolewski

AI PhD with 7 years experience as a game dev CEO, currently teaching, helping others and building something new.

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34