slack에 Go 언어로 post

13707 단어 5슬랙

소개



외부 라이브러리를 사용하지 않고, Slack에 투고하는 방법이 신경이 쓰였으므로, 스스로 짜 봤다.
Slack 설정은 Bot Token Scopes 에서 chat:writefiles:write 를 유효하게 한다.
그리고 게시하고 싶은 채널에 앱 권한을 부여하는 것
test.png라는 이미지 파일을 미리 준비해 두는 것

출처 정보



main.go
package main

import (
    "bytes"
    "context"
    "io"
    "io/ioutil"
    "mime/multipart"
    "net/http"
    "net/url"
    "os"
    "path/filepath"
    "strings"
    "time"
)

const (
    SLACKPOSTMESSAGE = "https://slack.com/api/chat.postMessage"
    SLACKPOSTFILE    = "https://slack.com/api/files.upload"
    TOKEN            = "{表示されたトークンを記載}"
    CHANNEL          = "general"
)

}

func postSlackfile() string {
    filename := "./test.png"
    file, err := os.Open(filename)
    if err != nil {
        return ""
    }
    defer file.Close()
    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)
    part, err := writer.CreateFormFile("file", filepath.Base(filename))
    if err != nil {
        return ""
    }
    _, err = io.Copy(part, file)
    if err != nil {
        return ""
    }
    err = writer.Close()
    if err != nil {
        return ""
    }

    values := url.Values{
        "token": {TOKEN},
    }
    values.Add("channels", CHANNEL)
    values.Add("filename", filepath.Base(filename))

    req, err := http.NewRequest("POST", SLACKPOSTFILE, body)
    if err != nil {
        return ""
    }
    req = req.WithContext(context.Background())
    req.URL.RawQuery = (values).Encode()
    req.Header.Add("Content-Type", writer.FormDataContentType())

    client := &http.Client{}
    // client.Timeout = time.Second * 15
    resp, err := client.Do(req)
    if err != nil {
        return ""
    }
    defer resp.Body.Close()
    body2, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return ""
    }
    return string(body2)
}

func postSlackMessage(text string) string {
    urldata := SLACKPOSTMESSAGE
    values := url.Values{}
    values.Set("token", TOKEN)
    values.Add("channel", CHANNEL)
    values.Add("text", text)

    client := &http.Client{}
    client.Timeout = time.Second * 15
    req, err := http.NewRequest("POST", urldata, strings.NewReader(values.Encode()))
    if err != nil {
        return ""
    }
    //
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    resp, err := client.Do(req)
    if err != nil {
        return ""
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return ""
    }
    return string(body)

}

func main(){
    fmt.Println(postSlackMessage("Hello World\nbbb"))
    fmt.Println(postSlackfile())
}


결과



실행하면 다음과 같이 투고된다.



여담



아래 링크의 라이브러리를 사용하면 더 쉽게 할 수 있지만 기능을 확인하거나 이해한다면 위의 소스 코드 만 더 즐겁습니다.

좋은 웹페이지 즐겨찾기