インターンブログはじめます

357

はじめまして!8月からモビンギにインターンとして参加している木村です。

普段はバイオインフォマティクス分野の大学院生をしています。

これからインターンシップで学んだことなどを書いていきますので、よろしくお願いいたします。

先日簡単なAWSの使用状況を教えてくれるSlackbotを作ったので、今回はその過程で触れたことについて紹介します。

使用言語はGO言語。Hello World以外を書くのは初めてでした!

Slack API token

SlackのAPIを使うために、まずはSlackでbotアカウントを作成しました。

botアカウントを作成すると、API tokenが発行されます。

このtokenを環境変数として設定し、プログラム内で読み込むようにしました。

GO言語で環境変数を読み込むには、

token := os.Getenv("SLACK_BOT_TOKEN")

のようにすると引数に指定した環境変数を取得できます。

(以前Pythonでslackbotを作った時に、ソース内にtokenを書いてgithubにあげて怒られた。成長しました。)

AWS credentials

AWSのAPIを使うための認証情報は、 “github.com/aws/aws-sdk-go/aws/credentials”パッケージで扱います。
~/.aws/credentials ファイルに認証情報を書くと、GOのソース内で

cred := credentials.NewSharedCredentials("", profilename)

とすると読み込んでくれます。

profilename には、credentialsに書いたプロファイル名を入れます。

credentialsファイルの書式は以下のようになっています。

[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAA
aws_secret_access_key = AAAAAAAAAAAAAAAAAAAAAA

[user1]
Aaws_access_key_id = BBBBBBBBBBBBBBBBBBBBB
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBB

[Bot]
aws_access_key_id = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
aws_secret_access_key = CCCCCCCCCCCCCCCCCCCCCCCCC

この例ではdefault、user1、Botの中から使いたいアカウントのプロファイル名を指定します。

Bot自身の情報

今回は、Botに対して特定のリプライが来たらAWSの使用状況を返信するようにしました。

(例)@bot ec2 limit

そこで、まず必要になるのはBot自身のSlackユーザーIDです。

slackのAPIは “github.com/nlopes/slack”パッケージ経由で使用します。

AuthTestメソッドを使うと認証情報をチェックしてBot自身の情報を取得できます。

bot := slack.New(token) //slack.Clientの作成
botdata, _ := bot.AuthTest() //Bot自身の情報を取得
id := botdata.UserID //BotのユーザーIDを取得

取得したIDは、U6L14758F のような暗号で取得されます。

返信などで@botのような状態で投稿したいときは、

repid := "<@" + id + ">"

のように”<@id>”の形式にするとアカウント名の状態で投稿されます。

Botの基本的なしくみ

Botの実装は、SlackのReal Time Messaging APIを使いました。

rtm := bot.NewRTM()//Real Time Messaging APIの呼び出し
go rtm.ManageConnection()//goroutineによる並行処理。RTMに接続
for {//無限ループで情報を取得
  select {
  case msg := <-rtm.IncomingEvents: //rtm.IncomingEventsでイベント情報を取得
    switch ev := msg.Data.(type) { //投稿された情報を取得
    case *slack.MessageEvent: //イベントがMessageイベントの場合に"hello"と投稿
      out := rtm.NewOutgoingMessage("hello", ev.Channel) //投稿オブジェクトを生成
      rtm.SendMessage(out)//投稿

    }
  }
}

Real Time Messaging(RTM) はWebSocketベースのAPIで、Slackからのイベントをリアルタイムで受信し、ユーザーとしてメッセージを送信できます。

RTMに接続し、無限ループで情報を取得し続けるようにしました。

これでbotユーザーが所属するチャンネルのイベントを常に監視できます。

この例では、取得したイベントが誰かが投稿した(MessageEvent)というものだったらBotは”hello”と投稿します。

投稿されたテキスト情報はev.Textで取得することができ、投稿内容による処理の分岐に使うことができます。

最後に

今回は主にSlackBotについて紹介しました。

AWSなどのクラウドやGO言語に触るのはほとんど初めてですが、新しいことを学ぶのはとても楽しいです。

このインターンでの経験は大きな財産になると思います。どんどん学んで行きます!