1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaによるSlack Bot の実装

Last updated at Posted at 2021-06-17

既存のアプリケーションを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

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?