amazing...
Slack SDK for Javaとは?
Slack SDK for Java supports the Slack platform in a Java idiomatic way. The SDK written in Java so developers can use it in any JVM language including Kotlin, Groovy, and Scala.
⇧ Slack platformをサポートって言われてもね...
Within the SDK, there are two different modules:
- Bolt for Java, which is a framework with a simple API that makes it easy to write modern Slack apps in Java.
- Slack API Client, for when you need a more customized approach to building a Slack app in Java.
⇧ 2種類あるらしく、
If what you want to do is call Slack APIs in your existing services, we recommend using only the Slack API Client. If instead, you’re developing a new modern and interactive Slack app, we recommend Bolt for it. The framework enables developers to focus on the essential parts of their apps without being bothered by trifles.
⇧ ということで、単純にSlack APIを呼び出すだけならば、「Slack API Client」を使うのが推奨らしい。
「Slack API Client」を使うには
⇧ Java 8以上が必要。
さらに、
To call a Web API method such as chat.postMessage, a MethodsClient instance needs to be initialized with a token. A token usually begins with xoxb-
(bot token) or xoxp-
(user token). You get them from each workspace that an app has been installed. The Slack App configuration pages help you get your first token for your development workspace.
⇧ tokenってものが必要らしいんだけど、
⇧ 上記の説明によると、
- Bot tokens
- User tokens
- App-level tokens
の3種類あるっぽいんだけど、どれを使えばよいのかがいまいち判然としない。
⇧ 上記サイト様を参考に利用してみる。
■アプリの作成
Slackの該当するワークスペースにログイン後、ブラウザで以下のページにアクセス。
適当な「App Name」を決めて、Slackのワークスペースを選択して、「Create App」ボタンを押下。
■Scopeの設定
引き続き、「OAuth & Permissions」を選択。
「Scopes」で「Bot Token Scopes」って方から「Add an OAuth Scope」を押下。
「chat:write」を選択。
「User Token Scopes」の方も同様に選択して追加する。
■アプリをワークスペースにインストール
「Install to Workspace」を押下。
「許可する」を押下。
tokenが作成されました。
■チャンネルにアプリを追加
SlackのUIが変わったのか分からんけど、作成してたアプリが選択できるようになってたので、選択し、プルダウンをクリック。
「チャンネルにこのアプリを追加する」を選択。
メッセージを通知したいチャンネルを選択。
「追加」を押下。
チャンネル側で追加されたメッセージが表示されてればOK。
■Javaからメッセージを送ってみる
とりあえず、Eclipseで「Spring スターター・プロジェクト」を作成。
プロジェクトが作成できたらば、build.gradleに「Slack API」を利用するための依存関係を追加。
■slack-api/build.gradle
plugins { id 'org.springframework.boot' version '2.7.4' id 'io.spring.dependency-management' version '1.0.14.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { //implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' annotationProcessor 'org.projectlombok:lombok' implementation("com.slack.api:slack-api-client:1.25.1") testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
ファイルの追加とファイルへ追記。
application.propertiesへは、tokenを設定。
■slack-api/src/main/java/com/example/demo/service/SlackServiceImpl.java
package com.example.demo.service; import java.io.IOException; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.slack.api.Slack; import com.slack.api.methods.MethodsClient; import com.slack.api.methods.SlackApiException; import com.slack.api.methods.request.chat.ChatPostMessageRequest; import com.slack.api.methods.response.chat.ChatPostMessageResponse; import lombok.extern.log4j.Log4j2; @Log4j2 @Service public class SlackServiceImpl { @Value("${slack.token.user}") private String slackApiTokenUser; @Value("${slack.token.bot}") private String slackApiTokenBot; public void sendMessageByBot() { Slack slack = Slack.getInstance(); // Initialize an API Methods client with the given token MethodsClient methods = slack.methods(slackApiTokenBot); // Build a request object ChatPostMessageRequest request = ChatPostMessageRequest.builder() .channel("#slack-api-test") // Use a channel ID .text(":wave: Hi from a bot written in Java!") .build(); // Get a response as a Java object try { ChatPostMessageResponse response = methods.chatPostMessage(request); log.info(response); } catch (IOException | SlackApiException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } public void sendMessageByUser() { Slack slack = Slack.getInstance(); // Initialize an API Methods client with the given token MethodsClient methods = slack.methods(slackApiTokenUser); // Build a request object ChatPostMessageRequest request = ChatPostMessageRequest.builder() .channel("#slack-api-test") // Use a channel ID .text(":wave: Hi from a user written in Java!") .build(); // Get a response as a Java object try { ChatPostMessageResponse response = methods.chatPostMessage(request); log.info(response); } catch (IOException | SlackApiException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } }
■slack-api/src/main/java/com/example/demo/controller/SlackController.java
package com.example.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.example.demo.service.SlackServiceImpl; @RestController public class SlackController { @Autowired private SlackServiceImpl slackServiceImpl; @GetMapping(value="/message/bot") public void sendMessageByBot() { slackServiceImpl.sendMessageByBot(); } @GetMapping(value="/message/user") public void sendMessageByUser() { slackServiceImpl.sendMessageByUser(); } }
⇧ で、保存したら実行し、
ブラウザでコントローラークラスのエンドポイントにアクセスすると、
Slack側に通知が飛びました。
参考サイト様のように、curlコマンドで日本語のテキストをSlackに通知すると、Slack側で変な風に変換されてしまったけども...
毎度モヤモヤ感が半端ない...
今回はこのへんで。