はじめに
宿のサイトで意外と手が回らないのが、周辺のお店情報です。「近くのスーパー」「おすすめの食事処」を載せたいけれど、営業時間は変わるし、閉店することもある。手で書いた情報は、たいてい半年で古くなります。
この記事では、周辺スポット紹介ページをGoogle Places APIと自社データの組み合わせで作った方法を紹介します。鮮度は自動で保ちつつ、「どこを勧めるか」は宿の意思として持ち続ける設計です。
「勧める理由」は自社、「今の状態」はGoogle
役割分担をはっきり決める
最初に決めたのは、情報の役割分担です。どのお店を載せるか、なぜ勧めるかは宿が決める。営業時間や評価といった移り変わる情報はGoogleから取る。この線引きをぶらさないことが、すべての設計の起点になりました。
管理画面では、スポットごとに「営業時間を表示するか」「評価を表示するか」を個別に切り替えられるようにしました。評価が参考にならない業種(コンビニなど)では非表示にするといった調整ができます。
保存していいものとダメなもの
Google Places APIには、利用規約上の重要なルールがあります。取得したデータのうち無期限に保存していいのはPlace ID(お店の識別子)だけで、営業時間や評価はキャッシュとして一時的に持つことしかできません。
評価や営業時間をデータベースに保存しない
「毎回APIを呼ぶのは無駄だから」と評価や営業時間を自社DBに保存してしまうと、規約違反になります。データベースに持つのはPlace IDのみ、それ以外は短時間のキャッシュにとどめる、という原則を守りました。
そこで自社DBにはPlace IDだけを保存し、表示のたびにAPIから取得。取得結果は6時間だけキャッシュして、同じページに何度アクセスされてもAPI呼び出しが増えないようにしています。
障害時も、ページは壊さない
外部APIは必ずいつか落ちます。Googleが応答しなかったとき、周辺案内ページ全体がエラーになってしまっては本末転倒です。
そこで取得処理は失敗しても例外を投げず「情報なし」を返す設計にしました。営業時間と評価だけが消え、宿が書いた紹介文とアクセス方法はそのまま表示され続けます。ページは常に成立する。この考え方は、外部サービスに依存する機能すべてに共通する原則です。
APIの使い方で費用は大きく変わる
使わない情報を取りに行かない
Places APIは取得する項目によって課金額が変わります。実際にあった話として、写真を表示しない画面でも写真情報を取得し続けてしまい、月に2,000回以上の無駄な呼び出しが発生していたことがありました。
そこで呼び出し側で「写真は不要」と明示できるオプションを用意し、AIアシスタントが周辺情報を参照するときなど、写真を使わない場面では取得しないようにしました。使う情報だけを取りに行く。単純ですが、費用に直結します。
検索結果の並べ方を工夫する
周辺のお店を検索すると、レビュー1件で満点のお店が上位に来ることがあります。これでは参考になりません。
そこで「レビュー件数が15件以上のお店を優先し、その中で評価の高い順」という並べ替えを自前で実装しました。件数の少ない店を除外するのではなく、優先順位を下げるだけにとどめています。
APIキーの置き場所を分ける
Google Maps関連のキーは、用途によって置き場所を分けました。
店舗情報・写真・テキスト検索。ブラウザには絶対に渡さない
地図の埋め込み表示のみ。参照元ドメイン制限をかける
写真もサーバー側でURLを解決してから配信することで、ブラウザにサーバー用キーが漏れないようにしています。ブラウザに出さざるを得ない地図埋め込み用のキーは、自サイトからの呼び出しだけを許可する制限を必ずかけます。
ブログ記事にもお店カードを埋め込む
記事にはPlace IDだけを残す
ブログでお店を紹介するとき、記事の本文に店名や営業時間を書き込むと、やはり古くなります。そこで管理画面のエディタに「お店を検索して挿入」する機能を作り、記事に埋め込まれるのはPlace IDだけにしました。
記事を表示する瞬間にAPIから最新の店名と評価を取得し、宿が書いたコメントと並べて表示します。5年前の記事でも、店名と評価は今の情報。管理者が書いたおすすめコメントだけが記事の資産として残ります。
検索の連打を防ぐ
管理画面のお店検索は、キーワードを打つたびにAPIを呼ぶと課金が積み上がります。そこで検索実行に1秒強の間隔制限を設け、連打による無駄な呼び出しを抑えました。管理画面だから安全、ではなく、管理画面だからこそ気づかないうちに費用が増える点に注意が必要です。
まとめ
周辺スポット紹介ページの設計で大事にしたのは、次の3点です。
- 役割分担を決める — 勧める理由は自社、今の状態はGoogle。混ぜない
- 規約と費用を守る — 保存はPlace IDのみ、使わない情報は取りに行かない
- 壊れても成立させる — API障害時は自社情報だけでページを表示し続ける
この周辺スポットのデータは、宿泊者向けAIアシスタントの回答にも使われています。詳しくは「宿泊ゲスト向けAIアシスタントの全体像」をご覧ください。