はじめに
SlackBotを作る記事はいくつかあったのですが、記事が少し古かったり、複雑な記事が多かったため、シンプルに/hoge
で入力した内容をそのまま返すSlackBotを作成します。Slackで匿名質問などをしたいときにも使えます。
Slackの設定
Botの設定
SlackAPIのサイトからCreate New App
で新しいBotを作ります。
その後、OAuth&PermissionsのScopesでBot Token Scopesというところがあるので、chat:write
とchat:write.public
とcommands
をscopeに追加します。
次にBotの設定をします。
Basic Information > Bots
をクリックしてApp DisplayName
の設定とShow tabsのMessages Tab
をONにするのとAllow users to send Slash commands and messages from the messages tab
にチェックをしてください。
その後install to Workspace
を選んでWorkspaceにBotをインストールしてください。
インストールした後に出てくるTokenが大事なので保管しておきましょう。見つからない場合は、OAuth & Permissions
のタブをクリックして確認しましょう。
Botの設定の確認
Botの設定がうまく行っているかテストするにはこちらのサイトのtoken
とchannel
とtext
を埋めてSendしてみてください。うまくいけば指定したチャンネルに入力したテキストが出力されるはずです。
channelはchannel IDを入れる必要があるのですが、こちらはWeb版のSlackチャンネルで出てくるURLに書いてあるので確認してみてください。
AWS側の設定
AWS Lambdaの設定
AWSを開いてAuthor from scratch
のBasic infomationを埋めてください。
今回はPython3.6を使いました。
API Gatewayの設定
Lambdaの画面が出てきたら、+Add trigger
を選択します。
Trigger configurationの画面のトリガー選択からAPI Gateway
を選択してください。
その後次のように埋めます。
できたあとは、こちらの画面のAPIエンドポイントにクリックしてアクセスしてみてください。"Hello from Lambda!"
と出てきたら、API Gatewayの設定はうまくいってます。
AWS Lambdaのコード
次にAWS Lambdaのコードを修正しましょう。
import urllib
import urllib.request
import base64
def send_text_response(event, response_text):
SLACK_URL = "https://slack.com/api/chat.postMessage"
channel_id = "<チャンネルIDを入力>"
data = urllib.parse.urlencode(
(
("token", "xoxb-...<Bot User OAuth Tokenを入力>"),
("channel", channel_id),
("text", response_text)
)
)
data = data.encode("ascii")
request = urllib.request.Request(SLACK_URL, data=data, method="POST")
request.add_header( "Content-Type", "application/x-www-form-urlencoded" )
urllib.request.urlopen(request).read()
def lambda_handler(event, context):
print(f"Received event:\n{event}\nWith context:\n{context}")
# Bodyのbase64をデコードしてstr型にする
body = base64.b64decode(event.get("body").encode()).decode()
# BodyをDict型にparseする
qs_d = urllib.parse.parse_qs(body)
# parse_qsのdict型のvalueは配列で持っているため0番目を選択する
response_text = qs_d["text"][0]
send_text_response(event, response_text)
# レスポンスをSlackbotが返す(なんでも良い)
return "200 OK"
多分Pythonの書き方はもっといい書き方があると思うのですが、こちらでとりあえず動きます。
リクエストのログや出力などは[CloudWatchコンソール]
(https://console.aws.amazon.com/cloudwatch/)の`Logs > log groups`で見ることができます。
デバッグするときに使ってみてください。
スラッシュコマンドの設定とAWSとの接続
スラッシュコマンドでBotが動くようにするためには、slack apiの左タブのSlash Commands
を選択します。
Commandには実行時に使いたいコマンド、RequestURLにはAPI Gatewayで設定したAPI endpointのURLを入力してください。
以上で完成です。
Slackで/hoge "Botに話させたい文字列"
を入力してあげればBotが返してくれます。
参考
こちらをかなり参考にしました。(英語)
https://medium.com/glasswall-engineering/how-to-create-a-slack-bot-using-aws-lambda-in-1-hour-1dbc1b6f021c
Node.jsで同様のものを作成しています。Requireの設定がうまく行かなかったため断念しました。
https://www.cview.co.jp/osakatech/2020.02.06.eSBhZVxH