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

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

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



執筆者のページはこちら

株式会社豆蔵's job postings

Weekly ranking

Show other rankings
If this story triggered your interest, go ahead and visit them to learn more