Как стать автором
Обновить

Создание Python Telegram бота и его deploy на виртуальную машину

Время на прочтение 5 мин
Количество просмотров 75K

Кому нужны чат-боты?

Рынок чат-ботов в России растет с бешеной скоростью и ожидается ежегодный прирост на 30% в течение ближайших трех лет. В 2020 г. количество запросов на чат-боты увеличилось на 17% по сравнению с 2019 г. Большим спросом стали поль­зо­вать­ся голосовые боты, количество запросов на них выросло в четыре раза. В 2021 г. ожидается рост числа запросов на чат-боты на 15-20% от ор­га­низа­ций из госсектора, об­ра­зова­ния, медицины, ло­гис­ти­ки, ре­тей­ла и e-commerce, промышленных и добывающих компаний.

Шаги

  1. Создаём нашего telegram бота.

  2. Пишем код под наши задачи и тестируем его работоспособность.

  3. Выбираем надежный сервис виртуальных машин.

  4. Переносим нашего бота на виртуальную машину для его дальнейшей работы.

  5. Настраиваем беспрерывную работу бота.

Шаг 1. Создание бота в Telegram

Первые три шага опишу максимально кратко, так как статей на эту тему много и обычно это не вызовет у пользователей никаких трудностей. Для создания бота нам понадобится написать BotFather.

Шаг 2. Напишем простейшего чат-бота и протестируем его

Для работы будем использовать библиотеку telebot, которую можно установить при помощи следующей команды:

$ pip install pytelegrambotapi

Для установки других библиотек, в случае того, если вы не ограничиваетесь базовым функционалом вам поможет господь Google.

Напишем простого бота, который будет присылать нам в ответ на различные Emoji их размытые PNG копии:

import telebot
import PIL
from PIL import Image
from requests import get

#Сюда подставляете свой токен
bot = telebot.TeleBot('1653707062:AAHxX29RP5HY-nVb21SSD8ZRbKpxKseSyS4')

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Пришли мне Emoji, который необходимо сделать размытым.)
                     
@bot.message_handler(content_types=['text'])
def send_text(message):
    if message.text.lower() == 'нам первый смайлик':
        img = open('Смайлики и люди 1.png', 'rb')
        
        bot.send_document(message.chat.id, img) 
    elif message.text.lower() == 'наш второй смайлик':
        img = open('Смайлики и люди 2.png', 'rb')
        bot.send_document(message.chat.id, img)    
   
    else:
        bot.send_message(message.chat.id, 'Прости, но пока у меня нет этих Emoji')

bot.polling()
#сами смайлики прописать не могу, иначе публикация не обрабатывается на habr

Наш бот готов, теперь осталось его протестировать. Заходим по ссылке, которую прислал BotFather.

Поздравляю, наш бот теперь работает. И тут мы подходим к главной проблеме: как только мы выключим наш компьютер с запущенным кодом, бот мгновенно перестанет работать. Для решения этой проблемы нам-то и понадобится сервис предоставляющий виртуальные машины.

Шаг 3. Выбираем виртуальную машину!

Что вообще такое эта виртуальная машина?

Виртуальная машина (ВМ ) — это виртуальный компьютер, который использует выделенные ресурсы реального компьютера (процессор, диск, адаптер). Эти ресурсы хранятся в облаке и позволяют ВМ работать автономно. Простыми словами, виртуальная машина позволяет создать на одном компьютере ещё один компьютер, который будет использовать его ресурсы, но работать изолированно.

Именно виртуальная машина поможет нашему боту отвечать на все запросы и работать 24 на 7.

Как выбрать виртуальную машину?

ВМ выбирается исключительно отталкиваясь от ваших потребностей бюджета. Чем больше вам необходимо мощности и памяти, тем выше будет ее стоимость. В настоящее время есть множество хороших сервисов, предоставляющих пробный период с которым вы сможете определиться, подходит ли вам сервис.

Лично я могу рекомендовать следующие сервисы:

  • Mail cloud solutions — Предоставляют 3000 р. на два месяца тестового периода. (Именно его я и буду использовать в дальнейшей работе).

  • Yandex.Cloud — Представляют 2000 р. на два месяца тестового периода.

  • Google Cloud Platform — Предоставляют 300$ на три месяца тестового периода.

После выбора сервиса, пройдем регистрацию и создадим новую виртуальную машину.

Создание виртуальной машины.

Я выбрал минимальные параметры, так как нашему боты не нужны какие-то большие энергоресурсы.

Настройка сети.

