· ·

Разработка Telegram-бота своими руками

16 минут чтения

Создание Telegram-бота обычно состоит из двух частей: зарегистрировать бота в Telegram и написать/запустить программу, которая будет отвечать на сообщения. Официально бот создаётся через @BotFather командой /newbot, после чего Telegram выдаёт токен доступа. Этот токен нужно хранить как пароль.

1. Создайте бота через BotFather

  1. Откройте Telegram.
  2. Найдите @BotFather.
  3. Отправьте команду:

/newbot

  1. Введите имя бота, например:

My Test Bot

  1. Введите username, который должен заканчиваться на bot, например:

my_test_123_bot

  1. BotFather выдаст токен вида:

1234567890:ABCDEF…

Никому его не показывайте — через него можно управлять вашим ботом.

2. Простейший бот на Python

Установите Python и библиотеку requests:

pip install requests

Создайте файл bot.py:

import requests

import time

TOKEN = «ВАШ_ТОКЕН_ОТ_BOTFATHER»

BASE_URL = f»https://api.telegram.org/bot{TOKEN}»

last_update_id = None

def send_message(chat_id, text):

    requests.post(

        f»{BASE_URL}/sendMessage»,

        json={

            «chat_id»: chat_id,

            «text»: text

        }

    )

while True:

    params = {}

    if last_update_id is not None:

        params[«offset»] = last_update_id + 1

    response = requests.get(f»{BASE_URL}/getUpdates», params=params)

    data = response.json()

    for update in data.get(«result», []):

        last_update_id = update[«update_id»]

        message = update.get(«message»)

        if not message:

            continue

        chat_id = message[«chat»][«id»]

        text = message.get(«text», «»)

        if text == «/start»:

            send_message(chat_id, «Привет! Я твой Telegram-бот.»)

        else:

            send_message(chat_id, f»Ты написал: {text}»)

    time.sleep(1)

Запустите:

python bot.py

Теперь откройте своего бота в Telegram и напишите /start.

3. Как бот получает сообщения

Есть два основных способа:

Long polling — бот сам постоянно спрашивает Telegram: “есть новые сообщения?” Это проще для новичка и подходит для локального запуска.

Webhook — Telegram сам отправляет новые события на ваш сервер. Это лучше для продакшена, но нужен сервер с HTTPS. В Bot API эти способы являются взаимоисключающими: используется либо getUpdates, либо webhook.

4. Что делать дальше

Через BotFather можно настроить описание, аватар, команды меню и другие параметры бота. Официальный FAQ Telegram уточняет, что для полноценной работы бот должен быть подключён к backend-серверу через Bot API.

Для простого учебного бота начните с варианта выше на getUpdates. Для постоянной работы потом можно разместить код на VPS, Render, Railway, PythonAnywhere или другом хостинге и перейти на webhook. Для webhook Telegram требует публичный сервер, HTTPS и поддерживаемый порт вроде 443, 80, 88 или 8443.

Ниже пример для Beget VPS на Ubuntu и Telegram-бота на Python через long polling. Это самый простой вариант: домен и HTTPS не нужны, потому что бот сам ходит к Telegram за обновлениями. У Telegram есть два взаимоисключающих способа получать апдейты — getUpdates и webhook, поэтому для простого VPS-старта лучше оставить getUpdates.

1. Создайте VPS в Beget

В панели Beget откройте раздел Облако / VPS/VDS, создайте сервер, выберите Ubuntu и дождитесь выдачи IP-адреса и данных доступа. В справке Beget указано, что VPS можно создать из панели, а доступ возможен по паролю или SSH-ключу.

2. Подключитесь к серверу по SSH

На компьютере откройте терминал:

ssh root@IP_СЕРВЕРА

Например:

ssh root@123.123.123.123

Beget отдельно описывает подключение по SSH и рекомендует использовать SSH-доступ для работы с сервером.

3. Обновите сервер и установите Python

На VPS выполните:

apt update && apt upgrade -y
apt install python3 python3-venv python3-pip 

4. Создайте папку для бота

mkdir -p /opt/telegram-bot
cd /opt/telegram-bot

5. Загрузите код на сервер

