2017/10/23

golangでSlack Real Time Messaging APIを使ってメッセージに応答するまで

以前、Node.js+botkitでSlack用botを作成した。
もう一度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の使い方などを書こうと思う。



参考サイト





以上

written by @bc_rikko

0 件のコメント :

コメントを投稿