Contents
Incoming Webhook の概要と取得手順
What is Incoming Webhook?
- シンプルな HTTP POST エンドポイントです。認証は URL に埋め込まれているため、別途トークンや OAuth は不要です。
- ペイロードは JSON 形式で送信し、
text(プレーンテキスト)またはblocks(Block Kit)をトップレベルに配置すれば Slack が自動的にレンダリングします。
取得手順
| 手順 | 内容 |
|---|---|
| 1 | ワークスペースの左サイドメニュー → 「アプリ」 → 「Incoming Webhooks」 を選択 |
| 2 | 「Webhook を追加」ボタンをクリックし、通知したいチャンネルを指定 |
| 3 | 発行された URL(例: https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX)をコピーして安全な場所に保管 |
※ セキュリティ上の注意
- Webhook URL は機密情報です。Git リポジトリや公開サーバーに平文で保存しないこと。
- 必要に応じて IP 制限(Enterprise Grid の場合)や 環境変数 で管理してください。
最小構成の JSON と送信例
|
1 2 3 4 |
{ "text": "Hello, Slack!" } |
cURL(Linux/macOS/Windows Subsystem for Linux)
|
1 2 3 4 5 6 7 |
WEBHOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX" PAYLOAD='{"text":"テストメッセージです"}' curl -X POST "$WEBHOOK_URL" \ -H "Content-Type: application/json; charset=utf-8" \ -d "$PAYLOAD" |
PowerShell(Windows)
|
1 2 3 4 5 6 7 8 9 10 |
$WebhookUrl = "https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX" $Payload = @{ text = "テストメッセージです" } | ConvertTo-Json -Compress Invoke-RestMethod -Uri $WebhookUrl ` -Method Post ` -ContentType 'application/json; charset=utf-8' ` -Body $Payload |
まとめ(この章の要点)
- URL を取得 → JSON を POST が基本フロー。
textとblocksのいずれかを必ず含め、Content-Type: application/jsonを付与すれば即座にメッセージが届く。- Webhook URL は機密情報として扱い、環境変数やシークレット管理ツールで保護すること。
テキストタイプと改行コードの正しい扱い方
Slack がサポートしているテキストタイプは大きく分けて 2 種類 です。
| タイプ | 特徴 |
|---|---|
plain_text |
フォーマットが無効化された純粋な文字列。改行は \n が有効だが、UI によって自動折返しされることがある。 |
mrkdwn(Markdown 互換) |
Slack 独自のマークアップ(太字、斜体、リンク等)が利用可能。改行は必ず エスケープされた \n を入れなければ無視される。 |
改行コードに関するベストプラクティス
- JSON 内では常に LF (
\n) のみを使用 -
Windows で作成したファイルは CRLF (
\r\n) が混入しやすいが、Slack は\rを無視してしまうため必ず除去する。 -
文字列リテラルのエスケープ
json\nLine1\nLine2\n
{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*ログ*\n"
}
}
]
} -
上記は
\nが 2 回 エスケープされている点に注意(JSON 文字列内部でのエスケープと Slack の改行解釈)。 -
プレーンテキストでも
\nは有効
json
{
"blocks": [
{
"type": "section",
"text": {
"type": "plain_text",
"text": "1 行目\n2 行目"
}
}
]
}
文字コード
- Slack は UTF‑8 のみを受け付けます。
curlや PowerShell で送信する際は必ずcharset=utf-8をヘッダーに含めるか、ツール側のエンコーディング設定を確認してください。
まとめ(この章の要点)
- 多行テキストは mrkdwn + エスケープされた
\nが最も汎用的。 - Windows の CRLF は除去し、常に LF (
\n) に統一する。 - ペイロード全体を UTF‑8 でエンコードし、ヘッダーに明示的に指定する。
section ブロックで多行テキストを表示するベストプラクティス
基本構造
|
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*タイトル*\n本文の1行目\n本文の2行目" } } ] } |
コードブロックやインラインコードを混在させる例
|
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "`curl -X POST …` を実行すると、以下のようにレスポンスが返ります。\n```\n{\"status\":\"ok\"}\n```" } } ] } |
特殊文字のエスケープ表
| 文字 | JSON エスケープ例 |
|---|---|
バッククオート |
\(JSON 内では \`) |
アスタリスク * |
\\* (JSON 内は \\\\*) |
アンダースコア _ |
\\_ (JSON 内は \\\\_) |
ポイント:
mrkdwnのパーサは上記エスケープが無いと意図しない装飾や構文エラーになることがあります。
文字数・サイズ制限
- 1 ブロックあたり 最大 3000 文字(改行含む)。
- Webhook 全体のペイロードは 最大 1 MB。超過した場合は
400 invalid_payloadが返ります。
まとめ(この章の要点)
section+mrkdwnが多行テキスト・コードブロック共通で最も扱いやすい。- 特殊文字は必ず JSON エスケープし、サイズ上限に注意する。
Rich Text 系ブロックの利用 – 現状と注意点
「公式に推奨」かどうか?
2023 年 9 月時点の Slack API ドキュメント(https://api.slack.com/block-kit)では、rich_text_* 系ブロックは「サポート対象」として記載されていますが、「推奨される」旨の明言はありません。
そのため、本稿では 「利用可能だが公式にプライオリティ付けされた推奨項目ではない」 と表現します。
注釈:2025‑2026 年版 Block Kit Builder でも
rich_textは選択肢の一つとして表示されますが、従来のsection/mrkdwnに比べて UI が限定的(テーブルやインデントはサポート外)である点に留意してください。
主な Rich Text 要素
| 要素 | 用途 |
|---|---|
rich_text_section |
通常のテキスト行。text 要素の配列で構成される。 |
rich_text_list |
箇条書き(style: "bullet")や番号付きリスト ("ordered")。 |
rich_text_preformatted |
等幅フォントでコードブロック的表示を行う。 |
rich_text_quote |
引用ブロック(インデントが自動付与される)。 |
例:箇条書きリスト
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ "blocks": [ { "type": "rich_text", "block_id": "list_example", "elements": [ { "type": "rich_text_section", "elements": [{ "type": "text", "text": "検出された脅威" }] }, { "type": "rich_text_list", "style": "bullet", "elements": [ { "type": "rich_text_section", "elements": [{ "type": "text", "text": "Malware.A" }]}, { "type": "rich_text_section", "elements": [{ "type": "text", "text": "Ransomware.B" }]}, { "type": "rich_text_section", "elements": [{ "type": "text", "text": "Rootkit.C" }]} ] } ] } ] } |
Block Kit Builder の活用手順
- ブラウザで Block Kit Builder(https://app.slack.com/block-kit-builder)にアクセス。
- 左側エディタに上記 JSON を貼り付け、右側プレビューで見た目を確認。
- 「Copy JSON」ボタンで確定したコードを自分のスクリプトへ組み込む。
使いどころと制限
| シナリオ | 推奨ブロック | 理由 |
|---|---|---|
| シンプルな多行テキスト | section + mrkdwn |
実装が最も簡単で、全体的に広くサポートされている。 |
| 箇条書きや階層リスト | rich_text_list |
自動インデント・バレット生成が行われるため手作業が不要。 |
| コードブロック(等幅フォント) | rich_text_preformatted または mrkdwn の triple‑backticks |
等幅表示が必要な場合は rich_text_preformatted が安全。 |
| 引用やコメント風のインデント | rich_text_quote |
右側に薄い縦線が自動で付くため視覚的に区別しやすい。 |
注意点:一部クライアント(モバイル版など)では
rich_text_*の描画が若干異なる場合があります。重要な情報は併せてsection/mrkdwnでも提供すると安全です。
まとめ(この章の要点)
rich_text_*は 「利用可能」 な機能であり、公式に「推奨」されているわけではない。- 箇条書きや等幅コードブロックなど、特定用途で便利だが互換性を確認しつつ使用すること。
実務事例:ESET Protect の多行テキスト問題と対策
背景(何が起きたか)
- ESET Protect が生成したアラート変数
ALERT_MESSAGEには改行 (\n) が含まれる。 - 従来のペイロードでは
mrkdwnに\nを入れず、plain_textを使用していたため Slack 側で改行が失われ、1 行に潰れて表示 された。
出典について:本事例は 2025 年 1 月 27 日に ESET 社公式フォーラム([ESET Community – Alert Formatting])で報告された内容を元にしています。投稿者が示したサンプルコードとその後のコメントから情報を抽出しましたが、正式なドキュメント化はされていない点をご留意ください。
解決策概要
- 変数側で改行文字をエスケープ
- Bash 例:
ESCAPED=$(printf '%s' "$ALERT_MESSAGE" | sed 's/"/\\"/g; s/$/\\n/') - ペイロードは
rich_text_preformattedに切り替える(等幅で改行が保持されやすい) - テストは Block Kit Builder と Webhook テストページで二段階検証
手順詳細
1️⃣ 変数エスケープ(シェルスクリプト例)
|
1 2 3 4 5 |
#!/usr/bin/env bash # ESET Protect の ALERT_MESSAGE を安全に Slack 用へ整形 RAW_MSG="${ALERT_MESSAGE}" ESCAPED=$(printf '%s' "$RAW_MSG" | sed -e 's/"/\\"/g' -e 's/$/\\n/') |
sedで 二重引用符 と 改行 をエスケープ。- 必要に応じて
awk '{printf "%s\\n",$0}'等でも可。
2️⃣ ペイロード(Rich Text Preformatted)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "blocks": [ { "type": "rich_text", "block_id": "eset_alert", "elements": [ { "type": "rich_text_section", "elements": [{ "type": "text", "text": "*ESET アラート*" }] }, { "type": "rich_text_preformatted", "border": 0, "elements": [{ "type": "text", "text": "${ESCAPED}" }] } ] } ] } |
${ESCAPED}はシェル変数展開後の文字列がそのまま入ります。rich_text_preformattedが等幅フォントで 改行を忠実に再現。
3️⃣ テストフロー
| 手順 | 実施場所 | 内容 |
|---|---|---|
| A | Webhook テストページ(https://hooks.slack.com/services) | JSON を貼り付けて「Send」 → チャンネルで表示確認 |
| B | Block Kit Builder | 同じ JSON を貼り付け、右側プレビューでレイアウトと改行をチェック |
| C | 実運用スクリプト(cron/システムジョブ) | 本番環境でテストアラートを送信し、ログにエラーが無いか確認 |
追加のベストプラクティス
- 変数は必ずシングルクオートで囲む → シェル展開時の予期せぬ文字置換防止。
- ペイロードサイズ:ESET のアラートは長文になることがあるため、1 MB 超過しないように事前に
wc -cでバイト数を測定。 - デバッグ情報の付加:失敗時に Slack が返すエラーオブジェクト(例:
invalid_blocks) を標準出力へリダイレクトして CI/CD パイプラインで検知。
まとめ(この章の要点)
- ESET Protect の改行が失われる問題は 「変数側で \n エスケープ + rich_text_preformatted」 に置き換えることで解決できる。
- 出典がフォーラム投稿に基づくため、実装前に自社環境で必ず検証すること。
テスト・デバッグ手法とよくあるエラー
1. Webhook テストページの活用
- URL 発行画面右上の 「Test this webhook」 ボタンから直接 JSON を貼り付けて送信可能。
- 成功時はステータス
200 OK、失敗時はエラーメッセージ(例:invalid_payload,invalid_blocks)が返る。
2. Block Kit Builder での事前検証
| 機能 | メリット |
|---|---|
| リアルタイムプレビュー | UI 上で実際の表示を確認でき、改行・インデントミスを即座に発見。 |
| Validate ボタン | JSON スキーマエラーを自動的に指摘。 |
| Copy JSON | 正しいフォーマットをそのままコピーできるので手入力ミスが減少。 |
3. コマンドラインでのデバッグテクニック
|
1 2 3 4 5 |
# 詳細な HTTP ヘッダーとレスポンスボディを表示 curl -v -X POST "$WEBHOOK_URL" \ -H "Content-Type: application/json; charset=utf-8" \ -d @payload.json |
-vオプションで リクエスト/レスポンスヘッダー と ステータスコード を取得。- エラーメッセージは JSON の
"error"フィールドに格納されていることが多い。
4. よくあるエラーと対処法
| エラー | 主な原因 | 確認ポイント / 対策 |
|---|---|---|
invalid_blocks |
必須フィールド欠落、タイプミス、ブロック階層不正 | JSON Lint で構文検証 → Block Kit Builder の「Validate」使用 |
| 改行が無視される | \n がエスケープ不足、plain_text 使用 |
mrkdwn に切り替え、\n を二重エスケープ (\\n) しないか確認 |
| 文字化け (UTF‑8 以外) | ペイロードが UTF‑16/Shift_JIS 等で送信された | charset=utf-8 ヘッダー付与 → PowerShell の -Encoding utf8 |
| 400 Bad Request | ペイロードサイズ > 1 MB、JSON が不正 | wc -c payload.json でバイト数測定、jsonlint.com で検証 |
5. ログとモニタリング
- Slack の API ダッシュボード(https://api.slack.com/apps → 「Incoming Webhooks」)でリクエスト履歴が確認できる。
- 外部監視ツール(Datadog, New Relic 等)に
curlのステータスコードを送信し、失敗時のアラートを設定すると運用上安心。
まとめ(この章の要点)
- テストは必ず二段階:Webhook テストページ → Block Kit Builder。
- エラーは JSON 構文かブロック定義ミスが多い。Linter とビルダーで事前検証を徹底する。
- 文字コード・サイズ制限に注意し、UTF‑8 かつ 1 MB 未満で送信する。
全体まとめ & 参考リンク
| 項目 | キーポイント |
|---|---|
| Webhook の取得と基本構成 | URL を取得 → text/blocks を JSON に入れ POST |
| テキストタイプ | mrkdwn + \n が多行テキストのデファクト標準 |
| section ブロック | 多行・コードブロックは section+mrkdwn が最も汎用的 |
| Rich Text 系 | 利用可能だが「公式推奨」ではない。箇条書きや等幅表示に便利 |
| 実務事例(ESET Protect) | 変数エスケープ + rich_text_preformatted が解決策 |
| テスト・デバッグ | Webhook テストページ+Block Kit Builder の併用、curl -v で詳細確認 |
| 運用上の注意 | URL はシークレット管理、UTF‑8 とサイズ制限を遵守 |
主な公式ドキュメント
- Slack API – Incoming Webhooks: https://api.slack.com/messaging/webhooks
- Block Kit Builder: https://app.slack.com/block-kit-builder
- Block Kit 文法リファレンス(2023 年版): https://api.slack.com/reference/block-kit/blocks
参考情報(外部リンク)
- JSON Lint: https://jsonlint.com/
- ESET Community – Alert Formatting (2025‑01‑27) (※公式フォーラム投稿、内容は非公式)
- 「Slack アプリ開発入門」Tech Blog(2024 年更新版)
この記事は 2026 年 4 月現在の情報を基に作成しています。Slack の機能や API は随時変更されるため、実装前には必ず最新公式ドキュメントをご確認ください。