投稿と Block Kit
chat.postMessage の要点 — チャンネルの指定方法、スレッド化、blocks + text のフォールバック、主要なブロック種別、unfurl フラグ
チャンネルの指定方法
chat.postMessage の channel には「メッセージの送信先となるチャンネル、プライベート グループ、あるいは IM チャンネルを表すエンコード済み ID またはチャンネル名」を渡す (chat.postMessage)。実務では 名前ではなくエンコード済み ID(C0123456789)を使うのが望ましい。ID はチャンネル名の変更を またいでも変わらず、名前ベースの解決には、アプリがすでにそのチャンネルのメンバーであることを 前提とするものもあるからだ。
メンバーシップの要件はチャンネル種別によって異なる。 chat:write.public スコープを もつ bot は、パブリックチャンネルに参加しないまま投稿できる — このスコープは参加の手順を 省くためにこそ存在する。これがない場合、bot は投稿前に conversations.join でパブリック チャンネルに参加する必要がある。プライベートチャンネルにはこうした近道はない。明示的に 招待されていないプライベートチャンネルへの投稿を許すスコープは存在しない。
thread_ts によるスレッド化
thread_ts(返信自身の ts ではなく、親メッセージの ts)を渡すと、そのメッセージはトップ レベルの投稿ではなくスレッド返信になる。押さえておきたい点が 2 つある。
必ず親の
tsを指定する。 返信のtsを指定してもさらに入れ子にはならない — Slack は スレッドを 1 階層に平坦化するので、返信はいずれにせよ親と同じスレッドに入る。とはいえ任意の 入れ子を前提としたコードは結果を読み違えることになる。reply_broadcast: trueを付けると、スレッド返信であると同時にチャンネル本体にも見える 形で投稿される。スレッド内の返信がチャンネル全体にとっても重要な知らせである場合のための ものだ。既定はfalseで、通常のスレッド返信は読み手がスレッドを開かないかぎりチャンネル 本体には現れない。
blocks + text: 実質的に必須のフォールバック
blocks があるとき text は厳密な必須項目ではないが、「強く推奨」されている。blocks を 指定した場合、text はプッシュ通知やメールダイジェスト、その他 Block Kit をレンダリング できない場所で表示されるフォールバック文字列として使われる(前掲の chat.postMessage)。 省略すれば、bot のメッセージは空白または汎用的な通知として届くことになる。表示される本文が すべてブロックであっても、text にはメッセージ内容を平易な言葉で短くまとめたものを必ず 設定しておくこと。
主要なブロック種別
| ブロック | 用途 | 主な制限 |
|---|---|---|
section | 主要コンテンツ — テキストに加えて任意の accessory(ボタン、画像、セレクトなど)、またはコンパクトなキー/値グリッド用に最大 10 個の fields | text は最大 3,000 文字、fields 配列は最大 10 要素(リファレンス) |
context | 小さく控えめな補足行 — 短いテキストと画像要素の組み合わせで、「2 分前に更新」のようなメタデータ向き | 最大 10 要素 |
actions | インタラクティブ要素 — ボタン、セレクトメニュー、日付ピッカー | 最大 25 要素(リファレンス) |
divider | 視覚的な区切り線。コンテンツなし | — |
header | メッセージ先頭の大きな太字テキスト。plain_text のみ(mrkdwn 不可、基本セットを超える絵文字ショートハンドのレンダリングもなし) | 最大 150 文字(リファレンス) |
1 つのメッセージが持てるブロックは最大 50 個。モーダルと App Home のビューではこれが 100 に 引き上げられる(Block Kit overview)。
unfurl フラグ
unfurl_links と unfurl_media はどちらも既定で有効になっており、メッセージ本文中の裸の URL は 明示的に抑制しないかぎりプレビューカードに展開される。メッセージをコンパクトに保ちたければ どちらかを false にする。これが効いてくるのは、すでに独自の Block Kit レイアウトを持っていて、 その下に Slack の自動生成リンクプレビューが割り込んで場所を取り合うのを避けたいメッセージだ。
text オブジェクト内で使う mrkdwn の構文は書式を、投稿済みメッセージを chat.update で更新するダッシュボードに仕立てる方法はその場での更新を 参照。