1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

JavaによるSlack Bot の実装

既存のアプリケーションをSlackに対応させるには?

Hubot, Microsoft BotFrameworkなど選択肢は複数ありますが、Slackが提供するフレームワークboltを使用して既存のアプリをSlackに対応させる方法・手順について記載します。

Slack Boltフレームワークとは?フレームワークの選定経緯

Slackアプリを作成するための、nodejsで実装されたフレームワーク
なんと言ってもSDKの形で、JavaScript, python, javaなどにバインディングされているのが良いと思います。
チュートリアル、入門資料も豊富にあり実装へのハードルは他のフレームワークより低いと考えられます。

この記事で実現するもの

以下の機能を備えたSlackアプリを構築する

  • Event(ユーザとの通常の対話)を処理する

Slackアプリを登録する(Slack側)

アプリ作成

Create New App より新規アプリを登録します。

image.png

OAuth & Permissionsの設定

Permissionを設定します。
設定は一例ですので必要に応じて設定を変更してください。

image.png

Scope - Bot Token Scopes

image.png

Workspace にアプリをインストール

image.png

Tokenの確認

image.png

プログラム側でUser OAuth Token, Bot User UAuth Tokenは使用します。

Eventの購読

有効化

image.png

有効なURLであるかを確認するリクエストを処理する必要があります。

Java (Spring)

Restを処理できればなんで良いですが、ここではSpringを使用します。

Maven

<dependency>
    <groupId>com.slack.api</groupId>
    <artifactId>bolt</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>com.slack.api</groupId>
    <artifactId>slack-api-client</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>com.slack.api</groupId>
    <artifactId>slack-api-model</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>com.slack.api</groupId>
    <artifactId>bolt-servlet</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>com.slack.api</groupId>
    <artifactId>slack-app-backend</artifactId>
    <version>1.7.1</version>
</dependency>
SlackController.java
@PostMapping("/event")
public String postSlackEvent(@RequestBody String args) throws Exception {
    Map<String, Object> argsMap = gson.fromJson(args, new TypeToken<HashMap<String, Object>>() {}.getType());
    switch (argsMap.get("type").toString()) {
        case "url_verification":
            return argsMap.get("challenge").toString();
        default:
            throw new Exception();
    }
}

下記の形式のJSONを受信するのでtype=url_verification の場合に、challengeを単純に返答するだけでOK

{
  "token": "aksfaksdjfadfTAJq46UTBUv",
  "challenge": "mheVygaHsfalksfjlasdkfjalskdfj940AeLzE9hNZL5",
  "type": "url_verification"
}

当然ながら、インターネット(Slack)から接続できる必要があります。
ngrokが便利すぎる

URL検証イベントの処理

image.png

購読するイベントの設定

image.png

設定は一例ですので必要に応じて設定を変更してください。
image.png
Save Changesを忘れずに。

Event処理

単純なエコーを実装します

SlackController.java
@PostMapping("/event")
public String postSlackEvent(@RequestBody String args) throws Exception {
    Map<String, Object> argsMap = gson.fromJson(args, new TypeToken<HashMap<String, Object>>() {}.getType());
    switch (argsMap.get("type").toString()) {
        case "url_verification":
            return argsMap.get("challenge").toString();

        case "event_callback": 
            var msg = gson.fromJson(args, MessagePayload.class);
            if (!StringUtils.isEmpty(msg.getEvent().getBotId())) {
                return "";
            }
            var who = msg.getEvent().getUser();
            var what = msg.getEvent().getText();          
            var channel = msg.getEvent().getChannel();
            var rmsg = String.format("Echo: %s (%s)", what, who);
            Slack.getInstance().methods(BOT_USER_OAUTH_TOKEN)
                .chatPostMessage(r->r.channel(channel).text(rmsg));
            return "";            
        default:
            throw new Exception();
    }
}

EventデータもURL確認と同じエンドポイントに送信されます。

  1. type=event_callbackを識別し、MessagePayloadにデシアライズ
  2. 入力値などから返答メッセージを構築
  3. `chatPostMessageでメッセージを送信

シンプルですね。
凝ったメッセージを作成するに、Block kitを使用します。

Links

https://api.slack.com/lang/ja-jp/hello-world-bolt
https://slack.dev/java-slack-sdk/guides/ja/composing-messages

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?