
Telegram-боты уже нашли широкое применение в самых разных сферах нашей жизни. Они эффективно автоматизируют рутину, упрощают коммуникацию и решают широкий спектр задач — от учёта финансов до клиентской поддержки. Популярность Telegram-ботов растет, потому что их просто использовать, можно гибко настраивать и интегрировать с другими сервисами.
В статье расскажем, как создать простого Telegram-бота на Python, который будет сообщать нужные данные о сервере. Вы познакомитесь с разработкой тг-ботов с нуля и узнаете, как разместить их на сервере, чтобы они работали круглосуточно.
Что такое Telegram-бот и зачем он нужен
Telegram-бот — это небольшая программа, которая работает внутри мессенджера Telegram и взаимодействует с пользователями через чат в формате «Вопрос — Ответ». Вы пишете сообщение в чат с ботом, бот его обрабатывает и сразу же делает то, что вы попросили.
Telegram-бота можно создать для выполнения различных задач: от простых ответов по команде до более сложных операций, таких как проверка погоды, управление сервером или даже продажа товаров.
Подготовка к созданию бота
Перед созданием бота необходимо продумать его концепцию: определить ключевые задачи и выбрать технологический стек (язык программирования и сервер для размещения). Это сделает процесс разработки более эффективным.
В нашем случае мы создаём Telegram-бота для мониторинга состояния сервера. Бот будет размещаться на этом же сервере. В качестве языка программирования выбран Python благодаря его популярности и обширным библиотекам для работы с Telegram.
Что будет уметь наш бот
По запросу пользователя бот будет предоставлять следующие данные о сервере:
- количество активных пользователей;
- загрузку процессора (CPU);
- использование оперативной памяти (RAM);
- нагрузку на дисковую подсистему (I/O);
- скорость интернет-соединения;
- аптайм (время непрерывной работы сервера).
Где будет находиться
Бота разместим на виртуальном сервере, так он будет доступен в любое время — простое решение для удаленного мониторинга. Если кратко, то чтобы реализовать задуманное, нам предстоит выполнить несколько шагов: сначала, по правилам Телеграма, мы должны зарегистрировать бота и получить API-токен, после — написать код на Python с нужной функциональностью, запустить нашего бота в Telegram и протестировать код, а затем разместить Telegram-бот на нашем сервере. Далее разберем каждый шаг подробнее.
Регистрация бота через BotFather
Перед тем, как писать код, нам нужно получить уникальный API-токен нашего бота. Это делается через официального бота Telegram — BotFather.
- В списке чатов нужно найти BotFather и кликнуть Start.

- Далее выберите в списке команду /newbot и отправьте её. Затем, следуя инструкциям, укажите название бота и уникальное имя пользователя, которое должно заканчиваться на “bot”.

Для справки:
- Имя, или название (name) — это то, что видят другие пользователи в списке контактов и чатов, и оно может быть не уникальным.
- Имя пользователя (username), или ник — уникальный идентификатор в формате @username, который используется для поиска и упоминания в сообщениях.
В нашем случае имя бота — bot_for_firstvds. Именно так он будет отображаться в списке чатов у пользователей этого бота, а ник — @test_firstvds_bot предназначен для поиска и упоминаний.
- В ответ BotFather пришлёт API-токен. Этот ключ будет нужен для подключения вашей программы к боту.

