アルパカログ

プログラミングとマネジメントがメインです。時々エモいのも書きます。

Golangの勉強がてらMTGをリスケするSlack Botを作った

年末年始、Golangの勉強を始めようと思い、SlackからインタラクティブMTGをリスケできるBotを作ったので、その話をしたいと思います。

f:id:otoyo0122:20190113141227g:plain

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秒以内にレスポンスを返さなければならない点です。

FYI: https://api.slack.com/interactive-messages#responding_to_message_actions

今回は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が公開されましたが、それ以前はSOAP APIしかありませんでした。REST APIが公開されてまだ間もないということもあり、GolangのGaroon REST API Clientはありませんでした。

そこで今回勉強も兼ねてGaroon REST API Client for Golangを作りました。

github.com

エラー処理とかは実際まだ全然ですが、正常系であればなんとか使えると思います。こちらの工夫した点などは後日ブログで取り上げたいと思います。

最後に

今回作ったSlack BotGitHubに公開しているのでご自由にお使いください。ただしテストはほぼ書いてないので使用は自己責任でお願いします。

今回GolangとSlack Interactive Componentsを学ぶにあたり下記の資料に大変お世話になりました。ありがとうございます。

tech.mercari.com

github.com

blog.kaneshin.co