Bot de canal de IA de Telegram - Generador TGPT con soporte para respuestas de texto e imagen
Avanzado
Este es unautomatización que contiene 22 nodos.Utiliza principalmente nodos como If, Set, Code, Switch, SplitOut. Generar respuestas de texto e imágenes en canales de Telegram con GPT-4 y TGPT
Requisitos previos
- •Bot Token de Telegram
- •Pueden requerirse credenciales de autenticación para la API de destino
Nodos utilizados (22)
Categoría
-
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
"id": "NyILudHveZv2PCWA",
"meta": {
"instanceId": "5c7ce220523e8664f49208a8be668a8dc6fab5f747ce4de865fa1309727919f1"
},
"name": "Telegram AI Channel Bot - Text & Image Response Generator with TGPT",
"tags": [],
"nodes": [
{
"id": "b0b9e65b-b10b-4515-a0d1-7bddf468fe43",
"name": "Programador",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1568,
256
],
"parameters": {
"rule": {
"interval": [
{
"field": "seconds",
"secondsInterval": 10
}
]
}
},
"typeVersion": 1.2
},
{
"id": "1e9869bb-34b6-4446-acf7-7a7da358f842",
"name": "Configuración",
"type": "n8n-nodes-base.set",
"position": [
-1344,
256
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "bot-token",
"name": "bot_token",
"type": "string",
"value": "your_telegram_token"
},
{
"id": "channel-id",
"name": "channel_id",
"type": "string",
"value": "your_telegram_channel_id"
},
{
"id": "last-offset",
"name": "last_offset",
"type": "number",
"value": "={{ $getWorkflowStaticData('global').last_offset || 0 }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "56f197e8-0e2e-43e6-ba3b-d87ddcf47673",
"name": "Obtener actualizaciones",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
-1120,
256
],
"parameters": {
"url": "=https://api.telegram.org/bot{{ $json.bot_token }}/getUpdates",
"options": {
"timeout": 30000
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "allowed_updates",
"value": "[\"channel_post\"]"
},
{
"name": "timeout",
"value": "3"
},
{
"name": "offset",
"value": "={{ $json.last_offset }}"
},
{
"name": "limit",
"value": "15"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "d6884a27-1999-4cea-9c83-427cdb507892",
"name": "Procesar desplazamiento",
"type": "n8n-nodes-base.code",
"position": [
-896,
256
],
"parameters": {
"jsCode": "// Process Offset - Complete solution with time window and duplicate prevention\nconst results = items[0].json.result || [];\nconst staticData = $getWorkflowStaticData('global');\n\n// Initialize if needed\nif (!staticData.processed_ids) {\n staticData.processed_ids = [];\n staticData.last_offset = 0;\n}\n\n// Get previous offset\nconst previousOffset = staticData.last_offset || 0;\n\n// Current time (Unix timestamp)\nconst currentTime = Math.floor(Date.now() / 1000);\nconst timeWindowSeconds = 15; // Slightly larger window for delays\n\n// Debug info\nconsole.log('=== Process Offset Debug ===' );\nconsole.log('Previous offset:', previousOffset);\nconsole.log('Number of messages received:', results.length);\nconsole.log('Number of processed IDs:', staticData.processed_ids.length);\n\n// ALWAYS update offset if there are results\nif (results.length > 0) {\n const maxUpdateId = Math.max(...results.map(r => r.update_id));\n staticData.last_offset = maxUpdateId + 1;\n console.log('Offset updated:', staticData.last_offset);\n}\n\n// Filter: only new messages + time window + not yet processed\nconst newMessages = results.filter(msg => {\n // Check if already processed\n if (staticData.processed_ids.includes(msg.update_id)) {\n console.log(`Message ${msg.update_id} already processed, skipping`);\n return false;\n }\n \n // Check time window\n const messageTime = msg.channel_post?.date || 0;\n const timeDiff = currentTime - messageTime;\n \n if (timeDiff > timeWindowSeconds) {\n console.log(`Message ${msg.update_id} too old (${timeDiff}s), skipping`);\n return false;\n }\n \n // Check if newer than previous offset\n if (msg.update_id < previousOffset) {\n console.log(`Message ${msg.update_id} older than offset ${previousOffset}, skipping`);\n return false;\n }\n \n console.log(`Message ${msg.update_id} will be processed (${timeDiff}s old)`);\n return true;\n});\n\n// If there are new messages\nif (newMessages.length > 0) {\n // Add processed IDs\n newMessages.forEach(msg => {\n staticData.processed_ids.push(msg.update_id);\n });\n \n // Cleanup: keep only last 100 IDs\n if (staticData.processed_ids.length > 100) {\n staticData.processed_ids = staticData.processed_ids.slice(-100);\n }\n \n console.log(`${newMessages.length} new messages to process`);\n \n // Return new messages WITH OFFSET\n return newMessages.map(msg => ({\n json: {\n ...msg,\n _current_offset: staticData.last_offset\n }\n }));\n} else {\n console.log('No new messages within time window');\n \n // If no new messages, still return the offset\n return [{\n json: {\n _no_new_message: true,\n _current_offset: staticData.last_offset\n }\n }];\n}"
},
"typeVersion": 2
},
{
"id": "b241edda-7c4c-439f-923f-866ad1f7784f",
"name": "Dividir",
"type": "n8n-nodes-base.splitOut",
"onError": "continueRegularOutput",
"position": [
-672,
256
],
"parameters": {
"options": {},
"fieldToSplitOut": "channel_post.text"
},
"typeVersion": 1
},
{
"id": "f194dc72-3089-4461-9424-437ccab2d019",
"name": "Filtrar",
"type": "n8n-nodes-base.if",
"position": [
-448,
256
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "channel-check",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('Process Offset').item.json.channel_post.chat.id.toString() }}",
"rightValue": "={{ $('Config').item.json.channel_id.toString() }}"
}
]
}
},
"typeVersion": 2
},
{
"id": "c266df6f-c97f-439f-86ce-77aa37b08c6b",
"name": "Limpiar",
"type": "n8n-nodes-base.code",
"position": [
224,
0
],
"parameters": {
"jsCode": "const rawOutput = items[0].json.stdout || '';\n\nif (!rawOutput) {\n console.log('Nincs kimenet az Execute node-tól');\n return [{\n json: {\n humanReadableText: 'Hiba történt a válasz generálása során.'\n }\n }];\n}\n\nlet cleaned = rawOutput\n\nreturn [\n {\n json: {\n humanReadableText: cleaned\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "66e7c7ac-7859-4ec3-a5e4-5163ff118b4e",
"name": "Selector",
"type": "n8n-nodes-base.switch",
"position": [
-192,
256
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "am",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "7831171b-9c57-4791-85cf-858817111370",
"operator": {
"type": "string",
"operation": "startsWith"
},
"leftValue": "={{ $('Split').item.json['channel_post.text'] }}",
"rightValue": "am# "
}
]
},
"renameOutput": true
},
{
"outputKey": "ami",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e9588452-a020-43c9-b75b-c182b629e97d",
"operator": {
"type": "string",
"operation": "startsWith"
},
"leftValue": "={{ $('Split').item.json['channel_post.text'] }}",
"rightValue": "ami# "
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "6ea51b7d-e8e5-4030-aedd-fa5dbec50a1f",
"name": "Ejecutar - Texto",
"type": "n8n-nodes-base.executeCommand",
"position": [
0,
0
],
"parameters": {
"command": "=addscriptifnotexists=$(apk add util-linux-misc)\naddcurlifnotexists=$(apk add curl)\n\nautomessage=\"{{ $('Split').item.json['channel_post.text'] }}\"\nprompt=$(echo \"$automessage\" | sed 's/am#//')\n\ngetpackagetgpt=$(curl -LO https://github.com/aandrew-me/tgpt/releases/download/v2.11.0/tgpt-linux-amd64)\nmv ./tgpt-linux-amd64 ./tgpt\nchmod +x ./tgpt\n\nrm -rf /tmp/response.txt\nscript -q -c \"./tgpt --model \\\"gtp-4\\\" --temperature \\\"0.3\\\" -q \\\"$prompt\\\" >> /tmp/response.txt\" /dev/null\n\ntput reset\ncat /tmp/response.txt | sed '/^\\r*@web_search/d'"
},
"typeVersion": 1,
"continueOnFail": true
},
{
"id": "8f038fc1-f7d7-45f0-8a54-76e423c3d05a",
"name": "Ejecutar - Imagen",
"type": "n8n-nodes-base.executeCommand",
"position": [
0,
528
],
"parameters": {
"command": "=apk add util-linux-misc\nautomessage=\"{{ $('Split').item.json['channel_post.text'] }}\"\nprompt=$(echo \"$automessage\" | sed 's/ami#//')\ncurl -LO https://github.com/aandrew-me/tgpt/releases/download/v2.11.0/tgpt-linux-amd64\nmv ./tgpt-linux-amd64 ./tgpt\nchmod +x ./tgpt\nrm -rf /tmp/genimg.jpg\necho \"$prompt\"\nscript -q -c \"./tgpt -image --height=1080 --width=1920 --out=/tmp/genimg.jpg --model \\\"gtp-4\\\" --temperature \\\"0.7\\\" \\\"$prompt\\\"\" /dev/null"
},
"typeVersion": 1,
"continueOnFail": true
},
{
"id": "66f1dc6c-f36e-41ca-857d-bc1cd9609c28",
"name": "Enviar respuesta de texto Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
448,
0
],
"webhookId": "469e6cfb-80c6-450f-a1ce-c1bf6cf15f64",
"parameters": {
"text": "={{ $json.humanReadableText }}",
"chatId": "={{ $('Config').item.json.channel_id }}",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "FUXl519hpM0FsK8j",
"name": "Telegram account"
}
},
"typeVersion": 1.2
},
{
"id": "200f6f2b-5772-40a6-b6a5-4e7253cb6ebb",
"name": "Enviar respuesta de imagen Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
448,
528
],
"webhookId": "1d13a0d3-6224-43c0-802f-7cdabb49ef98",
"parameters": {
"chatId": "={{ $('Config').item.json.channel_id }}",
"operation": "sendPhoto",
"binaryData": true,
"additionalFields": {},
"binaryPropertyName": "=genimg"
},
"credentials": {
"telegramApi": {
"id": "FUXl519hpM0FsK8j",
"name": "Telegram account"
}
},
"typeVersion": 1.2
},
{
"id": "8595bf68-1061-472c-9b65-f783fbc0ca8f",
"name": "Leer imagen generada",
"type": "n8n-nodes-base.readWriteFile",
"position": [
224,
528
],
"parameters": {
"options": {
"fileName": "genimg.jpg",
"dataPropertyName": "genimg"
},
"fileSelector": "=/tmp/genimg.jpg"
},
"typeVersion": 1
},
{
"id": "a2c3e370-36e7-4d46-8f1d-639726c0439c",
"name": "Limpiar lista de actualizaciones",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
-896,
496
],
"parameters": {
"url": "=https://api.telegram.org/bot{{ $('Config').item.json.bot_token }}/getUpdates?offset={{ $json._current_offset }}",
"options": {
"timeout": 30000
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "allowed_updates",
"value": "[\"channel_post\"]"
},
{
"name": "timeout",
"value": "3"
},
{
"name": "offset",
"value": "={{ $json.last_offset }}"
},
{
"name": "limit",
"value": "15"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "f1188129-6ad5-4c29-8fa8-b03b7e440ebb",
"name": "Nota adhesiva",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1968,
-16
],
"parameters": {
"width": 492,
"height": 248,
"content": "## Telegram AI Channel Bot\n\nAutomated bot that monitors a Telegram channel and generates AI responses using TGPT.\n\nSupports text and image generation with customizable prompts.\n\nPolls every 10 seconds with duplicate prevention and time-window filtering."
},
"typeVersion": 1
},
{
"id": "ae0fe6cb-6c11-483c-9011-524f3c156e5e",
"name": "Nota adhesiva1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1456,
432
],
"parameters": {
"width": 320,
"height": 276,
"content": "## CONFIGURATION REQUIRED\n\n1. Replace your_telegram_token with your bot token from @BotFather\n2. Replace your_telegram_channel_id with your channel ID\n3. Bot must be admin in the target channel\n\nOffset is managed automatically to track processed messages."
},
"typeVersion": 1
},
{
"id": "67494d2b-6e50-405f-a4be-9f2b3860b759",
"name": "Nota adhesiva2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1120,
-64
],
"parameters": {
"width": 340,
"height": 292,
"content": "## Message Polling & Processing\n\nFetches new channel messages using Telegram API.\n\nProcesses offset to track read messages and applies 15-second time window to filter only recent messages.\n\nDuplicate prevention ensures each message is processed only once."
},
"typeVersion": 1
},
{
"id": "0a3b2b8c-294d-4277-8232-743fcc47c68a",
"name": "Nota adhesiva3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-448,
432
],
"parameters": {
"width": 348,
"height": 208,
"content": "## Filtering & Message Routing\n\nFilter: Validates messages are from the configured channel\n\nSwitch: Routes messages based on prefix:\n- am# for text generation\n- ami# for image generation"
},
"typeVersion": 1
},
{
"id": "75b560d9-9698-4e46-a09f-fed0f645223c",
"name": "Nota adhesiva4",
"type": "n8n-nodes-base.stickyNote",
"position": [
16,
-208
],
"parameters": {
"width": 556,
"height": 192,
"content": "## Text Generation Pipeline\n\nAutomatically installs TGPT and dependencies.\n\nRemoves am# prefix and generates text response using GPT-4 with temperature 0.3 for focused responses.\n\nCleans output before sending to channel."
},
"typeVersion": 1
},
{
"id": "06cad956-9231-4216-b675-0ca3e3d3d11e",
"name": "Nota adhesiva5",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
704
],
"parameters": {
"width": 556,
"height": 192,
"content": "## Image Generation Pipeline\n\nInstalls TGPT and generates image from prompt.\n\nRemoves ami# prefix and creates 1920x1080 image using temperature 0.7 for creative output.\n\nReads generated file from /tmp/ and sends to channel."
},
"typeVersion": 1
},
{
"id": "1b710ffd-80e0-4026-9420-b07dcac1c995",
"name": "Nota adhesiva6",
"type": "n8n-nodes-base.stickyNote",
"position": [
528,
192
],
"parameters": {
"width": 300,
"height": 308,
"content": "## TELEGRAM CREDENTIALS\n\nBoth Send nodes require Telegram API credentials.\n\n1. Create credential with bot token from @BotFather\n2. Apply same credential to both text and image nodes\n\nMessages are sent with HTML parse mode enabled."
},
"typeVersion": 1
},
{
"id": "81df46e8-10a8-4385-8121-8b40c00c26b7",
"name": "Nota adhesiva7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1968,
256
],
"parameters": {
"width": 340,
"height": 224,
"content": "## Usage Commands\n\nText: Send message starting with am# followed by prompt\nExample: am# Explain quantum physics\n\nImage: Send message starting with ami# followed by description\nExample: ami# Futuristic city at sunset"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "5405a7b9-8287-4ac9-bfef-fc1b83956ea6",
"connections": {
"c266df6f-c97f-439f-86ce-77aa37b08c6b": {
"main": [
[
{
"node": "66f1dc6c-f36e-41ca-857d-bc1cd9609c28",
"type": "main",
"index": 0
}
]
]
},
"b241edda-7c4c-439f-923f-866ad1f7784f": {
"main": [
[
{
"node": "f194dc72-3089-4461-9424-437ccab2d019",
"type": "main",
"index": 0
}
]
]
},
"1e9869bb-34b6-4446-acf7-7a7da358f842": {
"main": [
[
{
"node": "56f197e8-0e2e-43e6-ba3b-d87ddcf47673",
"type": "main",
"index": 0
}
]
]
},
"f194dc72-3089-4461-9424-437ccab2d019": {
"main": [
[
{
"node": "66e7c7ac-7859-4ec3-a5e4-5163ff118b4e",
"type": "main",
"index": 0
}
]
]
},
"66e7c7ac-7859-4ec3-a5e4-5163ff118b4e": {
"main": [
[
{
"node": "6ea51b7d-e8e5-4030-aedd-fa5dbec50a1f",
"type": "main",
"index": 0
}
],
[
{
"node": "8f038fc1-f7d7-45f0-8a54-76e423c3d05a",
"type": "main",
"index": 0
}
]
]
},
"b0b9e65b-b10b-4515-a0d1-7bddf468fe43": {
"main": [
[
{
"node": "1e9869bb-34b6-4446-acf7-7a7da358f842",
"type": "main",
"index": 0
}
]
]
},
"56f197e8-0e2e-43e6-ba3b-d87ddcf47673": {
"main": [
[
{
"node": "d6884a27-1999-4cea-9c83-427cdb507892",
"type": "main",
"index": 0
}
]
]
},
"6ea51b7d-e8e5-4030-aedd-fa5dbec50a1f": {
"main": [
[
{
"node": "c266df6f-c97f-439f-86ce-77aa37b08c6b",
"type": "main",
"index": 0
}
]
]
},
"d6884a27-1999-4cea-9c83-427cdb507892": {
"main": [
[
{
"node": "b241edda-7c4c-439f-923f-866ad1f7784f",
"type": "main",
"index": 0
},
{
"node": "a2c3e370-36e7-4d46-8f1d-639726c0439c",
"type": "main",
"index": 0
}
]
]
},
"8f038fc1-f7d7-45f0-8a54-76e423c3d05a": {
"main": [
[
{
"node": "8595bf68-1061-472c-9b65-f783fbc0ca8f",
"type": "main",
"index": 0
}
]
]
},
"8595bf68-1061-472c-9b65-f783fbc0ca8f": {
"main": [
[
{
"node": "200f6f2b-5772-40a6-b6a5-4e7253cb6ebb",
"type": "main",
"index": 0
}
]
]
}
}
}Preguntas frecuentes
¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Avanzado
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
Implementación de pruebas automatizadas de Kubernetes usando Robot Framework, ArgoCD y un ciclo de vida completo KinD
Pruebas automatizadas de Kubernetes usando Robot Framework, ArgoCD y un ciclo de vida completo de KinD
If
Set
Gitlab
+
If
Set
Gitlab
73 NodosVigh Sandor
DevOps
Resumen deportivo diario
Usar Google Gemini, Kokoro TTS y FFmpeg para convertir fuentes RSS a podcasts
If
Set
Code
+
If
Set
Code
34 NodosJonas
Creación de contenido
Compartir correo de demostración
Crear outreach de correo personalizado usando IA, un bot de Telegram y web scraping
If
Set
Xml
+
If
Set
Xml
58 NodosMichael A Putra
Nutrición de leads
Monitoreo y alertas de Kubernetes - Estado de implementación y Pods - Alertas de Telegram
Despliegue en Kubernetes y monitoreo de Pods con alertas por Telegram
If
Code
Telegram
+
If
Code
Telegram
14 NodosVigh Sandor
MailChimpautomatización
基于AIde餐厅通讯generador,integraciónMailchimpyTelegram审批
If
Set
Code
+
If
Set
Code
43 NodosFemi Ad
Inteligencia Artificial
Generar y publicar automáticamente videos en 1080p usando Veo-3, Perplexity y FFmpeg
Usar Veo-3, Perplexity y FFmpeg para generar y publicar automáticamente videos en 1080p
If
Set
Wait
+
If
Set
Wait
21 NodosSulieman Said
Creación de contenido
Información del flujo de trabajo
Nivel de dificultad
Avanzado
Número de nodos22
Categoría-
Tipos de nodos11
Descripción de la dificultad
Autor
Vigh Sandor
@vighsandorEnlaces externos
Ver en n8n.io →
Compartir este flujo de trabajo