{"id":14283,"url":"\/distributions\/14283\/click?bit=1&hash=8766cc03cba44a6d934ee26f882971a64223452448548d2fc3a5f37339e77cfa","title":"\u0412\u0438\u0434\u0435\u043b\u0438 \u0432 \u0421\u043e\u0447\u0438 \u0443\u0436\u0435 \u0432\u0441\u0451? \u0412\u043e\u0442 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0434\u043b\u044f \u043e\u0442\u0434\u044b\u0445\u0430 \u043d\u0430 \u043a\u0443\u0440\u043e\u0440\u0442\u0435 ","buttonText":"","imageUuid":""}

Деплой телеграм-бота на примере PyTelegramBotApi

Начнём с описания проекта, ведь чтобы что-то деплоить, нужно что-то разработать.

Проект, на примере которого я буду деплоить – бот сбора обратной связи (отзывов) у клиентов.

Функциональность бота:

- Отправлять приветственное сообщение при первом входе в бота;

- Предоставить клавиатуру с кнопкой “Написать в поддержку”;

- При нажатии на неё запрашивать у пользователя имя и фамилию;

- После дать возможность изменить введённые данные;

- После этого, пользователь вводит текст отзыва;

- Отзыв пересылается администратору, с указанием введённых имени и фамилии.

Итоговый код бота выглядит так:

Файл config.py:

import os TOKEN = os.getenv('TOKEN')

В файле config.py мы указываем токен, который необходим для корректной работы бота.

Основной файл main.py:

import telebot from config import TOKEN bot = telebot.TeleBot(TOKEN) users = {} administrators = (814401631,) @bot.message_handler(commands=['start']) def welcome(message): chat_id = message.chat.id keyboard = telebot.types.ReplyKeyboardMarkup() button_save = telebot.types.InlineKeyboardButton( text="Написать в поддержку") keyboard.add(button_save) bot.send_message(chat_id, 'Добро пожаловать в бота сбора обратной связи', reply_markup=keyboard) with open('feedback.jpeg', 'rb') as file: photo = file.read() bot.send_photo(chat_id, photo) @bot.message_handler( func=lambda message: message.text == 'Написать в поддержку') def write_to_support(message): chat_id = message.chat.id bot.send_message(chat_id, 'Введите своё имя') users[chat_id] = {} bot.register_next_step_handler(message, save_username) def save_username(message): chat_id = message.chat.id name = message.text users[chat_id]['name'] = name bot.send_message(chat_id, f'Отлично, {name}. Теперь укажи свою фамилию') bot.register_next_step_handler(message, save_surname) def save_surname(message): chat_id = message.chat.id surname = message.text users[chat_id]['surname'] = surname keyboard = telebot.types.InlineKeyboardMarkup() button_save = telebot.types.InlineKeyboardButton(text="Сохранить", callback_data='save_data') button_change = telebot.types.InlineKeyboardButton(text="Изменить", callback_data='change_data') keyboard.add(button_save, button_change) bot.send_message(chat_id, f'Сохранить данные?', reply_markup=keyboard) @bot.message_handler(commands=['who_i']) def who_i(message): chat_id = message.chat.id name = users[chat_id]['name'] surname = users[chat_id]['surname'] bot.send_message(chat_id, f'Вы: {name} {surname}') @bot.callback_query_handler(func=lambda call: call.data == 'save_data') def save_btn(call): message = call.message chat_id = message.chat.id message_id = message.message_id bot.answer_callback_query(call.id, text="Данные сохранены") bot.delete_message(chat_id=chat_id, message_id=message_id) bot.send_message(chat_id, 'Введите текст отзыва: ') bot.register_next_step_handler(message, send_feedback_administrators) def send_feedback_administrators(message): feedback = message.text user = users[message.chat.id] name = user['name'] surname = user['surname'] for admin_chat_id in administrators: bot.send_message(admin_chat_id, f'{surname} {name} оставил отзыв: {feedback}') @bot.callback_query_handler(func=lambda call: call.data == 'change_data') def save_btn(call): message = call.message chat_id = message.chat.id message_id = message.message_id bot.edit_message_text(chat_id=chat_id, message_id=message_id, text='Изменение данных!') write_to_support(message) if __name__ == '__main__': print('Бот запущен!') bot.infinity_polling()

