Создаём Slack бота на Python

Создаём Slack бота на Python
Недавно у меня был случай поработать с Real Time Messaging API в Slack и сегодня я покажу вам как создать своего бота — это очень просто!

Slack API

Немного о Slack Real Time Messaging API:

API сообщений реального времени (Real Time Messaging API) это API, построенное на WebSocket, позволяющее получать события из Slack в реальном времени и отправлять сообщения как от обычного пользователя. Его также называют «RTM API». Оно является базой для всех клиентов Slack. С его помощью создают ботов-помощников для вашей команды.

Подготовка

Прочитайте вначале об аккаунтах для ботов и затем создайте такой аккаунт. Вы получите API Token. Сохраните его в секрете! Свой токен я прописал в .bashrc, чтобы он не попал в систему хранения версий при разработке приложения. А получить его можно будет так:

slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))
Затем выполните команду установки необходимого модуля:

pip install slackclient и также у меня установлено несколько других модулей.

Я взял за основу код из starterbot, который нашёл в этой отличной статье. Разработать бота на его основе очень просто, так как в нём уже прописано всё необходимое, включая начальную настройку, прослушивание упоминаний бота и перехват сообщений боту.

Теперь осталось получить BOT ID и также сохранить в скрипте логина (у меня он хранится в .bashrc):

$ python get_botid.py
Bot ID for 'pybitesbot' is XYZ

# .bashrc
export SLACK_BOT_TOKEN=ABC # первый этап
export BOT_ID=XYZ # получен из предыдущей команды
export WEATHER_API=123 # нужен будет для командных скриптов, об этом ниже

Действия бота

Я написал несколько скриптов, отвечающих на разные команды бота. Они лежат в папке commands проекта. Такая структура папок очень удобна для расширения списка команд в будущем.

В главном скрипте я загружаю все эти скрипты команд:

from commands.mood import get_mood # just a silly one
from commands.special import celebration
from commands.articles import get_num_posts
from commands.challenge import create_tweet
from commands.weather import get_weather # bot reports more sun and later sunset Spain vs Australia (sorry Julian haha)

# затем добавляем их в словарь COMMANDS
cmd_names = ('mood', 'celebration', 'num_posts', '100day_tweet', 'weather')
cmd_functions = (get_mood, celebration, get_num_posts, create_tweet, get_weather)
COMMANDS = dict(zip(cmd_names, cmd_functions))

Затем я переопределил (имеющуюся) функцию handle_command для того, чтобы бот отвечал на разные команды.

def handle_command(cmd, channel):

cmd = cmd.split()
cmd, args = cmd[0], cmd[1:]

if cmd in COMMANDS:
if args:
response = COMMANDS[cmd](*args)
else:
response = COMMANDS[cmd]()
else:
response = ('Not sure what you mean? '
'I can help you with these commands:\n'
'{}'.format('\n'.join(cmd_names)))

slack_client.api_call("chat.postMessage", channel=channel,
text=response, as_user=True)

Затем в main эта команды запускает цикл:

if slack_client.rtm_connect():
...

Деплой

Закончим на этом с кодом. На сервере я запускаю бота с помощью nohup чтобы он постоянно работал:

nohup python3 pybitesbot.py &
Обновлено: я нашёл маленькую ошибку, приводящую к непредвиденной остановке бота, поэтому написал небольшой скрипт для решения проблемы:

$ cat slackbot.sh
cmd="$HOME/bin/python3/bin/python3.5 pybitesbot.py"
until $cmd; do
echo "Slack bot crashed with exit code $?. Respawning.." >&2
sleep 1
done

$ ./slackbot.sh
StarterBot connected and running!

... нажимаем ctrl + c

^CTraceback (most recent call last):
File "pybitesbot.py", line 44, in
time.sleep(READ_WEBSOCKET_DELAY)
KeyboardInterrupt

Slack bot crashed with exit code 1. Respawning.. => thanks for the shell script
StarterBot connected and running!

# это была демонстрация, я всё ещё использую nohup для выхода из командной оболочки
$ nohup slackbot.sh &

Результат

Как видите, бот работает и с ним иногда очень весело:

Создаём Slack бота на Python

Что дальше?

Этот простейший пример с ботом заставил меня задуматься о том, как сделать по-настоящему умного бота для нашего сообщества. И почему бы не сделать бота, помогающего начинающим в решении их проблем с Python? Это было бы очень круто!

Я планирую написать продолжение этого примера, когда продвинусь немного в этом направлении…

Полный код доступен здесь. Форкайте его и начинайте разработку собственного крутого бота!

По материалам «How to Build a Simple Slack Bot»

Leave a Comment