Telegram бот с помощью python-telegram-bot для поддержки Жираф Go

Описание задачи

Создание TG бота для поддержки клиентов сервиса Жираф Go, с помощью которого будет происходить переадресация в чат франчайзи из того города, который выбирает пользователь. Так же чат-бот не предназначен для общения, только переадресация. Исходя из этого при отправке команды “/start” мы предлагаем выбрать город, а если пользователь не понял и отправил ещё какое-то сообщение, то мы более развернуто ему отвечаем о том, что необходимо перейти в чат соответствующего ему города.

Вид бота:

Создание и оформление бота, получение токена

Создаём бота в TG с помощью @BotFather

Смотрите инструкцию в YouTube -> https://www.youtube.com/watch?v=tq8VrdBfRik

Установка библиотеки python-telegram-bot

P.S.: Разумеется на сервере должен быть установлен python

Чтобы установить python-telegram-bot нужно выполнить команду:

pip install python-telegram-bot

Код бота

Название файла – bot.py, разместил по пути /var/bot-support/

Код:

from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes

# Замените 'YOUR_BOT_TOKEN' на токен вашего бота
BOT_TOKEN = 'YOUR_BOT_TOKEN'

# Список чатов и их ссылки
chats = [
    {"name": "Город1", "link": "https://t.me/1"},
    {"name": "Город2", "link": "https://t.me/2"},
    {"name": "Город3", "link": "https://t.me/3"},
]

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    keyboard = [
        [InlineKeyboardButton(chat["name"], url=chat["link"])]
        for chat in chats
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.message.reply_text('Выберите город:', reply_markup=reply_markup)

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    keyboard = [
        [InlineKeyboardButton(chat["name"], url=chat["link"])]
        for chat in chats
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.message.reply_text(
        'Этот чат не предназначен для общения, пожалуйста выберите город и задайте ваш вопрос представителю Жираф Go в этом городе.',
        reply_markup=reply_markup
    )

def main() -> None:
    application = Application.builder().token(BOT_TOKEN).build()

    application.add_handler(CommandHandler("start", start))
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))

    application.run_polling()

if __name__ == '__main__':
    main()

Пояснение к коду:

  • Импорт библиотек: Импортируются необходимые модули из python-telegram-bot.
  • Токен бота: Замените YOUR_BOT_TOKEN на токен вашего бота, который вы получили у @BotFather.
  • Список чатов: Замените значения в chats на нужные вам названия и ссылки.
  • Функция start: Эта функция отвечает на команду /start и отправляет сообщение с кнопками.

Запуск бота, команда

Переходим по пути (/var/bot-support/), где лежит наш файл бота (bot.py) и выполняем команду:

python bot.py

Готово!

Автоматическая загрузка скрипта на сервере

Шаг 1: Создание файла службы systemd

  1. Создайте файл службы systemd для вашего бота. Обычно такие файлы размещаются в каталоге /etc/systemd/system/. Назовем файл, tg_bot_support.service.
sudo nano /etc/systemd/system/tg_bot_support.service

2. Добавьте следующий текст в файл службы. Не забудьте заменить пути и имя пользователя на соответствующие вашему окружению:

[Unit]
Description=Telegram Bot
After=network.target

[Service]
User=your_username
WorkingDirectory=/path/to/your/bot
ExecStart=/usr/bin/python3 /path/to/your/bot/bot.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

Пояснение:

  • [Unit]: Описывает службу.
    • Description: Описание службы.
    • After: Указывает, что эта служба должна запускаться после network.target, то есть после установления сетевых соединений.
  • [Service]: Настройки самой службы.
    • User: Указывает пользователя, от имени которого будет запущен бот.
    • WorkingDirectory: Каталог, в котором находится ваш скрипт.
    • ExecStart: Команда для запуска скрипта.
    • Restart: Указывает, что служба должна перезапускаться в случае сбоя.
  • [Install]: Настройки для установки службы.
    • WantedBy: Определяет, когда служба должна быть запущена.

В моём случае конечный код будет выглядеть так:

[Unit]
Description=Telegram Bot
After=network.target

[Service]
User=root
WorkingDirectory=/var/bot-support
ExecStart=/usr/bin/python3 /var/bot-support/bot.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

Шаг 2: Загрузка и запуск службы

  1. Загрузите новый файл службы systemd:
sudo systemctl daemon-reload

2. Включите службу, чтобы она запускалась автоматически при загрузке системы:

sudo systemctl enable tg_bot_support.service

3. Запустите службу вручную, чтобы убедиться, что все работает:

sudo systemctl start tg_bot_support.service

4. Проверьте статус службы, чтобы убедиться, что она работает корректно:

sudo systemctl status tg_bot_support.service

Вы должны увидеть что-то вроде этого, если все работает правильно:

Остановка, запуск, перезапуск процесса

  1. Остановка
sudo systemctl stop tg_bot_support.service

2. Запуск

sudo systemctl start tg_bot_support.service

3. Перезапуск

sudo systemctl restart tg_bot_support.service

Также, не забываем проверять статус процесса, выполнен ли он. Команда:

sudo systemctl status tg_bot_support.service