[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) で作成したリクエストを送信します。
Go