Tableau Serverのサブスクライブでメール配信については以前別の記事で取り上げました。
しかしながら、最近はメール文化も廃れてきており、SlackやTeamsなどを
メインのコミュニケーションツールにされている会社も多いことかと思います。
そこで今回はTableau Server上のダッシュボードをSlackに連携する方法を
ご紹介したく思います。
前提
残念ながら、Tableau Server直でSlackに連携するわけではございません。
流れは以下の通りです。
- Tableau ServerサブスクライブでOutlookにメール配信
- Pythonのexchangelibでサブスクライブしたメールの画像ファイルを取得
- 取得した画像ファイルをローカルに保存
- 保存した画像ファイルをrequestsでSlackにアップロード
ちょっと周りくどい方法をとっています。
Slackのアプリを作成し、Tokenを取得する
まずはSlackのアプリを作成します。とても簡単です。
Slackアプリ作成のサイトにアクセス
以下にアクセスします。
アプリを作成する
Create an APPをクリック

App Name
Development Slack Workspace
それぞれを入力、選択し、Create App押下

Basic Informationをクリックし、
Permissionsを押下。

下部のScope部分までスクロールし、
Add an OAuth Scopeをクリックし、
files:writeを選択。

上部のOAuth Tokens & Redirect URLsまでスクロールし戻り、
Install to Workspaceをクリック

以下の画面が表示されるので、
Allowをクリック

Bot User OAuth Tokenをコピー(Copyボタン押下)
テキスト等に保存。

Slackの投稿したいチャネルにアプリを追加する
tableauというチャネルを作成し、そちらに今回作成したtableautestアプリを追加します。
チャネルを選択し、右上の詳細の・・・(More)ボタンをクリック
Add appsを押下する

対象のアプリをAddボタン押下で追加する。

以下の通り、チャネルにアプリが追加される

これにてSlack側の設定完了です。
PythonでTableauダッシュボードをSlack投稿
早速本題です。
今回はPythonのライブラリであるexchangelibとrequestsを使用します。
ライブラリをインストール
pip install exchangelib
pip install requests

exchangelib
Exchange Web Services client library
https://pypi.org/project/exchangelib/

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のダッシュボードの
画像情報を取得します。

一度、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に自動投稿されます。

いかがでしたでしょうか?
一部お見苦しい箇所ございますが、outlook経由という前提であれば、
容易にTableau→Slack連携ができることがお分かりいただいたのかと思います。
今回はjupyter notebookで一つずつ実行を確認して行いました。
実際はpyファイルもしくは実行ファイル、引数を格納するiniファイル等を作成し、
タスクスケジュール化するような運用となりますが、
その際にはこちらをご参考にしていただければと思います。
あとはメール件名で判断しておりますので、こちらを使う場合は
Tableau Serverのダッシュボードの名称については命名規則に則っての
運用前提になりますね。
では。