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

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

Разработка: Создаём Slack бота на Python
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 <module>
    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»
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.