Slack SDK for JavaでJavaのプログラミングからSlackへメッセージを通知してみる

nazology.net

amazing...

Slack SDK for Javaとは?

github.com

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.

https://github.com/slackapi/java-slack-sdk

⇧ Slack platformをサポートって言われてもね...

Slack SDK for Javaは、

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.

https://github.com/slackapi/java-slack-sdk

⇧ 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.

https://github.com/slackapi/java-slack-sdk

⇧ ということで、単純にSlack APIを呼び出すだけならば、「Slack API Client」を使うのが推奨らしい。

「Slack API Client」を使うには

Javaで「Slack API Client」を使うには、

slack.dev

Java 8以上が必要。

さらに、

slack.dev

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.

https://slack.dev/java-slack-sdk/guides/web-api-basics

⇧ tokenってものが必要らしいんだけど、

api.slack.com

⇧ 上記の説明によると、

  • Bot tokens
  • User tokens
  • App-level tokens

の3種類あるっぽいんだけど、どれを使えばよいのかがいまいち判然としない。

zenn.dev

⇧ 上記サイト様を参考に利用してみる。

■アプリの作成

Slackの該当するワークスペースにログイン後、ブラウザで以下のページにアクセス。

api.slack.com

適当な「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側で変な風に変換されてしまったけども...

毎度モヤモヤ感が半端ない...

今回はこのへんで。