既存のアプリケーションをSlackに対応させるには?
Hubot, Microsoft BotFrameworkなど選択肢は複数ありますが、Slackが提供するフレームワークboltを使用して既存のアプリをSlackに対応させる方法・手順について記載します。
Slack Boltフレームワークとは?フレームワークの選定経緯
Slackアプリを作成するための、nodejsで実装されたフレームワーク
なんと言ってもSDKの形で、JavaScript, python, javaなどにバインディングされているのが良いと思います。
チュートリアル、入門資料も豊富にあり実装へのハードルは他のフレームワークより低いと考えられます。
この記事で実現するもの
以下の機能を備えたSlackアプリを構築する
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確認と同じエンドポイントに送信されます。
- にデシアライズtype=event_callback
を識別し、MessagePayload
- 入力値などから返答メッセージを構築
- `chatPostMessageでメッセージを送信
シンプルですね。
凝ったメッセージを作成するに、Block kitを使用します。
Links
https://api.slack.com/lang/ja-jp/hello-world-bolt
https://slack.dev/java-slack-sdk/guides/ja/composing-messages
※転載元の情報は上記執筆時点の情報です。
上記執筆後に転載元の情報が修正されることがあります。
執筆者のページはこちら