【PHP】Google Business Profile APIを使ってクチコミを取得する

【PHP】Google Business Profile APIを使ってクチコミを取得する

Googleビジネスプロフィールとは

Googleビジネスプロフィール(旧Googleマイビジネス)とは、Googleが提供しているビジネス情報管理ツールです。

お店の情報などをビジネスプロフィールに登録しておくと、GoogleマップやGoogle検索上で登録した情報が表示されるようになります。登録は無料。Googleマップの地点情報の他、Webサイトや営業時間・電話番号などビジネスに必要な情報が表示できるので、Google検索時やGoogleマップ閲覧時にユーザーの目に止まりやすくなります。

登録方法は簡単で、Googleアカウントを持っていれば住所などお店の情報を入力するだけですぐに利用できます。
詳しくはGoogleの公式ドキュメントがあるのでそちらへ。

ビジネス プロフィールに登録する

Google Business Profile APIとは

Googleビジネスプロフィールに登録されている情報の管理をプログラムから行える機能です。
ビジネスプロフィールの管理画面で行える各データの登録、閲覧、編集、削除といったことをプログラムから行えるので、Webサイトに登録しているビジネス情報を表示したり、クチコミを投稿・返信できる画面を作ったり、ビジネスプロフィールの機能を借りて様々な実装が可能になります。

今回はこのAPIを使ってPHPでクチコミを取得する所までを記事にしています。

Business Profile APIを使うための準備

ビジネスプロフィールAPIは「じゃあやるか!」って思い立ってすぐに使えるAPIではありません。いくつか事前に準備が必要になってきます。

  • Googleアカウントの作成
  • Googleビジネスプロフィールの登録・ビジネス情報の設定(※要管理者権限)
  • Google Cloud Platform(GCP)のGoogle API Consoleでプロジェクトを作成する
  • APIの利用申請を行う(英語)

上記をクリアしないとAPIが使えるようになりません。上から順番に設定をします。

Googleアカウントの作成についてはここでは割愛します。

ビジネスプロフィールの登録についてはこちらから。
設定に関しては、ほとんどないですがAPIを利用するために管理者権限が必須です。他のアカウントからビジネス情報を共有する場合は権限に気をつけましょう。

APIコンソールのプロジェクト作成に関しては、Googleアカウント取得後にGoogle API Console にアクセスして、[プロジェクトを選択] > [新規プロジェクト]から任意の名前のプロジェクトを作成します。

申請フォームは英語ですが、英語が苦手でもGoogle翻訳使いながらで読んでいくと内容はだいたい把握できます。
数カ所、英語での記述説明を求められますが、それもGoogle翻訳使って日本語から変換すればOKです。内容も簡単な内容の記述で大丈夫です。今回は「APIを使ってWebサイトにクチコミ一覧を掲載したい」みたいな内容で申請しました。

申請したあとは通るまで待ちましょう。申請フォームの送信完了画面に2週間程度かかるよっていう表示が出ますが、今回は申請して2・3日でGoogleから登録したメールアドレスに返事が来ました。

申請フォームの返信内容

メールの内容は「申請を受け取ったので確認のためこのメールに返信してくれたら審査を開始しますよ」っていう感じです。
ここも英語で返信します。「確認したので審査を進めてください。お願いします。」的な内容を送りました。

この後、翌日に返事が来て、無事申請が通りAPIが使える状態になりました。

申請承認の連絡内容

APIの有効化

あとは、Google API Consoleから申請したプロジェクトを開いて、APIライブラリから下記の8つのライブラリをすべて有効化しておきます。

  • Google My Business API
  • My Business Account Management API
  • My Business Lodging API
  • My Business Place Actions API
  • My Business Notifications API
  • My Business Verifications API
  • My Business Business Information API
  • My Business Q&A API

先頭の「Google My Business API」が申請が通ると有効化できるようになるAPIです。申請が通っていないと検索結果にも出てきません。申請通ってすぐの時にAPIライブラリの検索をかけても一向に出てこないのでおかしいなーと思ってたのですが、何回か検索してたら出てきて無事有効化できました。申請通ったあともキャッシュとかタイミングがあるのかわからないですが、出てこない場合はしばらく待って何度かトライしてみてください。

