Создаем телеграм-бота
Более подробно и со скриншотами мы уже описывали регистрацию тг-бота в статье для Спринтбокс. Вспомним основное:
- Создание любого бота начинается с сообщения отцу ботов в Телеграме — @BotFather (это официальный бот для создания тг-ботов)
- Создать бота можно командой /newbot
- Токен бота меняется командой /revoke
- У @BotFather есть справка по команде /help
Написание бота
Размещать бота в папке сайта или создавать под него новый сайт не обязательно — бот всё равно будет запускаться из консоли и веб-сервер ему не нужен. Это же приводит нас к еще одному ограничению — поддержки webhook для робота на Python нет, работает только polling. На Спринтбокс таких ограничений нет, любой вариант получения сообщений от Telegram API будет работать.
Чтобы не повторять статью Спринтбокс, напишем код бота на основе другой библиотеки — Aiogram — и примера базового бота из официальной документации.
- Создадим папку, откуда будет работать бот:
[username@server ~]$ mkdir ~/tgbot
- Подготовим и активируем виртуальное окружение — инструкция тут
- Установим aiogram:
(bot_venv) [username@server ~]$ pip install aiogram==2.14.3
- Начнем писать бота прямо в терминале:
(bot_venv) [username@server ~]$ vim ~/tgbot/bot.py
Чтобы перейти в режим редактирования в vim, нажмем кнопку I Для сохранения и выхода из vim нужно нажать ESC и после ввести :wq Дальнейшие шаги такие же, как в документации Aiogram. - Импортируем все важные модули:
import logging from aiogram import Bot, Dispatcher, executor, types
- Настроим логирование и инициализируем бота и диспетчера:
API_TOKEN = 'ВСТАВЬТЕ СЮДА ТОКЕН БОТА' # Configure logging logging.basicConfig(level=logging.INFO) # Initialize bot and dispatcher bot = Bot(token=API_TOKEN) dp = Dispatcher(bot)
- Настроим обработчик команд /start и /help и ответы бота:Если вы хотите обрабатывать все текстовые сообщения в чате, то надо добавить обработчик без фильтров:
@dp.message_handler(commands=['start', 'help']) async def send_welcome(message: types.Message): """ This handler will be called when user sends `/start` or `/help` command """ await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.")
@dp.message_handler() async def echo(message: types.Message): # old style: # await bot.send_message(message.chat.id, message.text) await message.answer(message.text)
- И последний шаг — добавляем long polling:
if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)
После этого мы получаем Python-скрипт с телеграм-ботом:
Запуск бота
Бот готов, запустить его можно командой:
(bot_venv) [username@server ~]$ python ~/tgbot/bot.py
Но если закрыть соединение по SSH, бот тоже закроется. Чтобы этого не случилось, нужно дополнить код. В самое начало вставляем:
import os, sys activate_this = '/home/username/bot_venv/bin/activate_this.py' with open(activate_this) as f: exec(f.read(), {'__file__': activate_this})
Этот код активирует виртуальное окружение сразу внутри бота, и его не придется запускать отдельно.
Tmux
Теперь можно будет запустить бота в tmux и оставить его работать, даже отключившись от SSH.
Tmux уже установлен на всех серверах виртуального хостинга. Для запуска утилиты достаточно набрать в терминале tmux:
[username@server ~]$ tmux
И уже здесь нужно будет запустить бота, как мы делали это раньше:
[username@server ~]$ python ~/tgbot/bot.py
Теперь чтобы отключиться от сессии tmux, достаточно будет набрать комбинацию клавиш
Ctrl + B
, отпустить и нажать D
.Команды:
- Посмотреть список сессий:
[username@server ~]$ tmux ls
- Подключиться к последней активной сессии:
[username@server ~]$ tmux a
- Подключиться к определенной сессии:
[username@server ~]$ tmux a -t 0
Вместо нуля используйте конкретный номер сессии, его можно узнать через tmux ls
Автоматизируем запуск
Один из наших сотрудников написал простой bash-скрипт, который выполняет запуск, перезапуск и остановку.
Скрипт можно дорабатывать под себя бесконечно, плюс есть другие рабочие аналоги, это лишь пример.
Прямо сейчас скрипт работает только для Python, но интерпретатор можно легко поменять на 21-й и 24-й строках.
Чтобы запустить скрипт, как в примере кода, нужно сделать исполняемым файл под именем bot_control и положить его в папку /home/username/.local/bin/, где username – это логин вашего аккаунта.
Эти команды помогут развернуть скрипт на аккаунте:
[username@server ~]$ chmod +x bot_control [username@server ~]$ mkdir -p ~/.local/bin/ [username@server ~]$ mv bot_control ~/.local/bin/