こんにちは、ひがしです。
今回は部内のリモートLTで発表したbotを紹介していこうと思います。

それがこちらです

https://github.com/higashi000/block-mitsubot

名付けて密防止Botです。
n番煎じだと思いますが思い立ったが吉日で作成しました。

何をするBotなの?

こちらはSlackでも発言と発言の間に空白の発言をして発言間に間を開けるとともに発言の文字と文字の間に空白が含まれているかチェックするbotです。
ログを2倍の速度で増やせますね動かすと大変です。

動かし方

Slackのlegacy tokenを発行して、環境変数にSLACK_TOKEN という名前でtokenを、BOT_ID という名前でBotのユーザーIDを登録してください。
また、slackの絵文字に_ という名前で透過した1px*1pxの画像を追加してください。
その後にリポジトリのmain.goを動かしてください。

解説

今回はSlackのRTM APIを使用しています。
言語はみんな大好きGo言語です。いいね
ライブラリとしてslack-go/slackを使用させていただきました。

RTM部分

RTMの部分はこんな感じです。

rtm := api.NewRTM()
go rtm.ManageConnection()

for msg := range rtm.IncomingEvents {
	switch ev := msg.Data.(type) {
	case *slack.MessageEvent:
		if ev.User != os.Getenv("BOT_ID") {
			SendMsg(ev.Channel, ev.Text, api, r)
		}
	default:

	}
}

重要なのはif ev.User != os.Getenv("BOT_ID") の部分です。
これは投稿のユーザーIDを見てBotでなければ反応するという処理になってて、これを挟まないとBotが自分の投稿に反応してテキストを投げ続けます。
これで2, 3回やらかしました。

投稿部分

投稿部分はこんな感じです

func SendMsg(channel, msgText string, api *slack.Client, r *regexp.Regexp) {
	text := ":_:\n密 を ふ せ ぎ ま し ょ う\n:_:"

	if utf8.RuneCountInString(msgText) > 1 {
		if !r.MatchString(msgText) {
			text = ":_:\n:_:\nあ な た の メ ッ セ ー ジ は 密 で す\n:_:\nテ キ ス ト に 空 白 を 入 れ ま し ょ う\n:_:"
		}
	}

	_, _, err := api.PostMessage(channel,
		slack.MsgOptionAsUser(true),
		slack.MsgOptionText(text, false),
		slack.MsgOptionAttachments(slack.Attachment{}))

	if err != nil {
		log.Println(err)
	}
}

ここでメッセージが密かどうかを判断しています。
判断基準は正規表現で文字の間に空白文字が入っているかどうかです。
ちなみに正規表現はこんな感じのものを使用しています
^(.(\s| ))+

実際に動かしてみた

動かしました
いい感じですね

まとめ

皆さん外出を自粛し、きつい状況だと思いますが体調に気をつけ頑張っていきましょう。
このふざけたBotが皆さんの笑いのネタにでもなってくれれば幸いです。

カテゴリー: Go言語

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です