slackhogというツールを公開した
時間がない人へのまとめ
この記事では、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の
attachments、blocks、fieldsをレンダリングできる。ボタンやセクションブロックの見た目も確認できる

- ダーク/ライトテーマ — テーマ切り替えに対応。お好みで

- 絵文字アバター —
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お待ちしてます!!
