はじめまして!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言語に触るのはほとんど初めてですが、新しいことを学ぶのはとても楽しいです。
このインターンでの経験は大きな財産になると思います。どんどん学んで行きます!