[Python] Google My Business API を使ってインサイトデータを取得する

## はじめに
Google My Business APIを使ってインサイトデータを取得するための日本語の情報があまり見つからなかったため、備忘録として残しておきます。

## 参考
https://developers.google.com/my-business/content/prereqs
[Google API OAuth2.0のアクセストークン&リフレッシュトークン取得手順 2017年2月版](https://qiita.com/iwaseasahi/items/2363dc1d246bc06baeae)

## 環境
Python(3.6.2)

## Google My Business とは
Google My Business とはGoogleが提供しているGoogleマップやGoogle検索上で、登録したビジネス情報を表示されるようにする無料サービスです。
このサービスに自分のビジネス(飲食店や美容室、歯医者など)を登録する事で検索時やマップ閲覧時にそのビジネスをユーザーの目に入りやすくすることができます。

## Google My Business APIとは
Google My Businessに登録されているビジネス情報の取得・登録・更新・削除が行える機能です。例えば、ビシネスに投稿されている口コミに返信を行えたり、ビジネスに対するアクセス情報(インサイトデータ)の取得や、お店のメニューの編集や写真の追加などをAPIを使ってシステム的に行うことができます。この記事では、その中でもインサイトデータの取得方法に関して説明します。

## インサイトデータとは
Googleマイビジネス情報(飲食店や美容室、歯医者など)をユーザーがどのように見つけ、アクセスしたのかを確認できるデータです。具体的には以下のような項目に関するデータを確認できます。

　・ユーザーがGMBページを検索した方法
　・検索クエリ
　・ユーザーがGMBページの検索に使ったGoogleサービス
　・ユーザーの行動
　・ユーザーが電話した数
　・登録された写真の閲覧数
　　・・・etc

## APIを利用する上で必要な準備
Google My Business APIを利用するには下記の４つの手順を踏む必要があります。
　1. [Google APIコンソール](https://console.developers.google.com/)でプロジェクトを作成する
　2. APIへのアクセスをリクエストする
　3. Google My Business API を有効にする
　4. 認証情報を取得する

### 1. Google APIコンソールでプロジェクトを作成する
　Googleアカウントを作成した上で

　1-1. Google APIコンソールに移動
　1-2.「プロジェクトの作成」をクリックし、プロジェクト名を入力して「作成」をクリック

### 2. APIへのアクセスをリクエストする
　2-1. Google APIコンソールに移動
　2-2. 1で作成したプロジェクトを選択する
　2-3. [プロジェクト ID] でプロジェクトIDを確認する
　2-4. [アクセスリクエストフォーム](https://docs.google.com/forms/d/e/1FAIpQLSfC_FKSWzbSae_5rOpgwFeIUzXUF1JCQnlsZM_gC1I2UHjA3w/viewform)を記入して提出。
　2-5. 提出内容が審査された後、フォローアップメールが届くので返信		

私の場合は提出して約２週間後に リクエストフォームに入力したメールアドレス宛に「Google MyBusiness APIへのリクエスト申請をしましたか？」という旨の英文メール(下記のメール)が送られてきました。

![314efba9913dbb67409475013a389e1e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151361/a9355833-ecd3-388a-2de8-ddb0e09ec7df.png)


簡単な英文で”はいそうです。申請を行いました。”と返信して、数日後に APIの利用を許可する旨のメールが届きました(下記のメール)。

![3a9d0d6e5e0b4402156fe4bcfcf4128a-min.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151361/0d0ea216-de89-14d1-5880-fce3abe55911.png)

なお、フォームに入力する際には以下の点に注意が必要です。
　① プロジェクトを作成したGoogleアカウントのメールアドレスと会社のホームページURLの入力を求められるが、そのURLとメールアドレスのドメインは一致していなければならない。
　② その会社のGoogle My Businessアカウントの入力も求められるので、もし無ければ予め作っておく必要がある。


### 3. Google My Business API を有効にする
　3-1. Google APIコンソールに移動。
　3-2. 画面の左メニューから「ライブラリ」をクリックする
　3-3. 検索を行いGoogle My Business APIをクリックする
　3-4. 画面中央上にある「有効にする」リンクをクリックする

### 4. 認証情報を取得する
APIにリクエストをする際には、アクセストークンが必要となります。このアクセストークンは一度発行されても一定時間を過ぎたら無効となりますが、クラインアントID、クライアントシークレット、リフレッシュトークンがあれば再発行を行うことができます。そのため、APIを利用するためにこれらの情報を取得しておきます。

[Google API OAuth2.0のアクセストークン&リフレッシュトークン取得手順 2017年2月版](https://qiita.com/iwaseasahi/items/2363dc1d246bc06baeae)


## インサイトデータを取得する
認証情報が取得できたら、Pythonを使ってAPIにアクセスすることでインサイトデータの取得ができます。

###1.アクセストークンを取得する

```python
import requests

data = [
  ('grant_type', 'refresh_token'),
  ('client_id', '978904852xx-xxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com'),
  ('client_secret', 'qlDgUPlOIxxxxxxx5-L0yW'),
  ('refresh_token', '1/9OEydqvV2IExxxxxxxxxxxxxxxxxxx00vWVQ1CCs'),
]

response = requests.post('https://accounts.google.com/o/oauth2/token', data=data)

json = response.json()
access_token = json['access_token']
```
※client_id, client_secret, refresh_token の値は取得した認証情報に変えてください。



### 2.アカウントIDを取得する
各GMBアカウントを管理しているユーザーアカウントを取得します。

```python

headers = {
    'Authorization': 'Bearer ' + access_token,
}

response = requests.get('https://mybusiness.googleapis.com/v4/accounts', headers=headers)
json = response.json()

account_id = json['accounts'][0]['name'].replace('accounts/','')

```
※` json['accounts']` が管理アカウントの配列となっています。インサイトデータを取得したいGMBアカウントの管理ユーザーのアカウントIDを取得してください。

### 3.ロケーションネームを取得する
2で取得したアカウントIDを使って、各GMBアカウントに付与されているロケーションネームを取得します。

```python

headers = {
    'Authorization': 'Bearer ' + access_token,
}

response = requests.get('https://mybusiness.googleapis.com/v4/accounts/'+account_id+'/locations', headers=headers)
json = response.json()

location_name = json['locations'][0]['name']

```
※` json['locations']` が管理アカウントに紐づいたGMBアカウントの配列となっています。その中からインサイトデータを取得したいGMBアカウントのロケーションネームを取得してください。





### 4.アクセストークンを使ってインサイトデータを取得する
アカウントID、ロケーションネーム、アクセストークンを取得したら下記のコードでインサイトデータを取得することができます。

```python

headers = {
    'Authorization': 'Bearer ' + access_token,
}

# startTimeとendTimeでインサイトデータの対象期間を設定することができます。
data = '{\'locationNames\':[\''+location_name+'\',],\'basicRequest\':{\'metricRequests\':[{\'metric\':\'ALL\'}],\'timeRange\':{\'startTime\':\'2020-10-01T04:00:00.00000000Z\',\'endTime\':\'2020-10-2T04:00:00.00000000Z\',},},}'

response = requests.post('https://mybusiness.googleapis.com/v4/accounts/'+account_id+'/locations:reportInsights', headers=headers, data=data)

json = response.json()
```

#### [インサイトデータ]：ユーザーがお客様のビジネス情報を検索した方法
```python
#直接検索
QUERIES_DIRECT = json['locationMetrics'][0]['metricValues'][0]['totalValue']['value']
#間接検索
QUERIES_INDIRECT = json['locationMetrics'][0]['metricValues'][1]['totalValue']['value']
#ブランド検索
QUERIES_CHAIN = json['locationMetrics'][0]['metricValues'][2]['totalValue']['value']
```

#### [インサイトデータ]：ユーザーがお客様のビジネス情報の検索に使った Google サービス
```python
#マップ経由の表示
VIEWS_MAPS = json['locationMetrics'][0]['metricValues'][3]['totalValue']['value']
#検索経由の表示
VIEWS_SEARCH = json['locationMetrics'][0]['metricValues'][4]['totalValue']['value']
```

#### [インサイトデータ]：ユーザーの行動
```python
#ウェブサイトへのアクセス
ACTIONS_WEBSITE = json['locationMetrics'][0]['metricValues'][5]['totalValue']['value']
#通話したユーザー数
ACTIONS_PHONE = json['locationMetrics'][0]['metricValues'][6]['totalValue']['value']
#ルートのリクエスト
ACTIONS_DRIVING_DIRECTIONS = json['locationMetrics'][0]['metricValues'][7]['totalValue']['value']
```

#### [インサイトデータ]：写真の閲覧・枚数
```python
#写真の閲覧数(同業他社)
PHOTOS_VIEWS_MERCHANT = json['locationMetrics'][0]['metricValues'][8]['totalValue']['value']
#写真の閲覧数(お客様)
PHOTOS_VIEWS_CUSTOMERS = json['locationMetrics'][0]['metricValues'][9]['totalValue']['value']
#写真の投稿数(同業他社)
PHOTOS_COUNT_MERCHANT = json['locationMetrics'][0]['metricValues'][10]['totalValue']['value']
#写真の投稿数(お客様)
PHOTOS_COUNT_CUSTOMERS = json['locationMetrics'][0]['metricValues'][11]['totalValue']['value']
```


#### ビジネスに対する評価情報を取得
```python
headers = {
    'Authorization': 'Bearer '+access_token,
}

response = requests.get('https://mybusiness.googleapis.com/v4/'+location_name+'/reviews', headers=headers)

json = response.json()

#評価の平均値
averageRating = json['averageRating']

#総口コミ数
totalReviewCount = json['totalReviewCount']
```