Недавно у меня был случай поработать с 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 &
Результат
Как видите, бот работает и с ним иногда очень весело:
Что дальше?
Этот простейший пример с ботом заставил меня задуматься о том, как сделать по-настоящему умного бота для нашего сообщества. И почему бы не сделать бота, помогающего начинающим в решении их проблем с Python? Это было бы очень круто!
Я планирую написать продолжение этого примера, когда продвинусь немного в этом направлении…
Полный код доступен здесь. Форкайте его и начинайте разработку собственного крутого бота!
По материалам «How to Build a Simple Slack Bot»
Разработчик: java, kotlin, c#, javascript, dart, 1C, python, php.
Пишите: @ighar. Buy me a coffee, please :).