AutomationFlowsSlack & Telegram › Telegram Knowledge Bot Workflow

Telegram Knowledge Bot Workflow

Telegram Knowledge Bot Workflow. Uses httpRequest, googleSheets, telegram. Webhook trigger; 25 nodes.

Webhook trigger★★★★☆ complexity25 nodesHTTP RequestGoogle SheetsTelegram
Slack & Telegram Trigger: Webhook Nodes: 25 Complexity: ★★★★☆ Added:

This workflow follows the Google Sheets → 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 →

Download .json
{
  "name": "Telegram Knowledge Bot Workflow",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "telegram",
        "options": {
          "responseMode": "onReceived"
        }
      },
      "id": "webhook-trigger",
      "name": "Telegram Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.message.document }}",
              "operation": "isNotEmpty"
            }
          ]
        }
      },
      "id": "check-input-type",
      "name": "Check Input Type",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "url": "=https://api.telegram.org/bot{{ $env.TELEGRAM_BOT_TOKEN }}/getFile?file_id={{ $json.message.document.file_id }}",
        "options": {}
      },
      "id": "get-file-info",
      "name": "Get File Info",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 3,
      "position": [
        650,
        200
      ]
    },
    {
      "parameters": {
        "url": "=https://api.telegram.org/file/bot{{ $env.TELEGRAM_BOT_TOKEN }}/{{ $json.result.file_path }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "id": "download-file",
      "name": "Download File",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 3,
      "position": [
        850,
        200
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.message.text }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "id": "download-from-url",
      "name": "Download from URL",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 3,
      "position": [
        650,
        400
      ]
    },
    {
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ $binary.data.fileSize }}",
              "operation": "smallerEqual",
              "value2": 20971520
            }
          ],
          "string": [
            {
              "value1": "={{ $binary.data.mimeType }}",
              "operation": "regex",
              "value2": "(application/pdf|application/vnd.openxmlformats-officedocument.wordprocessingml.document|text/plain|text/markdown)"
            }
          ]
        }
      },
      "id": "validate-file",
      "name": "Validate File",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        1050,
        300
      ]
    },
    {
      "parameters": {
        "rules": {
          "rules": [
            {
              "operation": "equal",
              "value1": "={{ $binary.data.mimeType }}",
              "value2": "application/pdf"
            },
            {
              "operation": "equal",
              "value1": "={{ $binary.data.mimeType }}",
              "value2": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
            },
            {
              "operation": "equal",
              "value1": "={{ $binary.data.mimeType }}",
              "value2": "text/plain"
            },
            {
              "operation": "equal",
              "value1": "={{ $binary.data.mimeType }}",
              "value2": "text/markdown"
            }
          ]
        }
      },
      "id": "router-by-file-type",
      "name": "Router by File Type",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 1,
      "position": [
        1250,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "const pdfParse = require('pdf-parse');\nconst buffer = Buffer.from(items[0].binary.data.data, 'base64');\nconst data = await pdfParse(buffer);\nreturn [{ json: { text: data.text, charCount: data.text.length, method: 'pdfplumber' } }];"
      },
      "id": "pdf-parser",
      "name": "PDF Parser",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        1450,
        100
      ]
    },
    {
      "parameters": {
        "functionCode": "const mammoth = require('mammoth');\nconst buffer = Buffer.from(items[0].binary.data.data, 'base64');\nconst result = await mammoth.extractRawText({ buffer });\nreturn [{ json: { text: result.value, charCount: result.value.length, method: 'python_docx' } }];"
      },
      "id": "docx-parser",
      "name": "DOCX Parser",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        1450,
        250
      ]
    },
    {
      "parameters": {
        "functionCode": "const buffer = Buffer.from(items[0].binary.data.data, 'base64');\nconst text = buffer.toString('utf-8');\nreturn [{ json: { text: text, charCount: text.length, method: 'plain_read' } }];"
      },
      "id": "txt-parser",
      "name": "TXT Parser",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        1450,
        400
      ]
    },
    {
      "parameters": {
        "functionCode": "const buffer = Buffer.from(items[0].binary.data.data, 'base64');\nconst text = buffer.toString('utf-8');\nreturn [{ json: { text: text, charCount: text.length, method: 'plain_read' } }];"
      },
      "id": "md-parser",
      "name": "MD Parser",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        1450,
        550
      ]
    },
    {
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ $json.charCount }}",
              "operation": "smallerEqual",
              "value2": 50
            }
          ]
        }
      },
      "id": "check-empty-text",
      "name": "Check Empty Text",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        1650,
        100
      ]
    },
    {
      "parameters": {
        "functionCode": "// OCR processing using Tesseract\n// This would call external OCR service or local Tesseract\nconst ocrResult = { text: 'OCR extracted text', charCount: 20, method: 'tesseract_ocr', usedOcr: true };\nreturn [{ json: ocrResult }];"
      },
      "id": "ocr-engine",
      "name": "OCR Engine",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        1850,
        50
      ]
    },
    {
      "parameters": {},
      "id": "merge-text",
      "name": "Merge Extracted Text",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2,
      "position": [
        2050,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "const text = items[0].json.text;\n// Simple language detection based on character analysis\nconst cyrillicPattern = /[\\u0400-\\u04FF]/;\nconst language = cyrillicPattern.test(text) ? 'ru' : 'en';\nreturn [{ json: { ...items[0].json, language } }];"
      },
      "id": "detect-language",
      "name": "Language Detection",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        2250,
        300
      ]
    },
    {
      "parameters": {
        "url": "https://api.openai.com/v1/chat/completions",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {},
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "={{ $env.OPENAI_MODEL || 'gpt-4' }}"
            },
            {
              "name": "messages",
              "value": "=[{\"role\": \"system\", \"content\": \"You are a document summarizer. Create a summary of 3-7 sentences in the same language as the input text.\"}, {\"role\": \"user\", \"content\": \"{{ $json.text.substring(0, 10000) }}\"}]"
            },
            {
              "name": "max_tokens",
              "value": "500"
            },
            {
              "name": "temperature",
              "value": "0.3"
            }
          ]
        }
      },
      "id": "ai-summarizer",
      "name": "AI Summarizer",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 3,
      "position": [
        2450,
        300
      ],
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 2000
    },
    {
      "parameters": {
        "functionCode": "const text = items[0].json.text;\n// YAKE-style keyword extraction\nconst words = text.toLowerCase().split(/\\s+/);\nconst wordFreq = {};\nwords.forEach(w => {\n  if (w.length > 3) wordFreq[w] = (wordFreq[w] || 0) + 1;\n});\nconst sorted = Object.entries(wordFreq).sort((a, b) => b[1] - a[1]);\nconst keywords = sorted.slice(0, 10).map(([word]) => word);\nreturn [{ json: { keywords, formatted: keywords.join(', '), count: keywords.length, method: 'yake' } }];"
      },
      "id": "keyword-extractor",
      "name": "Keyword Extractor",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        2650,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "const now = new Date().toISOString();\nconst row = {\n  timestamp: now,\n  uploader_id: $('Telegram Webhook').item.json.message.from.id.toString(),\n  uploader_username: $('Telegram Webhook').item.json.message.from.username || '',\n  file_name: $('Telegram Webhook').item.json.message.document?.file_name || 'url_download',\n  file_type: items[0].json.method?.includes('pdf') ? 'pdf' : 'txt',\n  file_size: $('Telegram Webhook').item.json.message.document?.file_size || 0,\n  char_count: items[0].json.charCount || 0,\n  language: items[0].json.language || 'unknown',\n  summary: $('AI Summarizer').item.json.choices?.[0]?.message?.content || '',\n  keywords: items[0].json.formatted || '',\n  status: 'completed',\n  error_message: '',\n  ai_model_used: 'openai_gpt4',\n  extraction_method: items[0].json.method || 'unknown',\n  ocr_used: items[0].json.usedOcr || false,\n  processing_time: 0\n};\nreturn [{ json: row }];"
      },
      "id": "prepare-sheets-row",
      "name": "Prepare Google Sheets Row",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        2850,
        300
      ]
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $env.GOOGLE_SHEET_ID }}"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $env.GOOGLE_SHEET_NAME || 'Documents' }}"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "timestamp": "={{ $json.timestamp }}",
            "uploader_id": "={{ $json.uploader_id }}",
            "uploader_username": "={{ $json.uploader_username }}",
            "file_name": "={{ $json.file_name }}",
            "file_type": "={{ $json.file_type }}",
            "file_size": "={{ $json.file_size }}",
            "char_count": "={{ $json.char_count }}",
            "language": "={{ $json.language }}",
            "summary": "={{ $json.summary }}",
            "keywords": "={{ $json.keywords }}",
            "status": "={{ $json.status }}",
            "error_message": "={{ $json.error_message }}",
            "ai_model_used": "={{ $json.ai_model_used }}",
            "extraction_method": "={{ $json.extraction_method }}",
            "ocr_used": "={{ $json.ocr_used }}",
            "processing_time": "={{ $json.processing_time }}"
          }
        },
        "options": {}
      },
      "id": "google-sheets-write",
      "name": "Google Sheets Write",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4,
      "position": [
        3050,
        300
      ],
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 2000
    },
    {
      "parameters": {
        "chatId": "={{ $('Telegram Webhook').item.json.message.chat.id }}",
        "text": "=\u2705 \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d!\n\n<b>\u0421\u0443\u043c\u043c\u0430\u0440\u0438\u0437\u0430\u0446\u0438\u044f:</b>\n{{ $('AI Summarizer').item.json.choices[0].message.content }}\n\n<b>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430:</b>\n{{ $('Keyword Extractor').item.json.formatted }}",
        "additionalFields": {
          "parse_mode": "HTML"
        }
      },
      "id": "telegram-notify-success",
      "name": "Telegram Notify Success",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1,
      "position": [
        3250,
        300
      ]
    },
    {
      "parameters": {
        "chatId": "={{ $('Telegram Webhook').item.json.message.chat.id }}",
        "text": "\u274c \u0424\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.\n\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b: PDF, DOCX, TXT, MD",
        "additionalFields": {}
      },
      "id": "error-validation",
      "name": "Error: Validation",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1,
      "position": [
        1250,
        500
      ]
    },
    {
      "parameters": {
        "chatId": "={{ $('Telegram Webhook').item.json.message.chat.id }}",
        "text": "\u274c \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0444\u0430\u0439\u043b \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d",
        "additionalFields": {}
      },
      "id": "error-parse",
      "name": "Error: Parse",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1,
      "position": [
        1650,
        500
      ]
    },
    {
      "parameters": {
        "chatId": "={{ $('Telegram Webhook').item.json.message.chat.id }}",
        "text": "\u274c \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0437\u0436\u0435",
        "additionalFields": {}
      },
      "id": "error-api",
      "name": "Error: API",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1,
      "position": [
        2650,
        500
      ]
    },
    {
      "parameters": {
        "chatId": "={{ $('Telegram Webhook').item.json.message.chat.id }}",
        "text": "\u274c \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0437\u0436\u0435",
        "additionalFields": {}
      },
      "id": "error-storage",
      "name": "Error: Storage",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1,
      "position": [
        3050,
        500
      ]
    },
    {
      "parameters": {
        "functionCode": "const logEntry = {\n  timestamp: new Date().toISOString(),\n  event_type: items[0].json.event_type || 'processing',\n  details: items[0].json,\n  error: items[0].json.error || null\n};\nconsole.log(JSON.stringify(logEntry));\nreturn items;"
      },
      "id": "logger",
      "name": "Logger",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        3450,
        300
      ]
    }
  ],
  "connections": {
    "Telegram Webhook": {
      "main": [
        [
          {
            "node": "Check Input Type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Input Type": {
      "main": [
        [
          {
            "node": "Get File Info",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Download from URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get File Info": {
      "main": [
        [
          {
            "node": "Download File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download File": {
      "main": [
        [
          {
            "node": "Validate File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download from URL": {
      "main": [
        [
          {
            "node": "Validate File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate File": {
      "main": [
        [
          {
            "node": "Router by File Type",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Error: Validation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Router by File Type": {
      "main": [
        [
          {
            "node": "PDF Parser",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "DOCX Parser",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "TXT Parser",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "MD Parser",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PDF Parser": {
      "main": [
        [
          {
            "node": "Check Empty Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Empty Text": {
      "main": [
        [
          {
            "node": "OCR Engine",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Merge Extracted Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OCR Engine": {
      "main": [
        [
          {
            "node": "Merge Extracted Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DOCX Parser": {
      "main": [
        [
          {
            "node": "Merge Extracted Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "TXT Parser": {
      "main": [
        [
          {
            "node": "Merge Extracted Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MD Parser": {
      "main": [
        [
          {
            "node": "Merge Extracted Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Extracted Text": {
      "main": [
        [
          {
            "node": "Language Detection",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Language Detection": {
      "main": [
        [
          {
            "node": "AI Summarizer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Summarizer": {
      "main": [
        [
          {
            "node": "Keyword Extractor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Keyword Extractor": {
      "main": [
        [
          {
            "node": "Prepare Google Sheets Row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Google Sheets Row": {
      "main": [
        [
          {
            "node": "Google Sheets Write",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets Write": {
      "main": [
        [
          {
            "node": "Telegram Notify Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Notify Success": {
      "main": [
        [
          {
            "node": "Logger",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Error: Validation": {
      "main": [
        [
          {
            "node": "Logger",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Error: Parse": {
      "main": [
        [
          {
            "node": "Logger",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Error: API": {
      "main": [
        [
          {
            "node": "Logger",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Error: Storage": {
      "main": [
        [
          {
            "node": "Logger",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": ""
  },
  "versionId": "1.0.0",
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "id": "telegram-knowledge-bot-workflow",
  "tags": [
    {
      "id": "telegram",
      "name": "telegram"
    },
    {
      "id": "ai",
      "name": "ai"
    },
    {
      "id": "knowledge-base",
      "name": "knowledge-base"
    }
  ],
  "staticData": null,
  "triggerCount": 0
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Telegram Knowledge Bot Workflow. Uses httpRequest, googleSheets, telegram. Webhook trigger; 25 nodes.

Source: https://github.com/meloch287/Telegram-Knowledge-Bot/blob/5421c8554ca570a87547856c81fc0ba5f1cc67c4/workflows/n8n_workflow.json — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

WF_UNIFIED_LEGAL_AUTOMATION. Uses googleSheets, httpRequest, telegram, telegramTrigger. Webhook trigger; 53 nodes.

Google Sheets, HTTP Request, Telegram +1
Slack & Telegram

01_order_processing_tilda. Uses stickyNote, googleSheets, httpRequest, telegram. Webhook trigger; 25 nodes.

Google Sheets, HTTP Request, Telegram
Slack & Telegram

B — Монтаж готов: тексты и подтверждение (Челлендж 200 дней). Uses httpRequest, googleSheets, googleDrive, telegram. Webhook trigger; 24 nodes.

HTTP Request, Google Sheets, Google Drive +1
Slack & Telegram

Chat with the news. Uses telegram, httpRequest, emailSend, googleSheets. Webhook trigger; 18 nodes.

Telegram, HTTP Request, Email Send +1
Slack & Telegram

WF3 — Compat Analytics (Receive + Weekly Report). Uses googleSheets, httpRequest, telegram. Webhook trigger; 9 nodes.

Google Sheets, HTTP Request, Telegram