📬

【Slack】files.upload API 廃止に伴う書き換え curl もしくは Python Request関数を使って

2024/06/01に公開

本記事で参考になるケース

  • files.upload API が廃止なった
  • あえて公式関数は使わずに対応したい

curlの利用

前提

upload.png という画像ファイルが存在する

> ls
upload.png

Step 1:

SlackからファイルをアップロードするUpload URLとファイル識別子を発行してもらう

> curl  https://slack.com/api/files.getUploadURLExternal -F token='xoxb-xxx'  -F length=filesize -F filename=filename

{"ok":true,"upload_url":"https://files.slack.com/upload/v1/ABCD...","file_id":"ABCDEFGH"}

Step 1 Example:

20000バイトのupload.png ファイルをslackにアップしたい場合

curl  https://slack.com/api/files.getUploadURLExternal -F token='xoxb-xxx'  -F length=20000 -F filename=upload.png

※filenameは今回upload.pngにしているが、ここの名前はSlack上でのファイルの名前なのでupload.pngでなくとも良い(slackにアップされたファイルをダウンロードした時のファイル名になる)

Step 2:

SlackにファイルをStep 1のUpload URLに対してアップロードする

> curl -XPOST https://files.slack.com/upload/v1/ABCD... --data-binary @./file

OK - xxxxxx

Step 2 Example:

curl  -XPOST https://files.slack.com/upload/v1/ABCD... --data-binary @./upload.png

Step 3:

Slack上のUploadしたファイルをStep 1の返り値内のファイル識別子を用いてチャンネルに投稿する

> curl -X POST -H "Authorization: Bearer xoxb-xxx" -H "Content-Type: application/json" -d '{ "files": [{"id":"ABCDEFGH", "title":"投稿時のタイトル"}], "channel_id": "CXXXXXXXX" }' https://slack.com/api/files.completeUploadExternal

{"ok":true,"files".....}

Step3' (Option):

複数のファイルをまとめて1つの投稿にする

  1. Step 1 と Step 2を繰り返し、Step 1のfile_idを保管
  2. Step 3のfilesに追加
> curl -X POST -H "Authorization: Bearer xoxb-xxx" -H "Content-Type: application/json" 
-d  '{ "files": [
    {"id":"ABCDEFGH", "title":"投稿時のタイトル1"},
    {"id":"EFGHIJKL", "title":"投稿時のタイトル2"},
    {"id":"OPQRSTUV", "title":"投稿時のタイトル3"},
    {"id":"WXYZABCD", "title":"投稿時のタイトル4"}
    ...
    ], "channel_id": "CXXXXXXXX" 
    }' https://slack.com/api/files.completeUploadExternal

{"ok":true,"files".....}

Python requestの利用

一気にひとまとめに記載

例:

画像を通知してみよう!


########################
## 適当なグラフ画像を作成 ##
########################
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from io import BytesIO

r = np.random.RandomState(42)
m = [0, 0]
c = [[1, 2], [2, 5]]
X = r.multivariate_normal(m, c, 100)

f = plt.figure()
plt.scatter(X[:, 0], X[:, -1])
print(plt)

## 画像をSlackに通知

buf = BytesIO()
plt.savefig(buf, format='png')

filename = 'test.png'
bytedata = buf.getvalue()
title = 'test'
channelId = 'CXXXXXXX'

## Step 1
response_get = requests.get(
    url='https://slack.com/api/files.getUploadURLExternal',
    headers={'Authorization': 'Bearer xoxb-xxx'},
    params ={ 'filename' : filename, 'length' : len(bytedata)}
    )

## Step 2
response_post_file = requests.post(
    url=response_get.json()['upload_url'],
    data=bytedata
    )

## Step 3
response_post_chennel = requests.post(
    url='https://slack.com/api/files.completeUploadExternal',
    headers={'Content-Type': 'application/json', 'Authorization': 'Bearer xoxb-xxx'},
    json = {
        'files': [{'title': title, 'id': response_get.json()['file_id']}],
        'channel_id': channelId
        }
    )

##  Step3' (Option)

# response_post_chennel = requests.post(
#     url='https://slack.com/api/files.completeUploadExternal',
#     headers={'Content-Type': 'application/json', 'Authorization': 'Bearer xoxb-xxx'},
#     json = {
#         'files': [
#             {'title': title1, 'id': response_get1.json()['file_id']}
#              {'title': title2, 'id': response_get2.json()['file_id']}
#               {'title': title3, 'id': response_get3.json()['file_id']}
#                {'title': title4, 'id': response_get4.json()['file_id']}
#         ],
#         'channel_id': channelId
#         }
#     )

まとめ

癖があるのですが、やってみると単純です. 参考にしてください.

Discussion