[Go] Slack API を使って画像をアップロードする
作成日: 2021年08月21日
Slack の API を利用して画像のアップロードを行う Go のサンプルコードです。サンプルコードの簡略化のためエラー処理は簡略化しています。
package main
import (
"bytes"
"io"
"mime/multipart"
"net/http"
"os"
)
func main() {
f, err := os.Open("./hoge.png")
if err != nil {
panic("error")
}
defer f.Close()
bodyBuf := &bytes.Buffer{}
writer := multipart.NewWriter(bodyBuf)
part, err := writer.CreateFormFile("file", "some-filename")
if err != nil {
panic("error")
}
if _, err := io.Copy(part, f); err != nil {
panic("error")
}
err = writer.WriteField("token", "dummy-token")
if err != nil {
panic("error")
}
err = writer.WriteField("channels", "some-channel-name")
if err != nil {
panic("error")
}
err = writer.Close()
if err != nil {
panic("error")
}
requestSlack, err := http.NewRequest(
"POST",
"https://slack.com/api/files.upload",
bodyBuf)
if err != nil {
panic("error")
}
requestSlack.Header.Set("Content-Type", writer.FormDataContentType())
clientSlack := new(http.Client)
responseSlack, err := clientSlack.Do(requestSlack)
if err != nil {
panic("error")
}
defer responseSlack.Body.Close()
}
説明
os.Open()
を使ってアップロードを行うファイルである./hoge.png
を読み込みます。multipart.NewWriter()
を使ってmultipart/form-data
形式でデータを送信するための補助を行ってくれる Writer を作成します。CreateFormFile()
を使ってfile
フィールドにファイル名some-filename
を指定し、パートを作成します。io.Copy()
を使って、作成したファイル用のパートに読み込んだ画像データをコピーします。WriteField()
を使って、Slack の API が要求するパラメーターを作成していきます。token
: Slack で発行した API を利用するためのトークンを指定します。channels
: 投稿する Slack のチャンネル名を指定します。チャンネル ID でも可です。
http.NewRequest()
を使って HTTP リクエストを作成します。requestSlack.Header.Set()
ではContent-Type
を指定します。自動生成してくれたバウンダリーが含まれるためwriter.FormDataContentType()
を指定しています。new(http.Client)
を使って HTTP クライアントを作成します。clientSlack.Do(requestSlack)
で作成したリクエストを送信します。