Наш бот зарегистрирован, и мы получили его API. Можем двигаться дальше. Если хотите разобраться подробнее, в меню BotFather доступен мануал по Bot API.
Написание кода
Основной этап в создании Telegram-бота — это написание кода. Код — это набор инструкций, который объясняет боту, как реагировать на команды и сообщения пользователей, какие данные собирать и как отвечать. Проще говоря, это «мозг» вашего бота, определяющий всю его логику и набор опций.
Как мы уже упоминали ранее, для реализации бота был выбран язык программирования Python — из-за простоты, популярности и широкого выбора готовых библиотек. Если кратко, то на этом этапе мы с помощью кода свяжем Telegram-бот с данными о нашем сервере.
Если вы никогда не программировали на Python, не беспокойтесь. Чтобы повторить этот шаг, просто скопируйте приведенный ниже код в стандартный блокнот на вашем компьютере и сохраняйте файлы с указанными именами, включая расширения.
Для тех, кто уже немного знаком с программированием на Python, этот шаг не вызовет у вас трудностей. Открываем IDE, создаём новый файл.py, меняем название, копируем код, устанавливаем с помощью pip нужные библиотеки.
Если вы никогда не программировали:
- Скопируйте код, указанный ниже.
- Вставьте его в Блокнот (Notepad) на вашем компьютере.
- Сохраните файл с точным именем имя_файла.py (обязательно указав расширение .py).
Если вы уже знакомы с Python:
- Создайте новый файл .py в вашей IDE (например, PyCharm или VSCode).
- Скопируйте в него код ниже.
- Переименуйте файл.
- Установите необходимые библиотеки с помощью pip.
Теперь, чтобы не запутаться в одной большой инструкции, разложим её по разным файлам, как по полочкам. Условно весь проект бота делим на 4 файла:
- main.py — основной файл с запуском бота. Здесь будет реализована вся логика и интерфейс нашего Telegram-бота.
- utiles.py — с функциями для получения информации о сервере. Код, который умеет общаться с сервером и возвращать нужные данные.
- config.py — файл для хранения нашего токена. Здесь будет храниться ключ API, который выдал нам BotFather. Без него наш бот не сможет подключиться к Telegram.
- requirements.txt — список используемых библиотек. В этом файле мы напишем все дополнительные библиотеки, которые нужны для работы нашего бота. Это нужно, чтобы потом легко установить их всех одной командой.
Заполняем файл utiles.py: получение информации о сервере
Прежде всего, нам нужно написать код, который позволит получать информацию о нашем сервере. В IDE создадим файл с названием utiles.py и напишем несколько функций, которые и будут собирать необходимую нам информацию. А именно:
- количество активных пользователей;
- загрузку процессора (CPU);
- использование оперативной памяти (RAM);
- нагрузку на дисковую подсистему (I/O);
- скорость интернет-соединения;
- аптайм (время непрерывной работы сервера).
Для этого используем популярные библиотеки: psutil, os, speedtest.
В результате файл utiles.py будет выглядеть следующим образом:
import psutil
import datetime
import os
import speedtest
#аптайм
def get_uptime():
boot_time_timestamp = psutil.boot_time()
boot_time = datetime.datetime.fromtimestamp(boot_time_timestamp)
current_time = datetime.datetime.now()
uptime = current_time - boot_time
hours, remainder = divmod(int(uptime.total_seconds()), 3600)
minutes, seconds = divmod(remainder, 60)
return hours, minutes
#CPU
def get_cpu_load():
return psutil.cpu_percent(interval=1)
#RAM
def get_ram_load():
ram_info = psutil.virtual_memory()
return ram_info.percent
#Users
def get_active_users():
active_users = os.popen('who').readlines()
return len(active_users)
#Disk I/O
def get_disk_io():
disk_io = psutil.disk_io_counters(perdisk=False)
read_gb = round(disk_io.read_bytes / (1024 ** 3), 2) # переводим в ГБ
write_gb = round(disk_io.write_bytes / (1024 ** 3), 2) # переводим в ГБ
return read_gb, write_gb
# internet speed
def test_speed():
try:
st = speedtest.Speedtest()
st.get_best_server()
download_speed = round(st.download() / 1_000_000, 2) # преобразуем в Мбит/с и округляем
upload_speed = round(st.upload() / 1_000_000, 2) # преобразуем в Мбит/с и округляем
ping = round(st.results.ping, 2) # округляем
# проверим что числовое значение # Иногда speedtest возвращает ошибку
if (isinstance(download_speed, (int, float)) and
isinstance(upload_speed, (int, float)) and
isinstance(ping, (int, float)) and
download_speed > 0 and
upload_speed > 0 and
ping > 0):
return download_speed, upload_speed, ping
else:
return 0, 0, 0
except speedtest.ConfigRetrievalError:
return 0, 0, 0
except Exception:
return 0, 0, 0Заполняем файл config.py: хранение токена
Создадим файл config.py для хранения нашего API-токена. Создание отдельного файла с важными переменными — это удобное и безопасное решение. Важные параметры будут находиться отдельно от другого кода, их можно быстро найти и заменить в случае необходимости, а также труднее удалить случайно.
Добавим в файл переменную, которая будет ссылаться на наш API.
Теперь, когда в процессе работы с кодом нам потребуется этот токен, будет достаточно просто обратиться к переменной botkey по имени. Не нужно будет каждый раз вставлять длинный токен в код — мы используем короткое и понятное имя:
botkey = 'Тут Ваш API'Заполняем файл main.py: пишем логику и интерфейс бота
Все необходимые файлы с функциями и переменными написаны, перейдём теперь к написанию самого бота. Для этого создадим ещё один файл в IDE и оставим название по умолчанию main.py. Импортируем необходимые функции из файла utiles.py и переменную с нашим API-токеном из config.py.
Есть несколько библиотек на Python для создания Telegram-ботов, воспользуемся уже знакомой библиотекой telebot, она же pyTelegramBotAPI.
Для тех, кто желает более подробно ознакомиться с возможностями библиотеки, на странице GitHub telebot имеются наглядные примеры кода.
Чтобы понять принцип работы бота, разберем его ключевые элементы: от запуска и настройки интерфейса до обработки команд и формирования итогового отчёта о состоянии сервера. Далее каждый из этих элементов рассмотрим отдельно.
Файл main.py будет иметь следующее содержимое.
#!/usr/bin/env python3.8
import telebot
from telebot import types
from config import botkey
from utiles import get_uptime, test_speed, get_disk_io, get_active_users, get_ram_load, get_cpu_load
def main():
bot = telebot.TeleBot(botkey)
@bot.message_handler(commands=['start'])
def handle_start(message):
# Создаем кнопку-клавиатуру
markup = types.InlineKeyboardMarkup()
button_yes = types.InlineKeyboardButton("Да", callback_data="check_server")
markup.add(button_yes)
bot.send_message(message.chat.id, 'Привет! Я бот твоего сервера. Проверить состояние?', reply_markup=markup)
@bot.callback_query_handler(func=lambda call: call.data == "check_server")
def handle_server_info(call):
uptime = get_uptime()
internet = test_speed()
disk = get_disk_io()
users = get_active_users()
ram = get_ram_load()
cpu = get_cpu_load()
server_info = (
f"Аптайм сервера: {uptime[0]} час. {uptime[1]} мин. \n"
f"Количество активных пользователей: {users}\n"
f"Загрузка CPU: {cpu}%\n"
f"Загрузка RAM: {ram}%\n"
f"Интернет: Загрузка {internet[0]} Мб/c, Отправка {internet[1]} Мб/c, PING {internet[2]} ms\n"
f"Активность диска: Чтение {disk[0]} ГБ, Запись {disk[1]} ГБ."
)
bot.send_message(call.message.chat.id, server_info)
bot.polling()
if __name__ == "__main__":
main()Теперь давайте внимательно проанализируем код выше и разберёмся, как устроена логика работы бота. Весь процесс можно условно разделить на три последовательных этапа: обработка команды /start, реакция на нажатие кнопки и, наконец, формирование и отправка ответа. Каждый следующий шаг возможен только после выполнения предыдущего.
1. Обработчик команды /start
@bot.message_handler(commands=['start'])
def handle_start(message):Рассмотрим, как он работает:
- Декоратор @bot.message_handler(commands=['start']) указывает, что функция handle_start будет вызываться, когда пользователь отправляет команду
/start.Это происходит при переходе в Telegram-бот и нажатии кнопки «Старт». - В функции handle_start происходит создание нового объекта инлайн-кнопки, которая будет отображаться в сообщении бота. Кнопка является встроенной (inline) — она появляется прямо под сообщением, а не в виде отдельного меню.
- Создаётся сама кнопка с двумя параметрами: в первый передаем текст — подпись кнопки в нашем случае «Да», второй параметр отвечает за функциональность кнопки, то есть какие данные получит пользователь при нажатии кнопки.
- Метод send_message отправляет сообщение пользователю с указанным текстом, в нашем случае «Привет! Я бот твоего сервера. Проверить состояние?» и параметр reply_markup=markup добавляет созданную кнопку к сообщению.
2. Обработчик нажатия на инлайн-кнопку
@bot.callback_query_handler(func=lambda call: call.data == "check_server")
def handle_server_info(call):Декоратор @bot.callback_query_handler указывает, что функция handle_server_info будет вызываться, когда пользователь нажимает на инлайн-кнопку с callback_data, равным "check_server". Другими словами, это работает как фильтр: он гарантирует, что функция сработает, только если нажата кнопка с конкретной меткой "check_server". Внутри функции handle_server_info вызываются функции, написанные ранее для получения информации о нашем сервере.
3. Формирование и отправка информации о сервере
bot.send_message(call.message.chat.id, server_info) Метод send_message формирует строку с информацией о сервере и отправляет сообщение в чат, откуда пришел запрос.
Заполняем файл requirements.txt: сохраняем библиотеки
Файл с необходимыми библиотеками будет называться requirements.txt и иметь следующее содержимое:
certifi==2025.7.14
charset-normalizer==3.4.2
idna==3.10
psutil==7.0.0
pyTelegramBotAPI==4.23.0
requests==2.32.4
speedtest-cli==2.1.3
urllib3==2.2.3Команда для тех, кто повторяет в IDE:
pip freeze > requirements.txt Команда создаст файл requirements.txt с используемыми библиотеками, которые нам пригодятся для следующих шагов.
Код python телеграм-бота готов, но остался важный момент — тестирование.
Тестирование
Настало время проверить работу нашего telegram-бота. В поиске чатов воспользуемся поиском по нику @username, а именно @test_firstvds_bot с названием bot_for_firstvds, указанными при регистрации бота.

