---
title: slack-go/slack の websocket モードでメンションやDMを扱う - Let&#039;s Go Talk #5
tags: 
author: [Kei IWASAKI](https://convert.docswell.com/user/laughk)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/LJL9XKWN7R.jpg?width=480
description: slack-go/slack の websocket モードでメンションやDMを扱う - Let&#039;s Go Talk #5 by Kei IWASAKI
published: December 14, 22
canonical: https://convert.docswell.com/s/laughk/5G89X5-2022-12-14-125912-lets-go-talk-5
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/LJL9XKWN7R.jpg)

slack-go/slack の websocket モードで
メンションやDMを扱う
2022.12.14 Kei IWASAKI (@laugh_k)


# Page. 2

![Page Image](https://bcdn.docswell.com/page/47MZL29QJW.jpg)

お前誰よ
Kei IWASAKI
Twitter: @laugh_k
Github: @laughk
Mastodon @laughk@fedibird.com
コネヒトのインフラエンジニア
実家は Python, Go は雰囲気で書いている


# Page. 3

![Page Image](https://bcdn.docswell.com/page/P7R6KMGKE9.jpg)

今日の話
SGの許可設定を追加できる Slackbot を slack-go/slack で作ったよ
はじめの一歩としてメンション、スレッド、DM のイベントを分けて処理する方法
を紹介


# Page. 4

![Page Image](https://bcdn.docswell.com/page/PJXMLVX5EX.jpg)

作ったbotの紹介
対話的に受け取ったIPアドレスをSecurityGroupに突っ込む君


# Page. 5

![Page Image](https://bcdn.docswell.com/page/3JKGLQWR7D.jpg)

作ったbotの紹介
DMでもOK


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LE3N3P1GE5.jpg)

botを作った背景
リモートワークでもIP制限があるツールを利用するためにSquidで簡易Proxyを用意し
た話 - コネヒト開発者ブログより


# Page. 7

![Page Image](https://bcdn.docswell.com/page/8EDW4LXN7G.jpg)

slack-go/slack の websocket モードでメンションや
DMを扱う


# Page. 8

![Page Image](https://bcdn.docswell.com/page/V7P9M2PNJ8.jpg)

slack-go/slack とは
go で slackbot を作るときにお世話になるライブラリ
https://pkg.go.dev/github.com/slack-go/slack


# Page. 9

![Page Image](https://bcdn.docswell.com/page/2JVM9D2YJQ.jpg)

とりあえず動かすのは簡単
Slackbot部分の基本的な部分は以下の記事を参考に実装
基本的にこれをコピペするところからはじめればとりあえず何か動く
Slack ソケットモードの最も簡単な始め方 (Go 編) - Qiita
slack-go/slakc に含まれるサンプル:
slack/socketmode.go at master · slack-go/slack


# Page. 10

![Page Image](https://bcdn.docswell.com/page/5EGGZYRWEL.jpg)

サンプルのままでは
実用的な Slackbot にしていくは
大変
slack/socketmode.go at
f50586fa350b01963bd985591a87c19d99c
· slack-go/slack より


# Page. 11

![Page Image](https://bcdn.docswell.com/page/4JQXLMVQEP.jpg)

最低限やりやすくなってほしいこと
ひとまず今回作ったボットでは以下のときに反応するようにしたかった
チャンネルでメンションされたとき
botがメンションされたことのあるスレッドでの新たな発言があったとき
DMされたとき


# Page. 12

![Page Image](https://bcdn.docswell.com/page/K746DVMYE1.jpg)

なんとか今回やりたいケースだけでもいいので
扱いやすくしよう


# Page. 13

![Page Image](https://bcdn.docswell.com/page/LJ1VZ38NEG.jpg)

Slackのイベントを扱いやすくしていく
イベントの種類を判定するヘルパー関数を用意


# Page. 14

![Page Image](https://bcdn.docswell.com/page/GJWL9PGME2.jpg)

Slackのイベントを扱いやすくしていく
スレッドの中のメンション


# Page. 15

![Page Image](https://bcdn.docswell.com/page/4EZM9KLMJ3.jpg)

Slackのイベントを扱いやすくしていく
スレッドの中のメンション以外


# Page. 16

![Page Image](https://bcdn.docswell.com/page/Y76NKQW57V.jpg)

Slackのイベントを扱いやすくしていく
スレッドの中のメンション以外


# Page. 17

![Page Image](https://bcdn.docswell.com/page/G755PRMG74.jpg)

Slackのイベントを扱いやすくしていく
イベントの種類を定数化


# Page. 18

![Page Image](https://bcdn.docswell.com/page/9J2N6D9DER.jpg)

Slackのイベントを扱いやす
くしていく
イベントの判別がやりやすくなった
ら、分岐を「イベントの種類ごと」
にする


# Page. 19

![Page Image](https://bcdn.docswell.com/page/DEYP924MEM.jpg)

Slackのイベントを扱いやす
くしていく
イベントの種類を定数化


# Page. 20

![Page Image](https://bcdn.docswell.com/page/VJN5L8Y378.jpg)

Slackのイベントを扱いやす
くしていく
イベントの判別がやりやすくなった
ら、分岐を「イベントの種類ごと」
にする


# Page. 21

![Page Image](https://bcdn.docswell.com/page/YE9Y4KPPJ3.jpg)

Slackのイベントを扱いやす
くしていく
イベントの判別がやりやすくなった
ら、分岐を「イベントの種類ごと」
にする


# Page. 22

![Page Image](https://bcdn.docswell.com/page/GE86QRDX7D.jpg)

Slackのイベントを扱いやす
くしていく
イベントの判別がやりやすくなった
ら、分岐を「イベントの種類ごと」
にする


# Page. 23

![Page Image](https://bcdn.docswell.com/page/LEL9XKMNJR.jpg)

goroutin でイベントを処理する関数を実行し、socketMode.Run() で起動すればOK
このコードは色々なモノが省略されています


# Page. 24

![Page Image](https://bcdn.docswell.com/page/4JMZL2YQEW.jpg)

ようやく Slackbot の骨組みが出来た


# Page. 25

![Page Image](https://bcdn.docswell.com/page/PJR6KM9K79.jpg)

雑感
slack-go/slack は go で slack と websocket でおしゃべりできるようになるだけ
で、基本的に頑張って自分で event を見ながら頑張って処理を書く感覚があり泥臭
さを感じる
とはいえ、websocket モードで実装してしまえばバイナリ一つを動かすだけで bot
として機能するので Go で Slackbot をつくるメリットも大きい


