Slack Interactive Messageリファレンス

未翻訳の箇所は残っていますが、8割くらい出来たので一旦公開します。引き続き翻訳＆修正をします。

---

## 本記事について

本記事は以下記事を基に、一部自作の図を交えて作成したSlackのInteractive Message機能のリファレンスです。

* [Making messages interactive \| Slack](https://api.slack.com/interactive-messages)
* [Attaching interactive message buttons \| Slack](https://api.slack.com/docs/message-buttons)
* [Attaching interactive message menus \| Slack](https://api.slack.com/docs/message-menus)
* [A field guide to interactive messages \| Slack](https://api.slack.com/docs/interactive-message-field-guide)

## 概要

### Interactive Messageとは

Slack上で、ボタン付き又はメニュー付きのメッセージを送信し、ユーザーからのアクションに応答できる機能です。

#### ボタン
![slack_message_buttons.gif](https://qiita-image-store.s3.amazonaws.com/0/29755/d71a6df2-1da5-cb42-732b-3bfe923d1b4f.gif)

#### メニュー
![slack_message_menus.gif](https://qiita-image-store.s3.amazonaws.com/0/29755/278f2f37-ed48-38b9-ffbc-6e76229fed30.gif)

### 対話的メッセージフレームワーク

Interactive Messageは、ボタンとメニューを含んだメッセージです。ボタンとメニューは以下で利用できます。

* [slash command](https://api.slack.com/slash-commands)への呼び出しの応答
* [リンク展開](https://api.slack.com/docs/message-link-unfurling)に添付
* [incoming webhook](https://api.slack.com/incoming-webhooks)による呼び出し
* [message threads](https://api.slack.com/docs/message-threading)のメッセージに添付
* ボットによる送信又は[chat.postMessage](https://api.slack.com/methods/chat.postMessage)を利用した応答

### ライフサイクル

[Lifecycle of a typical interactive message flow](https://api.slack.com/interactive-messages)を参考に書き起こしたシーケンス図はこちらです。

![lifecycle.png](https://qiita-image-store.s3.amazonaws.com/0/29755/700dc17f-222f-b156-76d8-51eaea3809a9.png)

## ボタン

### ボタン付きメッセージの作成

アタッチメントとアタッチメントアクションを含むメッセージを作成します。基本的な[メッセージ書式設定](https://api.slack.com/docs/message-formatting)と[メッセージアタッチメント](https://api.slack.com/docs/message-attachments)が通常どのように動作するか確認すると良いでしょう。

インタラクティブメッセージは、あなたのサーバーのレスポンスにより、インタラクティブな経験を作成するために、合成・修正・削除されたとてもシンプルなブロックにより構成されています。

このボタン付きメッセージは、インタラクティブメッセージを作る際にもっとも重要なフィールドにシンプルな値を含んでいます。あなたのメッセージはこれよりもっと複雑になるかもしれないので、後ほどもっと複雑な例について取り上げます。

![image.png](https://a.slack-edge.com/bfaba/img/api/messages-joshua-games.png)

このメッセージには軽い文字列、３つの特定のボタン、また破壊的操作のようなボタンも一つ含みます。

これはこのメッセージを作るために使われたJSONです。

```json
{
    "text": "Would you like to play a game?",
    "attachments": [
        {
            "text": "Choose a game to play",
            "fallback": "You are unable to choose a game",
            "callback_id": "wopr_game",
            "color": "#3AA3E3",
            "attachment_type": "default",
            "actions": [
                {
                    "name": "game",
                    "text": "Chess",
                    "type": "button",
                    "value": "chess"
                },
                {
                    "name": "game",
                    "text": "Falken's Maze",
                    "type": "button",
                    "value": "maze"
                },
                {
                    "name": "game",
                    "text": "Thermonuclear War",
                    "style": "danger",
                    "type": "button",
                    "value": "war",
                    "confirm": {
                        "title": "Are you sure?",
                        "text": "Wouldn't you prefer a good game of chess?",
                        "ok_text": "Yes",
                        "dismiss_text": "No"
                    }
                }
            ]
        }
    ]
}
```

このメッセージがチャンネル内やダイレクトメッセージで表示され、ユーザーがチェスをクリックすると、あなたの登録したアクションURLは、特定のメッセージボタンのセットで指定されたJSONペイロードを受信します:

* メッセージを作成した際に設定した`callback_id`
* クリックしたボタンの特定の`name`
* 同じくクリックされた特定のボタンに該当する`value`

### メッセージアクションへの応答

あなたのアプリケーションがメッセージアクションに応答するときが来ました。

あなたのアクションURLは、ボディパラメーターに`payload`を含んだPOSTリクエストを受信し、それ自身は`application/x-www-form-urlencoded`のJSON文字列です。

これはお勧めのコミックブックの例のために、あなたが上記で受信する呼び出しの例です: 

```json
{
  "actions": [
    {
      "name": "recommend",
      "value": "yes",
      "type": "button"
    }
  ],
  "callback_id": "comic_1234_xyz",
  "team": {
    "id": "T47563693",
    "domain": "watermelonsugar"
  },
  "channel": {
    "id": "C065W1189",
    "name": "forgotten-works"
  },
  "user": {
    "id": "U045VRZFT",
    "name": "brautigan"
  },
  "action_ts": "1458170917.164398",
  "message_ts": "1458170866.000004",
  "attachment_id": "1",
  "token": "xAB3yVzGS4BQ3O9FACTa8Ho4",
  "original_message": {"text":"New comic book alert!","attachments":[{"title":"The Further Adventures of Slackbot","fields":[{"title":"Volume","value":"1","short":true},{"title":"Issue","value":"3","short":true}],"author_name":"Stanford S. Strickland","author_icon":"https://api.slack.comhttps://a.slack-edge.com/bfaba/img/api/homepage_custom_integrations-2x.png","image_url":"http://i.imgur.com/OJkaVOI.jpg?1"},{"title":"Synopsis","text":"After @episod pushed exciting changes to a devious new branch back in Issue 1, Slackbot notifies @don about an unexpected deploy..."},{"fallback":"Would you recommend it to customers?","title":"Would you recommend it to customers?","callback_id":"comic_1234_xyz","color":"#3AA3E3","attachment_type":"default","actions":[{"name":"recommend","text":"Recommend","type":"button","value":"recommend"},{"name":"no","text":"No","type":"button","value":"bad"}]}]},
  "response_url": "https://hooks.slack.com/actions/T47563693/6204672533/x7ZLaiVMoECAW50Gw1ZYAXEM"
}
```

一度のこのペイロードを受信したら、次に何をするかはあなたのアプリケーション次第です。

## メニュー

メッセージの中にオプションのメニューを表示することで、ユーザーに明確かつ簡潔な決定を助けます。

メッセージメニューは私達のインタラクティブメッセージフレームワークの上に構築され、Slackアプリケーションにこれまで以上に拡張し、進化した選択肢を提供できます。

![slack_message_menus.gif](https://qiita-image-store.s3.amazonaws.com/0/29755/278f2f37-ed48-38b9-ffbc-6e76229fed30.gif)

メッセージボタンはSlack上の会話の中で、限られたシンプルかつ正確なワークフローを可能にします。みんながそのボタンをクリックしたいでしょう。

より微妙な意思決定を促進する新しい方法です。

### シンプルなメニューの作成

メッセージメニューの中で最もシンプルな種類は、あなたのアプリが静的なオプションのセットを提供することです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29755/e538791a-7ec9-ab92-8c98-a8bd6c9802ac.png)

もし３つほど既に決まったオプションがある場合は、対話的メッセージへの最適なアプローチです。

例えば、このメッセージは何のゲームをして遊ぶかのメニューをユーザーに提供しています:

```json
{
    "text": "Would you like to play a game?",
    "response_type": "in_channel",
    "attachments": [
        {
            "text": "Choose a game to play",
            "fallback": "If you could read this message, you'd be choosing something fun to do right now.",
            "color": "#3AA3E3",
            "attachment_type": "default",
            "callback_id": "game_selection",
            "actions": [
                {
                    "name": "games_list",
                    "text": "Pick a game...",
                    "type": "select",
                    "options": [
                        {
                            "text": "Hearts",
                            "value": "hearts"
                        },
                        {
                            "text": "Bridge",
                            "value": "bridge"
                        },
                        {
                            "text": "Checkers",
                            "value": "checkers"
                        },
                        {
                            "text": "Chess",
                            "value": "chess"
                        },
                        {
                            "text": "Poker",
                            "value": "poker"
                        },
                        {
                            "text": "Falken's Maze",
                            "value": "maze"
                        },
                        {
                            "text": "Global Thermonuclear War",
                            "value": "war"
                        }
                    ]
                }
            ]
        }
    ]
}
```

このメッセージの構造は、メッセージボタンととても似ています。

主な違いは、各ボタンが別個のアクションではなく、複数のオプションを持つ単一のアクションとしてメッセージメニューを表示しています。

### アクションURLレスポンス

ユーザーがドロップダウンから提供されたオプションを選択すると、アクションURLはメッセージボタンのときと同じような呼び出しを受信します。`payload`パラメーターを含み、エンコードされたJSONオブジェクトをPOSTで受信します。あなたのプログラミング言語のハッシュ/オブジェクト構造でアクションを評価するため、JSONをデコードしてください。

上記の例に続けて、もしユーザーがメニューの中から `Falken's Maze` を選択した場合、Slackはあなたが設定したアクションURLに対して、`game_list`の選択ダイアログが`maze`オプションを選ぶのに使用されたことを要求するリクエストを出します。

これがこのシナリオにより送信されたJSONの例です。`payload`パラメーターはデコード済みです:

```json
{
    "actions": [
        {
            "name": "games_list",
            "selected_options": [
                {
                    "value": "maze"
                }
            ]
        }
    ],
    "callback_id": "game_selection",
    "team": {
        "id": "T012AB0A1",
        "domain": "pocket-calculator"
    },
    "channel": {
        "id": "C012AB3CD",
        "name": "general"
    },
    "user": {
        "id": "U012A1BCD",
        "name": "muzik"
    },
    "action_ts": "1481579588.685999",
    "message_ts": "1481579582.000003",
    "attachment_id": "1",
    "token": "verification_token_string",
    "original_message": {
        "text": "Pick a game...",
        "bot_id": "B08BCU62D",
        "attachments": [
            {
                "callback_id": "game_selection",
                "fallback": "Upgrade your Slack client to use messages like these.",
                "id": 1,
                "color": "3AA3E3",
                "actions": [
                    {
                        "name": "games_list",
                        "text": "Pick a game...",
                        "type": "select",
                        "options": [
                            {
                                "text": "Chess",
                                "value": "chess"
                            },
                            {
                                "text": "Falken's Maze",
                                "value": "maze"
                            },
                            {
                                "text": "Global Thermonuclear War",
                                "value": "war"
                            }
                        ]
                    }
                ]
            }
        ],
        "type": "message",
        "subtype": "bot_message",
        "ts": "1481579582.000003"
    },
    "response_url": "https://hooks.slack.com/actions/T012AB0A1/1234567890/JpmK0yzoZ5eRiqfeduTBYXWQ"
}
```

私達は網羅的で詳細なフィールドガイドがありますが、ここではいくつかに注目します:

メッセージ本文を再利用したいと思うあなたの為に、添付された `original_message` を見つけるでしょう、そしてこれらは記録に残さないでください。 `original_message`は、一時的なメッセージを参照している時は含まれません。展開式のインタラクティブメッセージを利用している時のみに添付データを含みます。

特定の対話のインスタンスを特定するのに役立つ `callback_id`もあります。これはチーム周りのコンテキストやこれが発生したチャンネルとユーザーがこのアクションを呼び出すのに役立ちます。もちろん、Slack内から来る`token`値はリクエストをバリデートするのに利用することはもちろん知っているでしょう。 

では、`actions`配列のトップレベルについて新しく関連することを注目しましょう。

#### 呼び出されたメッセージメニューアクション

* `name` - 上記で`games_list`と使用されたように、このメッセージメニューで指定した名前の文字列です。
* `selected_options` - このメッセージメニューでユーザーに選択されたハッシュオプション値の配列です。上記の例ではオプションを一つ選択し、`maze`という値が設定されているのを示しています。 しかし、`war`か`chess`が選択されていたかもしれません。現時点では、 ユーザーが選択できるオプションは一つだけで、アプリに配信することができます。

アクションURL呼び出しを受信した後も、レスポンスパターンはメッセージボタンと同じです:メッセージを追加したり、オリジナルメッセージを置き換えたり、一時的なメッセージを配信したりすることができます。また、`response_url`と`chat.update`を使用することで、 さらなるインタラクションを配信できます。


### チームメンバーを一覧から選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29755/ef99d755-bf90-5d2d-9b51-9b7d38ca6f51.png)

チームメンターを選択する一覧をメッセージメニューに入力することは簡単です。Slackはクライアント側のユーザーリストにもデータを埋め込むため、関連するOAuthスコープにアクセスする必要はありません。

ユーザーがメニューを選択すると、あなたのAction URLは選択したユーザーの`User ID`を受け取ります。

あなたのアクションの`data_source`で`users`を指定することで魔法がかかります:

こちらが簡単がデモの例です:

```json
{
    "text": "I hope the tour went well, Mr. Wonka.",
    "response_type": "in_channel",
    "attachments": [
        {
            "text": "Who wins the lifetime supply of chocolate?",
            "fallback": "You could be telling the computer exactly what it can do with a lifetime supply of chocolate.",
            "color": "#3AA3E3",
            "attachment_type": "default",
            "callback_id": "select_simple_1234",
            "actions": [
                {
                    "name": "winners_list",
                    "text": "Who should win?",
                    "type": "select",
                    "data_source": "users"
                }
            ]
        }
    ]
}
```

### ユーザーにチームのチャンネルを選択させよう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29755/4b27fcba-b363-527d-0acb-da216c8f5a41.png)

チャンネルのメッセージメニューを提供することも簡単です。これのために関連したスコープは必要としません。Action URLは選択されたチャンネルのIDだけを受け取ります。

ユーザーはチーム内のパブリックチャンネルのみから選択することができます。

アクションの`data_source`で以下のように`channels`を指定してください:

```json
{
    "text": "It's time to nominate the channel of the week",
    "response_type": "in_channel",
    "attachments": [
        {
            "fallback": "Upgrade your Slack client to use messages like these.",
            "color": "#3AA3E3",
            "attachment_type": "default",
            "callback_id": "select_simple_1234",
            "actions": [
                {
                    "name": "channels_list",
                    "text": "Which channel changed your life this week?",
                    "type": "select",
                    "data_source": "channels"
                }
            ]
        }
    ]
}
```

### Let users choose one of their conversations
TODO: よく分からないのでパス

## フィールドガイド

### トップレベルメッセージフィールド

フィールド|型|必須|説明
---|---|---|---
`text`|string|No|メッセージのテキスト本文。attachmentsが無い場合は必須である。
`attachments `|attachment array|No|attachmentオブジェクトのJSON配列である。メッセージの追加のコンポーネントを追加する。attachmentsは20個以下である必要がある。
`thread_ts `|string|No|親メッセージに返信する場合、この値は親メッセージのスレッドの`ts`値である。
`response_type `|string|no|次の２つの値のどちらかが必要である: <br> * `in_channel`: メッセージボタンがクリックされたチャンネル内の全てのユーザーに表示される。呼び出されたボタンアクションに応答して送信されるメッセージは、デフォルトでは`in_channel`に設定される。 <br> * `ephemeral`: メッセージボタンをクリックしたユーザーにだけ表示される。`Slash commands`に応答して送信されるメッセージは、デフォルトで`ephemeral`に設定される。 <br> このフィールドは新規メッセージでは指定できない。ボタンアクションやSlash commandsの応答にのみ使用できる。
`replace_original `|Boolean|No|ボタンアクション呼び出しに応答して、メッセージを作成する場合のみに使用される。`true`を設定した場合、オリジナルメッセージはあなたが提供したメッセージに置き換えられる。`false`を設定した場合、あなたが提供したメッセージは新規メッセージとして扱われる。
`delete_original `|Boolean|No|ボタンアクション呼び出しに応答して、メッセージを作成する場合のみに使用される。`true`を設定した場合、オリジナルメッセージは削除される。もしメッセージを提供していた場合は、新規メッセージとして投稿される。

### Attachment fields
これらのフィールドは、メッセージの`attachments`フィールドで、配列内のハッシュとして与えられる必要がある。

フィールド|型|必須|説明
---|---|---|---
`title `| string |No|ここに短い文字列を指定することで、視覚的なヘッダーを付けることができる
`fallback `| string |**Yes**|attachmentsや対話的メッセージをサポートしていないインターフェースを使用している場合に表示される平文メッセージです。 Consider leaving a URL pointing to your service if the potential message actions are representable outside of Slack. Otherwise, let folks know what they are missing.
`callback_id `| string |**Yes**|指定された文字列は、attachment内のボタンコレクションの一意な識別子として扱われる。この識別子は、アクションの応答によってメッセージボタンのAction URLに送り返される。 このフィールドはattachmentにメッセージボタンを含む場合は必須である。これはあなたが作業している対話を識別する鍵である。
`color `| string |No|他メッセージから視覚的に区別するために使用される。16進値と[ドキュメント](https://api.slack.com/docs/message-attachments)に記載されたいくつかのカラーコードを指定できる。[ベストプラクティス](https://api.slack.com/docs/message-guidelines)に沿って控えめに使用する。 
`actions `|action array|**Yes**|attachmentに含むボタン又はメニューのアクションのコレクションです。メッセージボタンやメッセージメニューを使用する時は必須です。attachment毎に最大で5個まで指定できる。
`attachment_type `| string |No| (分からない)Even for message menus, remains the default value default.

### Message action fields
あなたが指定したアクションがメッセージボタン又はメッセージメニューとしてレンダリングされます。

フィールド|型|必須|説明
---|---|---|---
`name `| string |**Yes**|アクションを識別する名前として文字列を指定する。この名前はアクションが呼び出された場合に、メッセージの`callback_id`と一緒にAction URLに返される。特定の応答経路を識別する際に使用してください。**もし複数のアクションで同じ名前が指定された場合は、そのうち一つだけがトリガー状態となることが出来る** 
`text`| string |**Yes**|このアクションが示すメッセージボタン又はメニューのユーザーが見るラベルです。マークアップは含むことは出来ません。短つかつ簡潔に保ってください。フォーム要素の最善の結果を得るために、30文字以内にしてください。
`type`| string |**Yes**|このアクションがメッセージボタンの場合は`button`を、メッセージメニューの場合は`select`を指定してください。
`value`| string |No|このアクションを識別する特定の文字列を指定する。`attachment`の`callback_it`と`name`と一緒にAction URLに送信される。 If providing multiple actions with the same name, value can be strategically used to differentiate intent. 値には最大で2000文字使用できる。
`confirm`| confirmation hash|No|もしconfirmation fieldsのJSONハッシュを指定した場合は、あたなのボタンやメニューで指定された文字列と選択肢のポップアップがダイアログが表示される。そして破壊的操作や望まない結果を拒否する最後のチャンスが与えられる。
`style `| string |No|メッセージボタンの時のみに使用でき、ボタンを指摘的な重要性や論理的なアクションや破壊的操作をハイライトする際に特に便利です。 <br> * `default` — デフォルトで有効です。ボタンはシンプルに見える。 <br> * `primary` — 重要な処理を実行する場合に、控えめに使用する。恐らく特定のグループ内で、primaryボタンは１つだけのはずです。 <br> * `danger` — これはボタンをクリックした際にサーバー内に保存されたデータを破壊するような結果になる場合に使用してください。これは`primary`よりも控えめに使用してください。
`options `| array |No|メッセージメニューの時のみに使用する。このメニューを表示するここのオプションであり、[option fields](https://api.slack.com/docs/interactive-message-field-guide#option_fields)の配列を指定する。データソースが静的の場合は必須であり、そうでなければ指定しない。各メニューには最大で100オプション指定できる。
`option_groups `| array |No|メッセージメニューの時のみに使用する。利用可能なオプションを一覧表示する半階層的な方法です。[option group definitions](https://api.slack.com/docs/interactive-message-field-guide#option_groups)を指定してください。これは`options`配列に取って代わります。
`data_source `| string |No|`static`, `users`, `channels`, `conversations`, 又は `external`を受け付ける。私達の賢い位デフォルトの振る舞いはデフォルトで、つまりメニューのオプションは投稿されたメッセージの下に直接表示される。デフォルトは`static`です。
`selected_options `|array of option_fields|No|もし指定された場合、配列の最初の要素がこのメニューの初期選択される。 追加の要素は無視される。 <br> 選択されたオプションの値フィールドは、メニューの種類に応じて常に必須です。: <br> <br>　 メニューの種類が`static`の場合、アクションのオプションの一覧に含まれていなければならない。 <br> メニューの種類が`users`, `channels`, `conversations`の場合、該当種類の正しいIDでなければならない。  <br> メニューの種類が外部要素の場合は、値は何でもよく何千文字でも構わない。
`min_query_length `| integer |No| `data_source`が`external`を指定された時のみに適用される。もし存在する場合、Slackは指定文字数が入力されるまで待ってから、あなたから提示された外部のAPIエントリポイントにリクエストを送る。デフォルトでは`1`です。

### Confirmation fields

フィールド|型|必須|説明
---|---|---|---
`title `| string |**No**|ポップアップウィドウのタイトルです。簡潔にしてください。
`text `| string |**Yes**|アクション結果を詳細に説明し、ボタンによる選択肢を解釈できるようにしてください。フォームファクター(?)が最善の結果を得るため、最大で30文字を使用してください。
`ok_text `| string |No|	アクションを継続するためのボタンの文字列ラベルです。簡潔に保ってください。デフォルトは`Okay`です。
`dismiss_text `| string |No|アクションをキャンセルするためのボタンの文字列ラベルです。簡潔に保ってください。デフォルトは`Cancel`です。

### メッセージメニューアクション内に配置されるオプションフィールド

オプションフィールドのコレクションです。メッセージデータタイプで、`default`又は`external`の場合に使用されます。

この値は特に重要で、`selected_options`が使用されていた場合に、以前提供されていたオプションの一つと一致している必要があります。

例:

```json
{
    "options": [
        {
            "text": "Barren Realms Elite",
            "value": "barren_realms_elite"
        },
        {
            "text": "Legend of the Red Dragon",
            "value": "legend_of_the_red_dragon"
        },
        {
            "text": "Solar Realms Elite",
            "value": "solar_realms_elite"
        },
        {
            "text": "Tradewars 2002",
            "value": "tradewars_2002"
        }
    ]
}
```

フィールド|型|必須|説明
---|---|---|---
`text `| string |**Yes**|ユーザーにこのオプションを表示するための短い文字列です。 フォームファクター(?)が最善の結果を得るため、最大で30文字を使用してください。
`value `| string |**Yes**|アプリケーションが特定のオプションを識別するための短い文字列です。このオプションが選択されたあ、Action URLに送信されます。Slackアプリ上では制限がありませんが、最大で2000文字まで含めることができる。
`description `| string |**Yes**|このオプションをより詳細に説明するための文字列です。最大で30文字まで含めることができる。

### メッセージメニューアクション内に配置するオプショングループ

オプショングループは１００個のオプションをグループに分けたものです。それらはメッセージメニューのデータタイプで、`static`か`external`を選んだ場合に使用できます。

例:

```json
{
    "option_groups": [
        {
            "text": "Doggone bot antics",
            "options": [
                    {
                        "text": "Unexpected sentience",
                        "value": "AI-2323"
                    },
                    {
                        "text": "Bot biased toward other bots",
                        "value": "SUPPORT-42"
                    },
                    {
                        "text": "Bot broke my toaster",
                        "value": "IOT-75"
                    }
            ]
        },
        {
            "text": "Human error",
            "options": [
                {
                    "text": "Not Penny's boat",
                    "value": "LOST-7172"
                },
                {
                    "text": "We built our own CMS",
                    "value": "OOPS-1"
                }
            ]
        }
    ]
}
```

フィールド|型|必須|説明
---|---|---|---
`text `| string |**Yes**|ユーザーにこのオプションを表示するための短い文字列です。
`options `| string |**Yes**|このメッセージメニューに表示される個々のオプション。オプションフィールドの配列として提供されます。データソースが`default`のときか未指定の場合に必要です。

### アクションURL呼び出しペイロード

対話的メッセージの鍵はもちろん素晴らしいメッセージと添付データです。ボタンを押すか、メニューオプションを選択する度にあなたのAction URLにフィールドが渡されるフィールドは、アプリケーションが次のステップを判断するために必要な情報を生成します。

```json
{
        "actions": [
            {
                "name": "channels_list",
                "selected_options": [
                    {
                    "value": "C012AB3CD"
                    }
                ]
            }
        ],
        "callback_id": "select_simple_1234",
        "team": {
            "id": "T012AB0A1",
            "domain": "pocket-calculator"
        },
        "channel": {
            "id": "C012AB3CD",
            "name": "general"
        },
        "user": {
            "id": "U012A1BCD",
            "name": "musik"
        },
        "action_ts": "1481579588.685999",
        "message_ts": "1481579582.000003",
        "attachment_id": "1",
        "token": "iUeRJkkRC9RMMvSRTd8gdq2m",
        "original_message": {
                "text": "It's time to nominate the channel of the week",
                "bot_id": "B08BCU62D",
                "attachments": [
                    {
                       "callback_id": "select_simple_1234",
                       "fallback": "Upgrade your Slack client to use messages like these.",
                       "id": 1,
                       "color": "3AA3E3",
                       "actions": [
                           {
                               "id": "1",
                               "name": "channels_list",
                               "text": "Which channel changed your life this week?",
                               "type": "select",
                               "data_source": "channels"
                           }
                        ]
                    }
                ],
                "type": "message",
                "subtype": "bot_message",
                "ts": "1481579582.000003"
        },
        "response_url": "https://hooks.slack.com/actions/T012AB0A1/123456789/JpmK0yzoZDeRiqfeduTBYXWQ"
}
```

フィールド|型|説明
---|---|---
`actions `|action array|クリックされたアクションの配列で、メッセージボタンの作成時に準備した名前や値を含んでいます。配列として表示されていますが、この時点では呼び出し毎に一つのアクションのみを受け取ります。 <br> name — オリジナルアクションの中で設定された`name`属性と結びつける文字列です <br> value — オリジナルアクションの中で設定された`value`属性と結びつける文字列です <br> type — オリジナルアクションの中で設定された`type`属性と結びつける文字列です
`callback_id`|string|オリジナルのメッセージアタッチメントに`callback_id `として指定した文字列です。これを使用して最初に投稿されたアクション/ボタンを識別します。もしアクションの`value`が答えである場合は、`callback_id`は質問した特定の質問です。200文字以下でお願いします。
`team`|team hash|このアクションが発生したチームに関する文字列属性の小さなセットです。 <br> id — オリジナルのメッセージが発生したSlackチームを示す一意の識別子です。 <br> domain — Slackチームと同じslack.domのサブドメインです。
`channel`|channel hash|全てが起きた場所のことです。 — このアクションを促すユーザーが、チャンネル内でメッセージのボタンをクリックし、このハッシュはそのチャンネルに関することです。<br>id — 元のメッセージを格納しているチャンネルの文字列識別子です。チャンネルIDは、表示されるチーム固有のものです。<br>name — メッセージが表示されるチャンネル名で、頭の`#`はありません。
`user`|user hash|クリックし、アクションを呼び出し、ボタンを押した人です！これらの属性はあなたのメッセージとやりとりをすることを決めたユーザーのこと全てを伝えます。<br>id — アクションを呼び出したユーザーの文字列識別子です。ユーザーIDは、表示されるチーム固有のものです。<br>name — 同じユーザーの名前です。
`action_ts`|string|文字列で囲まれたアクションが発生した時刻で、タイムスタンプ表記です。文字列になっています。例） "1458170917.164398"
`message_ts`|string|文字列で囲まれたアクションを含むメッセージが投稿された時刻で、タイムスタンプ表記です。文字列になっています。例）"1458170917.164398"
`attachment_id`|string|このアクションを含むメッセージ内の特定のアタッチメントの１区切りの識別子です。あなたがたくさんのアタッチメントを含むメッセージボタンの構築や興味がある場合に便利です。
`token`|string|	これはInteractive Messageの設定時にアプリの詳細ページで表示されたのと同じ文字列です。Slackから来たことを確認するのに利用してください。詳しくは[こちら](https://api.slack.com/docs/interactive-message-field-guide#validating_action_url_tokens)。
`original_message`|object|このアクションをトリガーした元のメッセージを表すJSONを含むハッシュオブジェクトです。これは状態を保持せずに、`chat.update`を使用するために`message_ts`を知る必要がある際に特に便利です。 **この値は一時的なメッセージのために提供していません**
`response_url`|string|URLを含む文字列。アクションURLのトリガーとは独立して、この呼出に応答するために使用されます。

### オプションロードURLペイロード

例:

```json
{
    "name": "bugs_list",
    "value": "bot",
    "callback_id": "select_remote_1234",
    "team": {
        "id": "T012AB0A1",
        "domain": "pocket-calculator"
    },
    "channel": {
        "id": "C012AB3CD",
        "name": "general"
    },
    "user": {
        "id": "U012A1BCJ",
        "name": "bugcatcher"
    },
    "action_ts": "1481670445.010908",
    "message_ts": "1481670439.000007",
    "attachment_id": "1",
    "token": "verification_token_string"
}
```

フィールド|型|説明
---|---|---
`name`|string|呼び出されたメッセージメニューの名前です。何か理由があってこれを名付けたんでしょ？
`value`|string|	When users utilize typeahead, their query will be presented here. Use min_query_length to customize the minimum amount of typing needed before dispatching an options loading request.
`callback_id`|string|オリジナルのメッセージアタッチメントに`callback_id `として指定した文字列です。これを使用して最初に投稿されたアクション/ボタンを識別します。もしアクションの`value`が答えである場合は、`callback_id`は質問した特定の質問です。200文字以下でお願いします。
`team`|team hash|このアクションが発生したチームに関する文字列属性の小さなセットです。 <br> id — オリジナルのメッセージが発生したSlackチームを示す一意の識別子です。 <br> domain — Slackチームと同じslack.domのサブドメインです。
`channel`|channel hash|全てが起きた場所のことです。 — このアクションを促すユーザーが、チャンネル内でメッセージのボタンをクリックし、このハッシュはそのチャンネルに関することです。<br>id — 元のメッセージを格納しているチャンネルの文字列識別子です。チャンネルIDは、表示されるチーム固有のものです。<br>name — メッセージが表示されるチャンネル名で、頭の`#`はありません。
`user`|user hash|クリックし、アクションを呼び出し、ボタンを押した人です！これらの属性はあなたのメッセージとやりとりをすることを決めたユーザーのこと全てを伝えます。<br>id — アクションを呼び出したユーザーの文字列識別子です。ユーザーIDは、表示されるチーム固有のものです。<br>name — 同じユーザーの名前です。
`action_ts`|string|文字列で囲まれたアクションが発生した時刻で、タイムスタンプ表記です。文字列になっています。例） "1458170917.164398"
`message_ts`|string|文字列で囲まれたアクションを含むメッセージが投稿された時刻で、タイムスタンプ表記です。文字列になっています。例）"1458170917.164398"
`attachment_id`|string|このアクションを含むメッセージ内の特定のアタッチメントの１区切りの識別子です。あなたがたくさんのアタッチメントを含むメッセージボタンの構築や興味がある場合に便利です。
`token`|string|	これはInteractive Messageの設定時にアプリの詳細ページで表示されたのと同じ文字列です。Slackから来たことを確認するのに利用してください。詳しくは[こちら](https://api.slack.com/docs/interactive-message-field-guide#validating_action_url_tokens)。

## 備考
Slack本家のTwitterにて、翻訳記事の公開の許可をもらった上で公開しています。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Sure — no worries 👍</p>&mdash; Slack (@SlackHQ) <a href="https://twitter.com/SlackHQ/status/886869202317041664">2017年7月17日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 参考
* [Making messages interactive \| Slack](https://api.slack.com/interactive-messages)
* [Attaching interactive message buttons \| Slack](https://api.slack.com/docs/message-buttons)
* [Attaching interactive message menus \| Slack](https://api.slack.com/docs/message-menus)
* [A field guide to interactive messages \| Slack](https://api.slack.com/docs/interactive-message-field-guide)