SpringBootでslackメッセージを送受信する

SpringBootを使用して、slack-botを作ってみます。
今回はslackのアプリはあることを前提に書いていきます。
slack appがわからないよ、という方は以下などを参考に作成してください。 qiita.com

1.Slack appでTokenを取得

アプリが作成できたら、左側のタブを見てください
OAuth & Permissionsというタブがあると思うのでクリックし、Bot User OAuth Access Tokenをコピーしてください
xoxb-****************************こんな感じのやつです。

2.simpleslackapiを取得

slackと連携するためにsimpleslackapiを取得します。

こちらで最新版を取得してください mvnrepository.com

pom.xmlに以下を追加します。

<dependency>
    <groupId>com.ullink.slack</groupId>
    <artifactId>simpleslackapi</artifactId>
    <version>1.2.0</version>
</dependency>

3.slackと接続する

ここからはslackと接続をしていきます。
先ほどコピーしたBot User OAuth Access Tokenを使います。

public class SlackManager {
    private SlackSession session;

    public SlackManager() throws IOException {
                //Bot User OAuth Access Tokenをtokenに追加します
        this.session = SlackSessionFactory.createWebSocketSlackSession(token);
        session.connect();
        
    }
}

これで接続が完成です。

4.送信してみる

Slackにこちら側から送信する方法です。

public class SlackManager {
    private SlackSession session;

    public SlackManager() throws IOException {
                //Bot User OAuth Access Tokenをtokenに追加します
        this.session = SlackSessionFactory.createWebSocketSlackSession(token);
        session.connect();
        
    //アプリが入っているチャンネルと、投稿したい文字列を入れます。
    this.sendMessage("channel", "hello slack!");
    }

    // メッセージ送信
    public void sendMessage(String channel, String message) {
        SlackChannel slackChannel = session.findChannelByName(channel);
        return session.sendMessage(slackChannel, message);
    }
}

5.受信してみる

最後に受信を行います。
受信したら受信したテキストを取得し、再度投稿するようにしてみました。 注意:このまま使うとbotの投稿も受信し再投稿するので、無限ループで投稿してしまいます!!

 public SlackManager() throws IOException {
        this.session = SlackSessionFactory.createWebSocketSlackSession(token);
        session.connect();
        
        //受信時の処理
        session.addMessagePostedListener(((event, slackSession) -> {
                         //投稿があると投稿された文字列を取得し再投稿する。
      //このまま使用するとbotが投稿したものにも反応するので注意
                this.sendMessage("channel", event.getMessageContent());
            }

        }));
    }
    
    // メッセージ送信
    public SlackMessageHandle<SlackMessageReply> sendMessage(String channel, String message) {
        SlackChannel slackChannel = session.findChannelByName(channel);
        return session.sendMessage(slackChannel, message);
    }

botからの投稿は無視したいのでbotか判別をしていきます。
botかはsession.getBots()で知ることができます。

 public SlackManager() throws IOException {
        this.session = SlackSessionFactory.createWebSocketSlackSession(token);
        session.connect();
        
        //受信時の処理
        session.addMessagePostedListener(((event, slackSession) -> {
            boolean botCheck = false;
            //ユーザかbotかどちらが投稿したか確認
            for(SlackBot s : session.getBots()) {
                if(event.getSender().getRealName().equals(s.getRealName())){
                    botCheck = true;
                    break;
                }
            }
            //ユーザが投稿していた場合
            if(!botCheck) {
                if( logger.isInfoEnabled() ) logger.info("slackの投稿"+event.getMessageContent()+"を受信しました");
                this.sendMessage("channel", event.getMessageContent());
            }

        }));
    }
    
    // メッセージ送信
    public SlackMessageHandle<SlackMessageReply> sendMessage(String channel, String message) {
        SlackChannel slackChannel = session.findChannelByName(channel);
        return session.sendMessage(slackChannel, message);
    }

sessionにはSlackのデータ全般が入っています。
受信後eventには受信したデータの情報が入っています。

誰が投稿したのか、どこのチャンネルから来たのか、などはsessioneventから取得し処理していきます。

まとめ

案外簡単にSlackと連携ができます。
もっと簡単にbotを作成するのであれば、GASなどで作成した方が簡単かと思います。

誰かのお役に立てれば幸いです。

参考サイト

springbootでslackボットを作ってみる - Qiita