AI によるフィルタリングされた個別化学習コンテンツアggregator
上級
これは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": "スケジュールトリガー - 1日2回",
"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 専門家による Analytics、Search Console、PageSpeed を使用した包括のな SEO 監査
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
人工知能