Для подключения будем использовать протокол SSH. Для подключения к нашей виртуальной машине, нам необходимо будет выпустить новую связку ssh-ключей.

Для этого перейдем в терминал и пропишем следующую команду:

$ ssh-keygen

Затем пропишем имя нашего ключа и нажмем Enter. Наш ключ создан. Для подключения нам понадобится public-key с расширением .pub. Копируем содержимое нашего файла и вставляем его в соответствующее поле «Ключ виртуальной машины».

Переходим к следующему шагу.

Подключение к виртуальной машине

Для подключения к нашей виртуальной машине пропишем следующую команду:

ssh -i ~/.ssh/ИмяВашегоКлюча ubuntu@ваш публичный IP-адрес

Например: ssh -i ~/.ssh/my_key ubuntu@22.222.222.222

В случае удачного подключения вы увидите нечто подобное:

Мы подошли к самому сложному шагу, который я надеюсь, благодаря моей статье перестанет быть столь трудным для освоения.

  • Установим на наш сервер последнюю версию Python. Для этого последовательно вводите следующие команды:

$ sudo apt update
$ sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev
$ wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz
$ tar -xf Python-3.8.5.tgz
$ cd Python-3.8.5
$ ./configure --enable-optimizations
$ make  # ~15 минут
$ sudo make altinstall
$ cd /home
  • Установим и создадим виртуально окружение:

    $ python3.8 -m pip install --upgrade pip 
    $ pip install virtualenv
    $ mkdir НазваниеВашегоБота
    $ cd НазваниеВашегоБота
    $ virtualenv venv
    $ source venv/bin/activate
    $ python -V
    $ deactivate
    
  • Установим и запустим Redis-server:

    $ sudo apt install redis-server
    $ redis-cli
    

Проверить, запущен ли наш Redis-server, необходимо прописать «ping»

Если в ответе вы получили PONG, поздравляю, все готово к дальнейшей работе!

  • Перенесем все необходимые файлы на наш виртуальный сервер. Для этого я буду использовать очень удобную программу CyberDuck

Выбираем новое подключение по SFTP, вводим IP-адрес вашей виртуальной машины, !ПРИВАТНЫЙ! ssh-ключ, логин и пароль от вашей виртуальной машины.

  • Мы попадаем фактически на наш сервер, с уже установленным Python, папкой с названием нашего бота и виртуальным окружением. Остается перенести все данные нашего бота. Для этого копируем ВСЕ необходимые файлы и вставляем их на сервер.

  • Поздравляю, мы на финишной прямой, остается запустить нашего бота на сервере и проверить его работоспособность.

    $ cd /home/НазваниеВашегоБота/  # перейдем в папку проекта
    $ source venv/bin/activate  # активируем окружение
    $ pip install -r requirements.txt  # установим зависимости
    $ python main.py  # запустим бота
    

Проверяем работу, если все в порядке, прописываем в терминале deactivate. Нам остается последний шаг. Настроить непрерывную работу нашего бота.

Шаг 5. Настройка беспрерывной работы нашего бота.

Пропишем следующую команду: nano /lib/systemd/system/НазваниеБота.service

[Unit]
Description=Описание вашего бота
After=network.target

[Service]
EnvironmentFile=/etc/environment
ExecStart=/home/НазваниеБота/venv/bin/python main.py
ExecReload=/home/НазваниеБота/venv/bin/python main.py
WorkingDirectory=/home/НазваниеБота/
KillMode=process
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Нажимаем CTRL+O → Enter → CTRL+X для сохранения. Эти настройки помогут запускать или перезапускать нашего бота.

  • Последний шаг: Снова запускаем нашего бота, но уже с беспрерывной работой.

    sudo systemctl enable НазваниеБота
    sudo systemctl start НазваниеБота
    

ГОТОВО! Наш бот запущен и теперь работает 24/7, независимо от того, включен наш с вами компьютер или нет. Если что-то не работает, тщательно проверьте, правильно ли вы прописали путь к файлам. Если терминал выдает ошибку авторизации, попробуйте добавить перед командой «sudo» (Команда от имени администратора)

P.S. Тема телеграм-ботов стала весьма интересной и актуальной в последнее время, поэтому буду рад услышать здравую критику по поводу моей первой на этот момент статьи. Если у вас возникнут идеи для написания новых, буду рад их выслушать.

Теги:
Хабы:
+7
Комментарии 16
Комментарии Комментарии 16

Публикации

Истории

Работа

Python разработчик
136 вакансий
Data Scientist
66 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн