JavaからSlackに、Blockを使ったメッセージを送る方法

こんにちは。 エキサイト株式会社の三浦です。

Slackではテキストだけのメッセージを送信することもできますが、Blockというものを使うことでよりリッチなメッセージを送ることもできます。

今回は、Javaを使ってSlackにBlockを使ったメッセージを送る方法を説明します

SlackのBlock

Blockは、Slackにメッセージを送るときに使うことのできる機能の一つで、テキストのみのメッセージに比べてよりリッチなメッセージを送ることが出来ます。

api.slack.com

Customize the order and appearance of information and guide users through your app's capabilities by composing, updating, sequencing, and stacking blocks — reusable components that work almost everywhere in Slack.

テキストのみでメッセージを送ると、以下のようになります。

テキストのみのメッセージ

Blockを使うと、以下のようにすることが出来ます。

Blockを使用したメッセージ

これはあくまで一部の機能を使った例で、これに加えて画像や各種入力フォームなど、様々なものを使うことが出来ます。

詳しくは、公式ドキュメントを見ると良いでしょう。

api.slack.com

Block Kit Builder を使えば、ブラウザ上で実際に整形してみることも出来ます。

api.slack.com

ここからは、実際にこれをJava上で実装する方法を紹介します。

JavaからSlackに、Blockを使ったメッセージを送る方法

前提として、JavaからSlackに何かしらのメッセージを送れるようにする必要があります。

やり方は以前以下の記事で紹介したので、こちらを御覧ください。

tech.excite.co.jp

さて、ここまでできれば、あとは難しくはありません。

上記記事でインストールしたSlackのライブラリにはBlock用のコードも含まれているので、それを利用するだけです。

上記記事では、テキストメッセージを送るコードを紹介しました。

try {
        Slack
                .getInstance()
                .methods("発行されたトークン")
                .chatPostMessage(req -> req
                        .channel("送信先チャンネル")
                        .text("テスト通知")
                );
 } catch (Exception e) {
        System.out.println(e.getMessage());
}

これに、Block用の設定を追加します。

try {
        Slack
                .getInstance()
                .methods("発行されたトークン")
                .chatPostMessage(req -> req
                        .channel("送信先チャンネル")
                        .text("テスト通知")
                        .blocks(this.createBlock()) // ここにBlock設定を追加する
                );
 } catch (Exception e) {
        System.out.println(e.getMessage());
}

// ...

private List<LayoutBlock> createBlock() {
    // ...
}

あとは、実際に作りたい内容に合わせてBlockのコードを組み立てていくだけです。

例えば今回の例で挙げたメッセージを実装してみます。

try {
        Slack
                .getInstance()
                .methods("発行されたトークン")
                .chatPostMessage(req -> req
                        .channel("送信先チャンネル")
                        .text("テスト通知")
                        .blocks(this.createBlock()) // ここにBlock設定を追加する
                );
 } catch (Exception e) {
        System.out.println(e.getMessage());
}

// ...

private List<LayoutBlock> createBlock() {
    return List.of(
            HeaderBlock
                    .builder()
                    .text(PlainTextObject.builder().text("テストタイトル").build())
                    .build(),
            DividerBlock.builder().build(),
            SectionBlock
                    .builder()
                    .fields(
                            List.of(
                                    MarkdownTextObject
                                            .builder()
                                            .text(String.format("*本文1タイトル*%n本文1"))
                                            .build(),
                                    MarkdownTextObject
                                            .builder()
                                            .text(String.format("*本文2タイトル*%n本文2"))
                                            .build()
                            )
                    )
                    .build(),
            SectionBlock
                    .builder()
                    .text(
                            MarkdownTextObject
                                    .builder()
                                    .text(String.format("*本文3タイトル*%nテキストテキストテキストテキストテキスト"))
                                    .build()
                    )
                    .build()
    );
}

一見少し長くて複雑なように見えますが、わかってしまえば簡単です。

まずは、先ほど紹介した Block Kit Builder を使って、作りたいメッセージを組み立てます。

app.slack.com

すると、以下のようなJSONが作られます。

{
    "blocks": [
        {
            "type": "header",
            "text": {
                "type": "plain_text",
                "text": "テストタイトル",
                "emoji": true
            }
        },
        {
            "type": "divider"
        },
        {
            "type": "section",
            "fields": [
                {
                    "type": "mrkdwn",
                    "text": "*本文1タイトル*\n本文1"
                },
                {
                    "type": "mrkdwn",
                    "text": "*本文2タイトル*\n本文2"
                }
            ]
        },
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "*本文3タイトル*\nテキストテキストテキストテキストテキスト"
            }
        }
    ]
}

これと、Javaのコードを比べてみましょう。

private List<LayoutBlock> createBlock() {
    return List.of(
            HeaderBlock
                    .builder()
                    .text(PlainTextObject.builder().text("テストタイトル").build())
                    .build(),
            DividerBlock.builder().build(),
            SectionBlock
                    .builder()
                    .fields(
                            List.of(
                                    MarkdownTextObject
                                            .builder()
                                            .text(String.format("*本文1タイトル*%n本文1"))
                                            .build(),
                                    MarkdownTextObject
                                            .builder()
                                            .text(String.format("*本文2タイトル*%n本文2"))
                                            .build()
                            )
                    )
                    .build(),
            SectionBlock
                    .builder()
                    .text(
                            MarkdownTextObject
                                    .builder()
                                    .text(String.format("*本文3タイトル*%nテキストテキストテキストテキストテキスト"))
                                    .build()
                    )
                    .build()
    );
}

見て分かる通り、ほぼ完全に対応していることがわかります。

やることとしてはまさしくこれで、

1. Block Kit Builderなどで、作りたいメッセージのJSONを取得
2. それに対応するように、コードを組み立てる

だけです。

もちろんこの例では挙げていないBlockの要素(画像の表示など)にも対応するコードは存在するので、JSONの順序どおりに組み立てればメッセージとして表示してくれます。

ただ、インストールしたSlackライブラリのコードを自動補完してくれないと探すのが難しいかもしれないので、IDEは使うと良いでしょう。

最後に

JavaによるBlockの組み立ては、慣れてしまえば苦ではないので、どちらかというとBlockにどんな要素があるのか、どのようにデザインするのがUI・UX的にいいのかを考えることが大事になってきます。

Slackへのメッセージ送信による通知は非常に便利で多用されやすいため、メッセージがわかりやすいものになるほど業務効率も上がりやすいはずです。

ぜひBlockを使ってみてください。