新しいぐるなびAPIで飲食店の店舗情報取得

新しいぐるなびAPIで飲食店の店舗情報取得

記事一覧新しいぐるなびAPIで飲食店の店舗情報取得

過去に作成した「ぐるなびAPI」のプログラムや、ぐるなびの Web Service が新しくなったこともあり、API からの情報取得プログラムを書き換えてみました。

以前の記事は下記になります。

ぐるなびAPIで飲食店の店舗情報取得

API バージョンや API キーの発行についても、色々と条件が明確になり、以前のアカウントが使えなくなっていたので、新たにアカウント発行もしてみました。

APIはRest形式で以前と同じ

API のエンドポイントは URL に 20150630 が含まれている通り、2 年くらい内容自体は変わっていないようです。

前回は xml 形式のフォーマットでレスポンスを受け取っていましたが、結局配列に置き換えていたので、今回は JSON 形式で情報を受け取る形に変えています。

ぐるなびのサイトにも API での情報取得は「JavaScript」「PHP」「Python」「Java」の 4 言語において、サンプルプログラムが提供されているのでそちらを使ってもいいと思います。

今回作成したプログラムはこちらです。よくある街サイトの情報からフォーマットが一致してそうな電話番号を使って、ぐるなびの店舗情報を検索してみます。

まだ、コードを整理していないので取得する項目や、使いたい項目、情報が不足している項目への配慮など、検討の余地は多いのですが、店舗名くらいは確実にどの店舗も情報が入っているので、そこをベースに拡張でいいかなと思います。

どの店舗も、1 枚目の画像は確実に揃っているとレイアウト的に使い勝手がいいのですけどねぇ。

<?php

class Gurunavi {

    /**
     * APIエンドポイント
     */
    const API_URL = "https://api.gnavi.co.jp/RestSearchAPI/20150630/";

    /**
     * API KEY
     */
    const API_KEY  = '発行したAPIキー';

    /**
     * クレジット
     */
    const API_CREDIT = '希望サイズのクレジット画像のHTML';

    /**
     * 取得件数
     */
    const API_NUM = 10;

    /**
     * ソート
     * 1:店舗名、2:業態、指定なし:ぐるなびソート順
     */
    const API_SORT = 1;

    /**
     * フォーマット
     */
    const API_FORMAT = 'json';

    function __construct() {
    }

    function search($input, $count = self::API_NUM, $sort = self::API_SORT) {

        $list = [];

        // URL
        $url = sprintf('%s?keyid=%s', self::API_URL, self::API_KEY);

        $param = [
            'format' => self::API_FORMAT,
            'sort' => $sort,
            'hit_per_page' => $count,
        ];

        if (!empty($input['tel'])) {
            $param['tel'] = $input['tel'];
        }
        foreach ($param as $key => $value) {
            $url .= '&' . $key . '=' . $value;
        }

        // REST
        $json = @file_get_contents($url);

        $data = json_decode($json, true);
        if ($data === false) {
            return $list;
        }

        $rest = [];
        if ($data['total_hit_count'] == 0) {
            return $list;
        } else if ($data['total_hit_count'] == 1) {
            $rest[] = $data['rest'];
        } else {
            $rest = $data['rest'];
        }

        foreach ($rest as $item) {
            $tmp = [];

            // 店舗名
            $tmp['name'] = !empty($item['name']) ? $item['name'] : '';
            $tmp['name_kana'] = !empty($item['name_kana']) ? $item['name_kana'] : '';
            
            // カテゴリ
            $tmp['category'] = !empty($item['category']) ? $item['category'] : '';
            // URL
            $tmp['url'] = !empty($item['url']) ? $item['url'] : '';

            // クーポン
            $tmp['coupon_url'] = '';
            if (!empty($item['coupon_url']['pc'])) {
                $tmp['coupon_url'] = $item['coupon_url']['pc'];
            }

            // 店舗画像(1枚だけ取得する)
            $tmp['image_url'] = '';
            for ($i = 1; $i <= 2; $i++) {
                if (!empty($item['image_url']['shop_image' . $i])) {
                    $tmp['image_url'] = $item['image_url']['shop_image' . $i];
                    break;
                }
            }

            // 住所
            $tmp['address'] = !empty($item['address']) ? $item['address'] : '';
            // 電話番号
            $tmp['tel'] = !empty($item['tel']) ? $item['tel'] : '';
            // 営業時間
            $tmp['opentime'] = !empty($item['opentime']) ? $item['opentime'] : '';
            // 定休日
            $tmp['holiday'] = !empty($item['holiday']) ? $item['holiday'] : '';
            // 駐車場台数
            $tmp['parking_lots'] = !empty($item['parking_lots']) ? $item['parking_lots'] : '';
            // PR文章
            $tmp['pr_s'] = !empty($item['pr']['pr_short']) ? $item['pr']['pr_short'] : '';
            $tmp['pr_l'] = !empty($item['pr']['pr_long']) ? $item['pr']['pr_long'] : '';
            // 平均予算
            $tmp['budget'] = !empty($item['budget']) ? $item['budget'] : '';
            // 宴会・パーティ平均予算
            $tmp['party'] = !empty($item['party']) ? $item['party'] : '';
            // ランチタイム平均予算
            $tmp['lunch'] = !empty($item['lunch']) ? $item['lunch'] : '';
            // クレジットカード名称
            $tmp['credit_card'] = !empty($item['credit_card']) ? $item['credit_card'] : '';
            // 電子マネー名称
            $tmp['e_money'] = !empty($item['e_money']) ? $item['e_money']: '';

            $list[] = $tmp;
        }

        return $list;
    }
}

