もう一度Slack botを作ってみたい欲が湧いてきたのだが、いつもどおりNode.jsで書いてしまうと他の言語が全然勉強できないので、今回はgolangを使って書いてみた。
この記事では、Slack Appの登録・設定・作成し、ユーザからのメッセージに対して応答するシンプルなbotを作成する。
Slack APIのページが完全に迷いの森で、慣れるまでどこで何が設定できるのかわかならい。そのため、スクリーンショット多めで説明する。
Slack Appを作成する
まずSlack Appを作成する。
Slack APIのページから左上のYourAppsに進み、[Create New App]ボタンから作成する。
次にSlack Appの名前を入力し、開発用のワークスペースを選択する。
これでSlack Appが作成できたので、つづいて設定を行う。
まずは、Bot Userを作成する。
Bot Userを作成することで、「
@bot hey!!
」みたいなことができる。[Basic Infomation]の[Add feature and functionally]から、Botsをクリックして、Bot User作成ページに移動する。
Bot Userのページで、[Add a Bot User]をクリックする。
するとBot Userの名前(表示名)を設定するページが表示されるので、テキトーに入力して[Add Bot User]をクリックする。
ちなみに[Always Show My Bot as Online]をONにすると、botサーバが起動していなくてもSlack上ではオンライン状態になる。
今回はReal Time Message API(RTM API)を使うので、APIが勝手に判断してサーバが起動していたらオンライン、停止していたらオフラインにしてくれる。
Bot Userの作成が終わったら、自分のワークスペースにSlack Appをインストールする。
[Basic Infomation]のページに戻り、[Install your app to your workspace]から[Install App to Workspace]をクリックする。
次に認証ページが表示されるので、[Authorize]をクリックしてインストールを完了させる。
これで自分のワークスペースにbotが表示される。
これでSlack Appの設定は完了。
私はこの設定だけで数時間かかった……。(主に権限まわりの設定で)
golangでbotを実装する
golangで、ユーザのリプライに対して応答するbotを実装する。
Real Time Messaging API と Events API
Slack Appを開発には、Real Time Messaging APIとEvents APIを使うことになる。(今回はReal Time Messaging APIを使う)
この2つを選ぶ基準を簡単に説明すると…。
- Real Time Messaging APIを選ぶ
- Events APIでサポートされていないイベントが必要な場合
- メッセージをリアルタイムで処理したい場合
- Events APIを選ぶ
- アプリケーションに必要な権限だけを与えたい場合
- websocket接続ができない場合
- リアルタイム性が不要な場合
より詳しく知りたい方は「When should I use the Events API and when should I use the RTM API?」をご確認ください。
golangで実装する
ようやくbotを実装する。……の前に、SlackにアクセスするためにAccess Tokenを取得する。
[OAuth & Permissions]から[Bot User OAuth Access Token]をコピーしておく。
※ [OAuth Access Token]だと
scope_missing rtm:stream
みたいなエラーになるので注意package main
import (
"github.com/nlopes/slack"
)
func main() {
// API Clientを作成する
api := slack.New("Bot User OAuth Access Token")
// WebSocketでSlack RTM APIに接続する
rtm := api.NewRTM()
// goroutineで並列化する
go rtm.ManageConnection()
// イベントを取得する
for msg := range rtm.IncomingEvents {
// 型swtichで型を比較する
switch ev := msg.Data.(type) {
case *slack.MessageEvent:
// MessageEventだったら、「Hello」と応答する
rtm.SendMessage(rtm.NewOutgoingMessage("Hello", ev.Channel))
}
}
}
これで実行すると、以下のように応答してくれる。
今回はここまで。
また後日、Interactive Message Buttonの使い方などを書こうと思う。
参考サイト
- GitHub - nlopes/slack: Slack API in Go
- When should I use the Events API and when should I use the RTM API?
- Real Time Messaging API | Slack
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