アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

Slack サイボウズガルーンの予定をリスケするBotを書きました

f:id:otoyo0122:20200911221205p:plain:w300

Go言語の勉強を兼ねて、、Slackからインタラクティブにサイボウズガルーンの予定をリスケできるBotを作ったので、その話をしたいと思います。

f:id:otoyo0122:20190113141227g:plain:w500

github.com

Slack Interactive Components

BOTから選択肢が提示されていますが、これはSlackのInteractive Componentsという機能を使っています。

Interactive Componentsは、messageにAttachment Actionsを付加したもので、ユーザが選択したActionの結果はあらかじめ設定したHTTPSエンドポイントにPOSTされます。

Interactive Componentsは前述の通り、アクション結果を待ち受けるHTTPSエンドポイントが必要なことから、開発の際はHTTPSエンドポイントを代理で公開してローカルへフォワードしてくれる ngrok というサービスが便利です。

ngrok.com

私は開発の際Dockerコンテナを使っているので、ngrokコマンドで公開したHTTPSエンドポイントを、DockerコンテナのExposeしたポートへフォワードし、コンテナ内で立てたサーバで開発していました。

Interactive messagesでは、受け取ったオリジナルのメッセージを上書きすることで書き換えることができるのですが、注意しなければならないのは、3秒以内にレスポンスを返さなければならない点です。

今回はInteractive messageを受け取ったあと、サイボウズGaroon APIを叩いて予定を検索しているのですが、簡単に3秒を超えてしまうので、いったんメッセージを受け取った旨の返事(Please wait的な)をし、APIの結果が返ってきたら新たにpostMessageする実装にしています。

GolangのSlack API Client

GolangのSlack API Client は nlopes/slack を使用しました。Golangの特長でもあると思いますが、必要なコンポーネントごとに構造体が定義されているので非常に扱いやすいです。

最新のv0.4.0と現在のmasterではCallback周りの定義が異なっているのでそこだけ少し注意が必要です。

GolangのGaroon API Client

サイボウズGaroonは去年2018年にREST APIが公開されました。

REST APIが公開されてまだ間もないということもあり、GolangのGaroon REST API Clientはなかったので、今回勉強も兼ねてGaroon REST API Client for Golangを作りました。

github.com

エラー処理とかはまだ全然ですが、正常系であればなんとか使えると思います。

最後に

今回作ったSlack BotはGitHubに公開しているのでご自由にお使いください。

ただしテストはほぼ書いてないので使用は自己責任でお願いします。

参考サイト