茶トラ猫エンジニア

フリーランスとして働く、先が見えないエンジニアのメモ帳

【過去記事】ぐるなびAPIで飲食店の店舗情報取得

2017 年に新しい Web API のサービス内容に沿ってプログラムを作り直してみました。

最新の情報は下記でご確認ください。

www.saratoga.jp

以下は 2009 年頃に、当時の API のリファレンスに沿って作成した内容になります。

ぐるなびAPIについて

ぐるなび API を利用して、ぐるなびの画像やぐるなびのページ URL を取得してみました。

ぐるなび API については、PHP(PEAR)のライブラリなども出ているようですが、汎用的に使わなければ独自に実装した方が早いです。

また、最新の API バージョンが出た場合にも自分で対応できますからね。

REST APIのサンプルコード

まずは、API を利用するクラスを作成してみました。

<?php

    class S_Gurunavi {

        private $cnt;
        private $imageUrl;
        private $couponUrl;

        function S_Gurunavi() {
            $this->cnt = 0;
            $this->imageUrl = "";
            $this->couponUrl = "";
        }

        function requestRest($apiUrl) {
            // REST
            $xml = simplexml_load_file($apiUrl);
            if (!empty($xml)) {
                $this->cnt = $xml->total_hit_count;
            }

            if ($this->cnt == 1) {
                $this->imageUrl = $xml->rest->image_url->shop_image1;
                $this->couponUrl = $xml->rest->url;
            }

            return $this->cnt;
        }

        function getCount() {
            return $this->cnt;
        }

        function getImage() {
            return $this->imageUrl;
        }

        function getCoupon() {
            return $this->couponUrl;
        }
    }
?>

今回は、画像の URL 1 つと、クーポンページへの誘導のためにぐるなびのお店ページ URL を取得する仕様としました。

また、電話番号を元に検索させるので、結果は 0 件または 1 件を想定しています。

エラー制御は今回のソースからは省いています。

使い方はシンプルで、API 用の URL を作成し、それを下記の S_Gurunavi クラスのインスタンスに渡すだけです。

あとは、requestRest() 実行後に、画像やページの URL を取得すれば完了です。

データのキャッシュは短時間で

毎回通信させるのも厄介なので、取得できたデータはキャッシュしておくといいと思います。

ただし、最新のお店の情報を伝えるという意味では長時間のキャッシュはタブーです。

こちらは利用規約にも今では盛り込まれています。

また、画像については最大で 2 種類しかなく、店内の写真や料理の写真はほとんどありません。

お店のロゴ画像が多いのとサイズがバラバラなので使い勝手が非常に悪いです。

キャッシュ方法のバグ

ぐるなび API を使ってクーポンページに誘導する URL を取得していましたが、キャッシュ時にエラーが出ていることに気付きました。

Warning: unserialize() [function.unserialize]: Node no longer exists [ファイル名]

どうやら、SimpleXML の simplexml_load_file() で取得したオブジェクトをシリアライズしていたので、アンシリアライズする時にエラーが発生していたようです。

前回作った、ぐるなび API の情報取得用のスクリプトで、XML のオブジェクトから情報を取得する際に、string にキャストすることで対応しました。

(変更前)
$this->imageUrl = $xml->rest->image_url->shop_image1;
$this->couponUrl = $xml->rest->url;

(変更後)
$this->imageUrl = (string)$xml->rest->image_url->shop_image1;
$this->couponUrl = (string)$xml->rest->url;