Некоторое время назад я создал SlackBot. Когда я начал его создавать, я не нашел ни одного «единого руководства», которое бы привело меня от самого начала к законченному, работающему приложению. Мы надеемся, что этот пост поможет любому создать SlackBot с использованием узла и JavaScript, без особого опыта программирования.

В качестве простого и понятного примера давайте создадим бота, который может рассказывать нам случайные анекдоты.

Часть 1. Настройка проекта

Шаг 1. Создайте своего бота в Slack

Неплохо создать отдельную учетную запись Slack для тестирования ботов. Тогда вам не нужно беспокоиться о публикации чего-то случайного на общем канале вашей команды Slack (я сделал это 😳 😳).

После настройки учетной записи Slack перейдите по адресу https://my.slack.com/services/new/bot, чтобы создать нового бота. Следуйте инструкциям по установке. Я назову своего бота jokesbot и выберу 😂 в качестве фотографии профиля своего бота. Убедитесь, что эта страница открыта, токен API вам понадобится позже!

Шаг 2. Создайте проект узла

Войдите в свой терминал и настройте репозиторий git для своего Slackbot:

mkdir jokes-bot
cd jokes-bot
git init

Находясь в каталоге jokes-bot, добавьте файл .gitignore и добавьте к нему node_modules, набрав в терминале следующее:

echo node_modules > .gitignore

Чтобы создать проект узла, запустите npm init из командной строки и выполните шаги настройки (я просто нажимал клавишу ввода для каждого шага).

Теперь у вас есть проект узла!

Шаг 4. Добавьте Slackbots API

В этом проекте мы будем использовать этот API, чтобы упростить задачу: https://github.com/mishk0/slack-bot-api

Давайте добавим эту библиотеку в наш проект, набрав в терминале:

npm install --save slackbots

Зафиксируйте свой код и отправьте его на GitHub. Вам нужно будет создать репозиторий GitHub и поместить туда свой код. Он нам понадобится на GitHub, чтобы мы могли развернуть наш jokesbot с Heroku, как только мы закончим.

Теперь мы готовы заняться кодированием! 🤓

Часть 2: Заставляем нашего бота говорить

Шаг 1. Начните использовать Slackbots API

Откройте проект узла в своем любимом текстовом редакторе и создайте файл index.js.

У Slackbots API есть отличный стартовый код в файле README:

Скопируйте и вставьте приведенный выше код из README Slackbots API в свой index.js файл.

Мы почти готовы поговорить с нашим ботом-шутником!

Шаг 2. Добавьте собственный токен Slackbot

Нам нужно добавить токен Slackbot, который соответствует нашему боту для шуток. Но вместо того, чтобы отправлять наш токен в GitHub для всеобщего обозрения, давайте сохраним его в безопасном месте. Этот токен можно хранить в нашем .bash_profile файле.

Зайдите в свой .bash_profile и добавьте свой ключ так:

export JOKES_BOT_TOKEN="put your key here"

Сохраните этот файл и обновите свой index.js файл, чтобы использовать этот новый токен:

const envKey = process.env.JOKES_BOT_TOKEN
var bot = new SlackBot({
  token: envKey,
  name: “Jokes Bot”
})

Теперь в каталоге проекта в терминале введите node index.js. Это запустит ваш проект локально.

Зайдите в Slack, и вы увидите, что ваш бот-шутник пишет «мяу!» в вашем общем канале!

Несмотря на то, что я люблю кошек, я хочу, чтобы мой бот делал больше, чем мяукал. Давайте запрограммируем нашего бота, чтобы он получал шутки из api шуток и размещал их вместо них.

Часть 3. Заставляем нашего бота рассказывать анекдоты

Шаг 1. Общение с ботом напрямую

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

bot.on("message", msg => {
  switch (msg.type) {
  case "message":
    if (msg.channel[0] === "D" && msg.bot_id === undefined) {
      bot.postMessage(msg.user, "hi", { as_user: true })
    }
    break
  }
})

Этот код заставит бот прослушивать DM и отвечать пользователю «привет». Чтобы снова запустить проект, сохраните файл и в терминале убейте текущего запущенного бота, нажав ctrl+c. Введите node index.js еще раз и попробуйте поговорить со своим ботом. В этот момент он должен сказать «привет»!

Шаг 2. Подключение к API

