2020/11/09
今回はSlackアプリに関するちょっとしたお話です。
私は以前「Slackでアザラシのクイズを出すコマンド」を作成しました。
そのアプリに「ユーザーごとの回答数/正答数を記録して正解率を表示する」機能を入れたかったわけです。
このとき、SlashCommandを実行したユーザーのIDはリクエストに乗ってくるので簡単に取得できます。それ以外のユーザーを参照する場合はメンションで指定できるようにしたいところです。コマンドのイメージとしては以下のような感じ。
しかしデフォルトではSlashCommandの引数にメンションを入れてもユーザー名がそのまま渡されるので、SlashCommandの設定を変える必要があります。具体的には設定画面の「Escape channels, users, and links sent to your app」のチェックを入れます。
するとメンション部分が以下の形式の文字列で渡ってきます。
<@user_id|user_name>
このユーザーID部分を正規表現で抜き出します。私のアプリの場合、「ユーザーが指定された場合はそのユーザーの成績、そうでなければ自分の成績」を表示したかったので、以下のような感じです。
実行にはAWS LambdaのPythonを使用しています。細かい構成は本記事冒頭で紹介した記事を参照ください。
def lambda_handler(event, context): request_data = urllib.parse.parse_qs(event["body"]) user_id = request_data['user_id'][0] # メンションでユーザーが指定されている場合はそれを参照 args_match = re.search(r'<@(.*?)\|', request_data['text'][0]) if args_match is not None: user_id = args_match.group(1) response_data = { "statusCode": 200, "body": user_id } return response_data
これでメンションしたユーザーのIDが取得できました。あとはSlackAPI叩くなりDynamoDBに問い合わせたりなど、あれこれ好きに使いましょう。
ちなみに存在しないユーザーをメンションに指定した場合、@を含めて入力文字列がそのまま渡されます。