Статьи

Сделать Slack-ботов на Java за считанные минуты

JBot Framework — LEGO для построения ботов.

JBot — это приложение с весенней загрузкой, которое позволяет Slack (скоро появятся Facebook и Twitter) за несколько минут. Он предоставляет весь стандартный код, необходимый для того, чтобы вы могли сразу же оживить своего бота .

Вы можете начать общаться со своим ботом всего за четыре простых шага:

  1. Клонировать этот проект $ git clone git@github.com:ramswaroop/jbot.gitи $ cd jbot/jbot-example.
  2. Создайте бот Slack и получите свой токен Slack.
  3. Вставьте токен в файл application.properties .
  4. Запустите приложение, запустив его JBotApplicationв IDE или через командную строку $ mvn spring-boot:run.

Вот и все.

Зачем использовать JBot для Slack?

  • Предоставляет вам весь стандартный код, который обрабатывает основные веб-сокеты и другие сложности.
  • Поддерживает несколько дополнительных событий в дополнение ко всем событиям, поддерживаемым Slack RTM API , что значительно упрощает вашу работу.
  • Прием и отправка сообщений так же просты, как определение controllerметода и вызова reply(), вам не нужно вручную анализировать какие-либо события или кодировать сообщения вручную перед отправкой.
  • Функция общения в JBot делает разговор с вашим ботом легким.
  • Хорошо протестирован с юнит-тестами.

Основное использование

Основная функция бота — получать и отвечать на сообщения. С этим комплектом получать сообщения так же просто, как написать простой контроллер и ответить на него, вызвав reply()метод, как показано ниже:

@Controller(events = EventType.MESSAGE)
public void onReceiveDM(WebSocketSession session, Event event) {
    reply(session, event, new Message("Hi, I am a Slack Bot!"));
}

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

Создание слабой интеграции с JBot

Вы можете интегрировать свои сервисы в Slack любым из следующих способов:

И Botkit в настоящее время поддерживает:

Боты взаимодействуют со Slack через RTM API или технически через веб-сокеты. Команды Рассечение не ничего , но GETи POSTвызовы для вашего приложения. Наконец, веб-хуки могут быть двух типов: входящие и исходящие. Входящие веб-заезды — это то, где вы извлекаетеPOST данные извне (т. Е. Свое приложение) в Slack, а исходящие веб-зацепки — это то, где отбрасывают POSTданные в конечную точку, указанную вами.

Настройка вашего приложения

Сначала необходимо вставить свои токены / URL-адреса в файл application.properties:

slackBotToken=xoxb-50014434-slacktokenx29U9X1bQ
slashCommandToken=X73Fv3tokenx242CdpEq
slackIncomingWebhookUrl=https://hooks.slack.com/services/T02WEBHOOKURLV7oOYvPiHL7y6

Основной пакет содержит все JBot кода. Вы можете создавать пакеты вне coreпакета и размещать там свой код. Сделать

  • Slack Bot ⇒ Расширить класс бота.
  • Обработчик команд косой черты ⇒ Аннотируйте свой класс с помощью Spring @Controllerи получите метод с требуемым @RequestMappingпутем, получающий набор параметров запроса, как показано в примере.
  • Slack Incoming Webhook ⇒ Просто POSTпозвоните в RichMessage всякий раз, когда вы хотите что-то сообщить своим пользователям Slack.
  • Slack Outgoing Webhook ⇒ То же, что и обработчик команд Slash.

Получение сообщений

Для ботов , вы получите сообщение как события . Почти для всех действий Slack запускает соответствующее событие для него. К сожалению, он не генерирует соответствующие события, когда кто-то напрямую отправляет сообщение боту (прямое сообщение) или упоминает бота на канале (например @bot). Он просто генерирует событие типа messageдля всех отправленных сообщений (непосредственно боту и каналам, в которых бот является участником).

Но угадайте, что вы сейчас в нужном месте — BotKit справится с этим за вас. Он поддерживает три дополнительные мероприятия EventType.DIRECT_MESSAGE, EventType.DIRECT_MENTIONи EventType.ACKв дополнении ко всем поддерживаемым в настоящее время гача событий . Первые два события говорят сами за себя, но EventType.ACKэто не что иное, как событие подтверждения, которое подтверждает доставку ранее отправленного сообщения.

Чтобы получать и анализировать слабые бот-события, вам нужно иметь следующее:

@Controller(events = {EventType.DIRECT_MENTION, EventType.DIRECT_MESSAGE})
public void onReceiveDM(WebSocketSession session, Event event) {
    if (event.getText().contains("hi")) {
        reply(session, event, new Message("Hi, I am " + slackService.getCurrentUser().getName()));
    }
}

Здесь вы делаете аннотацию метода с  аннотацией @Controller и передаете массив событий той аннотации, которую вы хотите прослушать. По умолчанию ваш контроллер будет прослушивать EventType.MESSAGEсобытия, если вы не укажете явные события.

Вы также можете добавить регулярные выражения к аннотации @Controller, например:

