CrossBridge Lab

技術ネタ、デバイスネタを...

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ボタンをクリックします。

f:id:crossbridge-lab:20170425234410p:plain

次の画面にWebhook URLが表示されるのでこのアドレスをメモしておきましょう。

f:id:crossbridge-lab:20170425234418p:plain

とりあえずCurlでメッセージを送ってみる

メモしたURLにPOSTメソッドでJSONを送ることでメッセージを送信することができます。textキーが送るメッセージになります。

curl -d '{"text":"Hello Slack"}' https://hooks.slack.com/services/ほげほげ

こんな感じにメッセージが送られてきます。

f:id:crossbridge-lab:20170425235032p:plain

送るチャンネルやユーザー名を指定することもできます。それぞれusernameキーとchannelキーになります。

curl -d '{"text":"Hello Slack", "username":"hoge", "channel":"random"}' https://hooks.slack.com/services/ほげほげ

f:id:crossbridge-lab:20170425235209p:plain

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()
}