PythonでSlackにファイルを送信する方法と活用例

「毎回Slackのチャンネルを開いてExcelやPDFファイルを送信するのが面倒くさい」とか、

「Slackに決まったファイルをアップロードする作業を効率化したい」

という課題をPythonで楽にする手順をご紹介します。

非エンジニアの自分が納得いく方法で、コードも理解できるやり方をまとめました。

SlackにPythonでファイルを送信する手順

Slack APIというという、プログラムを連携してSlackに備わっている機能を使う仕組みを使います。

1. Slack APPを作成する

「アプリを作るなんてなぜ?」と思われるかもしれませんが、調べているうちにこの方法がいたって一般的だと分かったのでご安心ください。

STEP

API Slackのホームページから、右上のYour apps>Create New Appをクリック。

STEP

From scratchを選択します。

STEP

任意のアプリ名を入力したら、ドロップダウンリストにあるworkspaceを選択。

最後にCreate Appをクリックします。

STEP

Permissionsを選択。

STEP

アプリがSlackで操作できる権限を付与します。

Add an OAuth Scopeのボタンからfiles:writeを選び、ファイルをアップロードする権限を与えます。

設定はBot Token ScopesのみでOKです。

STEP

同じページにある、下記のボタンをクリックします。

STEP

「(アプリ名が)ワークスペースにアクセスする権限をリクエストしています」というメッセージが出るので、「許可する」をクリック。

すると下のようなTokenが発行されます。

このトークンがPythonのプログラムに必要となります。

2. ファイルをアップロードしたいチャンネルにAPPを追加

ここからはご自分のSlackで、ファイルを送信したいチャンネルを選んでください。

私は「slack-ファイル送信テスト」というチャンネルを作成しました。

チャンネル名の横にある矢印をクリックすると、下のような詳細情報が現れるので、「インテグレーション」のタブをクリックし、「アプリを追加する」をクリックします。

先ほど作ったアプリを追加しないと、ファイルがアップロードされません。

これで、設定が完成です!

ここからPythonでプログラムを作成します。

ファイルを送信するPythonプログラム

ファイルに簡単なメッセージを付けて、ファイル名が分かる状態で送信するプログラムを考えました。

Pythonのプログラムでは先ほど発行したトークンと、チャンネルのIDが必要です。

チャンネルIDは「チャンネル情報」の一番下にあるので、こちらでご確認&コピーしてください。

送信ファイルが1つの場合

#ファイルにメッセージをつけてSlackにアップロード
import requests
import os

url="https://slack.com/api/files.upload"
file_path="ご自身のファイルの絶対パス"
file_name=os.path.basename(file_path)

data={
    "token":"ご自身のトークン",
    "channels":"ご自身のチャンネルID",
    "filename":file_name,
    "initial_comment":"スケジュール表を送ります",
    "title":file_name
}
files={"file":open(file_path,"rb")}
requests.post(url,data=data,files=files)

5行目のURLは公式サイトにあるように、Slackにファイルをアップロードするために決められたアドレスです。

7行目のfile_name=os.path.basename(file_path)は、ファイル名の設定をしています。

元のファイル名を維持したいので、パスからファイル名だけを取得できるos.path.basename()を使いました。

9行目のdate=の中の項目はご自身で設定が必要なので、コードを参考に入力してください。

initial_commentには、ファイルをアップロードしたときにつけるメッセージを入れます。

12行目のfilenameは7行目で設定したファイル名、14行目のtitleはファイルをアップロードしたときに表示されるファイル名です。

ここもファイル名を表示させたいので、os.path.basename()を使いました。

このように、メッセージ付きでアップロードができました!

送信ファイルが複数ある場合

#複数のファイルにメッセージをつけてSlackにアップロード
import requests
import os
from glob import glob

url="https://slack.com/api/files.upload"
token="ご自身のトークン"
channel_id="ご自身のチャンネルID"
innitial_comment=["スケジュール表","請求書"]

#最新のExcelとPDFファイルを取得する
file=sorted(glob("*xlsx"))[0]
file2=sorted(glob("*.pdf"))[0]

file_paths= [file,file2]

for i,file_path in enumerate(file_paths):
    data={
        "token": token,
        "channels": channel_id,
        "filename": os.path.basename(file_path),
        "initial_comment": innitial_comment[i],
        "title": os.path.basename(file_path)
    }
    files={"file": open(file_path, "rb")}

    response=requests.post(url, data=data, files=files)

複数ファイルの場合はfor文を使います。

今回はExcelとPDFの2つのファイルをアップロードします。

21行目のファイル名と23行目のタイトルは、元のファイルのファイル名をそのまま使用するため、os.path.basename()を使って設定しました。

22行目のinitial_commentはファイルをアップロードしたときにつけるメッセージで、9行目にリストに入れました。

for文の中でenumerateを使うと、リストのインデックスが取得できるため、initial_commentのインデックスの値を取るために使いました。

複数のファイルも、このようにアップロードができました!

活用例と注意点

定期的にファイルをアップロードするフォルダに今回作成したPythonファイルを置き、globで最新のファイルのみを取得するという書き方にすれば、ファイルの絶対パスを書く手間が省けます。

(手動の設定はチャンネルIDの入力だけで、あとはプログラムを実行するだけでファイルの送信が完了します。)

Slackには様々なAPIが用意されていますが、例えばメッセージ削除などは手動でやりたいと、調べてみて思いました。

あれもこれもPythonで…とプログラム作成に夢中になってしまうと逆効果。Slackで操作するより非効率になるのでご注意ください 笑

ABOUT US
中野友梨
旅行業の会社を運営。
慶応義塾大学卒

書類作成、確認作業などに追われる日々の仕事。
一生懸命やっているつもりだった。
計算ミス、手配ミスにヒヤヒヤする日々。
仕事の効率をなんとかしなけらばいけないと思っていたけど、 どうしたらよいのか分からなかった。
Pythonの世界なんて、全く知らなかった。
そんな私がPythonで仕事が効率化されることによって、公私ともに大きく 変わるとは、夢にも思っていなかった..。

業務効率化のためにPythonを始めたことがきっかけで、Pythonにはまりました。(個人利用レベル)
詳細はこちら

労働時間が大きく削減され、仕事が大カイゼンされて自由な時間も生まれました。
私のした素晴らしい経験を共有したい、仕事の効率が悪いけど、どうにかしたいという悩みを持った人々に向けて、 Pythonがいいよ、と教えてあげたい。
このブログでは、私が経験したエラー解決や迷い所、Pythonの活用方法をお伝えします。