Также опубликовано на 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, чтобы вовремя разбудить бота для отправки ежедневного сообщения. Учебник, на котором я основываюсь на этом, более подробно описывает, как сделать вашего бота интерактивным. Обязательно посмотрите, если вам это интересно.

Это все, что у меня есть для тебя. Идите вперед и раздражайте (или впечатляйте) своих коллег 😛

Спасибо за прочтение. Удачного кодирования!