Slack

Slack Incoming Webhookで改行失われる問題と対策【Block Kit・JSON編】

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
タイプ別にすぐ選べる

2026年、ビジネス競争力を上げる2ルート

"組織を動かす"立場と"個人スキルを伸ばす"立場では必要な打ち手が違います。自分の役割で選んでください。

▷ 部門・全社でAIリテラシー研修を入れたい管理職・人事・経営層

【Kindle本】イノベーションOps 組織を動かすDX&AI導入プロセスのすべて

▷ 個人のビジネススキル・思考法を"本から"底上げしたい実務担当者

Kindle Unlimited 30日無料|ビジネス書読み放題▶

※積極的な自己学習が成長への近道です

▶ 耳で学ぶビジネススキルなら オーディオブックAudible 。日経BP・東洋経済系の話題作も対象です。


スポンサードリンク

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. 最小ペイロード例

この JSON を Content‑Type: application/json として POST すれば、認証なしでメッセージが届きます。


改行が失われる原因と 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 文字が複数バイトになるため、コードポイント が上限です。
  • 長文を送る必要がある場合は ブロック分割(複数の sectiondivider)や ファイルアップロード API の併用を検討してください。

3. Workflow Builder の変数制限

  • カスタム変数は最大 20 個 まで作成可能です。
  • 各変数は文字列型で、内部的には同じ 4 000 文字上限が適用されます(ブロック構造に埋め込む場合は全体の 64 KB 制限も考慮)。

公式リンク: Workflow Builder – カスタム変数を追加する方法


Block Kit で多行テキストを表示する実装例 {#block-kit-multiline}

1. section ブロック + mrkdwn(最もシンプル)

  • \n をエスケープせずにそのまま文字列に書くと、Slack が mrkdwn パーサで改行として解釈します。
  • 注意: JSON エンコード時に \ が二重になる(例: "\\n")と実際の表示が \n という文字列になるので、プログラム側では生の LF を渡すようにしてください。

2. 等幅フォントでログを見せる rich_text_preformatted

  • preformatted等幅フォント と自動的なコードブロックスタイルを提供します。
  • 行頭にスペースやタブを書き込んでも、表示はそのまま維持されます。

3. インラインコードとエスケープ

シンボル 表示例 エスケープ方法
*(太字) *重要* → 重要 \*重要\*
_(斜体) _注釈_ → 注釈 \_注釈\_
(インラインコード) cmd --optioncmd --option バッククオートはそのままで OK

ベストプラクティス: 文字列中に多数の特殊文字が混在する場合は、事前に 正規表現でエスケープ処理\*, \_, )を行うと安全です。


実装サンプル:curl・PowerShell・Python で改行保持ペイロードを送信 {#samples}

1. curl(Unix 系シェル)

  • --data-rawシェルが文字列を追加でエスケープしない ため、JSON 内の \n がそのまま送信されます。
  • Windows の PowerShell では同等のオプションは -Body とシングルクォートが使えません。代わりに ヒアドキュメント@' … '@)を利用します。

2. PowerShell(Windows)

  • PowerShell の文字列リテラルでは **バッククオート () がエスケープ文字**です。\nではなく n を書くと LF に変換されます。
  • Invoke-RestMethod は自動的に UTF‑8 エンコーディングで送信します。

3. Python(requests)

  • json.dumps(..., separators=(",", ":")) は余計なスペースを除去し、ペイロードサイズを最小化します。
  • ensure_ascii=FalseUTF‑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)

3. JSON バリデーションの自動化

CI パイプラインで JSON Lintjq を使うと、構文エラーや余計なエスケープが即座に検出できます。


デバッグ手順と運用上のベストプラクティス {#debugging}

1. Slack の「Test Webhook」機能

管理コンソール → Incoming Webhooks ページにある “Send a test message” ボタンを使用すれば、実際の URL に対して任意の JSON を即座に送信できます。

成功条件 内容
HTTP 200 OK Slack がペイロードを受理し、メッセージがチャンネルに表示されたことを示す
正しい改行・装飾 Block Kit のプレビューで期待通りのレイアウトが確認できる

2. curl でレスポンスコードとエラーメッセージを取得

  • 400 系エラーは JSON が不正404URL が無効(削除・タイプミス)を示します。
  • Slack のレスポンスボディに **"invalid_payload"などの文字列が含まれることがありますので、-v` オプションで確認してください。

3. ログとモニタリング

項目 推奨ツール
Webhook 呼び出し回数・失敗率 CloudWatch / Datadog の HTTP カウンター
ペイロードサイズ jq --raw-output '. | tostring' | wc -c で事前測定
レートリミット(1 分あたり最大 20 000 件) Slack が返す 429 Too Many RequestsRetry-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!

スポンサードリンク

お得なお知らせ

スポンサードリンク
タイプ別にすぐ選べる

2026年、ビジネス競争力を上げる2ルート

"組織を動かす"立場と"個人スキルを伸ばす"立場では必要な打ち手が違います。自分の役割で選んでください。

▷ 部門・全社でAIリテラシー研修を入れたい管理職・人事・経営層

【Kindle本】イノベーションOps 組織を動かすDX&AI導入プロセスのすべて

▷ 個人のビジネススキル・思考法を"本から"底上げしたい実務担当者

Kindle Unlimited 30日無料|ビジネス書読み放題▶

※積極的な自己学習が成長への近道です

▶ 耳で学ぶビジネススキルなら オーディオブックAudible 。日経BP・東洋経済系の話題作も対象です。


-Slack