This workflow follows the Executecommand → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"name": "Switch",
"type": "n8n-nodes-base.switch",
"notes": "check bot commands",
"position": [
460,
480
],
"parameters": {
"rules": {
"rules": [
{
"value2": "/start"
},
{
"output": 1,
"value2": "/getweather"
}
]
},
"value1": "={{$json[\"message\"][\"text\"]}}",
"dataType": "string",
"fallbackOutput": 3
},
"notesInFlow": true,
"typeVersion": 1
},
{
"name": "msg_greet",
"type": "n8n-nodes-base.telegram",
"position": [
1820,
300
],
"parameters": {
"text": "=Nice to meet you, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}.\nI am n8n-powered bot, I can send you a weather data for several European capitals. The data is an image generated in ggplot2 package of R programming language.\nType /getweather to begin.",
"chatId": "={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 1
},
{
"name": "msg_wrongcommand",
"type": "n8n-nodes-base.telegram",
"position": [
1820,
1160
],
"parameters": {
"text": "=Sorry, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}, your command was not recognized.\n/getweather - show image with the weather info.",
"chatId": "={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 1
},
{
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
300,
480
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"name": "msg_getweather",
"type": "n8n-nodes-base.telegram",
"position": [
2020,
820
],
"parameters": {
"chatId": "={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}",
"operation": "sendPhoto",
"binaryData": true,
"additionalFields": {
"caption": "=Here's your image, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}."
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 1
},
{
"name": "City List",
"type": "n8n-nodes-base.function",
"position": [
1040,
640
],
"parameters": {
"functionCode": "return [{Cityid: 2643743, Cityname:\"London\", Country: \"GB\"},\r\n {Cityid: 2950159, Cityname:\"Berlin\", Country: \"DE\"},\r\n {Cityid: 3117735, Cityname:\"Madrid\", Country: \"ES\"},\r\n {Cityid: 3169070, Cityname:\"Rome\", Country: \"IT\"},\r\n {Cityid: 683506, Cityname:\"Bucharest\", Country: \"RO\"},\r\n {Cityid: 2968815, Cityname:\"Paris\", Country: \"FR\"},\r\n {Cityid: 2761369, Cityname:\"Vienna\", Country: \"AT\"},\r\n {Cityid: 756135, Cityname:\"Warsaw\", Country: \"PL\"},\r\n {Cityid: 3054638, Cityname:\"Budapest\", Country: \"HU\"},\r\n {Cityid: 792680, Cityname:\"Belgrade\", Country: \"RS\"}];"
},
"typeVersion": 1
},
{
"name": "Convert API response",
"type": "n8n-nodes-base.function",
"position": [
860,
840
],
"parameters": {
"functionCode": "// this data is stored as a CSV file and then processed in the R script. Please check the R code here:\n// https://gist.github.com/ed-parsadanyan/0561cd12d545e642fcef17dcb0872b00\nvar data = [];\n\nfor (item of items) {\n data.push({CityName: item.json.name+', '+item.json.sys.country,\n TempCur : item.json.main.temp,\n TempMin : item.json.main.temp_min,\n TempMax : item.json.main.temp_max\n });\n}\n\nreturn data;"
},
"typeVersion": 1
},
{
"name": "Get weather data",
"type": "n8n-nodes-base.httpRequest",
"position": [
1220,
640
],
"parameters": {
"url": "=https://api.openweathermap.org/data/2.5/weather?id={{$json[\"Cityid\"]}}&units=metric&appid=6d3fff582a101700576faf74734f9535",
"options": {}
},
"typeVersion": 1,
"continueOnFail": true
},
{
"name": "Spreadsheet File",
"type": "n8n-nodes-base.spreadsheetFile",
"position": [
1040,
840
],
"parameters": {
"options": {
"fileName": "={{$node[\"Filename\"].json[\"filename\"]}}.{{$parameter[\"fileFormat\"]}}"
},
"operation": "toFile",
"fileFormat": "csv"
},
"typeVersion": 1
},
{
"name": "Write csv",
"type": "n8n-nodes-base.writeBinaryFile",
"position": [
1220,
840
],
"parameters": {
"fileName": "={{$node[\"Filename\"].json[\"foldername\"]}}{{$binary.data.fileName}}"
},
"typeVersion": 1
},
{
"name": "Filename",
"type": "n8n-nodes-base.set",
"position": [
860,
640
],
"parameters": {
"values": {
"string": [
{
"name": "filename",
"value": "=request_from{{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"id\"]}}_{{DateTime.now().toISO({ format: 'basic' }).split('.')[0]}}"
},
{
"name": "foldername",
"value": "/home/node/.n8n/weather-bot/"
},
{
"name": "imgname",
"value": "=request_from{{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"id\"]}}"
}
]
},
"options": {}
},
"typeVersion": 1
},
{
"name": "msg_errorAPI",
"type": "n8n-nodes-base.telegram",
"position": [
1820,
640
],
"parameters": {
"text": "=Sorry, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}, an error occurred while fetching weather data. Please try again later.",
"chatId": "={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}",
"additionalFields": {
"parse_mode": "Markdown"
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 1
},
{
"name": "Any errors API?",
"type": "n8n-nodes-base.if",
"position": [
1580,
640
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$json[\"error\"][\"name\"]}}",
"value2": "Error"
}
]
}
},
"typeVersion": 1
},
{
"name": "msg_errorR",
"type": "n8n-nodes-base.telegram",
"position": [
1820,
1000
],
"parameters": {
"text": "=Sorry, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}, an error occurred while creating an image. Please try again later.",
"chatId": "={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}",
"additionalFields": {
"parse_mode": "Markdown"
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 1
},
{
"name": "Read Binary File",
"type": "n8n-nodes-base.readBinaryFile",
"position": [
1820,
820
],
"parameters": {
"filePath": "={{$node[\"Filename\"].json[\"foldername\"]}}{{$node[\"Filename\"].json[\"imgname\"]}}.png"
},
"typeVersion": 1
},
{
"name": "R successful?",
"type": "n8n-nodes-base.if",
"position": [
1580,
840
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{$json[\"exitCode\"]}}",
"operation": "equal"
}
]
}
},
"typeVersion": 1
},
{
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
680,
1160
],
"parameters": {
"mode": "passThrough"
},
"typeVersion": 1
},
{
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
680,
300
],
"parameters": {
"mode": "passThrough"
},
"typeVersion": 1
},
{
"name": "msg_pleasewait",
"type": "n8n-nodes-base.telegram",
"position": [
1820,
460
],
"parameters": {
"text": "=Please wait while your request is being processed...",
"chatId": "={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}",
"additionalFields": {
"parse_mode": "Markdown"
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 1
},
{
"name": "Merge2",
"type": "n8n-nodes-base.merge",
"position": [
680,
640
],
"parameters": {
"mode": "wait"
},
"typeVersion": 1
},
{
"name": "Run R script",
"type": "n8n-nodes-base.executeCommand",
"position": [
1400,
840
],
"parameters": {
"command": "=Rscript --vanilla '{{$node[\"Filename\"].json[\"foldername\"]}}dumbbell_plot.R' '{{$node[\"Filename\"].json[\"foldername\"]}}{{$node[\"Filename\"].json[\"filename\"]}}.csv' '{{$node[\"Filename\"].json[\"foldername\"]}}{{$node[\"Filename\"].json[\"imgname\"]}}.png' >& {{$node[\"Filename\"].json[\"foldername\"]}}{{$node[\"Filename\"].json[\"filename\"]}}.log"
},
"typeVersion": 1,
"continueOnFail": true
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "msg_wrongcommand",
"type": "main",
"index": 0
}
]
]
},
"Merge1": {
"main": [
[
{
"node": "msg_greet",
"type": "main",
"index": 0
}
]
]
},
"Merge2": {
"main": [
[
{
"node": "Filename",
"type": "main",
"index": 0
}
]
]
},
"Switch": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 0
}
],
[
{
"node": "msg_pleasewait",
"type": "main",
"index": 0
},
{
"node": "Merge2",
"type": "main",
"index": 0
}
],
null,
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Filename": {
"main": [
[
{
"node": "City List",
"type": "main",
"index": 0
}
]
]
},
"City List": {
"main": [
[
{
"node": "Get weather data",
"type": "main",
"index": 0
}
]
]
},
"Write csv": {
"main": [
[
{
"node": "Run R script",
"type": "main",
"index": 0
}
]
]
},
"Run R script": {
"main": [
[
{
"node": "R successful?",
"type": "main",
"index": 0
}
]
]
},
"R successful?": {
"main": [
[
{
"node": "Read Binary File",
"type": "main",
"index": 0
}
],
[
{
"node": "msg_errorR",
"type": "main",
"index": 0
}
]
]
},
"msg_pleasewait": {
"main": [
[
{
"node": "Merge2",
"type": "main",
"index": 1
}
]
]
},
"Any errors API?": {
"main": [
[
{
"node": "msg_errorAPI",
"type": "main",
"index": 0
}
],
[
{
"node": "Convert API response",
"type": "main",
"index": 0
}
]
]
},
"Get weather data": {
"main": [
[
{
"node": "Any errors API?",
"type": "main",
"index": 0
}
]
]
},
"Read Binary File": {
"main": [
[
{
"node": "msg_getweather",
"type": "main",
"index": 0
}
]
]
},
"Spreadsheet File": {
"main": [
[
{
"node": "Write csv",
"type": "main",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "Switch",
"type": "main",
"index": 0
}
]
]
},
"Convert API response": {
"main": [
[
{
"node": "Spreadsheet File",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
telegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow enables you to enhance your n8n automation by incorporating external tools like Telegram for instant messaging and HTTP requests for API integrations, allowing seamless data exchange without coding from scratch. It's ideal for developers and automation enthusiasts seeking to build responsive bots that handle user queries efficiently, such as fetching real-time weather information based on commands. The key step involves the Telegram trigger capturing incoming messages, followed by a switch node routing them to appropriate actions like querying an API and responding via Telegram, streamlining event-driven interactions.
Use this workflow when you need a flexible foundation to add custom tools to n8n for quick prototyping of chat-based automations, particularly for handling simple commands like weather checks. Avoid it for complex AI-driven tasks, as it lacks specialised nodes for those; instead, opt for built-in n8n AI features. Common variations include swapping the weather API for stock prices or integrating with Google Sheets via spreadsheetFile for logging user interactions.
About this workflow
Extend N8N With Additional Tools. Uses telegram, telegramTrigger, httpRequest, spreadsheetFile. Event-driven trigger; 21 nodes.
Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow extends n8n and uses R language graphic capabilities. This is a Telegram bot which fetches weather data via the openweathermap.org API, plots an image using ggoplot2 package from R and s
Vendorbot Form Filler. Uses executeCommand, gmail, telegram, slack. Event-driven trigger; 39 nodes.
02 - Photo OCR Handler. Uses telegramTrigger, telegram, httpRequest, readBinaryFile. Event-driven trigger; 16 nodes.
Send A Message To Telegram On A New Item Saved To Reader. Uses manualTrigger, writeBinaryFile, readBinaryFile, httpRequest. Event-driven trigger; 11 nodes.
This workflow aims to build a simple bot that will send a message to a telegram channel every time there is a new saved item to the Reader.