Тариф успешно добавлен в корзину
В корзину

Как создать telegram-бота на Python

Создание телеграм-бота

Telegram-боты уже нашли широкое применение в самых разных сферах нашей жизни. Они эффективно автоматизируют рутину, упрощают коммуникацию и решают широкий спектр задач — от учёта финансов до клиентской поддержки. Популярность Telegram-ботов растет, потому что их просто использовать, можно гибко настраивать и интегрировать с другими сервисами.

В статье расскажем, как создать простого Telegram-бота на Python, который будет сообщать нужные данные о сервере. Вы познакомитесь с разработкой тг-ботов с нуля и узнаете, как разместить их на сервере, чтобы они работали круглосуточно.

Что такое Telegram-бот и зачем он нужен

Telegram-бот — это небольшая программа, которая работает внутри мессенджера Telegram и взаимодействует с пользователями через чат в формате «Вопрос — Ответ». Вы пишете сообщение в чат с ботом, бот его обрабатывает и сразу же делает то, что вы попросили. 

Telegram-бота можно создать для выполнения различных задач: от простых ответов по команде до более сложных операций, таких как проверка погоды, управление сервером или даже продажа товаров.

Подготовка к созданию бота

Перед созданием бота необходимо продумать его концепцию: определить ключевые задачи и выбрать технологический стек (язык программирования и сервер для размещения). Это сделает процесс разработки более эффективным.

В нашем случае мы создаём Telegram-бота для мониторинга состояния сервера. Бот будет размещаться на этом же сервере. В качестве языка программирования выбран Python благодаря его популярности и обширным библиотекам для работы с Telegram.

Что будет уметь наш бот

По запросу пользователя бот будет предоставлять следующие данные о сервере:

  • количество активных пользователей;
  • загрузку процессора (CPU);
  • использование оперативной памяти (RAM);
  • нагрузку на дисковую подсистему (I/O);
  • скорость интернет-соединения;
  • аптайм (время непрерывной работы сервера).

Где будет находиться

Бота разместим на виртуальном сервере, так он будет доступен в любое время — простое решение для удаленного мониторинга. Если кратко, то чтобы реализовать задуманное, нам предстоит выполнить несколько шагов: сначала, по правилам Телеграма, мы должны зарегистрировать бота и получить API-токен, после — написать код на Python с нужной функциональностью, запустить нашего бота в Telegram и протестировать код, а затем разместить Telegram-бот на нашем сервере. Далее разберем каждый шаг подробнее.

Регистрация бота через BotFather

Перед тем, как писать код, нам нужно получить уникальный API-токен нашего бота. Это делается через официального бота Telegram — BotFather. 

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

Для справки: 

  • Имя, или название (name) — это то, что видят другие пользователи в списке контактов и чатов, и оно может быть не уникальным.
  • Имя пользователя (username), или ник — уникальный идентификатор в формате @username, который используется для поиска и упоминания в сообщениях.  

В нашем случае имя бота — bot_for_firstvds. Именно так он будет отображаться в списке чатов у пользователей этого бота, а ник — @test_firstvds_bot предназначен для поиска и упоминаний.

  1. В ответ BotFather пришлёт API-токен. Этот ключ будет нужен для подключения вашей программы к боту. 
Получение 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 добавляет созданную кнопку к сообщению.
Обработка команды start
Приветственное сообщение бота

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
Проверка наличия python3 и pip

Если всё установлено, двигаемся дальше. Если не установлено — нет ответа на команду, то устанавливаем:

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-бота на сервере

Теперь наш telegram-бот работает как служба, автоматически перезапускается в случае сбоя и запускается при старте сервера.

Что дальше?

Мы создали базовую, но полностью функциональную версию бота, которую в дальнейшем можно улучшать. Например, можно расширить возможности бота и добавить:

Мониторинг и оповещения:

  • Уведомления о высокой загрузке CPU и RAM.
  • Оповещения о потере или нестабильности интернет-соединения.
  • Сообщения о новых входах в систему по SSH.

Визуализацию и аналитику:

  • Вывод графиков с историческими данными о состоянии сервера (нагрузка, потребление памяти, трафик сети).

 Автоматизацию и управление:

  • Выполнение заранее определенных bash-команд по запросу из чата.
  • Автоматизация рутинных операций: перезапуск Docker-контейнеров, очистка кеша, обновление системы.

Это потребует разработки дополнительного кода, подключения базы данных для сбора и анализа данных, а также проведения более тонкой настройки пользователя и сервера — создания учётной записи бота с ограниченными правамиВажно отметить, что удалённое выполнение bash-команд на рабочем сервере может привести к неприятностям, если не будет должным образом защищено проверкой прав этого пользователя и валидацией выполняемых команд.

В итоге, мы создали базового Telegram-бота, создали условия для беспрерывной работы на сервере и наметили интересные направления для расширения его возможностей. Удачи в запуске ваших ботов!

Возможно, вам будет интересно

Было интересно?

Назад к списку
Скидка новым клиентам
Закажите сервер сегодня и получите скидку на первый месяц аренды!
Наш сайт использует cookies Вы можете отключить их в настройках браузера, но это может ограничить функционал. Оставаясь на сайте, вы соглашаетесь с использованием cookies.