概要
Python
でSlackBolt
を利用して、Slack用のボットを作る。AWS
のlambda
にデプロイする想定。
lambda
で実行、かつ応答に時間がかかることを考慮して、Lazy listeners
1を使用する。
ここではサンプルとして、Mention
とDM
に反応して、Hello !
と返信させるようにする。
スレッド内からMention
されたら、スレッド内に返信させる。
Slack API の設定
Slack APIでアプリを作って設定する。
- 必要なキーを取得する
-
Basic Information
のSigning Secret
-
OAuth & Permissions
のOAuth Tokens
-
- 権限を設定する
-
OAuth & Permissions
のScopes
app_mentions:read
chat:write
im:history
-
- ボットのURLを設定する
-
Event Subscriptions
のRequest URL
- あとでDeployするURL
-
https://xxxx.execute-api.ap-northeast-1.amazonaws.com/prod/app
とかになるはず
-
- 通知イベントを設定
-
Event Subscriptions
のSubscribe to bot events
app_mention
message.im
-
コード
from slack_bolt import App, Ack
from slack_bolt.adapter.aws_lambda import SlackRequestHandler
app = App(
signing_secret=os.environ["SLACK_SIGNING_SECRET"],
token=os.environ["SLACK_OAUTH_TOKEN"],
process_before_response=True,
)
# Mention受信時の処理
def receive_mention(_, event, say):
if event.get('subtype') == 'bot_message':
# 自分からのメッセージは無視(無限ループ対策)
return
say(text='Hello !', thread_ts=event.get("thread_ts"))
# DM受信時の処理
def receive_message(_, event, say):
if 'channel_type' not in event or event['channel_type'] != 'im':
# DirectMessage以外は無視
return
say(text='Hello !', thread_ts=event.get("thread_ts"))
def just_ack(ack: Ack):
ack()
app.event("app_mention")(
ack=just_ack,
lazy=[receive_mention]
)
app.event("message")(
ack=just_ack,
lazy=[receive_message]
)
def handler(event, context):
slack_handler = SlackRequestHandler(app=app)
return slack_handler.handle(event, context)
簡単…🥹