これでAPIを使う準備はOKです。

ライブラリの入手

Google API クライアントライブラリというGoogle APIを扱いやすくしたライブラリが、いくつかの言語で提供されているので、それを使います。今回はPHPを使うので「Google APIs Client Library for PHP」を使います。

Githubで直接ダウンロードしても良いですが、composerを使っていきます。

composer require google/apiclient:^2.12.1

使うAPIが限られている場合は、composer.jsonに下記のように書いてcomposer updateすると必要最低限のAPIサービスだけを含めた状態にできます。

{
    "require": {
        "google/apiclient": "^2.12.1"
    },
    "scripts": {
        "pre-autoload-dump": "Google\\Task\\Composer::cleanup"
    },
    "extra": {
        "google/apiclient-services": [
            "MyBusinessAccountManagement",
            "MyBusinessBusinessCalls",
            "MyBusinessBusinessInformation",
            "MyBusinessLodging",
            "MyBusinessNotificationSettings",
            "MyBusinessPlaceActions",
            "MyBusinessQA",
            "MyBusinessVerifications"
        ]
    }
}

今回はビジネスプロフィール関連のサービスだけしか必要がないので、これでOK。
composer updateしてインストールは完了。

旧APIライブラリの入手

ビジネスプロフィールAPIは、旧マイビジネスAPIから変更され新しい仕様になっていますが、この記事を執筆した2022年5月時点ではクチコミの取得は旧APIからしかできない様です。公式ドキュメントの説明も旧APIのまま変わっていませんし、クチコミ部分に関してはまだ非推奨にもなっていないので使える状態です。今後どこかのタイミングで変更があるかもしれませんが、現状は古いAPIと併用する形で使うことになりそうです。

composerでインストールしたクライアントライブラリには旧APIのサービスは含まれていないので、公式ドキュメントから以前のバージョンをダウンロードします。ダウンロードしたzipファイルを解凍すると、MyBusiness.phpというphpファイルが入っているので、クライアントライブラリと同じプロジェクト配下に下記のように設置しておきます。

index.php
├── /vendor
├── composer.json
├── composer.lock
└── MyBusiness.php

これで準備は完了です!

OAuth2.0クライアント認証

クチコミを取得するにはOAuth2.0を使った認証が必要になります。

認証については下記の記事がわかりやすかったので参考にさせていただきました。

https://www.y-hakopro.com/entry/google_oauth_api

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

認証情報を作成

API利用申請時にGoogle API Consoleで作ったプロジェクトで認証情報の作成を行います。
API Consoleから「認証情報」→「認証情報を作成」と進み、プルダウンの「OAuthクライアントID」を選択します。

OAuthクライアントIDの作成画面になるので、必須項目の「アプリケーションの種類」「名前」「承認済みのJavaScript生成元」「承認済みのリダイレクト URI」を入力します。

  • アプリケーションの種類 → ウェブアプリケーション
  • 名前 → 任意。後からわかるようにサイト名や用途を含めておくと良いかと思います。
  • 承認済みのJavaScript生成元 → この認証を使うサイトのURLを入力します。ローカル環境で確認する場合はhttp://localhostでOK。
  • 承認済みのリダイレクト URI → Googleのログイン認証が終わった後にリダイレクトされるURLを入力します。ローカル環境で確認する場合はhttp://localhostでOK。

後からでも変更可能なので、とりあえず使うだけならこれで保存してOKです。

その後、認証情報をJSON形式でダウンロードできるようになるので、先ほどのプロジェクト内に追加しておきます。

index.php
├── client_secret.json  ← 認証情報のJSONファイル
├── /vendor
├── composer.json
├── composer.lock
└── MyBusiness.php

認証情報の中身は下記のような感じ。

{
  "web":
  {
    "client_id":"*********************",
    "project_id":"*********************",
    "auth_uri":"https://accounts.google.com/o/oauth2/auth",
    "token_uri":"https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
    "client_secret":"*********************",
    "redirect_uris":[
      "https://localhost",
      "https://example.com"
    ],
    "javascript_origins":[
      "https://localhost",
      "https://example.com"
    ]
  }
}

