Также опубликовано на blog.karenying.com.
Мой коллега Али всегда забывает пообедать во время работы. Поскольку мы работаем удаленно, мне нужно было какое-то автоматическое напоминание, чтобы пинговать его. Вместо того, чтобы использовать собственное решение Slack без кода, напоминания Slack, я решил создать и развернуть его с нуля, потому что #QuarantineBoredom.
Как и любой здравомыслящий человек, я погуглил «учебник по Slack-ботам», «как создать Slack-бот с нуля» и прочитал множество руководств, прежде чем погрузиться в них. Меня интересовала реализация Node.js так как это то, с чем я больше всего знаком. Мне также нужна была относительно простая конфигурация, которая не требовала бы создания 10 разных учетных записей.
В конце концов я остановился на этом уроке от freeCodeCamp. В основном этот пост будет о том, как я взял реализацию Bolaji Ayodeji и заставил ее работать на меня. Мы будем писать Slack-бота, который будет отправлять сообщения по расписанию. В отличие от статьи Айодеджи, пользователи не могут взаимодействовать с этим ботом.
В этом посте также будет рассказано о том, что я развернул его на Heroku. Большинство руководств по Slack-ботам пропускают этот последний шаг. Они действуют так, как будто вы хотите запускать его локально каждый раз, когда хотите его использовать 🙄
Предварительные требования
В этом руководстве предполагается, что вы знакомы с Javascript, Node.js, npm и GitHub. Все хорошо? Приступим 👍🏼
Регистрация в Slack
Прежде чем мы начнем писать код, мы должны зарегистрировать наше приложение в Slack!
Убедитесь, что вы вошли в Slack и перейдите к Создать приложение Slack (классическое). Очень важно создать классическое приложение, потому что пакет npm, который мы собираемся использовать, slackbots, работает только с токенами, сгенерированными из старого API приложения Slack. Это НЕ будет работать, если вы перейдете на https://api.slack.com/apps и нажмете Создать новое приложение.
Введите желаемое имя приложения (я назвал свое «ланч-бот») и выберите рабочее пространство, в которое вы хотите добавить новое приложение. Нажмите Создать приложение.
На странице Основная информация прокрутите вниз до Отображать информацию. Это самое интересное! Настройте внешний вид вашего бота. Вы также можете сделать / изменить это позже.
Затем в верхней части страницы Основная информация в разделе Создание приложений для Slack разверните Добавить функции и возможности. Выберите карточку Боты. Мы хотим, чтобы наш бот мог отправлять сообщения, поэтому нам нужно Добавить старого пользователя бота. Заполните два обязательных поля: Отображаемое имя и Имя пользователя по умолчанию. Установите для параметра Всегда показывать моего бота как онлайн значение true.
Вернитесь к Базовая информация ›Создание приложений для Slack, разверните Установите приложение в рабочую область и нажмите Установить приложение в рабочую область. Нажмите Разрешить.
Теперь перейдите в свою рабочую область Slack: [your-workspace-name] .slack.com. На левой боковой панели прокрутите вниз, пока не увидите заголовок Приложения. Щелкните значок + справа и найдите только что созданное приложение. Нажмите на свое приложение, и оно появится под заголовком Приложения со статусом онлайн!
Отлично, мы на этом закончили настройку Slack. К части кодирования.
Кодирование
Приступаем к настройке
Как уже упоминалось, мы будем использовать Node.js и npm. Мы также хотим позже интегрировать Heroku x GitHub, поэтому давайте начнем с пустого каталога и
$ git init
Далее нам нужно инициализировать npm:
$ npm init
Продолжайте нажимать Enter, пока не сгенерируете свой package.json
.
Мы будем использовать три пакета npm: slackbots, dotenv и node-cron:
$ npm i slackbots $ npm i dotenv $ npm i node-cron
Затем создайте имя поля .env
. Здесь мы будем хранить токен авторизации нашего приложения Slack. Вернитесь на страницу конфигурации вашего приложения. Щелкните эту ссылку и найдите свое приложение. Затем перейдите в Функции ›OAuth и разрешения. Мы хотим скопировать токен доступа OAuth пользователя бота.
В .env
создайте переменную среды:
Поскольку мы продвигаем этот проект на GitHub, рекомендуется хранить свои токены авторизации в безопасности! Пакет dotenv npm позволяет нам работать с нашей переменной окружения 🙂
Наконец, давайте создадим index.js
и настроим наши пакеты. Здесь будет жить вся логика нашего бота.
Добавьте стартовый скрипт в package.json
в "scripts"
:
"start": "node index.js"
Таким образом, мы можем запустить бота с npm start
.
Создание бота
Мы будем использовать пакет slackbots npm. Хотя вы можете создать бота Slack, используя Slack API, этот пакет обрабатывает все вызовы API за нас. С помощью Slackbots мы можем написать нашего бота менее чем за 30 строк.
Чтобы запустить бота:
Убедитесь, что атрибут name в точности соответствует вашему зарегистрированному имени приложения (а не имени пользователя бота), включая регистр.
Пусть бот уведомит нас, когда он запустится:
Теперь, если вы запустите npm start
, вы должны получить уведомление о запуске вашего бота! Привыкайте к этому, потому что вы будете часто видеть это сообщение 😅
Ура, связь работает!
Теперь мы хотим запланировать, чтобы наш бот отправлял сообщение в определенное время. Вы можете проверить все методы Slackbots на его странице npm. Нам нужен именно postMessageToChannel
. Я обнаружил, что для работы postMessageToUser
пользователь должен добавить приложение в свою рабочую область (и оно должно отображаться в разделе Приложения). Таким образом, мы можем удивить ваших коллег, добавив их в группу, в которой публикует ваш бот, без необходимости добавлять приложение!
Чтобы сообщение было отправлено в нужное время, мы будем использовать пакет npm node-cron. Синтаксис планировщика можно найти здесь. Я преобразовал эту логику в другую функцию под названием createJob
. Вот что я добавил для своего бота:
'32 12 * * 1–5'
означает, что это сообщение будет отправляться каждый будний день в 12:32, как раз к обеду! Убедитесь, что вы добавили свой часовой пояс, потому что без этой конфигурации node-crone работает в UTC. Это - это список всех допустимых строк часовых поясов, которые принимает код узла.
Последняя часть - вызвать createJob
при запуске бота:
Вот и все! Вы только что создали своего собственного Slack-бота, используя менее 30 строк кода 🎉 Вы можете поиграть, когда и кому должны отправляться сообщения, для дополнительного тестирования и экспериментов, если хотите. Когда будете готовы, отправьте свой код в репозиторий GitHub и приступайте к развертыванию на Heroku!
Развертывание
Heroku
Войдите в систему или создайте учетную запись Heroku (это бесплатно). На панели управления нажмите Создать ›Создать новое приложение. Назовите свое приложение, выберите регион и нажмите Создать приложение. В разделе Метод развертывания выберите GitHub. Свяжите свою учетную запись GitHub, если вы еще этого не сделали. Найдите репозиторий своего бота и нажмите Подключиться.
Затем в разделе Настройки ›Параметры конфигурации› Показать переменные конфигурации введите BOT_TOKEN
в качестве КЛЮЧА и то же значение из вашего .env
файла в качестве ЗНАЧЕНИЕ. Нажмите Добавить, чтобы сохранить.
Перейдите в раздел Развертывание ›Развертывание вручную и нажмите Развернуть ветвь. Через несколько секунд ваш бот получит пинг, сообщающий, что ваш бот запускается! Очень волнующе.
Планировщик Heroku
Если вы использовали Heroku раньше, то знаете, что у их уровня бесплатного пользования есть ограничения: а именно: ваше приложение переходит в спящий режим после 30 минут бездействия. Это было бы хорошо, за исключением того, что у нашего приложения нет интерфейса. Если вы не развертываете приложение каждый раз вручную, оно будет постоянно спать по прошествии первых 30 минут. Здесь на помощь приходит Heroku Scheduler.
В случае с ланч-ботом мы хотим, чтобы ланч-бот просыпался до 12:32 каждый будний день, чтобы задание cron могло сработать и отправить сообщение.
На панели управления Heroku вашего приложения перейдите в Ресурсы ›Надстройки, найдите и выберите Heroku Scheduler. Нажмите Предоставление.
Heroku Scheduler должен появиться в разделе Надстройки. Нажмите на имя, и оно должно перенаправить вас на панель управления планировщиком. Нажмите Создать вакансию. Введите частоту, с которой вы хотите, чтобы ваше приложение запускалось. Для меня имело смысл выбрать Ежедневно в… 16:30 по всемирному координированному времени. Планировщик должен запускать команду npm start
, поэтому обязательно введите ее. Нажмите Сохранить работу, и все готово!
С помощью Heroku Scheduler мы обошли проблему бесплатного уровня, когда приложение засыпало. Предостережение: нет гарантии, что Heroku Scheduler будет выполняться вовремя. При создании задания есть отказ от ответственности Задания выполняются в пределах временного окна, максимально приближенного к расписанию. По моему опыту работы с обеденным роботом, были случаи, когда работа выполнялась только через 2 часа. Тогда наша cron-задача больше не работает, и наш бот не может уведомить Али о том, чтобы он пообедал ☹️ К сожалению, это всего лишь следствие бесплатного использования Heroku.
Еще одно примечание: хотя Heroku утверждает, что ваше приложение переходит в спящий режим после 30 минут бездействия, Heroku также довольно часто случайным образом запускает ваше приложение:
Если вы не хотите, чтобы ваш бот рассылал спам, вам, вероятно, следует удалить сообщение о запуске самому себе.
В любом случае ура! У вас есть работающий Slack-бот. Ниже я привел несколько хитростей, чтобы проверить, не возникли ли у вас проблемы. Вот и мое настоящее репозиторий GitHub для обеденного бота.
Исправление проблем
На эти вопросы следует ответить да ✅
- Вы обязательно создали Классическое приложение Slack?
- Ваш бот отображается в разделе Приложения?
- Вы установили часовой пояс в
cron.schedule()
? - Вы использовали точное название своего приложения в
new SlackBot()
? - Вы настраивали свои переменные Heroku?
- Вы установили правильное время UTC для своей работы планировщика Heroku?
Заключение
В этом посте мы использовали пару пакетов npm, чтобы собрать бота Slack менее чем за 30 строк кода. Мы развернули приложение на Heroku и использовали Heroku Scheduler, чтобы вовремя разбудить бота для отправки ежедневного сообщения. Учебник, на котором я основываюсь на этом, более подробно описывает, как сделать вашего бота интерактивным. Обязательно посмотрите, если вам это интересно.
Это все, что у меня есть для тебя. Идите вперед и раздражайте (или впечатляйте) своих коллег 😛
Спасибо за прочтение. Удачного кодирования!