2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

スクリーンショット 2024-01-30 135647.png

準備

Tokenの取得

以下の記事を参考に、インストールとトークンの取得を行う。
Slackでアプリケーションを作成し、OAuth Tokenを発行するまで

Bot TokenとUser Tokenはどちらでも問題ない。
Scopeはfiles:writeを選択すること。

アプリの追加

Slackの画面から、サイドバーの「アプリを追加する」をクリック。
先ほどインストールしたアプリを選択して追加。
スクリーンショット 2024-01-26 143607.png

サイドバーのAppに追加したアプリが表示されているため、右クリックしてメニューから「アプリの詳細を表示する」を選択。
詳細画面の「チャンネルにこのアプリを追加する」より投稿したいチャンネルを選択
スクリーンショット 2024-01-30 100443.png

チャンネルIDの取得

チャンネルを開いて左上のチャンネル名をクリックし、チャンネル詳細ウィンドウを表示
「チャンネル情報」タブ最下部に表示されているチャンネルIDをコピー
スクリーンショット 2024-01-30 101929(1).png

VBAコード

Const urlUp = "https://slack.com/api/files.upload"
Const token = "トークンをここに入力"
Const channelId = "チャンネルIDをここに入力"

'画像のアップロード
Sub postImage()
    
    Const adTypeBinary = 1
    Const adTypeText = 2
    
    Dim boundary As String: boundary = getBoundary
    
    Dim filePath As String: filePath = "画像ファイルのパスをここに入力"
    Dim mimetype As String: mimetype = "画像ファイルのMIMEタイプ、jpegならimage/jpeg"
    Dim fileName As String: fileName = "アップロード後のファイル名"
    
    Dim fileContents
    Dim stream: Set stream = CreateObject("ADODB.Stream")
    stream.Type = adTypeBinary
    stream.Open
    stream.LoadFromFile filePath
    fileContents = stream.Read
    stream.Close
    
    Dim params As String: params = ""
    
    'トークン
    params = params + "--" + boundary + vbCrLf
    params = params + "Content-Disposition: form-data; name=""token""" + vbCrLf + vbCrLf
    params = params + token + vbCrLf
    'チャンネル
    params = params + "--" + boundary + vbCrLf
    params = params + "Content-Disposition: form-data; name=""channels""" + vbCrLf + vbCrLf
    params = params + channelId + vbCrLf
    'ファイルデータ
    params = params + "--" + boundary + vbCrLf
    params = params + "Content-Disposition: form-data; name=""file""; filename=""" + fileName + """" + vbCrLf
    params = params + "Content-Type: " + mimetype + vbCrLf + vbCrLf
    
    stream.Type = adTypeText
    stream.Charset = "UTF-8"
    stream.Open
 
    'テキストデータの書き込み
    changeStreamType stream, adTypeText
    stream.WriteText params
    'バイナリデータの書き込み
    changeStreamType stream, adTypeBinary
    stream.Write fileContents
    '終端
    changeStreamType stream, adTypeText
    stream.WriteText vbCrLf + "--" + boundary + "--" + vbCrLf
    
    changeStreamType stream, adTypeBinary
    stream.Position = 0
    Dim formData: formData = stream.Read
    stream.Close

    'http送信
    Dim http As XMLHTTP60
    Set http = New XMLHTTP60
    With http
        .Open "POST", urlUp
        .setRequestHeader "Content-Type", "multipart/form-data; boundary=" + boundary
        .setRequestHeader "Authorization", "Bearer " + token
        .send (formData)
    End With
    
    Dim response As String
    response = http.responseText

    Set http = Nothing
    
    If InStr(response, """ok"":false") Then
        MsgBox "画像の投稿に失敗しました。"
        End
    End If

End Sub

'stream type変更
Private Function changeStreamType(stream, t)
    Dim p: p = stream.Position
    stream.Position = 0
    stream.Type = t
    stream.Position = p
    Set changeStreamType = stream
End Function

'boundary生成
Private Function getBoundary() As String

    Static sBoundary As String

    If sBoundary = "" Then

        Dim multipartChars As String: multipartChars = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        Dim boundary As String: boundary = "--------------------"

        Dim i, point As Integer

        For i = 1 To 20
            Randomize
            point = Int(Len(multipartChars) * Rnd + 1)
            boundary = boundary + Mid(multipartChars, point, 1)
        Next

        sBoundary = boundary + Format(Now, "yyyymmddHHMMSS")

    End If

    getBoundary = sBoundary

End Function

補足

引数の追加

files.uploadに引数を追加する場合はparamsにname=引数名で項目を追加する

params = params + "--" + boundary + vbCrLf
params = params + "Content-Disposition: form-data; name=""引数名""" + vbCrLf + vbCrLf
params = params + "hogehoge" + vbCrLf

チャンネルIDの省略

channelsを省略すると投稿を伴わず画像のアップロードのみが行われる。
httpレスポンスから画像のURLが取得可能。

参考

files.upload method | Slack
Excel-VBAによるサイボウズkintoneへのバイナリファイルアップロードのサンプル

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?