1
/
5

JavaによるSlack Bot の実装

Photo by Tracy Adams on Unsplash

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

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

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

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

この記事で実現するもの

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

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

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

アプリ作成

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


OAuth & Permissionsの設定

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


Scope - Bot Token Scopes


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


Tokenの確認


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

Eventの購読

有効化


有効な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();
    }
}

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

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

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

URL検証イベントの処理


購読するイベントの設定


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

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

※転載元の情報は上記執筆時点の情報です。

上記執筆後に転載元の情報が修正されることがあります。


JavaによるSlack Bot の実装 - Qiita
Hubot, Microsoft BotFrameworkなど選択肢は複数ありますが、Slackが提供するフレームワークboltを使用して既存のアプリをSlackに対応させる方法・手順について記載します。 Slackアプリを作成するための、nodejsで実装されたフレームワーク なんと言ってもSDKの形で、JavaScript, python, javaなどにバインディングされているのが良いと思います。 チュートリアル、入門資料も豊富にあり実装へのハードルは他のフレームワークより低いと考えられます。 Cr
https://qiita.com/rei-yamamoto/items/caa63b511169cb020d29


執筆者のページはこちら

株式会社豆蔵's job postings

Weekly ranking

Show other rankings
Like 河野 竜佑's Story
Let 河野 竜佑's company know you're interested in their content