С компьютера можно загрузить файл так:

scp bot.py root@IP_СЕРВЕРА:/opt/telegram-bot/bot.py

Или можно создать файл прямо на сервере:

nano /opt/telegram-bot/bot.py

Пример bot.py:

import os
import time
import requests
TOKEN = os.environ["BOT_TOKEN"]
BASE_URL = f"https://api.telegram.org/bot{TOKEN}"
last_update_id = None
def send_message(chat_id, text):
    requests.post(
        f"{BASE_URL}/sendMessage",
        json={"chat_id": chat_id, "text": text},
        timeout=10
    )
while True:
    params = {}
    if last_update_id is not None:
        params["offset"] = last_update_id + 1
    try:
        response = requests.get(
            f"{BASE_URL}/getUpdates",
            params=params,
            timeout=30
        )
        data = response.json()
        for update in data.get("result", []):
            last_update_id = update["update_id"]
            message = update.get("message")
            if not message:
                continue
            chat_id = message["chat"]["id"]
            text = message.get("text", "")
            if text == "/start":
                send_message(chat_id, "Привет! Бот работает на VPS.")
            else:
                send_message(chat_id, f"Ты написал: {text}")
    except Exception as e:
        print("Error:", e)
    time.sleep(1)

6. Создайте виртуальное окружение и установите зависимости

cd /opt/telegram-bot
python3 -m venv venv
source venv/bin/activate
pip install requests

Проверьте запуск вручную:

BOT_TOKEN="ВАШ_ТОКЕН_ОТ_BOTFATHER" python bot.py

После этого напишите своему боту в Telegram /start.

Чтобы выйти из работающего процесса, нажмите:

Ctrl + C

7. Запустите бота как сервис

Создайте systemd-сервис:

nano /etc/systemd/system/telegram-bot.service

Вставьте:

[Unit]
Description=Telegram Bot
After=network.target
[Service]
WorkingDirectory=/opt/telegram-bot
ExecStart=/opt/telegram-bot/venv/bin/python /opt/telegram-bot/bot.py
Restart=always
RestartSec=5
Environment=BOT_TOKEN=ВАШ_ТОКЕН_ОТ_BOTFATHER
[Install]
WantedBy=multi-user.target

Сохраните файл, затем выполните:

systemctl daemon-reload
systemctl enable telegram-bot
systemctl start telegram-bot

Проверить статус:

systemctl status telegram-bot

Посмотреть логи:

journalctl -u telegram-bot -f

Перезапустить после изменений в коде:

systemctl restart telegram-bot

8. Настройте firewall

Для long polling боту не нужны входящие порты, кроме SSH. Можно включить UFW:

apt install ufw -y
ufw allow OpenSSH
ufw enable
ufw status

Beget рекомендует использовать брандмауэр для защиты VPS от нежелательного трафика, а в их инструкции по UFW отдельно разбирается настройка firewall на Ubuntu.

9. Важный момент про webhook

Если раньше вы включали webhook, long polling может не работать. Отключите webhook так:

curl"https://api.telegram.org/botВАШ_ТОКЕН/deleteWebhook"

После этого getUpdates снова сможет получать сообщения. Telegram указывает, что getUpdates и webhook — два взаимоисключающих способа получения обновлений.

Итог: для простого бота на Beget VPS достаточно Ubuntu + Python + systemd. Такой бот будет работать постоянно и автоматически запускаться после перезагрузки сервера.

Как настраивать сценарии и получать заявки в яндекс таблицы?

Обработка заняла 1m 6s

Да, можно. Но есть важный нюанс: в n8n нет такого же простого штатного узла “Yandex Sheets → Append row”, как для Google Sheets. У n8n есть готовый Google Sheets node с операциями append/update/delete/get, а для Яндекс Таблиц обычно приходится идти через HTTP Request и Яндекс.Диск/файл, либо хранить заявки в базе/n8n Data Table и выгружать их в XLSX/CSV. n8n официально поддерживает HTTP Request node для вызова любых REST API, а Яндекс.Диск REST API работает с файлами и папками через HTTP-запросы.

Лучшая схема для вашего случая

Я бы сделал так:

Telegram Bot
   ↓
