概要
pythonでAPI使おうとして躓いたので。
ちなみにTableau Server Client (TSC)を使った時の話です。
Tableau Online版はこのへんが参考になるかと。
考え方は同じですが。
https://www.meganii.com/blog/2021/03/27/how-to-use-tableau-rest-api-with-personal-access-tokens/
https://cuebic.hatenablog.com/entry/2023/02/24/104623
https://www.ai-shift.co.jp/techblog/1577
ログイン
https://tableau.github.io/server-client-python/docs/
こちらに書いてあるようなログインが出来ればあとは煮るなり焼くなり。
ログインが出来なかったので、来世の自分向けにまとめます。
↓これが全て
import tableauserverclient as TSC
TOKEN_NAME = 'トークンのなまえ'
TOKEN_VALUE ='トークンの値'
SERVER_URL ='URLの固有部分'
tableau_auth = TSC.PersonalAccessTokenAuth(TOKEN_NAME, TOKEN_VALUE)
server = TSC.Server(SERVER_URL)
server.version = "3.17"
with server.auth.sign_in(tableau_auth):
all_datasources, pagination_item = server.datasources.get()
print("\nThere are {} datasources on site: ".format(pagination_item.total_available))
print([datasource.name for datasource in all_datasources])
ログインするときはトークン必須。
(セキュリティ的にもIDとパスワードはよくない)
トークンはマイアカウントの設定>個人トークンの発行から。
ちなみにトークンは15日間使用しないと使用不可になるらしい。
ので、定期的に使っていれば実質有効期限なし。たぶん。
で、URL。
サンプルには'http://SERVER_URL'と書いてあり、ぶっちゃけこのまんまの通り入力すればよかったのだが、深読みしすぎた。
「https://hogehoge.tableeeeeeeau.com/#/home」 みたいなURLだとすると、「hogehoge.tableau.com」と入力すればよいのである。
気づけなかったのがつらい。
あとはサーバのバージョン。
なんとなく不安だったので上書きした。
これの一番下の表に書いてるけども、サーバのバージョン毎にAPIも更新されているような。
https://tableau.github.io/server-client-python/docs/versions.html
古いものに対してはおそらく互換性あると思うし、デフォルトのバージョンでコケることもあるのか不明なので、おまじない。
なんにもしなかったら2.4って出た気がする。
やってることメモもついでに。
# requestでいうjsonを作ってくれてる
tableau_auth = TSC.PersonalAccessTokenAuth(TOKEN_NAME, TOKEN_VALUE)
# APIたたくURL作ってくれてる
server = TSC.Server(SERVER_URL)
# request送ってくれる
server.auth.sign_in(tableau_auth)
requestに置換すればべんりーってなるやつ。
試しにrequestで叩いてからこのライブラリ使ったら、ようやく何やってんのか理解できた。
いきなし発達文明に手を出すものではないな。
抽出の更新
https://tableau.github.io/server-client-python/docs/filter-sort
こちらを参考に。
更新するにはワークブックIDというのを取得しなくてはならないらしい。
フィルタリングで取れるのでさくっと取って更新する。
import tableauserverclient as TSC
TOKEN_NAME = 'トークンのなまえ'
TOKEN_VALUE ='トークンの値'
SERVER_URL ='URLの固有部分'
tableau_auth = TSC.PersonalAccessTokenAuth(TOKEN_NAME, TOKEN_VALUE)
server = TSC.Server(SERVER_URL)
server.version = "3.17"
with server.auth.sign_in(tableau_auth):
req_option = TSC.RequestOptions()
# テストワークブックという名を含むワークブック
req_option.filter.add(TSC.Filter(TSC.RequestOptions.Field.Name,
TSC.RequestOptions.Operator.Equals,
'テストワークブック'))
matching_workbooks, pagination_item = server.workbooks.get(req_option)
# これがワークブックID
# print(matching_workbooks[0].owner_id)
status = server.workbooks.refresh(workbook_id=matching_workbooks[0])
検索すると、フィルタなしのgetを使った例が出てくる。
オプションなしだと100件までしか取得してくれないし、わざわざ調べてから決め打ちするのも手間っぽそうなのでフィルタを採用。
抽出を終えたらサーバで確認。
多分秒で終わる気がする。