自作SlackコマンドをJSON形式で全員に見えるよう出力する

Slack

前回の記事では、自作Slackコマンドが動作するまでの手順を説明した。

本記事では、自作Slackコマンドの出力をJSON形式としてUIをより柔軟なものにしていく。またその副産物として、出力結果を全員に見せられるようになる。

本記事の概要

  • Slack APIのリファレンスに書かれている内容の一部を実践した
    • Block Kit Builderを利用し、JSON形式で出力した
    • 出力結果の可視性を変更し、全員に見えるようにした

JSON形式での出力

ブロックの記述と出力

Slack Appは、JSON形式のブロック構文を用いて視覚的にリッチなメッセージを送信することができる。ここでは、その機能の一部を紹介する。詳細は公式リファレンスを参照してほしい。

ひとつのブロックは、例えば以下のように構成される。

{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "You can use *markdown* syntax _here_."
  }
}

送信したい文章をtextキーに格納すればよい。マークダウン記法を利用することもできる(typeキーでmrkdwnと指定すること)。

実際の自作SlackコマンドによるCGI呼び出しへの応答は、以下のように記述される1

Content-Type: application/json; charset=utf-8

{
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "You can use *markdown* syntax _here_."
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "You can also stack multiple blocks like this."
      }
    }
  ]
}

JSON形式での出力の際は、ヘッダ部でContent-Type: application/jsonと指定しなければならない。ブロックはblocksキーに配列形式で格納する。配列内に複数のブロックを格納すれば、それらが順番に出力されることになる。

出力結果

Block Kit Builderについて

上述したJSON形式での出力を視覚的に行えるツール“Block Kit Builder”が用意されている。画面左側から利用したいブロックの種類を選択すると、自動的にJSON形式の出力およびそのプレビューを表示してくれる。

出力結果の可視性

Slackコマンドの出力は、デフォルトでは「コマンドを送信した本人にのみ表示される」仕様となっている。

これを変更するには、blocks キーと同階層に"response_type" : "in_channel"と追加する必要がある(下から2行目)2

Content-Type: application/json; charset=utf-8

{
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "You can use *markdown* syntax _here_."
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "You can also stack multiple blocks like this."
      }
    }
  ],
  "response_type": "in_channel"
}
「あなたにだけ表示されています」という表示が消え、全員に見えるようになった

おわりに

本記事では、JSON形式の記述により柔軟なメッセージ出力ができるようになった。

実は、Slackのメッセージ出力には静的なものだけでなく、動的な要素(ボタンやチェックボックスなど)も利用することができる。これらの利用方法についても、時間と気力が生まれたとき記事にしたい。


  1. Pythonで出力する場合はjsonライブラリを用いると便利。 ↩︎
  2. デフォルトでは"response_type" : "ephemeral"となっている。 ↩︎
タイトルとURLをコピーしました