[Slack]リンク付きボタンを返すslash commandを作成

社内で使用する主なwebページのリンクつきボタンを返すslackコマンドを作った。
作成方法を残しておく。
なおコマンド実行後に動作するプログラムはAWS上で構築した。言語はpython。

API GatewayでURLを発行する

「APIの作成」からAPI用のURLを作成する。
POSTでのURL作成後は、「統合リクエスト」にて「Lambda 関数」を選択し「Lambda プロキシ統合の使用」にチェックをつける。
のちに作成するLambda関数の関数名も入力する。

Lambdaで関数を作成する

Amazon Lambda上で作成し、下記のjsonデータを返すようにした。

# リストをjsonに変換
obj = { 
    "text": "どのページを表示しますか?",
    "response_type": "ephemeral",
    "attachments": [
        {   
            "fallback": "google",
            "text": "Google",
            "actions": [
                {   
                    "type": "button",
                    "text": "Google",
                    "url": "https://www.google.com/",
                },  
            ],  
            "color": "73c118"
        },  
        {   
            "fallback": "amazon",
            "text": "Amazon",
            "actions": [
                {   
                    "type": "button",
                    "text": "Amazon",
                    "url": "https://www.amazon.co.jp/",
                },  
            ],  
            "color": "673ab7"
        },  
    ]   
}
json_data = json.dumps(obj)

‘response_type’を’ephemeral’としたのは、返ってきた結果を実行者のみに表示したかったから。
チャンネルの他のメンバーにも表示したければ’in_channel’を指定すれば良い。

またslackコマンドを実行した時は下記の内容がPOSTされる。(参考ページより抜粋)

token=gIkuvaNzQIHg97ATvDxqgjtO
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
user_id=U2147483697
user_name=Steve
command=/weather
text=94070
response_url=https://hooks.slack.com/commands/1234/5678

このtokenをチェックして、不正なリクエストでないかを確認する。
ちなみにtokenはSlack APIページの「Basic Information」 > 「App Credentials」 > 「Verification Token」で確認することが出来る。

slash command登録

Slack APIページの「Slash Commands」 > 「Create New Command」から新規にコマンドを作成。URLにはAPI Gatewayで作成したURLを指定する。

実行結果

コマンドを実行すると下記の結果が返ってくる。

今後の課題

  • AWS KMSを使って今後同様のSlack tokenを使用する時に鍵を使い回しできるようにする。
  • コマンドの使用量を測ってみる。

参考

SlackのSlash CommandsをApp Engineで稼働させる

Attaching interactive message buttons

コメントを残す

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

7 + eleven =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください