時間がない人へのまとめ

この記事では、Slack APIのリクエストをローカルでキャッチしてSlack風Web UIに表示するツール「slackhog」を作った話をします。MailHogのSlack版です。

目次

まずslackhogの紹介

今回作ったツールは、slackhog というもので、Slack APIリクエストをローカルでキャッチし、Slack風のWeb UIにリアルタイム表示するツールです。いわばMailHogのSlack版です。

開発中にSlack通知のテストをするたびに、実際のSlackチャンネルにメッセージが飛んでしまった経験はないでしょうか。「テスト」とだけ書かれたメッセージがチームのチャンネルに流れてきたり、botの動作確認のつもりが本番チャンネルに大量の通知を飛ばしてしまったり…。

メールの世界にはMailHogというツールがあり、ローカルでメールをキャッチして確認できます。しかし、Slackには同じようなツールがありませんでした。slackhogはそのギャップを埋めるために作りました。

インストール方法

Docker環境があれば一発で起動できます。

docker run -p 4112:4112 ghcr.io/harakeishi/slackhog

設定ファイルを使う場合はこちら。

docker run -p 4112:4112 \
  -v ./slackhog.yaml:/etc/slackhog/config.yaml:ro \
  ghcr.io/harakeishi/slackhog -config /etc/slackhog/config.yaml

Go環境がある場合は go install でもインストールできます。

go install github.com/harakeishi/slackhog@latest
slackhog

起動後、http://localhost:4112 にアクセスするとWeb UIが開きます。

基本的な使い方

slackhogはSlack互換のAPIエンドポイントを提供しています。既存のSlack APIクライアントのベースURLをslackhogに向けるだけで使えます。

Slack互換エンドポイント

メソッド パス 説明
POST /api/chat.postMessage メッセージ投稿
POST /api/chat.update メッセージ更新
GET /api/conversations.info チャンネル情報取得
GET /api/conversations.list チャンネル一覧
POST /services/{webhook_id} Incoming Webhook

例えば、curlでメッセージを投稿する場合はこのようになります。

curl -X POST http://localhost:4112/api/chat.postMessage \
  -H "Content-Type: application/json" \
  -d '{"channel": "#general", "text": "Hello from SlackHog!", "username": "test-bot", "icon_emoji": ":robot_face:"}'

スレッド返信もサポートしています。

curl -X POST http://localhost:4112/api/chat.postMessage \
  -H "Content-Type: application/json" \
  -d '{"channel": "#general", "text": "This is a reply", "thread_ts": "<親メッセージのts>"}'

内部API

slackhogは管理用の内部APIも提供しています。

メソッド パス 説明
GET /_api/messages メッセージ一覧(?channel=フィルタ対応)
DELETE /_api/messages 全メッセージ削除
GET /_api/messages/{id}/replies スレッド返信取得
GET /ws WebSocket(リアルタイム更新)

Web UIについて

slackhogの一番の特徴は、Slack風のWeb UIです。

キャッチしたメッセージはWebSocketを通じてリアルタイムにWeb UIに反映されます。ブラウザを開いたまま開発していれば、curlやアプリケーションからメッセージを送った瞬間にUIに表示されるので、動作確認がとてもスムーズです。

チャンネル一覧画面
チャンネル一覧画面

UIの主な機能

  • チャンネル切り替え — 左サイドバーからチャンネルを選択できる。実際のSlackと同じ感覚で操作できる
  • スレッド表示 — スレッド返信がある場合、サイドパネルでスレッドを表示できる
スレッド表示
スレッド表示
  • リッチメッセージ対応 — Slackの attachmentsblocksfields をレンダリングできる。ボタンやセクションブロックの見た目も確認できる
リッチメッセージ
リッチメッセージ
  • ダーク/ライトテーマ — テーマ切り替えに対応。お好みで
ダークテーマ
ダークテーマ
  • 絵文字アバターicon_emoji で指定した絵文字がアバターとして表示される

Blocks付きのリッチメッセージも確認できます。

curl -X POST http://localhost:4112/api/chat.postMessage \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "#general",
    "text": "Approve this deploy?",
    "blocks": [
      {"type": "section", "text": {"type": "mrkdwn", "text": "Deploy *v1.2.3* to production?"}},
      {"type": "actions", "elements": [
        {"type": "button", "text": {"type": "plain_text", "text": "Approve"}, "style": "primary"},
        {"type": "button", "text": {"type": "plain_text", "text": "Reject"}, "style": "danger"}
      ]}
    ]
  }'

このように、実際のSlackで表示されるのと同じようなリッチメッセージの見た目をローカルで確認できるのが、slackhogの大きなメリットです。

設定ファイル

YAMLまたはJSON形式の設定ファイルで、ポート番号やチャンネルの事前登録などをカスタマイズできます。

port: 4112
max_messages: 1000
channels:
  - general
  - random
  - alerts
オプション 説明 デフォルト
port 起動ポート番号 4112
max_messages インメモリに保持するメッセージの最大数 1000
channels 事前登録するチャンネル名のリスト なし

CLIフラグで設定を上書きすることもできます。

slackhog -port 8080 -max-messages 500 -config slackhog.yaml

slackhogを作った経緯

開発中のアプリケーションにSlack通知の機能を実装すると、テストのたびに実際のSlackチャンネルにメッセージが飛んでしまいます。テスト用のチャンネルを作って対応することもできますが、Slackのワークスペースにゴミが溜まっていくし、そもそもオフラインでは確認できません。

メールの世界にはMailHogという素晴らしいツールがあります。ローカルにSMTPサーバーを立てて、送信されたメールをWeb UIで確認できるというものです。開発中のメール送信テストにはもはや欠かせないツールですが、SlackにはMailHogに相当するツールが見当たりませんでした。

「ないなら作ろう」ということで、slackhogが生まれました。

設計方針として意識したのは以下の点です。

  • Slack API互換 — 既存のコードのベースURLを変えるだけで使えるようにする。専用のクライアントライブラリは不要
  • 単一バイナリ — Goの embed 機能でWeb UIのアセットを埋め込み、バイナリ1つで完結する。Docker一発で起動できる手軽さを重視
  • インメモリストレージ — 永続化は不要。開発中の確認用途なので、再起動でクリアされるくらいがちょうどいい

おわりに

gopose に続いて、また開発中に感じた不便さからツールを作りました。自分自身の開発体験を改善するために作ったものですが、同じ悩みを持っている方のお役に立てれば嬉しいです。

スター、Issue、PRお待ちしてます!!