Находим по нику нашего бота и нажимаем кнопку Старт:

Бот запустился. Видим приветственное сообщение. Проверим, как работает. Нажимаем кнопку Да.

В результате выводится информация с показателями нашего сервера.

Можем двигаться дальше.
Telegram-бот работает, но только локально, пока активен терминал или IDE. После их закрытия процесс завершается, и бот перестаёт отвечать. Для круглосуточной работы его необходимо развернуть на сервере.
Как развернуть Telegram-бота на сервере
Существует несколько подходов к развертыванию Telegram-бота на сервере: можно создать отдельный процесс, службу, Docker-контейнер и т. д. Каждый из способов имеет преимущества и недостатки.
Создание службы
Преимущества: автоматически запускается и перезапускается, логи доступны через journalctl, можно запускать от имени другого пользователя.
Недостатки: подойдет более опытным пользователям. Потребуется создать файл службы.
Создание процесса
Преимущества: простая настройка и использование.
Недостатки: запускать, перезапускать и отслеживать логи придется вручную, запуск от текущего пользователя.
Docker-контейнер
Преимущества: можно настроить автозапуск и перезапуск, легко отслеживать и читать логи.
Недостатки: потребует создания Dockerfile — подойдет тем, кто уже немного знаком с Docker, а также в нашем случае потребует более глубокой настройки Dockerfile.
Docker-контейнер — это изолированная среда, а наш бот должен получать информацию о хосте и выводить информацию о сервере. Для тех, кто желает ознакомиться поближе с Docker, информация доступна в нашей базе знаний.
Мы рассмотрим первые два варианта — процесс и службу. Разместим бота на виртуальном сервере под управлением Ubuntu 20.04.
Подготовка сервера. Установка необходимых компонентов
Первым делом при установке новых дополнений на Ubuntu рекомендуется выполнить две команды:
sudo apt update && sudo apt upgrade -yПервая команда установит необходимые утилиты, а вторая обновит их до последней версии.
Далее проверим наличие python3 и пакетного менеджера pip на нашем сервере:
python3 --version
python3 -m pip --version
Если всё установлено, двигаемся дальше. Если не установлено — нет ответа на команду, то устанавливаем:
sudo apt install python3 python3-pip -yСоздадим на сервере папку, где будут находиться файлы нашего бота:
mkdir firstvds_bot
Теперь нам необходимо перенести файлы бота на сервер. В нашем примере на исходном устройстве установлена ОС Windows, поэтому будем использовать программу FileZilla. Вводим IP-адрес сервера и пароль, порт по умолчанию — 22. Подключаемся: с левой стороны будут ваши папки и файлы, а с правой — папки и файлы сервера. Перемещаем четыре файла с нашего компьютера в созданную на сервере папку для бота.