n8n Telegram Trigger
   ↓
Сценарий вопросов
   ↓
n8n Data Table / Postgres
   ↓
XLSX или CSV-файл на Яндекс.Диске
   ↓
Открываете файл через Яндекс Таблицы

Почему так: Яндекс.Диск API официально умеет загружать и скачивать файлы, но это не то же самое, что удобный API “добавить строку в онлайн-таблицу”. В документации Яндекс.Диска перечислены операции с файлами: метаданные, загрузка, скачивание, создание папок, копирование, перемещение и удаление ресурсов.

Какие поля сделать в таблице заявок

Создайте таблицу с такими колонками:

Дата
Имя
Телефон
Услуга
Комментарий
Username Telegram
Chat ID
Статус
Источник

Например:

2026-07-13 15:42 | Иван | +79991234567 | Консультация | Хочу узнать цену | @ivan | 123456789 | новая | telegram

Как настроить сценарий в n8n

Минимальный workflow:

Telegram Trigger
   ↓
Code / Edit Fields
   ↓
Data Table: найти состояние пользователя
   ↓
Switch: какой сейчас шаг диалога
   ↓
Telegram: задать следующий вопрос
   ↓
Data Table: обновить состояние
   ↓
Когда заявка собрана — записать заявку
   ↓
Telegram: подтвердить пользователю
   ↓
Telegram/Email: уведомить админа

n8n имеет Telegram Trigger node, который принимает события от Telegram, и обычный Telegram node для отправки сообщений.
Для хранения состояния диалога можно использовать Data Table node — он предназначен для постоянного хранения данных между разными запусками workflow.

Пример сценария заявки

Пользователь пишет:

/start

Бот отвечает:

Здравствуйте! Оставим заявку. Как вас зовут?

Пользователь:

Иван

Бот:

Укажите номер телефона.

Пользователь:

+79991234567

Бот:

Какая услуга вас интересует?

Пользователь:

Настройка бота

Бот:

Напишите комментарий к заявке.

Пользователь:

Нужен бот для приёма заказов

Бот:

Спасибо! Заявка принята. Мы скоро свяжемся с вами.

После этого n8n сохраняет строку в таблицу заявок.

Как хранить состояние диалога

Нужно завести отдельную таблицу sessions, например в n8n Data Table:

chat_id
step
name
phone
service
comment
updated_at

Логика такая:

Если step пустой → спросить имя → step = waiting_name
Если step = waiting_name → сохранить имя → спросить телефон → step = waiting_phone
Если step = waiting_phone → сохранить телефон → спросить услугу → step = waiting_service
Если step = waiting_service → сохранить услугу → спросить комментарий → step = waiting_comment
Если step = waiting_comment → сохранить заявку → очистить session

Как записывать заявки в Яндекс Таблицы

Вариант 1 — самый надёжный: n8n Data Table + выгрузка XLSX на Яндекс.Диск

Workflow после получения заявки:

Data Table: Insert lead
   ↓
Data Table: Get all leads
   ↓
Convert to File: XLSX
   ↓
HTTP Request: загрузить leads.xlsx на Яндекс.Диск

В n8n есть Convert to File node, который умеет конвертировать данные в CSV, XLS, XLSX, ODS и другие форматы.
Дальше через HTTP Request node файл отправляется в Яндекс.Диск по REST API. Яндекс.Диск API как раз предназначен для управления файлами и загрузки данных в облако.

Плюс: просто и стабильно.
Минус: это не “добавить строку в открытую онлайн-таблицу”, а обновление файла leads.xlsx.

Вариант 2 — хранить заявки в Postgres, а таблицу обновлять файлом

Так даже лучше для продакшена:

Telegram → n8n → Postgres → XLSX/CSV на Яндекс.Диск

Postgres будет основной базой, а Яндекс Таблица — удобным файлом для просмотра менеджером.

Вариант 3 — если нужна именно живая таблица с append row

Тогда проще использовать Google Sheets, потому что в n8n для него есть готовый node с append/update/get/delete операциями.
Но если принципиально нужен Яндекс, я бы делал через XLSX/CSV на Яндекс.Диске.

Как это собрать в n8n пошагово

