Выбор бокса и системы
Если вы хотите просто попробовать свои силы в размещении телеграм-бота и пока только знакомитесь, для ваших целей хватит базового тарифа. Когда бот вырастет, и ресурсов перестанет хватать, тариф можно будет увеличить.
Для готового бота подобрать ресурсы сложнее, и если вы не уверены, задайте вопрос нашей поддержке через форму подбора тарифа. Чем подробнее вы опишете ваш проект, тем точнее специалисты смогут подобрать подходящий тариф.
Операционная система подойдет любая, но если это ваш первый проект, то лучше выбрать 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
Для создания нового бота отправьте команду /newbot. После ответов на пару вопросов бот будет создан, а отец ботов пришлёт токен. Его нужно будет указывать в коде для взаимодействия с BotAPI.
Токен для каждого бота уникален. Нельзя, чтобы он попал в открытый доступ. Однако если это произошло, его всегда можно сменить через ботопапу командой /revoke.
Так будет выглядеть диалог создания бота:
Создание бота
Окружение подготовлено, бот зарегистрирован, можно начать писать его код.
Создайте директорию для бота, в ней будут все файлы проекта:
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