SlackのInteractive messagesのselectでデフォルト値を指定する

Slack botを作っていると一方的にメッセージを送りつけるだけでなく、ボタンを押したりセレクトボックスから何らかを選択した時にアクションをとれるようにしたくなる。

これを実現しているのがSlackのInteractive messagesでこれを利用することでボタンをユーザーが押した時、セレクトボックスでユーザーが選択した時をトリガーにメッセージを返信したり、バックエンド側でAPIにその値を用いて送信したりと色々できるようになる。

今回はそのInteractive messagesで提供されるセレクトボックスについての話。

セレクトボックスを作成する

例えばYESかNOを選択するようなセレクトボックスを作ってvalueではYESの時に1, NOの時に0を渡すようにする。
そのJSONは次のようになる。

{
   "text":"セレクトボックスのテスト",
   "attachments":[
      {
         "fallback":"your_fallback",
         "text":"",
         "callback_id":"your_callback_id",
         "color":"#393fe5",
         "actions":[
            {
               "name":"yes_or_no",
               "text":"YES OR NO",
               "type":"select",
               "options":[
                  {
                     "text":"YES",
                     "value":1
                  },
                  {
                     "text":"NO",
                     "value":0
                  }
               ]
            }
         ]
      }
   ]
}

すると次のようなものがSlack上に現れる。

f:id:hatappi1225:20180213000925p:plain

デフォルト値を指定する

ドキュメントを見るとselected_optionsを指定すると最初の値が選択された値となる。
次のように指定する。

{
   "text":"セレクトボックスのテスト",
   "attachments":[
      {
         "fallback":"your_fallback",
         "text":"",
         "callback_id":"your_callback_id",
         "color":"#393fe5",
         "actions":[
            {
               "name":"yes_or_no",
               "text":"YES OR NO",
               "type":"select",
               "options":[
                  {
                     "text":"YES",
                     "value":1
                  },
                  {
                     "text":"NO",
                     "value":0
                  }
               ],
               "selected_options": [
                  {
                     "text":"NO",
                     "value":0
                  }
               ]
            }
         ]
      }
   ]
}

f:id:hatappi1225:20180213001758p:plain

かわらない。。。。。。

何がいけなかったのか

valueの値が文字列でないとだめだった
どういうことかというと次のようなJSONでないといけない。

{
   "text":"セレクトボックスのテスト",
   "attachments":[
      {
         "fallback":"your_fallback",
         "text":"",
         "callback_id":"your_callback_id",
         "color":"#393fe5",
         "actions":[
            {
               "name":"yes_or_no",
               "text":"YES OR NO",
               "type":"select",
               "options":[
                  {
                     "text":"YES",
                     "value":"1"
                  },
                  {
                     "text":"NO",
                     "value":"0"
                  }
               ],
               "selected_options": [
                  {
                     "text":"NO",
                     "value":"0"
                  }
               ]
            }
         ]
      }
   ]
}

f:id:hatappi1225:20180213002007p:plain

できた!!!

最後

今回はSlackでセレクトボックスを作成する際のデフォルト値の指定方法と気をつけることをメモで書いた。
このselected_optionsはデフォルト値として使えるんだけど、配列で定義できるので当然2つ目を設定できる。
しかしドキュメントによると次のように書いてあって無視されると。。。

Any additional elements will be ignored.

SlackのAPIちょいちょい謎がある