アクセストークン・リフレッシュトークンの取得

アクセストークンは認証済みユーザーを識別するための文字列です。今回のビジネスプロフィールAPIのようにOAuth認証が必要なAPIにアクセスする際にはこのトークンをリクエストヘッダー含めます。有効なトークンが送信されなかった場合はAPIから弾かれます。

アクセストークンは有効期限が30分とか1時間とかかなり短く設定されており、有効期限を過ぎると無効となります。
では30分すぎるごとにGoogleログインしてアクセストークンを取得し直して、って何回もしなきゃいけないか、というとそうではありません。新しいアクセストークンを取得するための「リフレッシュトークン」という別のトークンがあります。

ここからアクセストークンとリフレッシュトークンの取得手順を説明していきます。

作成した認証情報を元に「アクセストークン」を取得します。

まずアクセストークンの取得に必要な認可コードを取得します。
下記のURLのパラメータに該当する情報を入れてアクセスします。

https://accounts.google.com/o/oauth2/auth?
client_id=*********************&
redirect_uri=*********************&
scope=https://www.googleapis.com/auth/business.manage&
access_type=offline&
response_type=code

scopeについては、ビジネスプロフィールAPIの場合はhttps://www.googleapis.com/auth/business.manageとなっています。APIによって変わるので、他のGoogle APIを使う場合は注意。

access_typeofflineにしておかないと後述するリフレッシュトークンが取得できないのでofflineにします。

response_typeは認可コードが必要なのでcodeとします。

アクセスするとGoogleの同意画面が出てくるので、該当アカウントを選択して同意します。すると下記のURLにリダイレクトされます。

http://localhost:8080/?code=*********************&scope=*********************

このURLのcodeパラメータが認可コードです。

次にこの認可コードを使ってcurlでアクセストークンを取得します。

curl
-d client_id=*********************
-d client_secret=*********************
-d redirect_uri=*********************
-d grant_type=authorization_code
-d code={認可コード}
https://accounts.google.com/o/oauth2/token

こんな感じの結果が返ってくるかと思います。

{
  "access_token":"*********************",
  "expires_in":3599,
  "scope":"https:\/\/www.googleapis.com\/auth\/business.manage",
  "token_type":"Bearer",
  "refresh_token":"*********************"
}

これでアクセストークン(access_token)が取得できました。同時にリフレッシュトークン(refresh_token)も取得できているかと思います。

これもJSONをまるっとファイルにしてプロジェクト内に保存しておきます。

index.php
├── my_token.json  ← トークンのJSONファイルとして保存
├── client_secret.json
├── /vendor
├── composer.json
├── composer.lock
└── MyBusiness.php

トークンの取得については、先に紹介した参考記事の方にも詳しく説明されていますのでうまくいかない場合はそちらもご確認ください。

次のセクションではリフレッシュトークンを使ったアクセストークンの更新を含め具体的なphpコードを交えて説明していきます。

OAuth認証のコード(PHP)

ここからやっとコードを書きます。まずOAuth認証のコードから。

<?php
// ライブラリの読み込み
require_once 'vendor/autoload.php';
require_once 'MyBusiness.php';

// APIクライアントの作成
function getBpApiClient(){
  $client = new Google\Client();
  $client->setApplicationName('my-google-reviews-app'); //アプリケーションの名前(任意・何でもOK)
  $client->setScopes(["https://www.googleapis.com/auth/plus.business.manage"]); // APIのスコープ
  $client->setAuthConfig('client_secret.json'); // 認証情報のJSONを読み込み
  // リフレッシュトークン用の設定
  $client->setAccessType('offline');
  $client->setApprovalPrompt('force');
  
  // トークンファイルがある場合はそこからアクセストークンを取得
  if (file_exists('my_token.json')) {
    $access_token = json_decode(file_get_contents('my_token.json'), true);
    $client->setAccessToken($access_token);
  }

  //トークンが期限切れの場合は再取得して設定
  if ($client->isAccessTokenExpired()) {
    $refresh_token = $client->getRefreshToken();
    $client->fetchAccessTokenWithRefreshToken($refresh_token);
    $access_token = $client->getAccessToken();
    $access_token['refresh_token'] = $refresh_token;
    $client->setAccessToken($access_token);
    // トークンの保存
    file_put_contents('my_token.json', json_encode($access_token));
  }

  return $client;
}

$client = getBpApiClient();
if(empty($client)){
  return;
}

ざっくり説明します。

Google API クライアントライブラリを使って認証するコードを書きます。
まずGoogle Clientを作成し、そこに認証情報やスコープなど必要情報を追加していきます。

$client = new Google\Client();
$client->setApplicationName('my-google-reviews-app'); //アプリケーションの名前(任意・何でもOK)
$client->setScopes(["https://www.googleapis.com/auth/plus.business.manage"]); // APIのスコープ
$client->setAuthConfig('client_secret.json'); // 認証情報のJSONを読み込み
// リフレッシュトークン用の設定
$client->setAccessType('offline');
$client->setApprovalPrompt('force');

次に保存したトークンのJSONファイルからアクセストークンをGoogle Clientに追加します。

// トークンファイルがある場合はそこからアクセストークンを取得
if (file_exists('my_token.json')) {
  $access_token = json_decode(file_get_contents('my_token.json'), true);
  $client->setAccessToken($access_token);
}

アクセストークンが期限切れの場合はリフレッシュトークンを使って再取得します。
再取得したトークンはfile_put_contentsで同じJSONファイルに上書き保存します。

//トークンが期限切れの場合は再取得して設定
if ($client->isAccessTokenExpired()) {
  $refresh_token = $client->getRefreshToken();
  $client->fetchAccessTokenWithRefreshToken($refresh_token);
  $access_token = $client->getAccessToken();
  $access_token['refresh_token'] = $refresh_token;
  $client->setAccessToken($access_token);
  // トークンの保存
  file_put_contents('my_token.json', json_encode($access_token));
}

これで認証はOKです。このコードの仕組みを使えば次から同意画面を通さずに自動的に期限切れのアクセストークンが更新されるので、アクセストークンの期限を気にせずAPIにアクセスすることが可能です。

ちなみにここではサンプルコードなので認証情報やアクセストークンをJSONファイルにして使っていますが、もちろんDBに保存して使うことも可能ですので、使いやすいように置き換えてください。筆者はWordPressで扱う案件でしたので、権限設定したオプションページを作ってDBで保存して使う方法にしました。

ビジネスプロフィールからクチコミ情報を取得するコード(PHP)

認証ができたので、ここからようやくクチコミデータを取得するコードを書きます。
まずはほとんどのエンドポイントで必要になるaccount_namelocation_nameを取得します。

account_nameの取得

Account Management APIを使ってaccount_nameを取得します。

try{
  $account_service = new \Google_Service_MyBusinessAccountManagement($client);
  $account = $account_service->accounts->listAccounts()->getAccounts();
  $account_name = !empty($account[0]) ? $account[0]->getName() : null;
}
catch(Exception $e) {
  return;
}

