Tableau ServerにREST APIを使用してアクセスする（コマンドラインを利用）

## Tableauサーバへのアクセス
社内に立てられたTableauサーバにはREST APIでアクセスする機能があります。
この記事ではコマンドラインからアクセスする手順をまとめます。
具体的にはサーバの認証を行い、アップロードされたTableauのViewからグラフの画像とデータのCSVをダウンロードする方法をまとめます。

やりたいこととしてはREST APIを使用して以下のTableauの画面にアクセスし、グラフデータの画像とデータをブラウザアクセスなしに取得することです。
以下の画面だとダウンロードメニューからイメージとデータをダウンロードした場合と同じになります。

![Tableau画面スクリーンショット 2024-07-13 140909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837083/28fb12a8-62bb-fd48-f37f-9a60aaf72e5d.png)


## 準備
Windows10またはWindows11でコマンドプロンプトを開きます。標準で使用できるcurlコマンドを使ってアクセスします。
その際に実行するフォルダを決めておいてそこに移動します。
以下の例では c:\work/rest フォルダで作業します。
![コマンドプロンプト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837083/c68deda2-2da5-8527-7e73-9d7de3c01807.png)


##認証
まずはTableauサーバの認証を通す必要があります。
認証のREST APIについては以下に記載があります。
https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_auth.htm

ユーザー名とパスワードでもアクセスできそうですが、今回は個人用アクセストークンを使用して認証を通します。

### 個人用アクセストークンの準備
Tableauサーバの右上の個人アイコンをクリックし、「マイアカウントの設定」メニューをクリックします。セキュリティメニューの下の方に「個人アクセストークン」とありますので、そこで「トークン名」を決めて、「新しいトークンを作成」ボタンをクリックします。

![スクリーンショット 2024-07-13 004545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837083/b62674b3-a364-555d-cce0-1f61f354de9e.png)

ダイアログが表示されますので、トークン名とトークンをどこかに保存しておいてください。
![アクセストークン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837083/93863cb4-b079-61e9-121e-e842f7d7c435.png)
「クリップボードにコピー」ボタンをクリックするとトークンシークレットがコピーされます。

### 認証用のファイルの作成
curlでHTTP POSTをする場合はテキストファイル指定の方がやりやすいため以下の内容のテキストファイルを作成してください。例えばsignin_token.xmlと保存します。
ここではpersonalAccessTokenNameに先ほど決めた「トークン名」のtest、personalAccessTokenSecretにコピーした「トークンシークレット」例えば  TTTTTTTTTTTTTTTTTTTTTTTTTTTTT を入れてください。
作成したファイルは実行するフォルダ（c:\work/rest）に保存してください。

```signin_token.xml
<tsRequest>
	<credentials
	  personalAccessTokenName="test" personalAccessTokenSecret="TTTTTTTTTTTTTTTTTTTTTTTTTTTTT" >
  		<site contentUrl="" />
	</credentials>
</tsRequest>
```

### 認証の実施
以下のコマンドを実行して認証をします。
curl "https://サーバのアドレス/api/3.11/auth/signin" -X POST -d @signin_token.xml

```
<?xml version='1.0' encoding='UTF-8'?><tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api https://help.tableau.com/samples/en-us/rest_api/ts-api_3_11.xsd">
<credentials token="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" estimatedTimeToExpiration="364:23:59">
    <site id="ssssssss-ssss-ssss-ssss-ssssssssssss" contentUrl=""/>
    <user id="dddddddd-dddd-dddd-dddd-dddddddddddd"/>
    </credentials>
</tsResponse>
```
これ以降はtokenにある文字列(XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)を使ってAPI実行できるようになります。

## ビューの検索
REST APIでアクセスできるようになりましたら次にTableauのViewのIDを探します。
先ほどの認証で取得したsite idを使用してビューを検索します。

シート名を「Order_Sales」にしたのでシート名をキーに検索します。
curl "https://サーバのアドレス/api/3.11/sites/ssssssss-ssss-ssss-ssss-ssssssssssss/views?filter=viewUrlName:eq:Order_Sales" -X GET -H "X-Tableau-Auth:(XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
```
<?xml version='1.0' encoding='UTF-8'?><tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api https://help.tableau.com/samples/en-us/rest_api/ts-api_3_11.xsd">
<pagination pageNumber="1" pageSize="100" totalAvailable="1"/>
<views>
    <view id="vvvvvvvv-vvvv-vvvv-vvvv-vvvvvvvvvvvv" name="Order_Sales" contentUrl="orders_sales_sample/sheets/Order_Sales" createdAt="2024-07-12T15:17:59Z" updatedAt="2024-07-12T15:18:58Z" viewUrlName="Order_Sales">
    <workbook id="wwwwwwww-wwww-wwww-wwww-wwwwwwwwwwww"/>
    <owner id="oooooooo-oooo-oooo-oooo-oooooooooooo"/>
    <project id="pppppppp-pppp-pppp-pppp-pppppppp"/>
    <tags/>
    </view>
    </views>
</tsResponse>
```

なお、シート名が日本語だったりわからない場合はViews全体に検索をかけれます。
curl "https://サーバのアドレス/api/3.11/sites/ssssssss-ssss-ssss-ssss-ssssssssssss/views" -X GET -H "X-Tableau-Auth:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

この場合はViewがすべて検索されるので何件もviewのデータが入ったXMLを読み解いてview idを見つけないといけないです。

## グラフのダウンロード
このビューは以下のようなものなのでそのまま画像とデータを取得します。
![スクリーンショット 2024-07-13 011038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837083/672133ff-123a-20c1-5eab-8a76d91e123c.png)

### 画像のダウンロード
以下のコマンドを実行します。
curl "https://サーバのアドレス/api/3.11/sites/ssssssss-ssss-ssss-ssss-ssssssssssss/views/vvvvvvvv-vvvv-vvvv-vvvv-vvvvvvvvvvvv"/image?resolution=high" -X GET -H "X-Tableau-Auth:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" > test.png

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 59063    0 59063    0     0  25713      0 --:--:--  0:00:02 --:--:-- 25724
```
実行したフォルダ（c:\work\rest）にtest.pngというファイルがダウンロードされます。

### データのダウンロード
以下のコマンドを実行します。
curl "https://サーバのアドレス/api/3.11/sites/ssssssss-ssss-ssss-ssss-ssssssssssss/views/vvvvvvvv-vvvv-vvvv-vvvv-vvvvvvvvvvvv"/data" -X GET -H "X-Tableau-Auth:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" > test.csv
```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5391    0  5391    0     0   2682      0 --:--:--  0:00:02 --:--:--  2686
```
実行したフォルダ（c:\work\rest）にtest.csvというファイルがダウンロードされます。

## まとめ
簡単ですが、REST APIを使用してTableauのグラフの画像とデータをダウンロードする方法をまとめました。次回はこれをPythonプログラムから実行したいと思います。