Google Nest CamのAPIを叩くまで

# はじめに

最近買ったGoogleのスマートカメラをAPI経由でアクセスしてみたいと思ってやってみると意外と手順が面倒だったので、それについてまとめます。

https://store.google.com/jp/product/nest_cam_indoor?hl=ja

# 準備

基本的には公式の[Get Started](https://developers.google.com/nest/device-access/get-started)に沿った内容となります

## アプリインストールやユーザー登録など

実際に開発に着手する前に以下の準備が必要となります。

- Googleアカウントの作成
- [Google Home](https://home.google.com/intl/ja_jp/welcome/)のインストール
    - [接続をする](https://support.google.com/googlenest/answer/9293657?hl=ja)
- [Device access](https://developers.google.com/nest/device-access)への登録（払いきりではありますが、有料です）

## GCPの設定

APIを使用するために、`Smart Device Management APIの有効化`と`OAuth 2.0 のClient ID`が必要になります。以下の`Enable ths API and get an OAuth 2.0 Client ID`というところをクリックするとダイアログ上で設定が完結します。

https://developers.google.com/nest/device-access/get-started#set_up_google_cloud_platform

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/e51de1ae-673f-ab57-acbc-f95525ca7532.png)

OAuthの設定のところではウェブサーバーを選択します。リダイレクト先の設定も必要となるので、一旦`https://www.google.com/`とかにしておきます（実際は自分が作成するウェブアプリのURLにします。）。

また、OAuth2.0などのクレデンシャル情報が最後に表示されているので、それをメモします。ダウンロードもしておくことをオススメします。

## Device Accessでプロジェクト作成

[Device access](https://developers.google.com/nest/device-access)のコンソールにアクセスして、`Create project`からプロジェクトを作成します。
このときにOAuth2.0のクライアントIDが必要になるので、メモした内容を入力します。

作成が終われば、プロジェクトIDがUUIDの形式で発行されるのでそれをメモします。

# アカウントをリンクする

Nest CamのAPIにアクセスするためには、Googleアカウントとの連携が必要となります。
具体的には、以下のようなURLにブラウザでアクセスしてもらいます。ここでは、`oauth2-client-id`と`project-id`を実際の値に書き換えます。

```
https://nestservices.google.com/partnerconnections/{project-id}/auth?redirect_uri=https://www.google.com&access_type=offline&prompt=consent&client_id={oauth2-client-id}&response_type=code&scope=https://www.googleapis.com/auth/sdm.service
```

アクセスをするとGoogleの同意画面が出てくるので、許可をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/d7b2f4a9-2b72-805a-5465-60317f670184.png)

次にログインしたあとに警告が出ますが、続行をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/14925779-ed46-1914-6ecc-c2905c8a94d2.png)

無事リダイレクトができたらブラウザ上のURLを確認します。そしたら以下のようなクエリ付きのURLになっていると思います。

```
リダイレクト先のURL?code=長い文字列&scope=https://www.googleapis.com/auth/sdm.service
```

`code=長い文字列`が認可コード(Authrization code)となるのでメモをしておきます。

# アクセストークン取得

Nest CamのAPIを使うためには、認可コードではなくアクセストークンが必要となります。そのために以下のAPIを実行します。

```
curl -L -X POST 'https://www.googleapis.com/oauth2/v4/token?client_id={oauth2-client-id}&client_secret={oauth2-client-secret}&code={authorization-code}&grant_type=authorization_code&redirect_uri=https://www.google.com'
```

`client_id={oauth2-client-id}` `client_secret={oauth2-client-secret}` `code={authorization-code}`を実際の値に書き換えます。

以下のようなレスポンスが返ってきます。

```json
{
  "access_token": "access-token",
  "expires_in": 3599,
  "refresh_token": "refresh-token",
  "scope": "https://www.googleapis.com/auth/sdm.service",
  "token_type": "Bearer"
}
```

`access-token` `refresh-token`の実際の値をメモしておきます。

# デバイスのリストを受け取ってみる

以下のAPIを実行して、デバイスのリストを受け取ってみます。

```
curl -X GET 'https://smartdevicemanagement.googleapis.com/v1/enterprises/{project-id}/devices' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {access-token}'
```

`project-id` `access-token`を実際の値に書き換えます。実行すると以下のようなレスポンスが返ってきます。

```json
{
  "devices": [
    {
      "name": "enterprises/project-id/devices/device-id",
      "type": "sdm.devices.types.device-type",
      "traits": { ... },
      "parentRelations": [
        {
          "parent": "enterprises/project-id/structures/structure-id/rooms/room-id",
          "displayName": "device-room-name"
        }
      ]
    }
  ]
}
```

# さいごに

以上がNest CamのAPIにアクセスするまでの道のりでした。