GolangでSlackの特定のチャンネルにメッセージを送る
Cronで定期的に動かしているGo言語で書かれたプログラムからSlackの特定のチャンネルにメッセージを送りたいと思って調べてみました。
どうやらWebhook URLを使えば簡単にSlackのチャンネルにメッセージを送ることができるようです。 というわけでまずはSlackのWebhookのURLを取得します。
Webhook URLを取得する
ブラウザで以下のアドレスにアクセスします。
https://slack.com/services/new/incoming-webhook
Post to Channelの箇所でメッセージを送りたいチャンネルを選択します。 ここで選んだチャンネルはメッセージを送信するときのデフォルトのChannelとなるだけで、送信する際に別のChannelを指定することもできるます。
選択したらAdd Incoming WebHooks integrationボタンをクリックします。
次の画面にWebhook URLが表示されるのでこのアドレスをメモしておきましょう。
とりあえずCurlでメッセージを送ってみる
メモしたURLにPOSTメソッドでJSONを送ることでメッセージを送信することができます。text
キーが送るメッセージになります。
curl -d '{"text":"Hello Slack"}' https://hooks.slack.com/services/ほげほげ
こんな感じにメッセージが送られてきます。
送るチャンネルやユーザー名を指定することもできます。それぞれusername
キーとchannel
キーになります。
curl -d '{"text":"Hello Slack", "username":"hoge", "channel":"random"}' https://hooks.slack.com/services/ほげほげ
GoでSlackにメッセージを送る
GoでHTTPリクエストを送信する際にはnet/http
パッケージを使います。
package main import ( "bytes" "fmt" "net/http" ) func main() { name := "Go" text := "Hello from go" channel := "random" jsonStr := `{"channel":"` + channel + `","username":"` + name + `","text":"` + text + `"}` req, err := http.NewRequest( "POST", "https://hooks.slack.com/services/ほげほげ", bytes.NewBuffer([]byte(jsonStr)), ) if err != nil { fmt.Print(err) } req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Print(err) } fmt.Print(resp) defer resp.Body.Close() }