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
には受信したデータの情報が入っています。
誰が投稿したのか、どこのチャンネルから来たのか、などはsession
かevent
から取得し処理していきます。
まとめ
案外簡単にSlackと連携ができます。
もっと簡単にbotを作成するのであれば、GASなどで作成した方が簡単かと思います。
誰かのお役に立てれば幸いです。