@Controller(events = EventType.MESSAGE, pattern = "([a-zA-Z ]{1,})(\\d+)([a-zA-Z ]{1,})")
public void onReceiveMessage(WebSocketSession session, Event event, Matcher matcher) {
    reply(session, event, new Message("First group: " + matcher.group(0) + "\n" +
            "Second group: " + matcher.group(1) + "\n" +
            "Third group: " + matcher.group(2) + "\n" +
            "Fourth group: " + matcher.group(3)));
}

При желании вы можете использовать matcherв качестве формального параметра в методе, если хотите работать со значениями, отправленными пользователем. Но следите за порядком параметров, как показано выше.

Отправка сообщений

В ботах вы можете использовать reply()метод, определенный в классе ботов , для отправки сообщений в Slack. Вам просто нужно установить текст, который вы хотите отправить в сообщении, и все остальное будет заботиться BotKit. Но вы можете установить другие поля, если хотите, например, idв сообщении.

Вот пример:

@Controller(events = EventType.MESSAGE)
public void onReceiveMessage(WebSocketSession session, Event event) {
    reply(session, event, new Message("Hi, this is a message!"));
}

Под капотом отправленное сообщение — не что иное, как json, как показано ниже:

{
    "id": 1,
    "type": "message",
    "channel": "C024BE91L",
    "text": "Hi, this is a message!"
}

ПРИМЕЧАНИЕ.  Event , Message и RichMessage являются общими классами. Не всегда все атрибуты, присутствующие в них, будут иметь значения. Другими словами, Slack отправляет разные ответы на разные события .

Диалоги

Это самая замечательная особенность BotKit — с этим вы можете буквально поговорить со своим ботом и поговорить. Ниже приведен пример того, как ваш бот назначает встречу для вашей команды, задавая простые вопросы один за другим.

разговоры вяло

    /**
     * Conversation feature of Botkit. This method is the starting point of the conversation (as it
     * calls {@link Bot#startConversation(Event, String)} within it. You can chain methods which will be invoked
     * one after the other leading to a conversation. You can chain methods with {@link Controller#next()} by
     * specifying the method name to chain with.
     *
     * @param session
     * @param event
     */
    @Controller(pattern = "(setup meeting)", next = "confirmTiming")
    public void setupMeeting(WebSocketSession session, Event event) {
        startConversation(event, "confirmTiming");   // start conversation
        reply(session, event, new Message("Cool! At what time (ex. 15:30) do you want me to set up the meeting?"));
    }

Вы можете начать разговор, позвонив startConversation(event, nextMethodName)в свой контроллер. Вы можете передать событие и имя следующего метода контроллера.

    /**
     * This method is chained with {@link SlackBot#setupMeeting(WebSocketSession, Event)}.
     *
     * @param session
     * @param event
     */
    @Controller(next = "askTimeForMeeting")
    public void confirmTiming(WebSocketSession session, Event event) {
        reply(session, event, new Message("Your meeting is set at " + event.getText() +
                ". Would you like to repeat it tomorrow?"));
        nextConversation(event);    // jump to next question in conversation
    }

This is your next method in the conversation. After your desired work is done, do not forget to call nextConversation(event) to jump to the next method. You can specify the next method to call in next attribute of the Controller annotation.

    /**
     * This method is chained with {@link SlackBot#confirmTiming(WebSocketSession, Event)}.
     *
     * @param session
     * @param event
     */
    @Controller(next = "askWhetherToRepeat")
    public void askTimeForMeeting(WebSocketSession session, Event event) {
        if (event.getText().contains("yes")) {
            reply(session, event, new Message("Okay. Would you like me to set a reminder for you?"));
            nextConversation(event);    // jump to next question in conversation  
        } else {
            reply(session, event, new Message("No problem. You can always schedule one with 'setup meeting' command."));
            stopConversation(event);    // stop conversation only if user says no
        }
    }

    /**
     * This method is chained with {@link SlackBot#askTimeForMeeting(WebSocketSession, Event)}.
     *
     * @param session
     * @param event
     */
    @Controller
    public void askWhetherToRepeat(WebSocketSession session, Event event) {
        if (event.getText().contains("yes")) {
            reply(session, event, new Message("Great! I will remind you tomorrow before the meeting."));
        } else {
            reply(session, event, new Message("Oh! my boss is smart enough to remind himself :)"));
        }
        stopConversation(event);    // stop conversation
    }

To end the conversation, call stopConversation(event) inside your controller method.

NOTE:

  • Only the first method in a conversation can define a pattern. A pattern attribute in theController annotation has no effect for rest of the methods in a conversation.
  • The first method in the conversation doesn’t need to call nextConversation(event), but the rest of the methods do need to.

Deploy to the Cloud

BotKit is Heroku-ready. To deploy, you need to perform the below simple steps:

  1. Clone this project $ git clone git@github.com:ramswaroop/jbot.git and $ cd jbot/jbot-example.
  2. Get your Slack bot token or slash command token or incoming webhook URL.
  3. Paste the above tokens/URLs in the application.properties file.
  4. Download Toolbelt for your system.
  5. $ heroku login — Log into Heroku.
  6. $ heroku create — Create an app on Heroku.
  7. $ git push heroku master — Push your code to Heroku.
  8. $ heroku ps:scale web=1 — Start your application.

This is just the tip of the iceberg. To explore/contribute/complain/donate, please visit JBot on GitHub or view the latest documentation on my blog.