Tableau Serverのサブスクライブでメール配信については以前別の記事で取り上げました。
しかしながら、最近はメール文化も廃れてきており、SlackやTeamsなどを
メインのコミュニケーションツールにされている会社も多いことかと思います。
そこで今回はTableau Server上のダッシュボードをSlackに連携する方法を
ご紹介したく思います。
前提
残念ながら、Tableau Server直でSlackに連携するわけではございません。
流れは以下の通りです。
- Tableau ServerサブスクライブでOutlookにメール配信
- Pythonのexchangelibでサブスクライブしたメールの画像ファイルを取得
- 取得した画像ファイルをローカルに保存
- 保存した画像ファイルをrequestsでSlackにアップロード
ちょっと周りくどい方法をとっています。
Slackのアプリを作成し、Tokenを取得する
まずはSlackのアプリを作成します。とても簡単です。
Slackアプリ作成のサイトにアクセス
以下にアクセスします。
アプリを作成する
Create an APPをクリック
![](https://boxcode.jp/wp-content/uploads/2021/03/image-25-1024x487.png)
App Name
Development Slack Workspace
それぞれを入力、選択し、Create App押下
![](https://boxcode.jp/wp-content/uploads/2021/03/image-26-1024x841.png)
Basic Informationをクリックし、
Permissionsを押下。
![](https://boxcode.jp/wp-content/uploads/2021/03/image-29.png)
下部のScope部分までスクロールし、
Add an OAuth Scopeをクリックし、
files:writeを選択。
![](https://boxcode.jp/wp-content/uploads/2021/03/image-28-1024x478.png)
上部のOAuth Tokens & Redirect URLsまでスクロールし戻り、
Install to Workspaceをクリック
![](https://boxcode.jp/wp-content/uploads/2021/03/image-30-1024x369.png)
以下の画面が表示されるので、
Allowをクリック
![](https://boxcode.jp/wp-content/uploads/2021/03/image-31-1024x815.png)
Bot User OAuth Tokenをコピー(Copyボタン押下)
テキスト等に保存。
![](https://boxcode.jp/wp-content/uploads/2021/03/image-32.png)
Slackの投稿したいチャネルにアプリを追加する
tableauというチャネルを作成し、そちらに今回作成したtableautestアプリを追加します。
チャネルを選択し、右上の詳細の・・・(More)ボタンをクリック
Add appsを押下する
![](https://boxcode.jp/wp-content/uploads/2021/03/image-33.png)
対象のアプリをAddボタン押下で追加する。
![](https://boxcode.jp/wp-content/uploads/2021/03/image-34.png)
以下の通り、チャネルにアプリが追加される
![](https://boxcode.jp/wp-content/uploads/2021/03/image-35.png)
これにてSlack側の設定完了です。
PythonでTableauダッシュボードをSlack投稿
早速本題です。
今回はPythonのライブラリであるexchangelibとrequestsを使用します。
ライブラリをインストール
pip install exchangelib
pip install requests
![](https://boxcode.jp/wp-content/uploads/2021/03/image-38.png)
exchangelib
Exchange Web Services client library
https://pypi.org/project/exchangelib/
![](https://boxcode.jp/wp-content/uploads/2021/03/image-39.png)
requests
Requests is a simple, yet elegant HTTP library.
https://pypi.org/project/requests/
outlookにログインし、アカウント情報を取得する
exchangelibのCredentialsとAccountを使って、ログイン→アカウント情報を取得します。
FileAttachmentは後々使うのでここで宣言しておきます。
from exchangelib import Credentials, Account, FileAttachment
credentials = Credentials(username='<outlookのログインID>', password='<outlookのログインパスワード>')
account = Account('<outlookのメールアドレス>', credentials=credentials, autodiscover=True)
なお、Exchangeサーバーをご利用の方は以下を実行ください。
from exchangelib import DELEGATE, Account, Credentials, Configuration, FileAttachment
credentials = Credentials(username = '<ユーザー>',password = '<パスワード>')
config = Configuration(server='<サーバー情報>', credentials=credentials)
account = Account(
primary_smtp_address = '<メールアドレス>',
config = config,
autodiscover = False,
access_type = DELEGATE
)
Tableauメールをサーチし、画像ファイルを保存
すでにoutlookにTableau Serverからメール配信がされていること前提です。
以下の通り、outlookに配信されたTableau Serverのダッシュボードの
画像情報を取得します。
![](https://boxcode.jp/wp-content/uploads/2021/03/image-36-1024x698.png)
一度、outlookの添付ファイルをローカルに保存→保存した画像をSlackに投稿するという
流れを組むためのの前準備です。
メール受信日でソートし、今回では上のoutlookの画像の通り、
incomeという件名のメールの最新のものを取得します。
account.inbox.filter(‘subject:income’)
※存在しない時のエラー処理は省略。
import os
path = '<画像ファイルを保存するローカルパス>'
for item in account.inbox.filter('subject:<Tableau配信メールの件名>').order_by('-datetime_received')[:1]:
for attachment in item.attachments:
if isinstance(attachment, FileAttachment):
filepath = os.path.join(path, attachment.name)
with open(filepath, 'wb') as file:
file.write(attachment.content)
保存した画像ファイルをSlackに投稿
次にrequestsを使って、ローカルに保存した画像ファイルをSlackに投稿します。
先ほどSlackアプリ作成時にメモしたTokenを使います。
また、チャネルのIDの取得ですが、Slack上で対象チャネルを右クリックし、
リンクをコピーした際の最後部の「C」から始まるコードです。
チャネル名では無いので、お気をつけください。
filepathは先ほどローカルに保存した画像ファイルのフルパスです。
import requests
data = {
'token': '<SlackアプリのToken>',
'channels': '<投稿するCから始まるチャネルのID。チャネル名ではない。>',
'title': '<投稿時のタイトル>',
'initial_comment': '<投稿時のコメント。「\n」で改行できます。>'
}
files = {'file': open(filepath, 'rb')}
requests.post('https://slack.com/api/files.upload', data=data, files=files)
Slackに投稿
上記を実行すると以下の通り、Slackに自動投稿されます。
![](https://boxcode.jp/wp-content/uploads/2021/03/image-37-1024x600.png)
いかがでしたでしょうか?
一部お見苦しい箇所ございますが、outlook経由という前提であれば、
容易にTableau→Slack連携ができることがお分かりいただいたのかと思います。
今回はjupyter notebookで一つずつ実行を確認して行いました。
実際はpyファイルもしくは実行ファイル、引数を格納するiniファイル等を作成し、
タスクスケジュール化するような運用となりますが、
その際にはこちらをご参考にしていただければと思います。
あとはメール件名で判断しておりますので、こちらを使う場合は
Tableau Serverのダッシュボードの名称については命名規則に則っての
運用前提になりますね。
では。