1. Telegram Trigger

Node: Telegram Trigger

Event:

Message

Он будет получать сообщения пользователя.

2. Edit Fields / Set

Сформируйте удобные поля:

chat_id = {{ $json.message.chat.id }}
text = {{ $json.message.text }}
username = {{ $json.message.from.username }}
first_name = {{ $json.message.from.first_name }}

3. Найти сессию пользователя

Node: Data Table

Таблица:

sessions

Ищем строку по:

chat_id = {{ $json.chat_id }}

4. Switch по шагу

Node: Switch

Проверяем поле:

step

Ветки:

empty
waiting_name
waiting_phone
waiting_service
waiting_comment

5. На каждом шаге сохраняем ответ и задаём следующий вопрос

Например, если step = waiting_name:

  1. Обновить session:
name = {{ $json.text }}
step = waiting_phone
  1. Отправить сообщение:
Укажите номер телефона.

6. На последнем шаге создать заявку

Когда step = waiting_comment, создаём lead:

date = текущая дата
name = session.name
phone = session.phone
service = session.service
comment = text
username = username
chat_id = chat_id
status = новая
source = telegram

После этого:

1. Insert row в Data Table leads
2. Очистить session пользователя
3. Отправить пользователю подтверждение
4. Отправить админу уведомление
5. Обновить XLSX/CSV на Яндекс.Диске

Уведомление админу

Добавьте Telegram node → Send Message.

Chat ID админа можно узнать через отдельный тестовый workflow или через сообщение от вашего аккаунта боту.

Текст админу:

Новая заявка:
Имя: {{ $json.name }}
Телефон: {{ $json.phone }}
Услуга: {{ $json.service }}
Комментарий: {{ $json.comment }}
Telegram: @{{ $json.username }}

Как я бы сделал MVP

Для первой версии:

1. Telegram Trigger
2. Сценарий: имя → телефон → услуга → комментарий
3. Сохранение в n8n Data Table leads
4. Уведомление админу в Telegram
5. Раз в 5 минут или после каждой заявки — генерация leads.xlsx
6. Загрузка leads.xlsx на Яндекс.Диск

Это будет рабочий и понятный вариант. А когда заявок станет больше, лучше перейти на схему:

n8n → Postgres → админка/таблица/CRM

+++++++++++++

Сколько стоит создать и содержать такой бот?

Обработка заняла 36s

Для бота Telegram → n8n → заявки в таблицу бюджет обычно делится на разовую настройку и ежемесячное содержание.

Коротко по цифрам

ВариантРазовоЕжемесячно
Делаете сами на VPS0 ₽, только ваше времяпримерно стоимость VPS + домен
Специалист настраивает MVP10 000–30 000 ₽500–2 000 ₽ за инфраструктуру + поддержка по желанию
Бот с CRM, AI, сложной логикой30 000–100 000+ ₽1 000–10 000+ ₽, зависит от сервисов
n8n Cloud вместо VPSнастройка отдельноот 20 €/мес при оплате за год

Telegram Bot API сам по себе бесплатный: Telegram пишет, что Bot API можно использовать бесплатно.

Минимальное содержание, если делать через Beget VPS

Для схемы n8n self-hosted + домен + Telegram bot вам нужны:

ЧтоПримерная стоимость
Telegram Bot API0 ₽
n8n Community self-hosted0 ₽ за сам софт
VPS Begetот 3,77 € / месяц по странице Beget
Домен .ru3 € регистрация, 5 € продление в год
SSL0 ₽, если через Caddy / Let’s Encrypt
Яндекс Таблицы / Дискчасто можно начать бесплатно, бизнес-тарифы отдельно
Поддержкаот 0 ₽, если сами; обычно 3 000–15 000 ₽/мес у специалиста

Beget на своей странице указывает VPS “from 3.77 €”, а домены .ru — 3 € за регистрацию и 5 € за продление.
n8n без лицензии работает как бесплатная Community edition, а платная n8n Cloud начинается от 20 €/мес при годовой оплате, с лимитом 2 500 workflow executions.

Реалистичный бюджет для вашего MVP

Для бота, который:

принимает заявку → спрашивает имя, телефон, услугу, комментарий → пишет в таблицу → уведомляет админа