В этом файле содержится основная логика бота.

Также нам необходим файл зависимостей requirements.txt. В него необходимо добавить все использованные сторонние библиотеки (например: pytelegrambotapi). Команда для этого: pip3 freeze > requirements.txt

Пример файла

Flask==2.2.2 Flask-CORS==3.0.10 gunicorn==20.1.0

Но если мы сейчас запустим нашего бота на ПК, то он будет работать пока наше устройство запущено.

Есть много компаний которые позволяет вам арендовать сервер, я буду показывать на примере одного из самых доступных и интересных облачных провайдеров Amvera. Эта компания отличается от конкурентов в первую очередь демократичной ценой, и максимально простым и удобным деплоем проекта через push в Git, либо через перетягивание файлов в интерфейсе, если не хотите работать с Git.

Первое что необходимо сделать - перейти на сайт Amvera и зарегистрироваться.

После регистрации вам сразу будет доступно 111р. Это хватит на несколько недель работы проекта.

После нажатия кнопки создать, указываем название нашего проекта, далее тип (оставим приложение) и выбираем конфигурацию. Для нашего проекта нам будет достаточно "Пробного" тарифа за 170 руб., для более крупных решений уже необходимо выбирать старшие тарифные планы.

Деплой телеграм-бота

Добавим файлы на сервер. Для этого либо воспользуемся загрузкой через интерфейс, либо используем push в Git, что правильнее, так-как это позволит в дальнейшем обновлять проект "одной командой" в консоли.

Привязываем наш локальный Git-репозиторий к удаленному репозиторию через команду, которую можно найти в разделе "Конфигурация" проекта в amvera (формат git remote add amvera https://git.amvera.ru/ваш_юзернейм/ваш_проект)

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

git remote add amvera https://git.amvera.ru/<имя-пользователя>/<транслитерированное-имя-проекта> git push amvera master

На запрос пользователя и пароля укажите имя пользователя и пароль вашей учетной записи Amvera.

Далее вводим

git add . git commit -m "Initial commit"

Пушим наш проект, выполняя команду

git push amvera master

Либо, можно перетянуть файлы через интерфейс

Теперь надо указать финальную конфигурацию: выбрать версию Python и команду для запуска. Обратите внимание, в run надо указать название вашего запускаемого файла (у меня это main.py) либо команды (взаимоисключающие способы), /data - это постоянное хранилище. Наш проект будет работать через 80 порт.

Нажимаем завершить.

Если вы доставляете код через push в Git, не забудьте сделать git pull, так как задание конфигурации делает коммит с созданием конфигурационного yaml файла.

Теперь переходим в меню "Переменные" и добавляем переменную окружения, в которой у нас хранится TOKEN.

Проверяем работоспособность.

На что обратить внимание

  • Если вы работаете через Git, и задали конфигурацию в интерфейсе, не забудьте сделать git pull, так-как задание конфигурации создает коммит.
  • Сохраняйте важные файлы в /data, чтобы не потерять их при пересборке проекта. Для удобства тестирования создайте /data у себя на ПК.
  • Если вы используете базу данных SQLite - ваш путь будет выглядеть примерно так - /data/sqlite_database.db
  • Не стесняйтесь читать документацию и обращаться в поддержку в чате комьюнити. Вам обязательно помогут!

Теперь вы сможете спокойно выключать компьютер, не боясь остановки бота, Amvera всё сделает за нас.

0
Комментарии
-3 комментариев
Раскрывать всегда