Искать в Базе знаний

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

Выбор бокса и системы

Если вы хотите просто попробовать свои силы в размещении телеграм-бота и пока только знакомитесь, для ваших целей хватит базового тарифа. Когда бот вырастет, и ресурсов перестанет хватать, тариф можно будет увеличить. 
Для готового бота подобрать ресурсы сложнее, и если вы не уверены, задайте вопрос нашей поддержке через форму подбора тарифа. Чем подробнее вы опишете ваш проект, тем точнее специалисты смогут подобрать подходящий тариф.
Операционная система подойдет любая, но если это ваш первый проект, то лучше выбрать Ubuntu: она проще в администрировании, чем CentOS.
Подключитесь к боксу по SSH и обновите ОС — с момента создания образа на нашей площадке могло выйти несколько обновлений для операционной системы и других пакетов, в которых могли быть закрыты обнаруженные уязвимости.
Для Ubuntu обновление проводится в 2 команды:
root@box-10000:~# apt-get update
root@box-10000:~# apt-get upgrade
Их можно совместить в одну:
root@box-10000:~# apt-get update && apt-get upgrade
Когда все основные компоненты системы будут обновлены, можно приступать к подготовке бокса к размещению телеграм-бота.

Создание пользователя для бота

Запускать бота под пользователем root небезопасно. Сделайте отдельного пользователя для этих целей. 
Запустите команду adduser, передав ей аргументом имя будущего пользователя.
root@box-10000:~# adduser bot
Далее команда предложит придумать пароль, повторить его ещё раз и заполнить информацию о новом пользователе. Все поля, кроме пароля, не обязательны, можно жать Enter для подстановки значения по умолчанию.
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for username
Enter the new value, or press ENTER for the default
    Full Name []: 
    Room Number []: 
    Work Phone []: 
    Home Phone []: 
    Other []: 
Is the information correct? [Y/n]
Стать новым пользователем можно командой su:
root@box-10000:~# su - bot
bot@box-10000:~$
Переключиться обратно к root-пользователю можно с помощью команды logout, либо сочетанием клавиш Ctrl+D, которое сразу выполнит эту команду:
bot@box-10000:~$ logout
root@box-10000:~#

Подготовка окружения

Проверьте версию Python, на котором будет запускаться бот:
root@box-10000:~# python3 --version
Python 3.8.5
Если вы будете размещать готового бота, версия Python должна соответствовать той, на которой бот был разработан.
Для создания нового бота подойдет любая версия. Если у вас есть готовый бот, написанный на более старой версии языка, установите интерпретатор для него. 
Установите менеджер пакетов pip. Он пригодится в дальнейшем для загрузки библиотек.
В Ubuntu установка производится так:
root@box-10000:~# apt install python3-pip
Следующий шаг — создание виртуального окружения. Это нужно для того, чтобы устанавливать разные модули разным проектам и избегать их конфликтов.
Станьте пользователем bot и установите модуль virtualenv командой:
bot@box-10000:~$ pip3 install virtualenv --user
Ключ --user поставит его локально для пользователя bot.
После установки добавьте виртуальное окружение в системные пути пользователя:
bot@box-10000:~$ export PATH=$HOME/.local/bin:$PATH
Создайте новое окружение:
bot@box-10000:~$ virtualenv --system-site-packages python
python - произвольное имя нового виртуального окружения
Ключ --system-site-packages задействует внутри окружения модули, уже установленные в системе.
И активируйте его:
bot@box-10000:~$ source ~/python/bin/activate
(python) bot@box-10000:~$
Выйти из окружения можно с помощью команды deactivate:
(python) bot@box-10000:~$ deactivate 
bot@box-10000:~$
После создания и активации окружения можно устанавливать модули, которые нам потребуются для запуска бота. В первую очередь это pyTelegramBotAPI. Установим его:
(python) bot@box-10000:~$ pip3 install pyTelegramBotAPI

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

Создание любого бота начинается сообщения отцу ботов в телеграме — @BotFather.
Он может управлять всеми существующими ботами, с помощью множества команд. Их список в любой момент можно вызвать командой /help
content-image
Для создания нового бота отправьте команду /newbot. После ответов на пару вопросов бот будет создан, а отец ботов пришлёт токен. Его нужно будет указывать в коде для взаимодействия с BotAPI.
Токен для каждого бота уникален. Нельзя, чтобы он попал в открытый доступ. Однако если это произошло, его всегда можно сменить через ботопапу командой /revoke.
Так будет выглядеть диалог создания бота:
content-image

