2020/08/12

[Python]SlackにAPIを使ってファイルをアップロードする

python

概要

こちらの記事でChatworkにアップしていたものを
Slackに移行する必要があったので、対応しました。

実施内容

以下の手順で実施しました。

  • SlackでOAuth Applicationを作成します
  • OAuth Applicationのaccess tokenを使って、メッセージが投稿できることを確認します
  • Pythonを使ってファイルをアップロードする処理を書きます

Create Slack Application

SlackのGUIから、Applicaitonの作成を行います。

その際に、以下のScopeを追加しておきます。

  • files:write
  • chat:write

作成すると、Access Tokenが発行されるのでメモを取っておきます。

Test Slack Application

試しに、発行されたTokenを使って、generalチャンネルに curl を使って投稿してみます。

access_token=yout-slack-app-access-token-here
channel=general
curl "https://slack.com/api/chat.postMessage?token=${access_token}&channel=${channel}&text=Test"

ちゃんと投稿できれば確認OKです。

なお、事前に投稿したいchannelにSlack Applicationのusernameを招待しておく必要があります。
これをしておかないと、 not_in_channel などのエラーメッセージがでます。

Upload File in Python

こんな感じになります。(TSVファイルの場合)

  • channel idにする必要があるので注意です。(curlの戻り値にchannel idがあるのでそれをメモしておくと良いです。)
file_name="your-file-name"
file_data = open(f"/path/to/{file_name}", 'rb').read()
files = {
    "file": (file_name, file_data, "text/tab-separated-values"),
}
data = {
    "token": "yout-slack-app-access-token-here",
    "channels": "your-slack-channel-id",
    "title": "message-title-here",
    "filename": file_name,
    "filetype": "tsv",
}
post_message_url = "https://slack.com/api/files.upload"
response = requests.post(
    post_message_url,
    data=data,
    files=files,
)

以上になります。