База знаний

Часто задаваемые вопросы, на которые мы уже ответили

Создание telegram-ботов на 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

Для создания нового бота отправьте команду /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

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


Была ли эта инструкция полезной?