Slack уведомления с помощью Incoming WebHooks (пример на golang)
Реализация уведомлений в канал slack с помощью Incoming WebHooks.
Порядок действий.
- Открываем страницу приложения Incoming WebHooks - http://slack.com/apps/A0F7XDUAZ.
- Открываем страницу добавления новой конфигурации хука "Add Configuration".
- Выбираем канал для уведомлений и жмем "Add Incoming WebHooks integration".
- Получаем URL для отправки POST запроса с данными playload JSON.
Дополнительно можно настроить иконку и имя отправителя.
Нельзя приаттачить файлы или выбрать канал уведомлений. Для этого нужно использовать web api.
Список webhooks slack
Пример отправки уведомления в slack на golang (notify-slack.go):
go run notify-slack.go --success --message "*Deploy success*"
# или
go build notify-slack.go
notify-slack --success --message "*Deploy success*"
package main
import (
"bytes"
"encoding/json"
"errors"
"flag"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
)
func main() {
var message, logFile string
var success, warn, fail bool
flag.StringVar(&message, "message", "", "Slack message text")
flag.StringVar(&logFile, "log", "", "Path to log file")
flag.BoolVar(&success, "success", false, "Status icon success")
flag.BoolVar(&warn, "warn", false, "Status icon warn")
flag.BoolVar(&fail, "fail", false, "Status icon fail")
flag.Parse()
// @note Укажите свой URL
hookUrl := "https://hooks.slack.com/services/<YOUR>/<SECRET>/<TOKEN>"
if hookUrl == "" {
log.Fatalln("Not specified slack hook url!")
os.Exit(3)
}
message = strings.Replace(message, "\\n", "\n", -1)
playload := map[string]interface{}{
"username": "Deployer",
"channel": "#booklama",
"text": message,
}
// @note Attachments allow only for web api, not incoming webhook - https://api.slack.com/docs/message-attachments
// @note Use upload file https://api.slack.com/methods/files.upload
if success {
playload["icon_emoji"] = ":heavy_check_mark:"
} else if warn {
playload["icon_emoji"] = ":warning:"
} else if fail {
playload["icon_emoji"] = ":bangbang:"
}
sendPostJson(hookUrl, playload)
os.Exit(0)
}
func sendPostJson(url string, data interface{}) (bodyString string, err error) {
jsonString, _ := json.Marshal(data)
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonString))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
os.Exit(1)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
bodyString = string(body)
if resp.StatusCode != 200 {
fmt.Println("Response Status:", resp.Status) // 200 OK
fmt.Println("Response Headers:", resp.Header)
fmt.Println("Response Body:", bodyString)
return bodyString, errors.New("can't work with 42")
}
return bodyString, nil
}
#slack, #webhook, #slack уведомления