🐶

SlackBotをGoで作成

2021/04/01に公開

SlackBotを作ろうとした理由

所属しているサークルの勉強会でslack botの作成方法の紹介があったのですが、当時理解できなかったためにスルーしてしまいました。現在、春休みで暇だったしある程度パソコン知識も増えたので作れるなら作ってみよう!ということで着手しました。参考にした資料はこちら

https://github.com/kmc-jp/webservice2020/blob/master/1st/4th/readme.md

やったこと

GoのSlackBot用のpackageをローカルにクローン

go get -u github.com/slack-go/slack

SlackAppの作成

  1. 下のサイトに飛びます。

https://api.slack.com/apps?new_app=1
2. SlackAppを作成します。
最初、普通に下の[Create New App]のところで作成したのですが参考にしていたコードが使っていたRTM(Real Time Messaging API)がサポートされなくなっていて動作しなかったので下記記事を参考にしてclassic appを作成しました。

https://qiita.com/nakashun/items/cb89dfb296af90e1ec0a

classic appの作成

  1. Basic InformationのところでBotsを選択

  2. App HomeのところでAdd Legacy Bot Userを選択

  3. OAuth&PermissionsのところでInstall to workspaceを選択して、権限を確認後「許可する」を押す。

    (注意:下のような警告が出ていますがUpdate ScopesするとRTMサポートしてくれなくなります。)

  4. 作成したBotのAPI Tokenが表示されるのでメモする。(下の方)

動かしたいチャンネルにBotを招待

チャンネルのiマーク→その他→アプリを追加するを押して招待

コードの作成

下のコードのYOUR_TOKENとYOUR_Channelの部分を埋めれば動くはず。

package main

import (
	"fmt"
	"strings"
	"github.com/slack-go/slack"
)

//EV put new slack events
var EV *slack.MessageEvent

//RTM use for sending events to slack
var RTM *slack.RTM

//BotToken Put your slackbot token here
const BotToken string = "YOUR_TOKEN"

//DefaultChannel Put your default channel
const DefaultChannel string = "#YOUR_Channel"

func main() {
	var api *slack.Client = slack.New(BotToken)

	RTM = api.NewRTM()

	go RTM.ManageConnection()

	for msg := range RTM.IncomingEvents {
		switch ev := msg.Data.(type) {
		case *slack.ConnectedEvent:
			fmt.Printf("Start connection with Slack\n")
		case *slack.MessageEvent:
			EV = ev
			ListenTo()
		}
	}
}

//ListenTo excute functions under suitable conditions
func ListenTo() {
	switch {
	case strings.Contains("こんにちは", EV.Text):
		RTM.SendMessage(RTM.NewOutgoingMessage("こんにちは。", EV.Channel))
		return
	}
}

コードの実行

ファイルの置いてあるディレクトリ上で
go rum main.go

Botに挨拶して確認

SlackBotのいるチャンネルで「こんにちは」と発言すれば「こんにちは」と返ってくるはず。

その他

色んなAPIがあってお天気Botとかも作れるので調べてみると良さそう。

下のサービスを利用して現在の京都市の天気を教えてくれるようにしました。
https://openweathermap.org/api

Discussion