account_nameaccount/*******という形式で取得できます。これがトークンの生成時に認証したGoogleアカウントのビジネスプロフィールでのアカウント名になります。

try-catchで括っているのは、もしなんらかの不具合でAPIアクセス次にエラーが返ってきた時に、クライアントライブラリ側で強制的にPHPのエラーが発生するようになっているみたいで、ミスると画面真っ白になるからです。このエンドポイントに関しては引数とか設定していないのでまずエラーは起きませんが、引数があってパラメータをたくさん設定する場合は要注意です。

location_nameの取得

次にBusiness Information APIを使ってlocation_nameを取得します。location_namelocations/*******の形式で取得できます。

try{
  $info_service = new \Google_Service_MyBusinessBusinessInformation($client);
  // account_nameに紐づくビジネス情報を取得する
  $accounts_locations = $info_service->accounts_locations->listAccountsLocations($account_name, [
    'readMask' => 'name,title,metadata',
    'filter'   => "title={ビジネス情報のタイトル}" // 絞り込み検索
  ]);
}
catch(Exception $e) {
  return;
}

$locations = $accounts_locations->getLocations(); //ロケーション情報を取得
$location = !empty($locations[0]) ? $locations[0] : null;
if(empty($location)){
  return;
}

$location_name  = $location->getName();

ざっと説明します。

ビジネス情報の取得

まずaccount_nameに紐づいたビジネス情報を取得します。ビジネスプロフィール画面の「お店やサービス」の一覧を取得するような感じです。ここでは一覧のタイトルで絞り込んで1件取得するようにしています。

listAccountsLocations関数の第一引数にaccount_nameを指定し、第二引数にオプションを配列で設定します。ここではreadMaskfilterを設定しています。

readMaskは必須の設定の様で、なければエラーが発生します。指定する内容は、取得するデータに必要なパラメータをカンマ区切りで設定します。設定できるパラメータは、下記のリファレンスのFieldsのリストに掲載されているものになります。

https://developers.google.com/my-business/reference/businessinformation/rest/v1/locations

ここでは'name,title,metadata'と指定しました。

続いてfilterですが、こちらは絞り込み検索ですね。クエリ構文というSQLみたいな記述で絞り込みができます。詳しくは下記URLから確認を。

https://developers.google.com/my-business/content/location-data?hl=ja#filter_results_when_you_list_locations

これについては若干クセがあるので、あまりうまく使いこなせてません。。。
いくつか試してみて、例えば「SHARESL (大阪支店)」みたいなビジネス名の場合、下記のように書くとエラーになります。

//これはエラーになる
$accounts_locations = $info_service->accounts_locations->listAccountsLocations($account_name, [
  'readMask' => 'name,title,metadata',
  'filter'   => 'title=SHARESL (大阪支店)'
]);

下記のように書くとうまくいきました。

$accounts_locations = $info_service->accounts_locations->listAccountsLocations($account_name, [
  'readMask' => 'name,title,metadata',
  'filter'   => 'title=SHARESL AND title=大阪支店'
]);

おそらくSQLと同じでスペースや半角カッコとかはエスケープしないとクエリ構文の一部として認識されてしまうみたいです。エスケープの仕方がよくわからなかったのですが、スペースはANDで分けて書いてみたらうまくいきました。

ちなみにreadMaskで指定していないもので絞り込もうとした場合もエラーになります。

//これはエラーになる
$accounts_locations = $info_service->accounts_locations->listAccountsLocations($account_name, [
  'readMask' => 'name,metadata',
  'filter'   => 'title=SHARESL AND title=大阪支店'
]);

filterについてどのくらいの件数のビジネス情報を使うかによって変わってくると思うので、例えば1件しかビジネス情報がない場合は、filterパラメータはなしでも問題ありません。自分が扱った案件ではビジネス情報が50〜60件ほどあったため絞り込みが必要でした。

ビジネス情報からlocation_nameを取得

あとは取得したビジネス情報からクライアントライブラリの関数を使ってlocation_nameを取得します。

$locations = $accounts_locations->getLocations();
$location = !empty($locations[0]) ? $locations[0] : null;
if(empty($location)){
  return;
}

$location_name  = $location->getName();

ここではfilterで1件だけに絞り込んでいる想定で配列の1番目を取得していますが、うまく絞り込めずに複数の情報が返ってくる場合はphpでarray_filterなどでさらに絞り込む必要があると思います。そのあたりは適宜調整を。

クチコミ一覧を取得

ここが今回のメインです。ようやくたどり着きました。
上記で取得したビジネス情報に紐づいているクチコミ一覧を取得します。コメントが存在しない評価だけの投稿は除外して取得しようと思います。

<?php
// リクエスト用のオブジェクトを作成
$batch_get_reviews_request = new Google_Service_MyBusiness_BatchGetReviewsRequest();
// locationName
$batch_get_reviews_request->setLocationNames(["${account_name}/${location_name}"]);
// 取得する件数
$batch_get_reviews_request->setPageSize(5);
// 評価のみでコメントが無い投稿を無視するかどうか
$batch_get_reviews_request->setIgnoreRatingOnlyReviews(true);

// 旧APIのサービスを使う
$gmb_service = new \Google_Service_MyBusiness($client);
// 一覧を取得
$batch_get_reviews = $gmb_service->accounts_locations->batchGetReviews($account_name, $batch_get_reviews_request);
$reviews_obj = $batch_get_reviews->getLocationReviews();

まず、旧APIのクライアントライブラリのGoogle_Service_MyBusiness_BatchGetReviewsRequestでリクエスト用のオブジェクトを作ります。Google_Service_MyBusiness_BatchGetReviewsRequestクラスにgetter・setterのプロパティが用意されているので、setterを使って必要な項目を設定します。

// リクエスト用のオブジェクトを作成
$batch_get_reviews_request = new Google_Service_MyBusiness_BatchGetReviewsRequest();
// ビジネス情報の指定
$batch_get_reviews_request->setLocationNames(["${account_name}/${location_name}"]);
// 取得する件数
$batch_get_reviews_request->setPageSize(5);
// 評価のみでコメントが無い投稿を無視するかどうか
$batch_get_reviews_request->setIgnoreRatingOnlyReviews(true);

ここではクチコミを取得するビジネス情報の指定と、クチコミの取得件数を5件、評価のみでコメントが無い投稿は無視する設定を追加しています。

ビジネス情報の指定については、配列でlocationNameを指定できます。複数のビジネス情報のクチコミをまとめて取得したい場合は配列にlocationNameを追加します。

ここでいうlocationNameは、旧APIと新APIでは意味が違うみたいで、
旧APIではaccount/*******/locations/*******という形式に、
新APIでは上の方で取得したlocations/*******の形式になります。

最初、普通に下記のように指定していたのですが、エラーになってしまいました。

// これはエラーになる
$batch_get_reviews_request->setLocationNames([$location_name]);

旧APIを知らずに新APIになってからドキュメントやコードを調べていたので何が間違えているのかわからず、ビジネスのタイトルを入れてみたりアカウント名だけ入れてみたりいろいろ試しました。ただ闇雲に試してもうまくいかないままなので、遠回りになりますがいろんなエンドポイントを調べてみて、最終的には旧APIではaccount_namelocation_nameを合わせたものがここで指定できるlocationNameになるっていうことに気づいて解決しました。こういう情報はググっても全く出てこないのでハマると辛いです・・・。公式のリファレンス内にもlocationNameっぽいものがいくつかありますが、使うポイントによって違うものを意味している場合があるのでかなりややこしかったです。

リクエスト用のオブジェクトを設定できたら、旧APIでレビュー情報の取得を行います。

$gmb_service = new \Google_Service_MyBusiness($client);
$batch_get_reviews = $gmb_service->accounts_locations->batchGetReviews($account_name, $batch_get_reviews_request);

レビュー情報が取得できたら、getterを使ってクチコミ情報のみを取得します。

$reviews_obj = $batch_get_reviews->getLocationReviews();

batchGetReviews関数は戻り値がGoogle_Service_MyBusiness_BatchGetReviewsResponseクラスになるので、取得結果からクチコミ一覧を取得するにはgetLocationReviewsプロパティを使います。

これでクチコミ一覧が取得できました!

あとは煮るなり焼くなりループで表示するなりですね。

foreach ((object)$reviews_obj as $r){
  // 旧APIのGoogle_Service_MyBusiness_Review型でレビューを取得する
  $review = $r->getReview();

  // コメントを取得
  $comment = $review->getComment();
  // コメントが空の場合はスキップ
  if(empty($comment)){
    continue;
  }

  // 投稿作成日
  $create_time = $review->getUpdateTime();
  $datetime    = new DateTimeImmutable($create_time, $timezone);
  $date        = $datetime->format('Y.m.d');

  // 評価
  $rate        = $review->getStarRating();
  $rate_number = 0;
  // 評価は文字列で取得できるので数値に変換
  switch ($rate){
    case 'ONE':
    $rate_number = 1;
    break;
    case 'TWO':
    $rate_number = 2;
    break;
    case 'THREE':
    $rate_number = 3;
    break;
    case 'FOUR':
    $rate_number = 4;
    break;
    case 'FIVE':
    $rate_number = 5;
    break;
    $rate_number = 0;
    default:

  }
  // 返信を取得
  $reply = $review->getReviewReply();
  $reply_comment = !empty($reply) ? $reply->getComment() : null;

  // 投稿者情報の取得
  $reviewer        = $review->getReviewer();
  // 投稿者の名前の取得
  $reviewer_name   = $reviewer->getDisplayName();
  // 投稿者のアカウント画像URLの取得
  $reviewer_imgurl = $reviewer->getProfilePhotoUrl();

}

こんな感じでクチコミの細かい情報を取得可能です。

次のクチコミを取得する

取得したクチコミの次のクチコミを取得する方法はこちら。

// 次ページのトークン
$next_page_token = $batch_get_reviews->getNextPageToken();

// 次ページを取得するためのリクエストを作成
$batch_get_reviews_request = new Google_Service_MyBusiness_BatchGetReviewsRequest();
$batch_get_reviews_request->setLocationNames(["${account_name}/${location_name}"]);
$batch_get_reviews_request->setPageSize(5);
$batch_get_reviews_request->setIgnoreRatingOnlyReviews(true);
// 次ページのトークンを設定
$batch_get_reviews_request->setPageToken($next_page_token);

$gmb_service = new \Google_Service_MyBusiness($client);
$batch_get_reviews = $gmb_service->accounts_locations->batchGetReviews($account_name, $batch_get_reviews_request);
$reviews_obj = $batch_get_reviews->getLocationReviews();

取得結果から次ページのトークンを取得できるので、次のリクエストにこのトークンを設定するだけでOK。JSでもっと読むみたいなボタンを作ってAjaxで追加する、みたいなページネーションを実装するときに使います。

クチコミ一覧画面URLの取得

Google検索結果でクチコミを見る時に表示される画面のURLを取得します。

$location_meta = $location->getMetadata();
$place_id      = $location_meta->getPlaceId();
$review_url    = "https://search.google.com/local/reviews?placeid=${place_id}";

クチコミ新規投稿画面URLの取得

こちらはクチコミの新規投稿画面のURLの取得。

$location_meta = $location->getMetadata();
$new_review_url = $location_meta->getNewReviewUri();

評価平均・トータルレビュー数などの情報取得

検索結果でビジネス情報が表示された時に表示される評価平均やトータルレビュー数などの取得方法。こちらは旧APIを使います。

// 評価平均・トータルレビュー数などの情報取得
$reviews = $gmb_service->accounts_locations_reviews;
$list_reviews_response = $reviews->listAccountsLocationsReviews("${account_name}/${location_name}", [
  'orderBy' => 'update_time desc'
]);

// 評価平均
$average_rating     = $list_reviews_response->getAverageRating();
// トータルレビュー数
$total_review_count = $list_reviews_response->getTotalReviewCount();

さいごに

今回はビジネスプロフィールAPIについてのメモでした。思った以上に記事が長くなってしまいましたが、これでも記事にするためにある程度ポイントになる部分だけに絞り込んで書いたつもりです。

苦戦したのはクライアントライブラリの使い方。PHPで使いやすくするために導入したにも関わらず、日本語の情報がほとんどなくて、ドキュメントもなくGithubにコードが置いてあるだけって感じなので、最初はほんとに使い方がわからず、使いたいAPIの部分を上から下まで読んで、どのエンドポイント使ってるか調べていちいち実際にコード書いて使ってみて、また調べて・・・の繰り返し。使い方がわかると、なるほどな、使いやすいかも。と思う部分もあれば、普通にcurlでエンドポイントにアクセスしてたらもっと早くできたな・・・っていう所もあります。

ただ、クライアントライブラリは他のGoogleのAPIでも同じ様な使い方ができるので、別のAPIを使う時や、すでに導入されているコードを見る時に役に立ちそうです。最近は何かとAPI使って実装が多いので覚えてて損は無いかと思います。もう使い方慣れてるよ!っていう場合はこの記事の理解も早いかと思います。

日本語の情報が少なかったので、誰かのお役に立てば幸いです。