Rappel automatisé de nouvelles sur les actions via Google RSS, Openrouter et Telegram
Ceci est unCrypto Trading, AI Summarizationworkflow d'automatisation du domainecontenant 22 nœuds.Utilise principalement des nœuds comme If, Code, Merge, JinaAi, Telegram. Alerte automatisée pour les actualités boursières basée sur Google RSS, Gemini et les notifications Telegram
- •Token Bot Telegram
- •Informations d'identification Google Sheets API
Nœuds utilisés (22)
Catégorie
{
"id": "zyj0hJZNNR3mKvEx",
"name": "Automated Stock News Alerts via Google RSS, Openrouter & Telegram",
"tags": [],
"nodes": [
{
"id": "b4739068-769f-4638-83cf-94a7c611caad",
"name": "Ajouter ou mettre à jour une ligne dans la feuille",
"type": "n8n-nodes-base.googleSheets",
"position": [
2380,
620
],
"parameters": {
"columns": {
"value": {
"ID": "={{ $('Merge').item.json.id }}",
"URL": "={{ $json.realUrl }}",
"Date": "={{ $('Merge').item.json.pubDate }}",
"Title": "={{ $('Merge').item.json.title }}"
},
"schema": [
{
"id": "ID",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Title",
"type": "string",
"display": true,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL",
"type": "string",
"display": true,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SentToTelegram",
"type": "string",
"display": true,
"required": false,
"displayName": "SentToTelegram",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"ID"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "109kj97ABR37XviIpxARCFviZwq8opOoe--rayOeFDSo"
}
},
"typeVersion": 4.6
},
{
"id": "4d5abad5-44ac-4698-a178-f6da494d83d7",
"name": "Note adhésive1",
"type": "n8n-nodes-base.stickyNote",
"position": [
860,
140
],
"parameters": {
"color": 7,
"width": 460,
"height": 760,
"content": "### ⏰ Scheduler\n\n**Function:** \nThis node triggers the entire workflow at a predefined interval. It ensures that the system checks for new stock news regularly without manual intervention.\n\n**Configuration:**\n- **Mode:** Every X minutes\n- **Interval:** 15 minutes (default, can be customized based on user needs)\n\n**Notes:**\n- You can adjust the interval depending on how frequently you want to monitor news updates.\n\n"
},
"typeVersion": 1
},
{
"id": "8f3aeb9c-380e-4d91-a8e0-f2c856d360b5",
"name": "Note adhésive7",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"color": 6,
"width": 780,
"height": 1300,
"content": "## 🎯 Purpose\nThis workflow helps you automatically monitor stock related news, extract the main content, summarize it using a LLM (via OpenRouter), and send real time alerts to Telegram and store them in Google Sheets.\n\n## ⚙️ How It Works\n### Trigger\n- A Cron node triggers the workflow every 15 minutes (adjustable).\n- RSS Feed node checks latest articles from Google Alerts RSS.\n- The workflow filters duplicates using Google Sheets as a log.\n- The article URL is sent to Jina AI Readability API to extract the main body text.\n- The content is summarized using a model from OpenRouter (e.g., Gemini, Claude, GPT-4).\n- You can customize the prompt to suit your tone and analysis needs.\n- The result is appended to a Google Sheets file.\n- Sends the title, summary, and reccomendation to Telegram chat.\n\n**🧾 Google Sheets Template**\nCreate a Google Sheet using this template: [Stock Alert](https://docs.google.com/spreadsheets/d/109kj97ABR37XviIpxARCFviZwq8opOoe--rayOeFDSo/edit?usp=sharing)\n\n## 🧰 Requirements\n- Telegram Bot + your Chat ID\n- OpenRouter account and API key\n- Jina AI account for content extraction\n- Google Account with access to Google Sheets\n- Google Alerts RSS feed\n\n## 🛠 Setup Instructions\n- Install required credentials:\n - Add OpenRouter API key to n8n credentials.\n - Add Telegram Bot Token and Chat ID.\n - Add Google Sheets credentials.\n - Add Jina AI credentials.\n- Create or copy the Google Sheet using the link above.\n- Go to Google Alerts, create alerts, and copy the RSS feed URL.\n- Replace placeholder API keys and URLs.\n- Adjust Telegram Chat ID.\n\n## 🔐 Security Note\nAll sensitive credentials (e.g., API keys, personal chat IDs) have been removed from this template. Please replace them using the n8n credentials manager before activating the workflow."
},
"typeVersion": 1
},
{
"id": "f00e3efd-e11e-4340-adef-c87b01c4818c",
"name": "Lire le contenu de l'URL",
"type": "n8n-nodes-base.jinaAi",
"position": [
2980,
500
],
"parameters": {
"url": "={{ $('Get row(s) in sheet').item.json.URL }}",
"options": {},
"requestOptions": {}
},
"typeVersion": 1
},
{
"id": "f86e1a17-48b9-4a3b-a428-b4e6edc27d6f",
"name": "Agent IA",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
3300,
500
],
"parameters": {
"text": "=Create a summary of up to 200 words from {{ $json.content }} Add a description of the affected stocks (stock code). Add a sentiment description (uptrend, downtrend, sideways, positive, negative or others). The writing format is as follows: Title\\nCategory\\nSummary\\nSentiment\\nReccomendation. Write in plain text without punctuation, use emoji to more interactive.",
"options": {
"systemMessage": "You are a professional analyst who has studied a lot about stock movements. Use the following news articles to see the company's fundamentals, sentiment, and future projections."
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "b94dff41-913d-4e8b-9ea8-3fe9d36041ab",
"name": "Modèle de chat OpenRouter",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
3300,
700
],
"parameters": {
"model": "google/gemini-2.0-flash-exp:free",
"options": {}
},
"typeVersion": 1
},
{
"id": "f4d18c3e-7ed8-44d8-b699-82c6923e642f",
"name": "Fusionner",
"type": "n8n-nodes-base.merge",
"position": [
1960,
620
],
"parameters": {
"numberInputs": 3
},
"typeVersion": 3.2
},
{
"id": "552b48ff-8921-4878-8c65-4d1f9c63f6e0",
"name": "Obtenir une ou plusieurs lignes dans la feuille",
"type": "n8n-nodes-base.googleSheets",
"position": [
2580,
620
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "109kj97ABR37XviIpxARCFviZwq8opOoe--rayOeFDSo"
}
},
"typeVersion": 4.6
},
{
"id": "2dc342e9-9f0b-4f1e-8889-60b61bcb42f2",
"name": "Envoyer un message texte",
"type": "n8n-nodes-base.telegram",
"position": [
3960,
500
],
"parameters": {
"text": "={{ $json.Summary }}",
"additionalFields": {
"appendAttribution": false
}
},
"typeVersion": 1.2
},
{
"id": "f49aa596-c969-4c4f-b466-79f962c2a658",
"name": "Ajouter ou mettre à jour une ligne dans la feuille1",
"type": "n8n-nodes-base.googleSheets",
"position": [
3740,
500
],
"parameters": {
"columns": {
"value": {
"URL": "={{ $('Read URL content').item.json.url }}",
"Summary": "={{ $json.output }}",
"SentToTelegram": "true"
},
"schema": [
{
"id": "ID",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Title",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SentToTelegram",
"type": "string",
"display": true,
"required": false,
"displayName": "SentToTelegram",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"URL"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "109kj97ABR37XviIpxARCFviZwq8opOoe--rayOeFDSo"
}
},
"typeVersion": 4.6
},
{
"id": "966d4fb2-39e1-4e8f-a6bc-847f49e2f6f0",
"name": "Déclencheur planifié1",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
1020,
620
],
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 15
}
]
}
},
"typeVersion": 1.2
},
{
"id": "b9d23403-da7b-4c43-a6b4-aeaa38ac6e2d",
"name": "Aucune opération, ne rien faire",
"type": "n8n-nodes-base.noOp",
"position": [
2980,
720
],
"parameters": {},
"typeVersion": 1
},
{
"id": "002d50e3-f1d5-4bcc-b342-7c94f9d22bf8",
"name": "Note adhésive",
"type": "n8n-nodes-base.stickyNote",
"position": [
1420,
140
],
"parameters": {
"color": 7,
"width": 460,
"height": 840,
"content": "### 📡 RSS Feed (Google Alerts)\n\n**Function:** \nThis node fetches the latest news articles from Google Alerts RSS feeds based on specific stock related keywords.\n\n**Configuration:**\n- **RSS Feed URL:** Generated from Google Alerts using chosen keywords (e.g., `IPO`, `stock acquisition`, `company merger`, or specific company names like `AAPL`, `NVDA`, etc.)\n"
},
"typeVersion": 1
},
{
"id": "c17cce05-0f63-47ee-abdf-e5c016819766",
"name": "Note adhésive2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1940,
140
],
"parameters": {
"color": 7,
"width": 560,
"height": 840,
"content": "### 🔗 Merge & Extract Real URL\n\n**Function:** \nAfter collecting articles from multiple RSS Feed nodes, this step merges the data and **extracts the actual article URL**, since Google Alerts RSS provides redirect URLs (e.g., `https://www.google.com/url?...`).\n\n**Processing Steps:**\n- Use a **Merge** node to combine outputs from multiple RSS nodes.\n- Use a **Function** node to:\n - Parse the `link` field from the RSS item.\n - Extract the real URL from the `url` query parameter of Google's redirect link.\n- Save data to **Google Sheets**\n"
},
"typeVersion": 1
},
{
"id": "134bf506-303f-45aa-a659-93c7a9c8252d",
"name": "Obtenir l'URL réelle",
"type": "n8n-nodes-base.code",
"position": [
2160,
620
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "return {\n realUrl: $json.link.includes(\"google.com/url\")\n ? decodeURIComponent($json.link.match(/url=([^&]+)/)[1])\n : $json.link\n};\n"
},
"typeVersion": 2
},
{
"id": "6011ec34-cb71-4db6-b3a6-a8a190db78fc",
"name": "Si",
"type": "n8n-nodes-base.if",
"position": [
2760,
620
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "67a8680d-5aca-4e40-9ae7-f91925461807",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.Summary }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "4a05175a-00ef-42b7-a8f5-87d6d729313f",
"name": "Note adhésive3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2560,
140
],
"parameters": {
"color": 7,
"width": 620,
"height": 840,
"content": "### 📄 Extract Content (Jina AI)\n\n**Function:** \nThis step extracts the **main content** (article body) from the real URL using **Jina AI’s article reader API**.\n\n**Processing Steps:**\n- Use an **IF node** to check whether the article already contains extracted content.\n - **If content exists:** Do nothing.\n - **If content is empty or missing:** Continue to next step.\n- Use **Jina AI API** to extract the full article content from the `realUrl`.\n\n**Output:**\n- The full article text is stored in a field such as `extractedContent` or `fullText`.\n- This text will be passed to the summarization step."
},
"typeVersion": 1
},
{
"id": "cdf4b5fd-8da9-49d4-a79b-cfb6bcf4dac3",
"name": "Note adhésive4",
"type": "n8n-nodes-base.stickyNote",
"position": [
3200,
140
],
"parameters": {
"color": 7,
"width": 440,
"height": 840,
"content": "### 🧠 Summarize & Analyze (LLM via OpenRouter)\n\n**Function:** \nThis node uses a **Large Language Model (LLM)** via the **OpenRouter API** to summarize and analyze the extracted article content. The goal is to turn raw text into concise, actionable insights.\n\n- You can customize the **system message** and **user prompt** to suit your use case.\n- **Model**: Choose from a variety of models via OpenRouter (GPT-4, Claude, etc.).\n\n**Output:**\n- `summary`: A brief overview of the article.\n- `analysis`: Optional insight or investment angle.\n"
},
"typeVersion": 1
},
{
"id": "f71646be-296c-47d0-9443-126c03405faa",
"name": "Note adhésive5",
"type": "n8n-nodes-base.stickyNote",
"position": [
3700,
140
],
"parameters": {
"color": 7,
"width": 440,
"height": 840,
"content": "### 🗂️ Save to Google Sheets and Send to Telegram\nThis step saves the results of the summarization and analysis into the existing **Google Sheets database** to maintain a structured log of processed news.\n\n### 📲 Send to Telegram\nDelivers the summarized news and analysis via **Telegram Bot API** for real-time alerts.\n"
},
"typeVersion": 1
},
{
"id": "ce580e6b-e954-4cf0-a55b-f9e67be8a905",
"name": "Acquisition d'actions",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
1580,
440
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
},
{
"id": "d64cf706-d073-4d1a-a793-4ab66a32da28",
"name": "Rachat d'actions",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
1580,
620
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
},
{
"id": "1a3e5030-0b82-4649-910f-bfc8d0a28866",
"name": "Action NVDA",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
1580,
800
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"connections": {
"6011ec34-cb71-4db6-b3a6-a8a190db78fc": {
"main": [
[
{
"node": "f00e3efd-e11e-4340-adef-c87b01c4818c",
"type": "main",
"index": 0
}
],
[
{
"node": "b9d23403-da7b-4c43-a6b4-aeaa38ac6e2d",
"type": "main",
"index": 0
}
]
]
},
"f4d18c3e-7ed8-44d8-b699-82c6923e642f": {
"main": [
[
{
"node": "134bf506-303f-45aa-a659-93c7a9c8252d",
"type": "main",
"index": 0
}
]
]
},
"f86e1a17-48b9-4a3b-a428-b4e6edc27d6f": {
"main": [
[
{
"node": "f49aa596-c969-4c4f-b466-79f962c2a658",
"type": "main",
"index": 0
}
]
]
},
"1a3e5030-0b82-4649-910f-bfc8d0a28866": {
"main": [
[
{
"node": "f4d18c3e-7ed8-44d8-b699-82c6923e642f",
"type": "main",
"index": 2
}
]
]
},
"134bf506-303f-45aa-a659-93c7a9c8252d": {
"main": [
[
{
"node": "b4739068-769f-4638-83cf-94a7c611caad",
"type": "main",
"index": 0
}
]
]
},
"d64cf706-d073-4d1a-a793-4ab66a32da28": {
"main": [
[
{
"node": "f4d18c3e-7ed8-44d8-b699-82c6923e642f",
"type": "main",
"index": 1
}
]
]
},
"f00e3efd-e11e-4340-adef-c87b01c4818c": {
"main": [
[
{
"node": "f86e1a17-48b9-4a3b-a428-b4e6edc27d6f",
"type": "main",
"index": 0
}
]
]
},
"966d4fb2-39e1-4e8f-a6bc-847f49e2f6f0": {
"main": [
[
{
"node": "1a3e5030-0b82-4649-910f-bfc8d0a28866",
"type": "main",
"index": 0
},
{
"node": "d64cf706-d073-4d1a-a793-4ab66a32da28",
"type": "main",
"index": 0
},
{
"node": "ce580e6b-e954-4cf0-a55b-f9e67be8a905",
"type": "main",
"index": 0
}
]
]
},
"ce580e6b-e954-4cf0-a55b-f9e67be8a905": {
"main": [
[
{
"node": "f4d18c3e-7ed8-44d8-b699-82c6923e642f",
"type": "main",
"index": 0
}
]
]
},
"552b48ff-8921-4878-8c65-4d1f9c63f6e0": {
"main": [
[
{
"node": "6011ec34-cb71-4db6-b3a6-a8a190db78fc",
"type": "main",
"index": 0
}
]
]
},
"b94dff41-913d-4e8b-9ea8-3fe9d36041ab": {
"ai_languageModel": [
[
{
"node": "f86e1a17-48b9-4a3b-a428-b4e6edc27d6f",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"b4739068-769f-4638-83cf-94a7c611caad": {
"main": [
[
{
"node": "552b48ff-8921-4878-8c65-4d1f9c63f6e0",
"type": "main",
"index": 0
}
]
]
},
"f49aa596-c969-4c4f-b466-79f962c2a658": {
"main": [
[
{
"node": "2dc342e9-9f0b-4f1e-8889-60b61bcb42f2",
"type": "main",
"index": 0
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - Trading crypto, Résumé IA
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Budi SJ
@budisjI’m a Product Designer who also works as an Automation Developer. With a background in product design and systems thinking, I build user-centered workflows. My focus is on helping teams and businesses work more productively through impactful automation systems.
Partager ce workflow