Looker Studio APIを利用してレポートのデータ一覧を取得する方法

## はじめに
[フューチャー Advent Calendar](https://qiita.com/advent-calendar/2024/future)の12日目の記事です。
Looker Studioに作成したレポートを、プログラムから取得したいなと思い立ち、Looker StudioのAPIがあることを知って、利用を試みたのですが、なかなかに躓いたのここで取得方法を紹介します。

## Looker Studio APIでなにができる？
Looker Studioでは、レポートやデータソースなどのアセット情報や権限情報を取得できるAPIを提供しています。このAPIを利用することで、レポート管理の自動化が可能になります。
Looker Studio APIのReferenceは[こちら](https://developers.google.com/looker-studio/integrate/api/reference)

今回はレポートを取得してみたいと思います。


## Looker Studio APIの利用方法
APIを実行するにあたり、Google Cloudの認証が必要になります。
認証方法には下記の2パターンがあります。

* OAUTHで認証して利用する方法
* サービスアカウントで利用する方法

認証方法の比較
|認証方法|メリット|デメリット|
|---|---|---|
|OAuth認証|対話的な操作に適している|ユーザー操作が必要|
|サービスアカウント|自動化に適している|初期設定が複雑|

今回はそれぞれの方法で認証をし、APIを実行してみました。

### OAUTHで認証してAPIを利用する方法

#### 手順
※こちらの手順は、Google Cloudの公式ページに記載があります。

https://developers.google.com/looker-studio/integrate/api

##### APIの有効化
* Google Cloud Consoleで「Looker Studio API」を検索
* 「有効にする」をクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632711/ef731520-f96f-1604-7064-8ec1e3322e80.png)
    
##### OAuth クライアントの作成
* Google Cloud Consoleの「APIとサービス」から「認証情報を選択」 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632711/5d362d6a-29fd-4472-610a-86242a1267ef.png)
* 「認証情報を作成」からOAUTHクライアントを作成（↓作成結果）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632711/eb6b78a3-9bae-3807-bffe-f1c2d1a4d544.png)
    
##### 作成したoauthクライアントの情報を利用して、アクセストークンの取得
※アクセストークンの取得方法は下記を参考にさせていただきました。

https://blog.shinonome.io/google-api/

* まずは認可コードを取得します。
    ```
    https://accounts.google.com/o/oauth2/v2/auth?
    scope={スコープ※1}
    &access_type=offline
    &include_granted_scope=true
    &response_type=code
    &redirect_uri={OAUTHクライアントで設定したリダイレクトURI※2}
    &client_id={OAUTHクライアント画面から取得したクライアントID}
    ```
※1：Looker Studio APIに必要なスコープを設定します。
    今回は`https://www.googleapis.com/auth/datastudio`を設定しています。
※2：今回はリダイレクトURLに`http://localhost:8080`を設定しています。

* 上記のパラメータを埋めたうえで、改行コードを削除し、ブラウザにてURLにアクセスすると、認証画面に飛びます。
* 認証を実施すると、リダイレクトしたURLに「code」（認可コード）が下記のように設定されてきます。
    ```
    http://localhost:8080/?code={認可コード}&scope=https://www.googleapis.com/auth/datastudio
    ```
* 続いて、上記で取得した認可コードを利用して、アクセストークンを取得します。
    ```
    curl 
    -d code=｛上記で取得した認可コード｝\ 
    -d client_id=｛OAUTHクライアント画面から取得したクライアントID｝ \
    -d client_secret=｛OAUTHクライアント画面から取得したクライアントシークレット｝ \
    -dredirect_uri=｛リダイレクトURI｝
    -d grant_type=authorization_code 
    --insecure　https://accounts.google.com/o/oauth2/token
    ```
    * 上記のパラメータを埋めたうえでcurlコマンドを実行すると、下記のようなレスポンスが返ってきます。
        ```
        {
          "access_token": "{アクセストークン}",
          "expires_in": 3562,
          "scope": "https://www.googleapis.com/auth/datastudio",
          "token_type": "Bearer"
        }
        ```
* これでアクセストークンを取得できました。
* 上記で取得したアクセストークンを利用して、下記のようにLooker Studio APIを実行すると、Looker Studioのアセットが取得できます！
    ``` bash
    # Request
    curl -H "Authorization: Bearer {アクセストークン}" "https://datastudio.googleapis.com/v1/assets:search?assetTypes=REPORT"
    
    # Response
    "assets": [
        {
          "name": "8f57f8b2-b446-4e80-b47f-360e3c71cb21",
          "title": "test2",
          "assetType": "REPORT",
          "updateTime": "2024-12-10T12:07:20.011Z",
          "updateByMeTime": "1970-01-01T00:00:00Z",
          "createTime": "2024-12-10T12:07:20.011Z",
          "lastViewByMeTime": "2024-12-10T12:07:22.294Z",
          "owner": "hogehoge"
        },
        ----割愛----
      ]
    ```

私のLooker Studioのデータと一致していそうですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632711/3c15ad04-e3b4-9694-b518-8459e0e5746b.png)



### サービスアカウントで利用する方法
こちらの方法では、手動での認証を実施せずに、Looker Studio APIを利用することができます。
下記の手順を実施した場合にデータを取得することができました。
1. サービスアカウントを作成
1. 1で作成したサービスアカウントに対してドメイン全体の委任を実施し、Looker StudioへアクセスするScopeを付与。
1. サービスアカウントのキーファイルを作成
1. 下記のような実装で、アクセストークンを取得し、Looker Studio APIを実行し結果を取得する。
    ```python
    import jwt
    import requests
    
    import time
    
    
    def main():
        data = {json形式のサービスアカウントキーを貼り付け}

    # アクセストークンの取得
    token_url = "https://oauth2.googleapis.com/token"
    try:
        token_response = requests.post(
            token_url,
            data={
                "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
                "assertion": jwt.encode(
                    {
                        "iss": data["client_email"],
                        "sub": "{LookerStudioを閲覧するユーザ}",
                        "scope": "https://www.googleapis.com/auth/datastudio",
                        "aud": token_url,
                        "iat": int(time.time()),
                        "exp": int(time.time()) + 3600,
                    },
                    data["private_key"],
                    algorithm="RS256",
                ),
            },
            timeout=10,
        )
    except Exception as e:
        print(f"Error occurred: {e}")

    # Looker Studio APIを実行する。
    try:
        headers = {
            "Authorization": f"Bearer {token_response.json()['access_token']}",
        }
        response = requests.get(
            "https://datastudio.googleapis.com/v1/assets:search?assetTypes=REPORT",
            headers=headers,
            timeout=10,
        )
    except Exception as e:
        print(f"Error occurred: {e}")

    print(response.json)

    return response.json()

    if __name__ == "__main__":
        main()
    ```

#### サービスアカウントで認証方式での試行錯誤ポイント
* Looker Studio APIは[google-api-python-client](https://github.com/googleapis/google-api-python-client)が対応していないため、アクセストークンの取得は自前で実装する必要がありました。
* アクセストークンの取得の際に、subイシューに設定するのはサービスアカウントのメールアドレスではなく、Looker Studioを見るアカウントのメールアドレスアドレスでした。

### まとめ
Looker Studio APIを利用してレポートを取得することにチャレンジしてみました。
躓きのなかでOAUTHやGoogle Cloudの権限に関しての知識を学ぶことができてよかったです。