「毎回Slackのチャンネルを開いてExcelやPDFファイルを送信するのが面倒くさい」とか、
「Slackに決まったファイルをアップロードする作業を効率化したい」
という課題をPythonで楽にする手順をご紹介します。
非エンジニアの自分が納得いく方法で、コードも理解できるやり方をまとめました。
目次
SlackにPythonでファイルを送信する手順
Slack APIというという、プログラムを連携してSlackに備わっている機能を使う仕組みを使います。
1. Slack APPを作成する
「アプリを作るなんてなぜ?」と思われるかもしれませんが、調べているうちにこの方法がいたって一般的だと分かったのでご安心ください。
API Slackのホームページから、右上のYour apps>Create New Appをクリック。
From scratchを選択します。
任意のアプリ名を入力したら、ドロップダウンリストにあるworkspaceを選択。
最後にCreate Appをクリックします。
Permissionsを選択。
アプリがSlackで操作できる権限を付与します。
Add an OAuth Scopeのボタンからfiles:writeを選び、ファイルをアップロードする権限を与えます。
設定はBot Token ScopesのみでOKです。
同じページにある、下記のボタンをクリックします。
「(アプリ名が)ワークスペースにアクセスする権限をリクエストしています」というメッセージが出るので、「許可する」をクリック。
すると下のような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)
今回はExcelとPDFの2つのファイルをアップロードします。
21行目のファイル名と23行目のタイトルは、元のファイルのファイル名をそのまま使用するため、os.path.basename()を使って設定。
22行目のinitial_commentはファイルをアップロードしたときにつけるメッセージで、9行目にリストに入れました。
複数のファイルも、このようにアップロードができました!