[Slack Bot] blocksを使ってURLが含まれるメッセージを送信した時、Slack上でURLを展開する方法

## 方法
`blocks`を使った場合は、`unfurled,_links`をtrueにした上で、`text`にslack上で展開したいURLを入力すると、Slack上でURLが展開されるようです。
※ `text`に含まれるURLのみ展開されるようです。
※ `blocks`や`attachments`内のURLは展開されてないようです。
例えば以下のコードを実行すると、`text`に含まれているはてなブログのURLだけがSlack上で展開されます。

```js
var url = "https://hooks.slack.com/services/xxxxx";//incoming webhooksのURL
var payload = {
  "text" : "<https://hatenablog.com>",
  "unfurl_links": true,
  "blocks" : [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "Qiita: <https://www.qiita.com>"
      }
    }
  ],      
  "attachments" : [
    {
      "color": "#FD8F07",
      "blocks" : [
        {
          "type": "section",
          "text": {
            "type": "mrkdwn",
            "text": "Amebaブログ <https://ameblo.jp/>"
          }
        }          
      ]
    }
  ]
};

var options = {
  "method" : "POST",
  "contentType" : "application/json",
  "payload" : JSON.stringify(payload)
};
var response = UrlFetchApp.fetch(url, options);
```
## 実行結果
![4f57bcffb3a8a9feb3debc95bbc509fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259668/db12ef10-4cfd-17c5-e836-2dab43344202.png)


## text, blocks, attachmentsの関係
現在のSlackのchat.postMessage APIの`text`, `blocks`, `attachments`の関係は以下のようになっているようです。

|  | text | blocks | attachments | slack上の表示 |
|--:|:---:|:---:|:---:|:---|
|1 | あり | あり | あり | blocks + attachments |
|2 | あり | あり | なし | blocks |
|3 | あり | なし | あり | text + attachments |
|4 | あり | なし | なし | text |
|5 | なし | あり | あり  | blocks + attachments |
|6 | なし | あり | なし  | blocks |
|7 | なし | なし | あり  | attachments |
|8 | なし | なし | なし | エラー |

### `text`と`blocks`について

- `blocks`を使用しない場合: `text`の値がSlack上で表示される
- `blocks`を使用している場合: `text`の値はSlack上に表示されない

となっているようです。
textは本来必須項目ですが、blocksやattachmentsがある場合は空でOKみたいですね(blocksが代わりにっていう表記は見つけられなかったんですが…)。
![f8988410f7514edeba665dd6c5fd3c67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259668/bbf8ead2-7cc7-8ffe-94ad-8dbfa9681f8f.png)
[chat.postMessage method \| Slack](https://api.slack.com/methods/chat.postMessage)より

### URLの展開
![9d60bacab512945c83a968c7a2bed256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259668/5a8c7b4b-c566-5431-19d2-a98358d2c01f.png)
[chat.postMessage method \| Slack](https://api.slack.com/methods/chat.postMessage)より

この`unfurled,_links`をtrueにすると展開されるようです。
しかし、この対象となっているのはどうも`text`のところだけみたいですね。

## Incoming Webhooksではなく、Tokenを使った場合は？
上述の仕様と同じようです。
tokenを使った場合は以下の感じになります。 

```js
var url = 'https://slack.com/api/chat.postMessage';
var token = 'xoxb-xxxxxxxxxx';　//tokenを入力する
var payload = {
  "channel" : "{ChannelID or Channel Name}",
  "text" : "<https://hatenablog.com>",
  "unfurl_links": true,
  "blocks" : [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "Qiita: <https://www.qiita.com>"
      }
    }
  ],      
  "attachments" : [
    {
      "color": "#FD8F07",
      "blocks" : [
        {
          "type": "section",
          "text": {
            "type": "mrkdwn",
            "text": "Abemaブログ <https://ameblo.jp/>"
          }
        }          
      ]
    }
  ]
};

var options = {
  "method" : "POST",
  "contentType" : "application/json",
  "payload" : JSON.stringify(payload)
};
var response = UrlFetchApp.fetch(url, options);
```
## まとめ
`blocks`のおかげでいろいろ見やすくなりましたが、`text`のことも思い出さないとですね。

## 参考
[SlackのIncoming Webhooksで投稿したURLが展開されなくて困った話 - Qiita](https://qiita.com/foooomio/items/16e4da98f8835daa7b6d)
[Slack APIでリンクを開く - Qiita](https://qiita.com/tiger_t/items/70d4b30eea46838234f4)