Мы будем использовать API icanhazdadjoke, чтобы получить несколько отцовских шуток (только лучшие шутки для нашего бота!). Этот API не требует аутентификации, поэтому его легко настроить и запустить. Для работы с API мы можем использовать библиотеку request. Для установки наберите npm install --save request в терминале. Вверху нашего index.js файла импортируйте эту библиотеку, добавив var request = require("request").

Теперь добавьте следующую функцию, чтобы мы могли взаимодействовать с API:

const getRandomJoke = (callback, user) => {
  return request("https://icanhazdadjoke.com/slack", (error, response) => {
    if (error) {
      console.log("Error: ", error)
    } else {
      let jokeJSON = JSON.parse(response.body)
      let joke = jokeJSON.attachments[0].text
      return callback(joke, user)
    }
  })
}

Эта функция сделает запрос к API icanhazdadjoke и запросит случайную шутку. Разобранный response.body выглядит так:

{ attachments:
  [ { fallback: 'Did you hear about the guy whose whole left side was cut off? He\'s all right now.',
  footer: '<https://icanhazdadjoke.com/j/08EQZ8EQukb|permalink> - <https://icanhazdadjoke.com|icanhazdadjoke.com>',
  text: 'Did you hear about the guy whose whole left side was cut   off? He\'s all right now.' } ],
response_type: 'in_channel',
username: 'icanhazdadjoke' 
}

Все, что нас интересует в этом JSON, - это текст первого вложения, поэтому мы можем извлечь его с помощью let joke = jokeJSON.attachments[0].text в нашем getRandomJoke методе. Получив этот текст, мы можем выполнить метод обратного вызова, который будет отвечать за отправку сообщения в Slack. Этот метод будет выглядеть так:

const postMessage = (message, user) => {
  bot.postMessage(user, message, { as_user: true })
}

В теле bot.on на предыдущем шаге теперь мы можем заменить строку bot.postMessage(msg.user, “hi”, {as_user:true}) на getRandomJoke(postMessage, msg.user). Передав функцию postMessage в качестве параметра методу getRandomJoke, метод getRandomJoke может вызвать функцию postMessage после того, как он закончит получение шутки из API.

Вернитесь в Slack и попробуйте что-нибудь сказать боту-шутнику. Теперь он должен ответить такой остроумной папиной шуткой!

Часть 4: Развертывание нашего бота с Heroku

Часть 1: Создание нового приложения в Heroku

Если у вас еще нет учетной записи Heroku, создайте ее на www.heroku.com. После настройки учетной записи перейдите в раздел Личные приложения на панели управления (https://dashboard.heroku.com/apps). В правом углу выберите Создать› Создать новое приложение . Следуйте инструкциям по настройке, чтобы создать новое приложение. После создания приложения подключите его к GitHub, выбрав GitHub в качестве метода развертывания и выполнив поиск репозитория git:

Щелкните «Подключиться». Ниже вы можете выбрать «включить автоматическое развертывание». Теперь каждый раз, когда вы нажимаете на мастер, новая версия вашего бота-шутника будет развернута и готова к использованию в Slack.

Шаг 2: Совместное использование переменных конфигурации с Heroku

Нам нужно поделиться токеном нашего бота с Heroku, чтобы он смог развернуть нашего бота для нас. Для этого зайдите в настройки и нажмите «Показать переменные конфигурации». Добавьте свой токен для своего бота-шутника, который вы получили от Slack, вот так:

Шаг 3: Добавление Procfile

Поскольку Heroku по умолчанию настроен на развертывание веб-страниц, нам нужно добавить еще одну вещь, чтобы это работало. Перейдите в свой проект и создайте новый файл с именем Procfile. В этом файле добавьте эту строку worker: node index.js. Сохраните этот файл и отправьте его на GitHub. Последнее, что нужно сделать, это перейти на панель управления Heroku, выбрать Resources и убедиться, что ваш «рабочий» дино включен, а ваш «веб-дино» выключен (см. Ниже).

Вот и все! Ваш бот-шутник должен быть в рабочем состоянии. Каждый раз, когда вы болтаете со своим ботом, он ответит отцовской шуткой:

Посмотрите мое репозиторий на GitHub с готовым продуктом: https://github.com/astr0-4/jokes-bot. Дайте мне знать, если у вас возникнут какие-либо вопросы, в комментариях ниже!