📬
【Slack】files.upload API 廃止に伴う書き換え curl もしくは Python Request関数を使って
本記事で参考になるケース
- 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つの投稿にする
- Step 1 と Step 2を繰り返し、Step 1のfile_idを保管
- 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