Intelligenter RSS-Feed-Hub mit täglichem Slack-Zusammenfassung
Dies ist ein Market Research, AI Summarization-Bereich Automatisierungsworkflow mit 29 Nodes. Hauptsächlich werden Set, Code, Sort, Limit, Slack und andere Nodes verwendet. Automatisierung von Nachrichten-Intelligenz für RSS-Quellen mit Gemini AI, mit Benachrichtigungen an Notion und Slack
- •Slack Bot Token oder Webhook URL
- •Notion API Key
- •Google Sheets API-Anmeldedaten
- •Google Gemini API Key
Verwendete Nodes (29)
Kategorie
{
"id": "L75BmalAEZZ1orS5",
"meta": {
"instanceId": "189dde98270e9ce0f006f0e9deb96aa5e627396fc6279cac8902c9b06936984d"
},
"name": "RSS Feed Intelligence Hub with Daily Slack Digest",
"tags": [],
"nodes": [
{
"id": "b53e19f4-42d6-4433-be23-dee9d43d4c96",
"name": "Täglicher Morgen-Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
1088,
160
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "df28a219-fa77-408f-b842-1394c04bd8db",
"name": "Workflow-Konfiguration",
"type": "n8n-nodes-base.set",
"position": [
1408,
160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "rssFeeds",
"type": "array",
"value": "[\"https://techcrunch.com/feed/\"]"
},
{
"id": "id-2",
"name": "notionDatabaseId",
"type": "string",
"value": "296863ef60d880f28e32e8212b244d30"
},
{
"id": "id-3",
"name": "slackChannel",
"type": "string",
"value": "#general"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "7f7de5b9-dd1a-4a5a-9eb3-c85030a8bb59",
"name": "RSS-Feeds lesen",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
2016,
64
],
"parameters": {
"url": "={{ $json.rssFeeds }}",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "f6b25f54-0635-4498-b878-4468c633c932",
"name": "KI-Zusammenfasser und Tagger",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2256,
64
],
"parameters": {
"text": "You are an expert content analyst.\nYour task is to analyze the provided RSS feed item based on the tag dictionary below.\n\nHere is the dictionary of available tags you MUST use:\n{{ JSON.stringify($('Aggregate Tags').first().json.tagDictionary) }}\n\n---\n\nNow, analyze the following RSS feed item:\nTitle: {{ $json.title }}\nContent: {{ $json.content }}\n\nBased on the content and the tag dictionary, create a 3-line summary and assign relevant tags.\nOutput a single, valid JSON object with these fields: \"title\", \"summary\" (max 3 lines), \"tags\" (array of strings), \"priority\" (integer 1-5, 5 is most important), \"url\", \"publishedDate\".\n\n**IMPORTANT: You MUST only output the JSON object itself. Do not include any explanatory text, markdown formatting (like ```json), or anything else before or after the JSON object.**",
"options": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "fb2fe89f-b551-47e0-a133-cb585c92a517",
"name": "Tag-Wörterbuch abrufen",
"type": "n8n-nodes-base.googleSheets",
"position": [
1712,
256
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dLUTeDxFv8zOeVXDB6_e05BsZBWrG_Ar-r4T8V0GacE/edit#gid=0",
"cachedResultName": "Tags"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1dLUTeDxFv8zOeVXDB6_e05BsZBWrG_Ar-r4T8V0GacE"
}
},
"typeVersion": 4.7
},
{
"id": "92010737-ab4a-49de-a1ee-670759347865",
"name": "KI-Ausgabe parsen",
"type": "n8n-nodes-base.code",
"position": [
2624,
64
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "// Parse AI agent output and extract relevant fields\nlet aiOutput = $input.item.json.output;\n\n// --- START: AI Output Cleaning ---\nconst jsonMatch = aiOutput.match(/\\{[\\s\\S]*\\}/);\nif (jsonMatch) {\n aiOutput = jsonMatch[0];\n} else {\n aiOutput = null; \n}\n// --- END: AI Output Cleaning ---\n\nlet parsedData;\ntry {\n if (aiOutput === null) throw new Error(\"No valid JSON object found in AI output.\");\n parsedData = JSON.parse(aiOutput);\n} catch (e) {\n // Parsing failed, return data that won't cause a Notion API error\n return { \n title: 'Error: Failed to parse AI output', \n summary: $input.item.json.output, // Keep original output for debugging\n tags: [], \n priority: 1, \n url: null, \n publishedDate: null \n };\n}\n\n// === START: Notion Multi-Select Fix ===\nconst tagsArray = parsedData.tags || [];\n// === END: Notion Multi-Select Fix ===\n\n// === START: Robust Notion Date Fix ===\n// Ensure the publishedDate is a valid ISO string or null.\nlet notionDate = null;\nif (parsedData.publishedDate) {\n const dateObject = new Date(parsedData.publishedDate);\n \n // Create a Date object and check if it's a valid date.\n // isNaN(dateObject.getTime()) is a reliable way to check for \"Invalid Date\".\n if (dateObject instanceof Date && !isNaN(dateObject.getTime())) {\n notionDate = dateObject.toISOString();\n } else {\n // If the date string is invalid, notionDate remains null.\n console.log(`Could not parse date: ${parsedData.publishedDate}`);\n }\n}\n// === END: Robust Notion Date Fix ===\n\n\n// Extract the fields and create the final result object\nconst result = {\n title: parsedData.title || '',\n summary: parsedData.summary || '',\n tags: tagsArray,\n priority: parsedData.priority || 1,\n url: parsedData.url || null,\n publishedDate: notionDate \n};\n\nreturn result;"
},
"typeVersion": 2
},
{
"id": "808a0b99-b2d7-4b4e-970a-c3f8e189e87c",
"name": "In Notion Datenbank schreiben",
"type": "n8n-nodes-base.notion",
"position": [
2944,
64
],
"parameters": {
"title": "={{ $json.title }}",
"options": {},
"resource": "databasePage",
"databaseId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Configuration').first().json.notionDatabaseId }}"
},
"propertiesUi": {
"propertyValues": [
{
"key": "summary|rich_text",
"textContent": "={{ $json.summary }}"
},
{
"key": "tags|multi_select",
"multiSelectValue": "={{ $json.tags }}"
},
{
"key": "priority|number",
"numberValue": "={{ $json.priority }}"
},
{
"key": "url|url",
"urlValue": "={{ $json.url }}"
},
{
"key": "publishedDate|date",
"date": "={{ $json.publishedDate }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "970b77bd-6c52-43b8-800a-2d236d9a7cd3",
"name": "Nach Priorität sortieren",
"type": "n8n-nodes-base.sort",
"position": [
3248,
64
],
"parameters": {
"options": {},
"sortFieldsUi": {
"sortField": [
{
"order": "descending",
"fieldName": "property_priority"
}
]
}
},
"typeVersion": 1
},
{
"id": "075978c2-5ee8-453e-a75e-0fb7708889a2",
"name": "Top 3 Schlagzeilen",
"type": "n8n-nodes-base.limit",
"position": [
3568,
64
],
"parameters": {
"maxItems": 3
},
"typeVersion": 1
},
{
"id": "643c4d99-f909-4287-ab22-203526c96c02",
"name": "Slack Nachricht formatieren",
"type": "n8n-nodes-base.code",
"position": [
3872,
64
],
"parameters": {
"jsCode": "// Format top 3 items into a Slack message\nconst items = $input.all();\n\n// Slackの改行には \\\\n ではなく \\n を使います\nlet message = \"*📰 Your Daily Top 3 Headlines*\\n\\n\";\n\nfor (let i = 0; i < items.length; i++) {\n const item = items[i].json;\n const number = i + 1;\n \n // Notionノードからのデータ名に合わせてプロパティを取得\n const title = item.name || 'No Title';\n const summary = item.property_summary || 'No summary available';\n const tags = item.property_tags || [];\n const url = item.property_url;\n \n message += `*${number}. ${title}*\\n`;\n message += `${summary}\\n`;\n \n // タグの表示部分も修正\n if (tags.length > 0) {\n const tagNames = tags.map(tag => tag.name); // タグ名を取得\n message += `🏷️ Tags: ${tagNames.join(', ')}\\n`;\n }\n \n if (url) {\n message += `🔗 <${url}|Read more>\\n`;\n }\n \n // 各項目の間にスペースを入れます\n message += \"\\n\";\n}\n\nreturn [{ json: { message } }];"
},
"typeVersion": 2
},
{
"id": "4b73b33f-b7b8-4305-9f96-afecab761db2",
"name": "An Slack senden",
"type": "n8n-nodes-base.slack",
"position": [
4176,
64
],
"webhookId": "2163c2fa-5df4-4765-b317-c349cefc528e",
"parameters": {
"text": "={{ $json.message }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Configuration').first().json.slackChannel }}"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"typeVersion": 2.3
},
{
"id": "2b77e4b0-f37e-4d05-a4c9-4b6f4015ef1e",
"name": "Code in JavaScript",
"type": "n8n-nodes-base.code",
"position": [
1712,
64
],
"parameters": {
"jsCode": "const rssFeedsArray = $input.item.json.rssFeeds;\nconst outputItems = [];\n\nfor (const feedUrl of rssFeedsArray) {\n outputItems.push({ \n json: { \n rssFeeds: feedUrl \n } \n });\n}\n\nreturn outputItems;"
},
"typeVersion": 2
},
{
"id": "cb8efc38-c306-4c35-ae0e-230a28686529",
"name": "Tags aggregieren",
"type": "n8n-nodes-base.code",
"position": [
2016,
256
],
"parameters": {
"jsCode": "// Googleシートの全行を受け取り、'tagDictionary'という一つのリストにまとめます。\nconst allTags = $input.all().map(item => item.json);\n\n// ワークフローの後続ノードが使いやすいように、一つのアイテムとして出力します。\nreturn [{ json: { tagDictionary: allTags } }];"
},
"typeVersion": 2
},
{
"id": "335c2541-e71d-4992-afd2-1262aa810ae2",
"name": "Google Gemini Chat-Modell",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
2240,
256
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash-lite"
},
"typeVersion": 1
},
{
"id": "e4c64295-aad1-4a04-a328-9fd9a1d51614",
"name": "Hinweis: Täglicher Morgen-Trigger",
"type": "n8n-nodes-base.stickyNote",
"position": [
1024,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Kicks off the workflow every morning.\n**Key setting:** Change trigger hour in the node options.\n**Tip:** Switch to weekdays only if you don't brief on weekends."
},
"typeVersion": 1
},
{
"id": "51d8fc1b-5195-42cb-85b7-6d1d00a4829d",
"name": "Hinweis: Workflow-Konfiguration",
"type": "n8n-nodes-base.stickyNote",
"position": [
1344,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Central config hub.\n**Fields:** `rssFeeds` (array), `notionDatabaseId` (string), `slackChannel` (string).\n**Tip:** Keep all user-editable values here."
},
"typeVersion": 1
},
{
"id": "37dfe9c2-c412-454b-8aa5-ed580d2c88dc",
"name": "Hinweis: Code in JavaScript",
"type": "n8n-nodes-base.stickyNote",
"position": [
1648,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Splits the `rssFeeds` array into one item per feed URL.\n**Why:** Lets downstream nodes process feeds independently."
},
"typeVersion": 1
},
{
"id": "24192a09-f208-4eaa-837e-00ccece1d873",
"name": "Hinweis: RSS-Feeds lesen",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Fetches articles for each feed URL.\n**Output:** Items with `title`, `content`, `link`, `pubDate`, etc."
},
"typeVersion": 1
},
{
"id": "21304a64-1034-44ba-97c8-f4040d074fc4",
"name": "Hinweis: Tag-Wörterbuch abrufen",
"type": "n8n-nodes-base.stickyNote",
"position": [
1648,
416
],
"parameters": {
"color": "white",
"content": "**Purpose:** Loads the Tag Dictionary from Google Sheets.\n**Note:** Reconnect your own Google Sheets credential in n8n."
},
"typeVersion": 1
},
{
"id": "ccd7838e-b26f-4e95-ab9f-4c3deb157c94",
"name": "Hinweis: Tags aggregieren",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
416
],
"parameters": {
"color": "white",
"content": "**Purpose:** Combines all sheet rows into `tagDictionary` (single item).\n**Downstream:** Used by the AI node to enforce consistent tagging."
},
"typeVersion": 1
},
{
"id": "7f6c10fb-10ad-4f39-90a7-713af4b676a6",
"name": "Hinweis: Google Gemini Chat-Modell",
"type": "n8n-nodes-base.stickyNote",
"position": [
2256,
416
],
"parameters": {
"color": "white",
"content": "**Purpose:** Provides the LLM runtime for the AI agent.\n**Note:** Reconnect your own Gemini (PaLM) API credential in n8n."
},
"typeVersion": 1
},
{
"id": "32def482-d498-47a1-8905-6b7ec2629307",
"name": "Hinweis: KI-Zusammenfasser und Tagger",
"type": "n8n-nodes-base.stickyNote",
"position": [
2256,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Produces a strict JSON payload: title, summary (≤3 lines), tags[], priority (1–5), url, publishedDate.\n**Prompt tip:** Update wording and tag schema as your taxonomy evolves."
},
"typeVersion": 1
},
{
"id": "be9475cf-e641-4b92-9845-84b71cda8c6d",
"name": "Hinweis: KI-Ausgabe parsen",
"type": "n8n-nodes-base.stickyNote",
"position": [
2560,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Validates and normalizes AI JSON.\n**Includes:** JSON-safe extraction, Notion date formatting, tag array fix."
},
"typeVersion": 1
},
{
"id": "e985e8c7-c9ea-4e3b-b568-a6e3105980d4",
"name": "Hinweis: In Notion Datenbank schreiben",
"type": "n8n-nodes-base.stickyNote",
"position": [
2864,
-144
],
"parameters": {
"color": "white",
"width": 256,
"height": 176,
"content": "**Purpose:** Creates a Notion page per item.\n**Mapping:** summary→rich_text, tags→multi_select, priority→number, url→url, publishedDate→date.\n**Note:** Reconnect Notion credential."
},
"typeVersion": 1
},
{
"id": "deb714fc-9818-48a1-a6b4-dd3dacc4414e",
"name": "Hinweis: Nach Priorität sortieren",
"type": "n8n-nodes-base.stickyNote",
"position": [
3184,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Orders items by `priority` (desc).\n**Tip:** Change to `publishedDate` or hybrid scoring if preferred."
},
"typeVersion": 1
},
{
"id": "8817c32a-ed51-4086-b7a8-75f1c81f05ef",
"name": "Hinweis: Top 3 Schlagzeilen",
"type": "n8n-nodes-base.stickyNote",
"position": [
3488,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Limits items to the top three for Slack brevity.\n**Tip:** Adjust `maxItems` for longer digests."
},
"typeVersion": 1
},
{
"id": "c5cbb7ef-b3c3-416a-9bc1-47852f1edaa5",
"name": "Hinweis: Slack Nachricht formatieren",
"type": "n8n-nodes-base.stickyNote",
"position": [
3792,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Builds a readable Slack digest.\n**Includes:** Title, summary, tags, and `Read more` URL per item."
},
"typeVersion": 1
},
{
"id": "f7ee2819-01f5-4150-9c5a-33c22d000066",
"name": "Hinweis: An Slack senden",
"type": "n8n-nodes-base.stickyNote",
"position": [
4096,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Sends the digest to your channel.\n**Config:** Uses `slackChannel` from the Set node.\n**Note:** Reconnect Slack OAuth2 credential."
},
"typeVersion": 1
},
{
"id": "a1b407c5-4e5a-4cff-9e19-b7d0d131b893",
"name": "Vorlagenübersicht",
"type": "n8n-nodes-base.stickyNote",
"position": [
288,
-384
],
"parameters": {
"color": "yellow",
"width": 608,
"height": 688,
"content": "## RSS Feed Intelligence Hub with Daily Slack Digest\n\n**Who’s it for** \nTeams that track multiple news sources and want an automated, tagged, and prioritized daily briefing in Slack (PMM, PR/Comms, Sales/CS, founders).\n\n**How it works / What it does** \n1) Runs each morning. \n2) Loads **rssFeeds**, **notionDatabaseId**, **slackChannel** from *Workflow Configuration (Set)*. \n3) Reads each RSS feed → summarizes & tags via **AI Summarizer and Tagger** (with **Aggregate Tags** dictionary). \n4) Writes items to **Notion** with summary/tags/priority/date. \n5) Sorts by priority → picks **Top 3 Headlines** → posts a Slack digest.\n\n**How to set up** \n- Edit `rssFeeds`, `notionDatabaseId`, `slackChannel` in **Workflow Configuration (Set)**. \n- Connect your own **Google Sheets**, **Notion**, **Slack**, and **LLM** credentials in n8n (kept unconfigured in this template). \n- (Optional) Change the trigger time in **Daily Morning Trigger**.\n\n**Requirements** \n- n8n (Cloud or self-hosted) \n- Slack app with chat:write permission for the target channel \n- Notion DB with properties: `summary` (rich_text), `tags` (multi_select), `priority` (number), `url` (url), `publishedDate` (date) \n- Google Sheets (for the Tag Dictionary), or replace with another source\n\n**Customize** \n- Add more feeds, tweak the AI prompt, change the sort key (e.g., by recency), or post separate Slack threads per tag."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "fab6bf45-898d-47e3-a790-add5ccd6767d",
"connections": {
"7f7de5b9-dd1a-4a5a-9eb3-c85030a8bb59": {
"main": [
[
{
"node": "f6b25f54-0635-4498-b878-4468c633c932",
"type": "main",
"index": 0
}
]
]
},
"92010737-ab4a-49de-a1ee-670759347865": {
"main": [
[
{
"node": "808a0b99-b2d7-4b4e-970a-c3f8e189e87c",
"type": "main",
"index": 0
}
]
]
},
"075978c2-5ee8-453e-a75e-0fb7708889a2": {
"main": [
[
{
"node": "643c4d99-f909-4287-ab22-203526c96c02",
"type": "main",
"index": 0
}
]
]
},
"970b77bd-6c52-43b8-800a-2d236d9a7cd3": {
"main": [
[
{
"node": "075978c2-5ee8-453e-a75e-0fb7708889a2",
"type": "main",
"index": 0
}
]
]
},
"2b77e4b0-f37e-4d05-a4c9-4b6f4015ef1e": {
"main": [
[
{
"node": "7f7de5b9-dd1a-4a5a-9eb3-c85030a8bb59",
"type": "main",
"index": 0
}
]
]
},
"fb2fe89f-b551-47e0-a133-cb585c92a517": {
"main": [
[
{
"node": "cb8efc38-c306-4c35-ae0e-230a28686529",
"type": "main",
"index": 0
}
]
]
},
"643c4d99-f909-4287-ab22-203526c96c02": {
"main": [
[
{
"node": "4b73b33f-b7b8-4305-9f96-afecab761db2",
"type": "main",
"index": 0
}
]
]
},
"b53e19f4-42d6-4433-be23-dee9d43d4c96": {
"main": [
[
{
"node": "df28a219-fa77-408f-b842-1394c04bd8db",
"type": "main",
"index": 0
}
]
]
},
"df28a219-fa77-408f-b842-1394c04bd8db": {
"main": [
[
{
"node": "fb2fe89f-b551-47e0-a133-cb585c92a517",
"type": "main",
"index": 0
},
{
"node": "2b77e4b0-f37e-4d05-a4c9-4b6f4015ef1e",
"type": "main",
"index": 0
}
]
]
},
"f6b25f54-0635-4498-b878-4468c633c932": {
"main": [
[
{
"node": "92010737-ab4a-49de-a1ee-670759347865",
"type": "main",
"index": 0
}
]
]
},
"335c2541-e71d-4992-afd2-1262aa810ae2": {
"ai_languageModel": [
[
{
"node": "f6b25f54-0635-4498-b878-4468c633c932",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"808a0b99-b2d7-4b4e-970a-c3f8e189e87c": {
"main": [
[
{
"node": "970b77bd-6c52-43b8-800a-2d236d9a7cd3",
"type": "main",
"index": 0
}
]
]
}
}
}Wie verwende ich diesen Workflow?
Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.
Für welche Szenarien ist dieser Workflow geeignet?
Experte - Marktforschung, KI-Zusammenfassung
Ist es kostenpflichtig?
Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.
Verwandte Workflows
Takuya Ojima
@takuyaDiesen Workflow teilen