Также вы можете воспользоваться альтернативной программой, например WinSCP. Либо использовать команду scp для копирования на сервер с помощью ssh. Для этого откройте командную строку или PowerShell на вашем компьютере и проверьте наличие OpenSSH:
sshДетальнее о подключении по ssh можете прочитать здесь.
В Windows 10 и более поздних версиях OpenSSH должен быть установлен по умолчанию. В ином случае можно установить самостоятельно. Для этого перейдите в Настройки > Приложения > Дополнительные функции > Добавить функцию и выберите OpenSSH Client.
Далее в терминале введите команду:
scp C:\Ваша папка\main.py C:\Ваша папка\utiles.py C:\Ваша папка\config.py C:\Ваша папка\requirements.txt Ваш логин@Ваш ip адрес сервера:/root/firstvds_bot/Если вы используете IOS, то команда scp также доступна в терминале.
Затем перейдём обратно на сервер и убедимся, что все файлы загрузились:
cd firstvds_bot
ls
Находясь в папке, создадим и активируем виртуальное окружение. С его помощью мы получим изолированный Python для бота со своими библиотеками, не затрагивая другие проекты и системные библиотеки. Об успешности команды нас проинформирует суффикс в командной строке (.venv). Также об установке виртуального окружения на Python можно почитать в нашей базе знаний.
python3 -m venv .venv
source .venv/bin/activate
Если произошла ошибка и venv не установлен:
sudo apt install python3-venv -yДалее, также находясь в папке проекта, установим все необходимые зависимости:
pip install -r requirements.txt
Запуск telegram-бота как процесса
Нам необходимо, чтобы наш процесс с ботом был отдельным, не занимал терминал и работал в фоновом режиме. Для этого воспользуемся встроенной командой nohup. Команда nohup предотвращает остановку процесса при выходе из терминала.
Перейдем в директорию с файлами бота:
cd firstvds_botИ выполним команду:
nohup python3 main.py &После выполнения отобразится номер процесса:

Нажимаем Enter и возвращаемся в терминал.
Посмотрим список запущенных процессов. Для этого используем команду с фильтром по названию нашего исполняемого файла:
ps -ax | grep main.py
Утилита nohup автоматически создает файл nohup.out, куда сохраняются логи. В нашем примере мы не настраивали логи, поэтому файл пустой. Но при необходимости вы можете настроить и отслеживать логи. Команда для чтения файла:
cat nohup.out
Если вы решили внести изменения или отключить telegram-бота, то используйте команду с номером процесса:
kill ****
Команда, чтобы снова запустить бота, выполняется в папке с ботом:
nohup python3 main.py &Теперь наш telegram-бот будет активен, когда работает сервер. Кроме nohup, вы также можете воспользоваться другими утилитами, такими как tmux или screen, чтобы управлять сессиями и процессами. Попробуйте их и выберите наиболее удобную.
Запуск телеграмм бота как службы
Как писали ранее, у процессов есть недостатки: при сбое на сервере их придётся перезапускать вручную. Более надёжный вариант автоматизации — службы.
Существует несколько способов создать службу на сервере. Мы воспользуемся системным инструментом systemd. Это система инициализации, которая управляет службами в Linux. С помощью systemd можно создавать юниты (Unit) — скрипты для автоматизации необходимого процесса.
Первым делом создадим файл конфигурации сервиса (например, telegram_bot.service) в директории /etc/systemd/system/, который будет описывать запуск и управление telegram-ботом.
Для этого перейдем в каталог и создадим файл:
cd /etc/systemd/system/
sudo nano firstvds_bot.serviceЕсли редактор nano не установлен, то установить его будет не лишним:
sudo apt install nano -yСоздаем файл юнита со следующим содержимым:
[Unit]
Description=Our Tg Bot Service
After=network.target
[Service]
Type=idle
Restart=always
RestartSec=3
User=root
WorkingDirectory=/root/firstvds_bot/
ExecStart=/root/firstvds_bot/.venv/bin/python3 main.py
[Install]
WantedBy=multi-user.targetОписание параметров:
Description: Описание сервиса.
ExecStart: Команда для запуска бота, включая путь к исполняемому файлу и аргументы. Используем путь к виртуальному окружению.
Type=idle: Означает, что служба будет ожидать завершения других процессов перед запуском. Если важна беспрерывность работы telegram-бота, то можно использовать Type=simple.
WorkingDirectory: Рабочая директория, где находится код бота.
Restart: Условия перезапуска сервиса в случае сбоя.
User: Пользователь, от имени которого будет запущен бот.
Сохраняем файл, выходим из редактора nano (Ctrl + X) и нажимаем Y для сохранения.
Перезагружаем systemd для добавления новых файлов юнита:
sudo systemctl daemon-reloadВключаем новую службу с автозапуском (при старте сервера):
sudo systemctl enable firstvds_bot.service
Запускаем новую службу:
sudo systemctl start firstvds_bot.serviceДля проверки состояния службы и вывода служебной информации используется команда:
sudo systemctl status firstvds_bot.service
Если отсутствуют ошибки, значит, все сделали верно, и теперь служба будет запускаться вместе с сервером.
Чтобы посмотреть логи работы службы, используйте команду:
journalctl -u firstvds_bot.service
В наших логах отображается неудачный запуск службы из-за неверного пути к исполняемому файлу. Команда journalctl более информативна и позволяет быстрее исправлять ошибки, чем при работе с процессом.
Если вы решили внести изменения в код бота, то после сохранения изменений нужно перезапустить службу:
sudo systemctl restart firstvds_bot.serviceДля полного отключения службы на сервере и остановки telegram-бота поможет команда:
sudo systemctl disable firstvds_bot
Теперь наш telegram-бот работает как служба, автоматически перезапускается в случае сбоя и запускается при старте сервера.
Что дальше?
Мы создали базовую, но полностью функциональную версию бота, которую в дальнейшем можно улучшать. Например, можно расширить возможности бота и добавить:
Мониторинг и оповещения:
- Уведомления о высокой загрузке CPU и RAM.
- Оповещения о потере или нестабильности интернет-соединения.
- Сообщения о новых входах в систему по SSH.
Визуализацию и аналитику:
- Вывод графиков с историческими данными о состоянии сервера (нагрузка, потребление памяти, трафик сети).
Автоматизацию и управление:
- Выполнение заранее определенных bash-команд по запросу из чата.
- Автоматизация рутинных операций: перезапуск Docker-контейнеров, очистка кеша, обновление системы.
Это потребует разработки дополнительного кода, подключения базы данных для сбора и анализа данных, а также проведения более тонкой настройки пользователя и сервера — создания учётной записи бота с ограниченными правами. Важно отметить, что удалённое выполнение bash-команд на рабочем сервере может привести к неприятностям, если не будет должным образом защищено проверкой прав этого пользователя и валидацией выполняемых команд.
В итоге, мы создали базового Telegram-бота, создали условия для беспрерывной работы на сервере и наметили интересные направления для расширения его возможностей. Удачи в запуске ваших ботов!