я бы закладывал так:

Разовая настройка: 15 000–35 000 
Содержание: 500–1 500 ₽/мес
Поддержка, если нужна: 3 000–10 000 ₽/мес

На фриланс-биржах похожие работы сильно гуляют по цене: на FL.ru видны предложения вроде “бот для сбора заявок” от 2 990 ₽, развёртывание n8n на VPS около 5 187–10 010 ₽, поддержка n8n/Make около 8 450 ₽ за 30 дней, а более сложные AI/CRM-боты — 19 500–59 800 ₽ и выше.

Где могут появиться дополнительные расходы

Дополнительно могут стоить:

- интеграция с CRM;
- AI-ответы через OpenAI/другую модель;
- SMS или WhatsApp-уведомления;
- платная Яндекс 360 организация;
- резервные копии;
- мониторинг;
- доработка сценариев;
- админ-панель;
- оплата специалиста за исправления.

Если использовать Яндекс 360 для бизнеса, официальный тариф Basic указан от 3,99 $/мес за сотрудника.

Мой совет по старту

Для первой версии не переплачивайте. Оптимальный вариант:

Beget VPS + n8n Community + Telegram Trigger + Data Table/Postgres + выгрузка в Яндекс Таблицу

Бюджет:

Разово: 15 000–25 000 ₽, если делает специалист
Ежемесячно: около 500–1 500 ₽ без поддержки

А уже после проверки, что заявки реально идут, можно добавлять CRM, AI-ответы, статусы заявок, рассылки и админ-панель.

Как бот может заменить человека и насколько полноценно?

Да, такой бот может заменить часть работы сотрудника, но не всегда самого сотрудника целиком. В вашем случае — Telegram-бот на n8n, который принимает заявки, задаёт вопросы, пишет в таблицы/CRM и уведомляет менеджера — лучше всего заменяет рутинные операции первой линии.

Главная мысль: бот хорошо заменяет “приём, сортировку и передачу информации”, но хуже заменяет “убеждение, ответственность и нестандартное общение”.

Какие должности можно заменить или разгрузить

Должность / рольЧто бот может делатьНасколько может заменить
Администратор заявокПринимать заявки, спрашивать имя/телефон/услугу, записывать в таблицу, уведомлять менеджера70–95%
Оператор первой линииОтвечать на типовые вопросы, собирать данные, передавать сложные случаи человеку50–85%
Менеджер по входящим лидамКвалифицировать заявку, уточнять бюджет/сроки/услугу, ставить статус40–75%
Администратор записиЗаписывать на консультацию, напоминать, переносить запись60–90%
Поддержка 1-й линииОтвечать по базе знаний: цены, сроки, инструкции, статус обращения40–80%
HR-ассистентСобирать анкеты кандидатов, задавать первичные вопросы, фильтровать отклики30–60%
Ассистент руководителяСобирать входящие обращения, напоминать, раскладывать задачи20–50%
Продавец / менеджер по продажамМожет помогать, но не полноценно закрывать сложные сделки20–60%

Где бот может заменить сотрудника почти полностью

Почти полностью — если работа сотрудника состоит из повторяющегося сценария:

1. Получить сообщение
2. Задать 3–7 стандартных вопросов
3. Записать данные
4. Отправить уведомление
5. Передать заявку дальше

Например:

Администратор заявок
Бот спрашивает имя, телефон, услугу, город, комментарий, записывает всё в Яндекс Таблицу и отправляет вам уведомление в Telegram.

Оператор приёма заказов
Бот принимает заказ, уточняет параметры, считает примерную стоимость, передаёт менеджеру.

Регистратор на консультацию
Бот показывает свободные окна, записывает клиента, отправляет напоминание.

В таких случаях бот может закрывать до 80–95% рутины, а человеку остаются только нестандартные ситуации.

Где бот заменяет сотрудника частично

Менеджер по продажам — частично.
Бот может принять заявку, задать квалифицирующие вопросы, понять интерес клиента, отправить прайс, показать варианты. Но если нужно “дожимать”, торговаться, работать с возражениями и чувствовать настроение клиента — человек всё ещё сильнее.

