Slack уведомления с помощью Incoming WebHooks (пример на golang)

Категория: IT / WEB / Internet

Реализация уведомлений в канал slack с помощью Incoming WebHooks.

Порядок действий.

  1. Открываем страницу приложения Incoming WebHooks - http://slack.com/apps/A0F7XDUAZ. 
  2. Открываем страницу добавления новой конфигурации хука "Add Configuration".
  3. Выбираем канал для уведомлений и жмем "Add Incoming WebHooks integration".
  4. Получаем 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 уведомления