slack에 Go 언어로 post
소개
외부 라이브러리를 사용하지 않고, Slack에 투고하는 방법이 신경이 쓰였으므로, 스스로 짜 봤다.
Slack 설정은 Bot Token Scopes
에서 chat:write
와 files:write
를 유효하게 한다.
그리고 게시하고 싶은 채널에 앱 권한을 부여하는 것
test.png라는 이미지 파일을 미리 준비해 두는 것
출처 정보
main.gopackage 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())
}
결과
실행하면 다음과 같이 투고된다.
여담
아래 링크의 라이브러리를 사용하면 더 쉽게 할 수 있지만 기능을 확인하거나 이해한다면 위의 소스 코드 만 더 즐겁습니다.
Reference
이 문제에 관하여(slack에 Go 언어로 post), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/karosuwindam/items/891f5812ee9f75eb728e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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())
}
결과
실행하면 다음과 같이 투고된다.
여담
아래 링크의 라이브러리를 사용하면 더 쉽게 할 수 있지만 기능을 확인하거나 이해한다면 위의 소스 코드 만 더 즐겁습니다.
Reference
이 문제에 관하여(slack에 Go 언어로 post), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/karosuwindam/items/891f5812ee9f75eb728e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
아래 링크의 라이브러리를 사용하면 더 쉽게 할 수 있지만 기능을 확인하거나 이해한다면 위의 소스 코드 만 더 즐겁습니다.
Reference
이 문제에 관하여(slack에 Go 언어로 post), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/karosuwindam/items/891f5812ee9f75eb728e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)