AI 필터를 통한 개인화된 학습 콘텐츠 모음기
고급
이것은Market Research, AI Summarization분야의자동화 워크플로우로, 18개의 노드를 포함합니다.주로 Set, Code, Merge, HttpRequest, RssFeedRead 등의 노드를 사용하며. GPT-4.1-mini와 Google Sheets를 사용하여 Reddit와 RSS에서 학습 내용을 필터링
사전 요구사항
- •대상 API의 인증 정보가 필요할 수 있음
- •Google Sheets API 인증 정보
- •OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "SPMdOPACsv0whzC1",
"meta": {
"instanceId": "15d6057a37b8367f33882dd60593ee5f6cc0c59310ff1dc66b626d726083b48d",
"templateCredsSetupCompleted": true
},
"name": "Personalized Learning Content Aggregator with AI Filtering",
"tags": [],
"nodes": [
{
"id": "530285ce-4719-441a-9027-a5a1f55454f8",
"name": "스케줄 트리거 - 하루 두 번",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
144,
272
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
},
{
"triggerAtHour": 18
}
]
}
},
"typeVersion": 1.2
},
{
"id": "01138c7e-b68b-4772-bb47-ff096170fad2",
"name": "워크플로우 설정",
"type": "n8n-nodes-base.set",
"position": [
368,
272
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-2",
"name": "rssFeeds",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Comma-separated RSS feed URLs to monitor__>"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "f752f79f-3242-49bd-9ad9-536aadf3ecda",
"name": "Google Sheets에서 키워드 가져오기",
"type": "n8n-nodes-base.googleSheets",
"position": [
592,
272
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7dTOI3g-SEmv2unfMTrmzuLllb5TBY6IXajPjZ1RmE/edit#gid=0",
"cachedResultName": "シート1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1e7dTOI3g-SEmv2unfMTrmzuLllb5TBY6IXajPjZ1RmE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7dTOI3g-SEmv2unfMTrmzuLllb5TBY6IXajPjZ1RmE/edit?usp=drivesdk",
"cachedResultName": "無題のスプレッドシート"
}
},
"typeVersion": 4.7
},
{
"id": "bf214976-ba37-435f-8191-1d6af7ed0159",
"name": "키워드 순환 처리",
"type": "n8n-nodes-base.code",
"position": [
816,
272
],
"parameters": {
"jsCode": "const keywords = $input.all().map(item => item.json);\nconst outputs = [];\n\nfor (const row of keywords) {\n let keyword = row.keyword || row.Keyword || Object.values(row)[0];\n\n // 文字列でない場合のフォールバック\n if (typeof keyword === 'object' && keyword !== null) {\n keyword = Object.values(keyword)[0];\n }\n\n if (typeof keyword === 'string' && keyword.trim()) {\n outputs.push({ json: { keyword: keyword.trim() } });\n }\n}\n\nreturn outputs;\n"
},
"typeVersion": 2
},
{
"id": "91891a18-73a3-4582-af3f-a932483dd8e2",
"name": "RSS 피드 검색",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
1040,
80
],
"parameters": {
"url": "={{ $('Workflow Configuration').first().json.rssFeeds.split(',')[0] }}",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "fa1e5bad-c831-42d8-a246-a694b5ff11f4",
"name": "모든 검색 결과 병합",
"type": "n8n-nodes-base.merge",
"position": [
1264,
176
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineAll"
},
"typeVersion": 3.2
},
{
"id": "7b189ca5-cd33-42fb-a415-6573cba65dd8",
"name": "AI용 아티클 준비",
"type": "n8n-nodes-base.code",
"position": [
1488,
176
],
"parameters": {
"jsCode": "const items = $input.all();\nconst articles = [];\n\nfor (const item of items) {\n const data = item.json;\n \n // Handle Reddit API response format (data.children array)\n if (data.data && data.data.children && Array.isArray(data.data.children)) {\n for (const child of data.data.children) {\n const post = child.data;\n let article = {\n title: post.title || 'No title',\n url: post.url || `https://reddit.com${post.permalink}` || '',\n description: post.selftext || post.title || '',\n source: 'Reddit',\n publishedAt: post.created_utc ? new Date(post.created_utc * 1000).toISOString() : new Date().toISOString()\n };\n articles.push(article);\n }\n }\n // Handle individual Reddit post format\n else if (data.subreddit || data.permalink) {\n let article = {\n title: data.title || data.name || 'No title',\n url: data.url || data.permalink || '',\n description: data.selftext || data.text || data.title || '',\n source: 'Reddit',\n publishedAt: data.created_utc ? new Date(data.created_utc * 1000).toISOString() : new Date().toISOString()\n };\n articles.push(article);\n }\n // Handle Twitter format\n else if (data.author_id || data.tweet_id) {\n let article = {\n title: data.text ? data.text.substring(0, 100) : 'No title',\n url: data.url || '',\n description: data.text || data.content || '',\n source: 'Twitter',\n publishedAt: data.created_at || new Date().toISOString()\n };\n articles.push(article);\n }\n // Handle RSS format\n else {\n let article = {\n title: data.title || data.name || 'No title',\n url: data.url || data.link || '',\n description: data.description || data.content || '',\n source: 'RSS',\n publishedAt: data.pubDate || data.published || new Date().toISOString()\n };\n articles.push(article);\n }\n}\n\nconst articlesText = articles.map((a, i) => \n `Article ${i + 1}:\\nTitle: ${a.title}\\nURL: ${a.url}\\nDescription: ${a.description.substring(0, 300)}...\\nSource: ${a.source}\\n`\n).join('\\n---\\n');\n\nreturn [{ json: { articles, articlesText, keyword: $('Loop Over Keywords').first().json.keyword } }];"
},
"typeVersion": 2
},
{
"id": "04657aeb-6396-46a1-8457-174cbd5380d6",
"name": "AI 콘텐츠 필터",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1712,
176
],
"parameters": {
"text": "=You are a content curator for personalized learning. Your task is to analyze articles and select only those that are:\n1. Highly relevant to the keyword: {{ $json.keyword }}\n2. Contain NEW and valuable information (tutorials, new features, announcements, guides)\n3. NOT promotional content, spam, or low-quality posts\n\nHere are the articles to analyze:\n\n{{ $json.articlesText }}\n\nRespond with a JSON array containing only the article numbers (1, 2, 3, etc.) that meet the criteria. Example: [1, 3, 5]\nIf no articles meet the criteria, respond with an empty array: []\n\nOnly return the JSON array, nothing else",
"options": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "047ef445-5190-4a41-83cc-535cc0419149",
"name": "AI 응답 파싱",
"type": "n8n-nodes-base.code",
"position": [
2064,
176
],
"parameters": {
"jsCode": "const aiResponse = $json.output;\nconst articles = $('Prepare Articles for AI').first().json.articles;\n\nlet selectedIndices = [];\ntry {\n // Try to parse the AI response as JSON\n const match = aiResponse.match(/\\[(.*?)\\]/s);\n if (match) {\n selectedIndices = JSON.parse('[' + match[1] + ']');\n }\n} catch (error) {\n console.log('Failed to parse AI response:', error);\n return [];\n}\n\nconst selectedArticles = selectedIndices\n .map(index => articles[index - 1])\n .filter(article => article !== undefined);\n\nreturn selectedArticles.map(article => ({ json: article }));"
},
"typeVersion": 2
},
{
"id": "ccc0797d-0636-4027-98e0-6aae1e8ecb58",
"name": "OpenAI 채팅 모델",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1792,
400
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"typeVersion": 1.2
},
{
"id": "8c4b9ba8-1478-4a8a-96fc-93971fd97d7b",
"name": "API을 통한 Reddit 검색",
"type": "n8n-nodes-base.httpRequest",
"position": [
1040,
272
],
"parameters": {
"url": "https://www.reddit.com/search.json",
"options": {
"response": {
"response": {
"responseFormat": "json"
}
}
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "={{ $json.keyword }}"
},
{
"name": "limit",
"value": "10"
},
{
"name": "sort",
"value": "relevance"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "578fc36c-a9d8-4893-821d-7cbb04a6174d",
"name": "Google Sheets에 저장",
"type": "n8n-nodes-base.googleSheets",
"position": [
2288,
176
],
"parameters": {
"columns": {
"value": {
"URL": "={{ $json.url }}",
"Title": "={{ $json.title }}",
"Source": "={{ $json.source }}",
"Added Date": "={{ $now.toISO() }}",
"Description": "={{ $json.description }}"
},
"schema": [
{
"id": "Title",
"type": "string",
"display": true,
"required": false,
"displayName": "Title",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "URL",
"type": "string",
"display": true,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Source",
"type": "string",
"display": true,
"required": false,
"displayName": "Source",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Added Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Added Date",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Title"
]
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1891354699,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7dTOI3g-SEmv2unfMTrmzuLllb5TBY6IXajPjZ1RmE/edit#gid=1891354699",
"cachedResultName": "シート3"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1e7dTOI3g-SEmv2unfMTrmzuLllb5TBY6IXajPjZ1RmE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7dTOI3g-SEmv2unfMTrmzuLllb5TBY6IXajPjZ1RmE/edit?usp=drivesdk",
"cachedResultName": "無題のスプレッドシート"
}
},
"typeVersion": 4.7
},
{
"id": "846c183a-c784-4ca2-bc85-78503934df11",
"name": "템플릿 개요",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
64
],
"parameters": {
"width": 560,
"height": 896,
"content": "## Personalized Learning Content Aggregator with AI Filtering\n\n### Who’s it for\nThis workflow is for learners, educators, and professionals who want to automatically collect and filter the most relevant educational articles, tutorials, and resources based on specific keywords.\n\n### How it works\n- Fetches content from RSS feeds and Reddit based on user-defined keywords.\n- AI analyzes and filters the articles to keep only **relevant, educational, and non-promotional** posts.\n- Saves curated results into a Google Sheet for easy review.\n\n### How to set up\n1. Connect your **Google Sheets** and **AI** (OpenAI or LangChain) credentials.\n2. Add your RSS feed URLs and keywords to Google Sheets.\n3. Adjust schedule timing in the trigger node (default: 8 AM & 6 PM daily).\n4. Run the workflow and check the results in your Google Sheet.\n\n### Requirements\n- Google Sheets account for storage.\n- RSS feed URLs and keyword list.\n- AI node (OpenAI / Gemini / Claude) for filtering logic.\n\n### How to customize\n- Change or add new content sources (e.g., YouTube, Medium, Dev.to).\n- Adjust AI prompt criteria to match your learning goals.\n- Save results to other platforms (e.g., Notion, Slack, or Airtable).\n\n**Note:** This workflow uses no personal identifiers or API keys directly in nodes. All credentials are safely stored in n8n’s credential manager."
},
"typeVersion": 1
},
{
"id": "57735186-ac1c-45cb-a685-1fa0aba45fc5",
"name": "설정 참고",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
176
],
"parameters": {
"content": "Holds the RSS feed URLs and user-defined keywords from Google Sheets."
},
"typeVersion": 1
},
{
"id": "50c96cef-b37c-44fa-930a-bafbb2f1b0f9",
"name": "Reddit 노트 가져오기",
"type": "n8n-nodes-base.stickyNote",
"position": [
960,
464
],
"parameters": {
"height": 128,
"content": "Fetches learning-related posts from Reddit via public API based on keywords."
},
"typeVersion": 1
},
{
"id": "461e1737-57fa-4116-a0c9-83d5c02136ff",
"name": "노트 병합",
"type": "n8n-nodes-base.stickyNote",
"position": [
1248,
48
],
"parameters": {
"content": "Combines results from all content sources (RSS + Reddit) for unified AI filtering."
},
"typeVersion": 1
},
{
"id": "85ed87bf-4ecf-4ceb-9cdd-6d66712b1ccf",
"name": "AI 필터 참고",
"type": "n8n-nodes-base.stickyNote",
"position": [
1712,
16
],
"parameters": {
"content": "AI analyzes articles and keeps only high-quality, relevant educational content."
},
"typeVersion": 1
},
{
"id": "3cc34535-4907-4957-92fa-11ae789bdcec",
"name": "결과 저장 참고",
"type": "n8n-nodes-base.stickyNote",
"position": [
2208,
32
],
"parameters": {
"content": "Saves the final curated articles to your connected Google Sheet automatically."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "efbba744-6c3b-4fd9-b47b-f5e3b08a8256",
"connections": {
"91891a18-73a3-4582-af3f-a932483dd8e2": {
"main": [
[
{
"node": "fa1e5bad-c831-42d8-a246-a694b5ff11f4",
"type": "main",
"index": 0
}
]
]
},
"04657aeb-6396-46a1-8457-174cbd5380d6": {
"main": [
[
{
"node": "047ef445-5190-4a41-83cc-535cc0419149",
"type": "main",
"index": 0
}
]
]
},
"ccc0797d-0636-4027-98e0-6aae1e8ecb58": {
"ai_languageModel": [
[
{
"node": "04657aeb-6396-46a1-8457-174cbd5380d6",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"047ef445-5190-4a41-83cc-535cc0419149": {
"main": [
[
{
"node": "578fc36c-a9d8-4893-821d-7cbb04a6174d",
"type": "main",
"index": 0
}
]
]
},
"bf214976-ba37-435f-8191-1d6af7ed0159": {
"main": [
[
{
"node": "91891a18-73a3-4582-af3f-a932483dd8e2",
"type": "main",
"index": 0
},
{
"node": "8c4b9ba8-1478-4a8a-96fc-93971fd97d7b",
"type": "main",
"index": 0
}
]
]
},
"8c4b9ba8-1478-4a8a-96fc-93971fd97d7b": {
"main": [
[
{
"node": "fa1e5bad-c831-42d8-a246-a694b5ff11f4",
"type": "main",
"index": 1
}
]
]
},
"01138c7e-b68b-4772-bb47-ff096170fad2": {
"main": [
[
{
"node": "f752f79f-3242-49bd-9ad9-536aadf3ecda",
"type": "main",
"index": 0
}
]
]
},
"7b189ca5-cd33-42fb-a415-6573cba65dd8": {
"main": [
[
{
"node": "04657aeb-6396-46a1-8457-174cbd5380d6",
"type": "main",
"index": 0
}
]
]
},
"fa1e5bad-c831-42d8-a246-a694b5ff11f4": {
"main": [
[
{
"node": "7b189ca5-cd33-42fb-a415-6573cba65dd8",
"type": "main",
"index": 0
}
]
]
},
"530285ce-4719-441a-9027-a5a1f55454f8": {
"main": [
[
{
"node": "01138c7e-b68b-4772-bb47-ff096170fad2",
"type": "main",
"index": 0
}
]
]
},
"f752f79f-3242-49bd-9ad9-536aadf3ecda": {
"main": [
[
{
"node": "bf214976-ba37-435f-8191-1d6af7ed0159",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 시장 조사, AI 요약
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
GPT-4 전문가 기반의 전면 SEO 검토, Analytics, Search Console, PageSpeed 사용
GPT-4 전문가 기반의 전면적인 SEO 검토, Analytics, Search Console 및 PageSpeed 사용
Set
Code
Merge
+
Set
Code
Merge
38 노드Jimmy Gay
시장 조사
GPT-4 인사이트와 Slack 전송을 사용한 주간 SEO 보고서 자동화
GPT-4 인사이트 및 Slack 배달을 통한 주간 SEO 보고서 자동화
Set
Code
Merge
+
Set
Code
Merge
42 노드Marcelo Abreu
시장 조사
지리정치 긴급 뉴스 알림
AI 평점과 Telegram 경고를 사용하여 지리정치 긴급 뉴스를 필터링합니다.
If
Code
Merge
+
If
Code
Merge
30 노드Dev Dutta
시장 조사
GPT-4o, Sheets 및 Slack을 사용한 월간 Google Ads 성과 분석 자동화
GPT-4o, Sheets 및 Slack을 사용한 자동화된 월간 Google Ads 성과 분석
Code
Slack
Http Request
+
Code
Slack
Http Request
13 노드Nikan Noorafkan
시장 조사
RSS 피드 스마트 허브 및 매일 Slack 요약
Gemini AI를 사용한 RSS 피드 뉴스 인텔리전스 자동화, Notion 및 Slack으로 푸시
Set
Code
Sort
+
Set
Code
Sort
29 노드Takuya Ojima
시장 조사
GPT-4o, WordPress, LinkedIn을 사용한 RSS 콘텐츠 자동 블로그 게시
GPT-4o, WordPress 및 LinkedIn을 사용한 RSS 콘텐츠 블로그 게시물 자동 발행
If
Set
Code
+
If
Set
Code
40 노드Immanuel
인공지능