【Google クチコミ】Google Business Profileを新しいAPI v1にアップデートする
Google Business Profile APIでクチコミ(レビュー)を取得していたのですが、400エラーが出てしまい、APIのアップデートを行いました。
口コミ取得のエンドポイントは変わらないといえども、結局、クライアントライブラリもアップデートしなければいけないですよね、そりゃそうだ。
今回でたエラーは以下の通り。ステータスコードは400です。
Message: {
"error":
{
"code": 400,
"message": "Request contains an invalid argument.",
"errors": [ {
"message": "Request contains an invalid argument.",
"domain": "global", "reason": "badRequest"
} ],
"status": "INVALID_ARGUMENT",
"details": [ {
"@type": "type.googleapis.com/google.mybusiness.v4.ValidationError",
"errorDetails": [ {
"message": "This API will soon be deprecated. Please migrate all the usages to My Business Account Management API - https://developers.google.com/my-business/reference/accountmanagement/rest"
} ]
} ]
} }
新しいAPIを有効にする
Google Cloud で新しいAPIを有効にします。
今回のクチコミで必要なのは以下↓
- Google My Business API(以前利用していたのであればこれは入っている)
- My Business Account Management API
ビジネスプロフィールに関連付けられたAPIは以下を参考にできます。
https://developers.google.com/my-business/content/basic-setup
クライアントライブラリをアップデートする
今回はPHPを利用していますので、PHPのライブラリをアップデートしました。
他の言語のクライアントライブラリ一覧は以下を参考↓
https://developers.google.com/my-business/samples
PHPのクライアントライブラリは以下↓
https://github.com/googleapis/google-api-php-client
composerを使ってクライアントライブラリをアップデートします。
composer require google/apiclient:^2.12.1
Google APIを利用するライブラリと、各サービスを利用するライブラリ
クライアント ライブラリは、Google APIに接続するクライアント「google-api-php-client」と、各エンドポイントを利用するクライアント「google-api-client-services」という2つがあります。
どちらも必要なのですが、各エンドポイントを利用する「google-api-client-services」は、沢山あるので必要なものだけをインストールできます。
composerで必要なサービスだけを設定るする
composerに必要なサービスだけを記載してupdateすることで、必要サービスだけ入れます。
{
"require": {
"google/apiclient": "^2.12.1"
},
"scripts": {
"pre-autoload-dump": "Google\\Task\\Composer::cleanup"
},
"extra": {
"google/apiclient-services": [
"MyBusinessAccountManagement"
]
}
}
extraの箇所に、今回口コミ取得に必要なサービスを入れました。
- MyBusinessAccountManagement
このextraんに記載するサービスは一体どこで探してきたらいいのか分からなかったので、ライブラリのsrcから探してみました。
https://github.com/googleapis/google-api-php-client-services/tree/main/src
各サービス(各エンドポイント)に接続するクライアントライブラリは以下からも利用できます↓
https://github.com/googleapis/google-api-php-client-services
コードもアップデート
クライアント ライブラリをアップデートしたので、コードもアップデートして行きます。
Google APIに接続する(google-api-php-client)
Google APIを利用するにはGoogle Cloudで先に設定したりする必要もあり、単にエンドポイントを叩けばいいというわけではありません。
というわけで最初にこのクライアントでGoogle APIに繋ぎます。
大体は以前のバージョンのままでOKなのですが、インスタンスを生成するところがちょっと変わります。
$client = new \Google\Client();
旧:$client = new \Google_Client();
新:$client = new \Google\Client();
このような感じでちょっとだけ変わりました。
Google クチコミを取得する
さて、肝心な箇所です。ちなみに現在(2022/06/25時点)ではまだクチコミのエンドポイントは旧v4.9のままです。
ということで、新しいサービスクライアントは使えなそうなので、生のエンドポイントを叩いていくスタイルで取得をします。
$client = new \Google\Client();
...トークンなどの処理(v4.9と一緒)
//クチコミ一覧を取得
$httpClient = $client->authorize();
$response = $httpClient->get('https://mybusiness.googleapis.com/v4/{parent=accounts/*/locations/*}/reviews');
$reviews = json_decode((string)$response->getBody(), true);
//クチコミ50件出てくる
var_dump($reviews);
使っているエンドポイントの公式説明はこちら↓
https://developers.google.com/my-business/reference/rest/v4/accounts.locations.reviews/list
参考にさせていただいたのはこちら↓
https://github.com/googleapis/google-api-php-client/issues/2096
次の50件を取得する場合もGETで投げてあげます。
//最初の50件
$response = $httpClient->get('https://mybusiness.googleapis.com/v4/{parent=accounts/*/locations/*}/reviews');
$reviews = json_decode((string)$response->getBody(), true);
//クチコミと一緒に次の50件を取得するトークンも戻ってくるので、それを取得
$nextPageToken = $reviews['nextPageToken'];
//次の50件
$response = $httpClient->get('https://mybusiness.googleapis.com/v4/{parent=accounts/*/locations/*}/reviews?pageToken='.$nextPageToken);
$nextReviews = json_decode((string)$response->getBody(), true);
//次の50件が出てくる
var_dump($nextReviews);
クチコミを取得すると次の50件がある場合は、nextPageTokenというのが一緒の返ってくるので、それをGETで投げると次の50件が取得できます。
{parent=accounts/*/locations/*/}には何を入れるのか
躓いてしまうのが「{parent=accounts/*/locations/*/}」にはいったい何を入れるのか、ということです。
ここは親アカウントのNameと、クチコミ(レビュー)を取得したい、例えば店舗などのNameです。
例えばこのように入ります。
https://mybusiness.googleapis.com/v4/accounts/{親アカウントname}/locations/{クチコミ取得する店舗のname}/reviews
Nameというとローマ字を想像しますが、数字の羅列です。
親アカウントは、大抵は自分のGoogleアカウントになるかと思います。
最初にGoogle CloudでAPIを有効にする際にログインをしたアカウントです。
※プロジェクト番号とは別です。
これをどこで確認するかというと、最初のGoogle Cloudやcomposerで設定した「MyBusinessAccountManagement」を使って取得ができます。
親アカウント(自分のアカウント)のNameを取得する
アカウント周りのエンドポイントはv1へアップデートされているので、クライアント ライブラリを使って取得が可能です。
$client = new \Google\Client();
...トークンなどの処理(v4.9と一緒)
$service = new \Google\Service\MyBusinessAccountManagement($client);
$myAccountName = $service->accounts->listAccounts()->getAccounts()[0]->getName();
echo $myAccountName;
これで取得できるのが親のアカウントNameで、「accounts/{親アカウントname}」という形式で取得できます。
クチコミを取得する店舗のNameを取得する
次に、{クチコミ取得する店舗のname}もAPIを使って取得することになります。
正確に言うと、APIで取得する以外の方法が未だに分からないだけで、どこかで確認できるのかもしれないです。
実は、このクチコミを取得するAPIは現時点で400エラーが返ってきて、上手くいっていません。
元々v4でクチコミを取得されている場合は、既にこのデータを持っているはずなので、それを使えば問題ないです。
新たに取得したい場合は、現在調査中なのでもうしばらくお待ちいただきたいです。
上手くいかない場合
エラーが返ってくる、上手く行かない場合は、以下を再度確認してみてください。
親アカウント(自分のアカウント)と、取得したいクチコミを持っている店舗や場所が紐付いている
親アカウント(自分のアカウント)が基本なので、取得する先も紐付いている必要があります。
権限が無ければ、権限をもいましょう。
Google Business Profileにログインしてみると紐付いているか分かるはずです。
APIへのアクセスをリクエストしている
API利用の前提条件を確認してみます↓
https://developers.google.com/my-business/content/prereqs
400エラーやBat request
投げている値に誤りがある場合が多そうです。例えば「親アカウントのName」や、エンドポイントのURLに誤りがあるなど。
最後に
Google APIはいつも難しいイメージです。公式ドキュメントは揃っていますが、細かく書いているわけではありません。(そんな気がする)
英語であればお問い合わせできるのですが、クライアント ライブラリを使っていますと伝えると、クライアント ライブラリに聞いてくれと、なかなか冷たいです。
結局今回も利用したいエンドポイントがv4.9のままであるという点を解決するのと、クライアント ライブラリの使い方には時間がかかってしまいました。
まだ、アカウント取得周りでできていない箇所もありますが、同じように困っている方がいるのではないかと思い、取り急ぎ公開しました。