Contents
- 1 Slack Incoming Webhook の取得と基本構造 {#incoming-webhook}
- 2 改行が失われる原因と Slack の文字列制限 {#newline-limit}
- 3 Block Kit で多行テキストを表示する実装例 {#block-kit-multiline}
- 4 実装サンプル:curl・PowerShell・Python で改行保持ペイロードを送信 {#samples}
- 5 変数正規化とトラブルシューティング {#troubleshooting}
- 6 デバッグ手順と運用上のベストプラクティス {#debugging}
- 7 まとめと次に取るべきアクション {#conclusion}
Slack Incoming Webhook の取得と基本構造 {#incoming-webhook}
1. Webhook URL の作り方
| 手順 | 操作内容 |
|---|---|
| 1 | ワークスペースの左上メニュー → 「Apps」(アプリ)を開く |
| 2 | アプリ検索ボックスに 「Incoming Webhooks」 と入力し、結果から 「Add to Slack」 をクリック |
| 3 | 「Post to Channel」で通知先チャンネルを選択し、「Allow」 を押す |
| 4 | 生成された Webhook URL(例: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX)をコピー |
ポイント
認証ヘッダーは不要です。URL がそのままシークレットになりますので、外部に漏れないよう管理コンソールの「Secrets」や CI の環境変数に保存してください。
同一ワークスペース内であれば、同じ URL でも異なるチャンネルへ送信できます(JSON のchannelフィールドはサポートされていません)。
2. 最小ペイロード例
|
1 2 3 4 |
{ "text": "Hello, Slack! このメッセージは最小構造です。" } |
この JSON を Content‑Type: application/json として POST すれば、認証なしでメッセージが届きます。
|
1 2 3 4 |
curl -X POST https://hooks.slack.com/services/… \ -H "Content-Type: application/json" \ --data '{"text":"Hello, Slack! このメッセージは最小構造です。"}' |
改行が失われる原因と Slack の文字列制限 {#newline-limit}
1. JSON 内での改行表現
\n(LF) が正しい改行エスケープです。\r\n(CR+LF) はそのまま渡すと Slack の JSON パーサが\rを無視し、結果として 1 行になることがあります。
誤情報の訂正
「プレーンテキストは改行を保持できない」という記述は不正確です。"text"フィールドでも\nがエスケープされていれば改行は表示されます(ただし、mrkdwn を使うと装飾が可能になるため推奨されます)。
2. 文字数上限
| フィールド | 上限 (2024‑04 時点) |
|---|---|
text / mrkdwn.text |
4 000 UTF‑8 コードポイント |
blocks 全体(JSON サイズ) |
約 64 KB まで送信可能(実際の制限は Slack の内部バッファに依存) |
- マルチバイト文字は 1 文字が複数バイトになるため、コードポイント が上限です。
- 長文を送る必要がある場合は ブロック分割(複数の
sectionやdivider)や ファイルアップロード API の併用を検討してください。
3. Workflow Builder の変数制限
- カスタム変数は最大 20 個 まで作成可能です。
- 各変数は文字列型で、内部的には同じ 4 000 文字上限が適用されます(ブロック構造に埋め込む場合は全体の 64 KB 制限も考慮)。
Block Kit で多行テキストを表示する実装例 {#block-kit-multiline}
1. section ブロック + mrkdwn(最もシンプル)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "・1 行目\n・2 行目\n・3 行目" } } ] } |
\nをエスケープせずにそのまま文字列に書くと、Slack が mrkdwn パーサで改行として解釈します。- 注意: JSON エンコード時に
\が二重になる(例:"\\n")と実際の表示が\nという文字列になるので、プログラム側では生の LF を渡すようにしてください。
2. 等幅フォントでログを見せる rich_text_preformatted
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "blocks": [ { "type": "rich_text", "elements": [ { "type": "rich_text_preformatted", "elements": [ { "type": "text", "text": "error: line1\nwarning: line2\ninfo: line3" } ] } ] } ] } |
preformattedは 等幅フォント と自動的なコードブロックスタイルを提供します。- 行頭にスペースやタブを書き込んでも、表示はそのまま維持されます。
3. インラインコードとエスケープ
| シンボル | 表示例 | エスケープ方法 |
|---|---|---|
*(太字) |
*重要* → 重要 | \*重要\* |
_(斜体) |
_注釈_ → 注釈 | \_注釈\_ |
|
cmd --option → cmd --option |
バッククオートはそのままで OK |
ベストプラクティス: 文字列中に多数の特殊文字が混在する場合は、事前に 正規表現でエスケープ処理(
\*,\_,)を行うと安全です。
実装サンプル:curl・PowerShell・Python で改行保持ペイロードを送信 {#samples}
1. curl(Unix 系シェル)
|
1 2 3 4 5 6 7 8 9 10 11 |
curl -X POST "https://hooks.slack.com/services/…" \ -H "Content-Type: application/json" \ --data-raw '{ "blocks":[ { "type":"section", "text":{"type":"mrkdwn","text":"ログ開始\nerror: Something went wrong\ninfo: Process completed"} } ] }' |
--data-rawは シェルが文字列を追加でエスケープしない ため、JSON 内の\nがそのまま送信されます。- Windows の PowerShell では同等のオプションは
-Bodyとシングルクォートが使えません。代わりに ヒアドキュメント(@' … '@)を利用します。
2. PowerShell(Windows)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$webhook = "https://hooks.slack.com/services/…" $json = @' { "blocks": [ { "type": "section", "text": { "type":"mrkdwn", "text":"ログ開始`nerror: Something went wrong`ninfo: Process completed" } } ] } '@ Invoke-RestMethod -Uri $webhook ` -Method Post ` -ContentType 'application/json' ` -Body $json |
- PowerShell の文字列リテラルでは **バッククオート (
) がエスケープ文字**です。\nではなくnを書くと LF に変換されます。 Invoke-RestMethodは自動的に UTF‑8 エンコーディングで送信します。
3. Python(requests)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import json, requests WEBHOOK_URL = "https://hooks.slack.com/services/…" payload = { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "ビルド結果\n✅ 成功\n❌ 失敗" } } ] } # ensure_ascii=False → 日本語をエスケープせずにそのまま送信 data = json.dumps(payload, ensure_ascii=False, separators=(",", ":")) response = requests.post( WEBHOOK_URL, data=data.encode("utf-8"), headers={"Content-Type": "application/json"} ) print(f"Status: {response.status_code}") |
json.dumps(..., separators=(",", ":"))は余計なスペースを除去し、ペイロードサイズを最小化します。ensure_ascii=Falseが UTF‑8 のまま送信できる鍵です。
変数正規化とトラブルシューティング {#troubleshooting}
1. 改行コードの統一
外部サービス(CI/CD、監視ツールなど)から渡される文字列に \r\n が混在するケースが多いです。Python・Node.js・Bash で簡単に LF に置換できます。
| 言語 | 正規化コード例 |
|---|---|
| Python | text = raw_text.replace("\r\n", "\n") |
| Bash | text=${raw//$'\r'$'\n'/$'\n'} |
| Node.js | text = raw.replace(/\r\n/g, '\n'); |
実務上のヒント: 変数を Slack に渡す直前に必ず正規化ステップを入れると、ほぼ全ての改行消失問題が解決します。
2. ESET Protect の事例(参考リンク)
- 問題報告: https://forum.eset.com/topic/44103-eset-protect-slack-webhooks-integrating-eset-generated-multiline-variables-for-slack/
- 原因:
\r\nがそのまま JSON に埋め込まれ、Slack が LF のみを解釈したため 1 行化。
回避策(Python)
|
1 2 3 |
log = raw_log.replace("\r\n", "\n") payload["text"] = log # plain text でも改行は保持される |
3. JSON バリデーションの自動化
CI パイプラインで JSON Lint や jq を使うと、構文エラーや余計なエスケープが即座に検出できます。
|
1 2 3 4 |
# payload が環境変数 $PAYLOAD に入っている例 echo "$PAYLOAD" | jq . > /dev/null \ && echo "✅ JSON valid" || echo "❌ Invalid JSON" |
デバッグ手順と運用上のベストプラクティス {#debugging}
1. Slack の「Test Webhook」機能
管理コンソール → Incoming Webhooks ページにある “Send a test message” ボタンを使用すれば、実際の URL に対して任意の JSON を即座に送信できます。
| 成功条件 | 内容 |
|---|---|
| HTTP 200 OK | Slack がペイロードを受理し、メッセージがチャンネルに表示されたことを示す |
| 正しい改行・装飾 | Block Kit のプレビューで期待通りのレイアウトが確認できる |
2. curl でレスポンスコードとエラーメッセージを取得
|
1 2 3 4 5 |
curl -v -X POST "$WEBHOOK_URL" \ -H "Content-Type: application/json" \ --data-raw '{"text":"debug"}' \ -o /dev/null -w "\nHTTP status: %{http_code}\n" |
400系エラーは JSON が不正、404は URL が無効(削除・タイプミス)を示します。- Slack のレスポンスボディに **"invalid_payload"
などの文字列が含まれることがありますので、-v` オプションで確認してください。
3. ログとモニタリング
| 項目 | 推奨ツール |
|---|---|
| Webhook 呼び出し回数・失敗率 | CloudWatch / Datadog の HTTP カウンター |
| ペイロードサイズ | jq --raw-output '. | tostring' | wc -c で事前測定 |
| レートリミット(1 分あたり最大 20 000 件) | Slack が返す 429 Too Many Requests と Retry-After ヘッダーをハンドリング |
まとめと次に取るべきアクション {#conclusion}
| 項目 | 要点 |
|---|---|
| Webhook の取得 | 管理画面 → Incoming Webhooks → URL をコピーし、シークレットとして保管 |
| 改行の保持 | 必ず LF (\n) に統一。\r\n が混在すると 1 行化するので事前正規化 |
| 文字数上限 | 各テキストフィールドは 4 000 UTF‑8 コードポイント、ブロック全体は約 64 KB |
| Block Kit の選択肢 | 多行テキスト → mrkdwn + \n;等幅ログ → rich_text_preformatted |
| サンプルコード | curl (--data-raw)、PowerShell(ヒアドキュメント)、Python(requests + json.dumps) |
| Workflow Builder | 最大 20 個の変数、各変数は 4 000 文字まで。変数展開は mrkdwn に直接埋め込むだけで改行保持 |
| トラブル対策 | 正規化・JSON Lint・テスト Webhook の活用で「改行消失」や「ペイロード不正」を未然に防止 |
| 運用監視 | HTTP ステータスと 429 レートリミットをロギングし、必要ならリトライロジックを実装 |
CTA
1. 本記事の手順で自社システムの Slack 通知を作成し、Test Webhook で動作確認してください。
2. CI/CD パイプラインに「改行正規化 + JSON バリデーション」ステップを追加し、デプロイ前にペイロードが有効か自動チェックする仕組みを導入しましょう。
これらのベストプラクティスを取り入れれば、信頼性の高いリアルタイム通知 が実現できます。 Happy Slack‑ing!