Поддержка клиентов — частично.
Бот хорошо отвечает на типовые вопросы: “сколько стоит?”, “как оплатить?”, “какие сроки?”, “где мой заказ?”. Но если клиент злой, случай нестандартный или нужна компенсация — лучше переводить на человека.

HR / рекрутер — частично.
Бот может собрать резюме, опыт, зарплатные ожидания, график, контакты. Но финальное решение, интервью и оценка человека остаются за HR или руководителем.

Где бот плохо заменяет человека

Бот не стоит использовать как полноценную замену там, где нужны:

- сложные переговоры;
- высокая ответственность;
- юридические решения;
- медицинские рекомендации;
- финансовые советы;
- работа с конфликтами;
- индивидуальный подход;
- креативная стратегия;
- управление людьми.

Например, бот может помогать юристу, врачу, бухгалтеру или руководителю, но не должен полностью заменять их в ответственных решениях.

Самый реалистичный вариант для бизнеса

Лучше думать не так:

“Бот заменит сотрудника”

а так:

“Бот снимет с сотрудника 50–80% однотипной работы”

Например, раньше сотрудник вручную принимал 100 заявок в месяц:

- отвечал на первое сообщение;
- спрашивал имя и телефон;
- уточнял услугу;
- копировал данные в таблицу;
- писал менеджеру.

После внедрения бота он занимается только теми заявками, где клиент уже оставил данные и готов к разговору. Это не всегда позволяет уволить человека, но часто позволяет не нанимать дополнительного сотрудника при росте количества заявок.

Что можно автоматизировать в вашем боте

Для Telegram + n8n + Яндекс Таблицы можно сделать:

- приём заявок 24/7;
- анкетирование клиента;
- запись в Яндекс Таблицы;
- уведомление админа;
- присвоение статуса заявки;
- напоминания клиенту;
- повторное касание через 1–2 дня;
- распределение заявок между менеджерами;
- ответы на частые вопросы;
- фильтрацию нецелевых заявок;
- интеграцию с CRM;
- AI-ответы по базе знаний;
- передачу сложных диалогов человеку.

Пример: бот вместо администратора заявок

Сценарий:

Клиент: Хочу узнать цену
Бот: Здравствуйте! Как вас зовут?
Клиент: Иван
Бот: Укажите номер телефона
Клиент: +7...
Бот: Какая услуга интересует?
Клиент: Настройка рекламы
Бот: В каком городе/нише работаете?
Клиент: ...
Бот: Спасибо! Передали заявку специалисту.

В таблицу падает:

Дата | Имя | Телефон | Услуга | Комментарий | Telegram | Статус

Менеджеру приходит уведомление:

Новая заявка: Иван, +7..., настройка рекламы, статус: новая

Такой бот реально может заменить большую часть работы администратора, который просто принимает и передаёт заявки.

Насколько полноценно по уровням

Уровень 1 — простой бот

Собирает заявки → пишет в таблицу → уведомляет вас

Замена сотрудника: 30–60%.

Подходит, если нужно просто не терять заявки.

Уровень 2 — бот со сценариями

Задаёт разные вопросы в зависимости от услуги,
фильтрует клиентов,
ставит статусы,
напоминает,
передаёт менеджеру.

Замена сотрудника: 50–80%.

Это уже может серьёзно разгрузить администратора или оператора.

Уровень 3 — бот с AI и базой знаний

Отвечает на вопросы,
объясняет услуги,
ведёт диалог,
квалифицирует заявку,
подключает человека при необходимости.

Замена сотрудника: 60–90% для первой линии, но не для сложных продаж.

Мой вывод

Да, такой бот может заменить:

- администратора входящих заявок;
- оператора первой линии;
- часть работы менеджера по продажам;
- часть поддержки;
- часть HR-ассистента;
- часть личного ассистента.

Самая сильная зона — приём, сортировка, запись и передача заявок.
Самая слабая зона — сложные переговоры, эмоции, ответственность и нестандартные решения.

Для вашего варианта я бы ставил цель так: не “заменить человека на 100%”, а сделать бота, который принимает 100% входящих обращений и передаёт человеку только тёплые, заполненные заявки.