参考カテゴリ

オススメ記事

最新の投稿やよく見られているのオススメ記事一覧です。

標準出力と標準エラー出力をパイプに渡す

よく、標準出力先をファイルにリダイレクトすることはありますが、意外に標準エラー出力は使う機会がありません。しかし、やはりツールやパッケージ製品になると標準エラー出力も活用されているようです。でも、...

Linux(FreeBSD)

>>記事を確認する

主要無料ブログ5つに対する自動投稿PHPプログラム

アメブロへ楽天APIなどの情報を自動で投稿する の反響が良かったので、どうせならアメブロ以外の無料ブログの XML-RPC を使った自動投稿も紹介したいと思います。これには FC2BlogManager.php というライブ...

PHP

>>記事を確認する

snmpでデバイスの情報を取得

snmpでデバイスの情報を取得するコマンドです。これを元に、ディスクIOなどのMIB値を探します。 $ snmpwalk -v 2c -c {SNMPGROUPNAME} localhost 1.3.6.1.4.1.2021.13.15.1.1.2 (結果の一部) UCD-DIS...

Linux(FreeBSD)

>>記事を確認する

awkで指定したカラム以降をprint表示する

前回、awk で最後のカラム以外を表示してみましたが、今回は指定したカラム以降のカラムを全部表示したいと思います。 例えば、7 個の文字列がカンマで区切られているファイルがあるとしたら、3 番目のカラム...

awk / シェル

>>記事を確認する

CentOSでRedisサーバを使う

冗長化した Web サーバなどで、セッションの管理や、セッションや特定のユーザーに紐付く一時データを管理するのに memcache を使う場面は多いと思います。 その memcache の中でも主流なのが memcached です...

Linux(FreeBSD) / CentOS / Redis

>>記事を確認する

新しいぐるなびAPIで飲食店の店舗情報取得

過去に作成した「ぐるなびAPI」のプログラムや、ぐるなびの Web Service が新しくなったこともあり、API からの情報取得プログラムを書き換えてみました。 以前の記事は下記になります。 ・ ぐるなびAPIで...

WebAPI

>>記事を確認する

NginxのFastCGIキャッシュで白い画面がキャッシュされる

以前から、トップページにアクセスすると、レスポンスステータスは 200 で返ってくるのに、画面に何も表示されない現象が稀に見受けられたので調査してみました。 さすがに機会損失にも繋がるということで、...

Nginx

>>記事を確認する

Laravel5.4の認証ユーザーのパスワードハッシュについて

Laravel で用意されている認証モジュールを利用する際、ユーザーモデル(User.php)経由で登録されるパスワードのハッシュ方法について調べてみました。 Laravel 上ではパスワード文字列を bcrypt() のヘルパー...

PHP / Laravel

>>記事を確認する

Laravel5.4のコントローラコンストラクタでAuth::user()が取得できない

Laravel5.4 で認証を通したアクセスに対して、コントローラのコンストラクタでユーザモデルの値を取得しようと思ったら、なぜか Auth::user() の値が取得できなくて悩みました。 public function __construc...

PHP / PHPフレームワーク / Laravel

>>記事を確認する

NginxのHSTS(HTTP Strict-Transport-Security)の設定

「Let's Encrypt」のおかげで、全サイト SSL 化していますが、これまで nginx の設定では、http のアクセスがあった場合に https に 301 リダイレクトさせていました。 この場合、Googlebot に http のアク...

セキュリティ / Nginx / SSL

>>記事を確認する