Создание бота

Окружение подготовлено, бот зарегистрирован, можно начать писать его код.
Создайте директорию для бота, в ней будут все файлы проекта:
bot@box-10000:~$ mkdir tgbot
В директории создайте конфигурационный файл, в котором будут храниться некоторые данные проекта, например, токен:
bot@box-10000:~$ vim tgbot/config.py
Помимо vim можно использовать vi или nano. Далее добавьте в файл токен, в виде такой строки:
TOKEN = "1713984490:AAGHy1PGHlEeNEeZ1CM0IWjU9HcZVTzQO7g"
Создайте файл самого бота — ~/tgbot/bot.py — и начните наполнять его кодом.
Активация виртуального окружения, которым будет пользоваться бот:
import os, sys
activate_this = '/home/bot/python/bin/activate_this.py'
with open(activate_this) as f:
    exec(f.read(), {'__file__': activate_this})
Импорт нужных библиотек и настроек из config.py:
import telebot
from config import TOKEN
Создание бота:
bot = telebot.TeleBot(TOKEN)
Этот код — чтобы бот мог отвечать на стандартную команду /start текстом «Я жив!»:
@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Я жив!')
А этот — сделает так, что бот будет повторять тексты всех отправленных ему сообщений:
@bot.message_handler(content_types=['text'])
def echo(message):
    bot.reply_to(message, message.text)
Эта строка в коде бота отвечает за постоянную обработку информации, приходящей с серверов Telegram:
bot.polling(none_stop=True, interval=0)
Вот так будет выглядеть полностью код файла bot.py:
import os, sys
activate_this = '/home/bot/python/bin/activate_this.py'
with open(activate_this) as f:
    exec(f.read(), {'__file__': activate_this})

import telebot
from config import TOKEN

bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Я жив!')

@bot.message_handler(content_types=['text'])
def echo(message):
    bot.reply_to(message, message.text)

bot.polling(none_stop=True, interval=0)
Чтобы теперь проверить, как всё работает, достаточно напрямую запустить файл с ботом:
bot@box-10000:~$ python3 tgbot/bot.py
И обратиться к боту в телеграме.

Запуск бота

В примере выше бот запускается прямым вызовом интерпретатора Python в консоли, но работать он будет, пока активна сессия SSH. Ещё можно запустить его в tmux или screen, но нужно будет следить за тем, чтобы бот всегда работал и поднимать его. Этот процесс можно упростить с помощью системных демонов linux.
Для этого создайте сервис:
root@box-10000:~# vim /etc/systemd/system/bot.service
И добавьте в него такой код:
[Unit]
Description=Awesome Bot
After=syslog.target
After=network.target

[Service]
Type=simple
User=bot
WorkingDirectory=/home/bot/tgbot
ExecStart=/usr/bin/python3 /home/bot/tgbot/bot.py
Restart=always

[Install]
WantedBy=multi-user.target
После этого выполните 3 команды друг за другом. Первая перезапустит менеджер служб, вторая включит демона, третья — запустит бота:
root@box-10000:~# systemctl daemon-reload
root@box-10000:~# systemctl enable bot
root@box-10000:~# systemctl start bot
Проверить, что бот работает, можно командой:
root@box-10000:~# systemctl status bot
Её вывод будет примерно таким:
● bot.service - Awesome Bot
     Loaded: loaded (/etc/systemd/system/bot.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-03-29 05:52:50 MSK; 3min 12s ago
   Main PID: 2087 (python3)
      Tasks: 4 (limit: 2344)
     Memory: 19.9M
     CGroup: /system.slice/bot.service
             └─2087 /usr/bin/python3 /home/bot/tgbot/bot.py
Самое важное здесь — состояние бота, в строке «Active». Если бот вдруг остановился, его можно снова запустить:
root@box-10000:~# systemctl start bot
Когда вы вносите изменения в код бота, сервис нужно перезапускать:
root@box-10000:~# systemctl restart bot
Чтобы отключить автоматический перезапуск бота, нужно его остановить и отключить демона:
root@box-10000:~# systemctl stop bot
root@box-10000:~# systemctl disable bot

Документация

2005–2025 ООО «СПРИНТХОСТ.РУ»
Входит в Реестр аккредитованных ИТ-компаний
и Реестр провайдеров хостинга
Лицензия №162552