とあるサービスの webhook の中身を確認したいことがありました。webhook の中身を見るためには web サーバーを構築してログを見ればよいのですが、インターネット上に web サーバーを構築するのはそれなりに大変です。GitHub のドキュメントに smee を使った方法が紹介されている ので、その方法を試したときの記録です。
smee とは
webhook を自分の PC に転送するためのサービスです。https://github.com/probot/smee.io で詳しく説明されています。
smee で channel を作成
https://smee.io で channel を作成すると、URL が発行されます。Webhook の送信先に発行された URL を設定します。
簡易的な web サーバーを作成
smee から転送されてきた webhook の中身をみるために、手元の PC で簡易的な web サーバーを立ち上げます。今回は Go で書きました。
main.go
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) {
body, _ := io.ReadAll(r.Body)
//fmt.Println("===== Headers =====")
//for k, v := range r.Header {
// fmt.Printf("%s: %v\n", k, v)
//}
//fmt.Println("===== Body =====")
fmt.Println(string(body))
w.WriteHeader(http.StatusOK)
})
log.Println("listening on :3000")
log.Fatal(http.ListenAndServe(":3000", nil))
}
Docker コンテナで smee-client と web サーバーを立ち上げます。
compose.yml
services:
server:
image: golang:1.26
working_dir: /app
volumes:
- .:/app
command: go run main.go
ports:
- "3000:3000"
client:
image: node:24
command: sh -c "npm install -g smee-client && smee --url ${SMEE_URL} --target http://server:3000/webhook"
environment:
- SMEE_URL=${SMEE_URL}
depends_on:
- server
使い方。以下のように SMEE_URL を環境変数に設定して、docker compose up コマンドで立ち上げます。
SMEE_URL=https://smee.io/xxxx docker compose up
うまくいくと webhook の中身が出力されます。
出力内容をカスタマイズ
中身を見ながら、それをファイルにも出力したい場合。
SMEE_URL=https://smee.io/xxxx docker compose up 2>&1 | tee webhook.log
コンテナ名が邪魔な場合は、オプションで出力しないようにできます。
SMEE_URL=https://smee.io/xxxx docker compose logs -f --no-log-prefix server
リクエストヘッダも見たい場合は、さきほどの main.go のヘッダ出力のコメントアウトを外します。
fmt.Println("===== Headers =====")
for k, v := range r.Header {
fmt.Printf("%s: %v\n", k, v)
}
注意点
https://github.com/probot/smee.io にも書かれていますが、本番環境では使わないようにしましょう。あくまで開発用途で。
smee の channel の URL は共有しないようにしましょう。URL が他の人に知られると、その人も webhook の内容を見ることができます。