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

Рынок чат-ботов в России растет с бешеной скоростью и ожидается ежегодный прирост на 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. Тема телеграм-ботов стала весьма интересной и актуальной в последнее время, поэтому буду рад услышать здравую критику по поводу моей первой на этот момент статьи. Если у вас возникнут идеи для написания новых, буду рад их выслушать.