GANCHIKU.com

とりあえず、ソースコード吐いていいかね。Services_HotPepper-0.1.0?(訂正)

2006年12月25日
API

というわけで、ライブラリが出てきたっぽいので、そちらにリンクを貼って、こっちのソースコードは消すよー。だいたい同じ感じのAPIで、そちらの方が完成度が高そうだったので。でも、少しだけ使用方法が違ったので、それを修正したよー。
過去と他人はかえられないが、未来と自分はかえられる – Services_HotPepper-0.1.1

とりあえず、ライセンスは放棄しておく。なので、自由に改変してもいいし、配布してもいいです。ライセンス周りは結構面倒なのよ。なので、やる気が出てちゃんとメンテする気が出るまでライセンスは放棄でよろしく。単にGoogle Mapsと連携してみたかっただけなので。

で、ライブラリの方のソースコードは、Exception周りをちゃんとチェックしていないので、よくわからないけど、今回作ったHotPepperのAPIとGoogle Mapsのマッシュアップのソースの公開でもしてみる。適当に自己責任で使ってくれ。名前を変更して、追加開発しても構いませんよ。前回のポストにも書いたけど、すでに名前があると、なんかややこいけど、いいライブラリが出てきたらServices_の接頭辞を消しますよー。例によって、PHP5で、Curlが必要。Cache_Liteもあると激しくよい。つーか、パッケージ化すればいいのか。なんかやる気がないのが困ったものだ。需要があれば、してみるけど、ちょっと様子見。

アプリの方は、Pagerがないとダメ。あと、0.1.0 では、

で、これを使うと、マスタ系APIとグルメサーチができる。

$hotpepper = new Services_HotPepper();

// 大サービスエリアコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#021
$data = $hotpepper->getLargeServiceArea();
var_dump($data);
// サービスエリアコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#022
$data = $hotpepper->getServiceArea();
var_dump($data);
// 大エリアコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#023
$data = $hotpepper->getLargeArea();
var_dump($data);
// 中エリアコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#024
$data = $hotpepper->getMiddleArea();
var_dump($data);
// 小エリアコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#025
$data = $hotpepper->getSmallArea();
var_dump($data);
// お店ジャンルコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#026
$data = $hotpepper->getGenre();
var_dump($data);
// 予算のコード内容を取得 詳細: http://api.hotpepper.jp/reference.html#027
$data = $hotpepper->getBudget();
var_dump($data);

// グルメサーチAPIの内容を取得
// $parametersの内容は、リクエストパラメータのハッシュ http://api.hotpepper.jp/reference.html#002
$data = $hotpepper->getGourmetSearch($parameters);
var_dump($data);

これだけではありがた味がわからないので、それを使って、検索結果の店の住所からGoogle Mapsにプロットしてみるのが次のコード。はい。ツッコミされまくりそうですね。

< ?php
require_once 'Services/Hotpepper.php';
require_once 'Pager.php';

class HotPepperApp
{
    private $hotpepper;
    private $searchResult;
    private $parameters;

    const DEFAULT_ADDRESS = '東京';

    public function __construct($parameters = array())
    {
        $this->hotpepper = new Services_Hotpepper();
        $this->hotpepper->setResponseFormat('array');
        $this->hotpepper->setUseCache(true);
        $this->parameters = $parameters;
        if (isset($this->parameters['Start'])) {
            if (!isset($this->parameters['Count'])) {
                $this->parameters['Count'] = 10;
            }
            $this->parameters['Start'] *= (int)$this->parameters['Count'];
        }
        // 2006-12-25T16:03:16 修正 parametersに使えない値があるとInvalidParamerExceptionを吐くので、とりあえずそれ以外は削る。
        $availables = array(
          'ShopIdFront', 'ShopNameKana', 'ShopName', 'ShopTel', 'ShopAddress',
          'KtaiCoupon', 'LargeServiceAreaCD', 'ServiceAreaCD', 'LargeAreaCD',
          'MiddleAreaCD', 'SmallAreaCD', 'Keyword', 'GenreCD', 'Order',
          'Start', 'Count');
        foreach ($this->parameters as $key => $value) {
            if (!in_array($key, $availables) or $value == '') {
                unset($this->parameters[$key]);
            }
        }
    }

    public function getOptions($master)
    {
        $method = 'get' . $master;
        $result = $this->hotpepper->$method();

        $output = '


';
        return $output;
    }

    public function getResult()
    {
        if (!isset($_REQUEST['search'])) { return array(); }
        $output = '';
        if (empty($this->searchResult)) {
            $this->searchResult = $this->hotpepper->getGourmetSearch($this->parameters);
        }
        if (is_null($this->searchResult['NumberOfResults'])) { return array(); }
        return $this->searchResult['Shop'];
    }

    public function getPager()
    {
        if (!isset($this->parameters)) { return ''; }
        if (empty($this->searchResult)) {
            $this->searchResult = $this->hotpepper->getGourmetSearch($this->parameters);
        }
        $options = array(
            'mode'         => 'Sliding',
            'urlVar'       => 'Start',
            'totalItems'   => (int)$this->searchResult['NumberOfResults'] - (int)$this->searchResult['DisplayPerPage'],
            'perPage'      => (int)$this->searchResult['DisplayPerPage'],
            'currentPage'  => (int)$this->searchResult['DisplayFrom'] / (int)$this->searchResult['DisplayPerPage'],
        );

        $pager = Pager::factory($options);
        return $pager->links;
    }

    public function getShopAddress()
    {
        return isset($_REQUEST['ShopAddress']) ? htmlspecialchars($_REQUEST['ShopAddress']) : self::DEFAULT_ADDRESS;
    }

    // Helper Method
    public static function getTabHtml($result)
    {
        $url          = htmlspecialchars($result['ShopUrl']);
        $name         = htmlspecialchars($result['ShopName']);
        $address      = htmlspecialchars($result['ShopAddress']);
        $noKtaiCoupon = (boolean)$result['KtaiCoupon'];
        $access       = htmlspecialchars($result['Access']);
        $genre        = htmlspecialchars($result['GenreName']);
        $catch        = htmlspecialchars($result['ShopCatch']);
        $budget       = htmlspecialchars($result['BudgetDesc']);
        $capacity     = htmlspecialchars($result['Capacity']);
        $ktaiShopUrl  = htmlspecialchars($result['KtaiShopUrl']);
        $image        = htmlspecialchars($result['PictureUrl']['PcMiddleImg']);

        $ktaiText = $isKtaiCoupon ? '携帯NG!' : '携帯OK!';

        $base =< <$name($ktaiText)$catch

$address EOF; $detail =< < $name写真提供:ホットペッパー.jp
ジャンル($genre)予算($budget)総席数($capacity)
$access
EOF; $tab = array( '店情報' => str_replace("\n", "", $base), '詳細情報' => str_replace("\n", "", $detail) ); return $tab; } } if (isset($_REQUEST['search'])) { $app = new HotPepperApp($_REQUEST); } else { $app = new HotPepperApp; } ?> < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< ?php echo $app->getOptions('Genre'); ?>
< ?php if (isset($_REQUEST['search'])) { echo '' . $app->getPager(); } ?>
Powered by ホットペッパー.jp, GoogleMap

まぁ、詳細はどうでもいいけど、HotPepperのAPIから帰ってくる住所は、建物の名前まで返ってくるので、それは削っている。あと、Pagerは、適当にtotalItemsに NumberOfResultsを – DisplayPerPageで引いた値を入れておく。最後のページのところで問題があるので。まぁ、本当はもう少しスマートにできるんだろうけど。

で、このソースから、少しだけ修正してあるけど、HotPeppe APIとGoogleMapのMashUpができあがる。まぁ、暇なときに作成したプロダクトとしてはこんなもんじゃない?まぁ、前から言っているように、食べログも使いたいので、これで終わりではない。。。予定。

うまいこと食べログを使うことができたら、価格.com WEBサービスAPIコンテストでも参加してみようかな。つーか、こういうのはどんどんやって欲しいね。HotPepperだったら、クーポン載せるの結構高いんでしょ?いっぱい宣伝してもらった方が、店もうれしいし、リクルートもうれしいし、Win-Win Situationじゃないのかね。そして、コンテストで買った人がお金とかもらえてうれしかったら、さらにいいじゃない?なんか、Web2.0ではお金儲けにならないって、どこかで読んだけど、こういうパターンだったらお金儲けになるんじゃない?

というわけで、メリークリスマス。

とりあえず、ソースコード吐いていいかね。Services_HotPepper-0.1.0?(訂正) への3件のコメント

  1. magiwo より:

    Shinさん早すぎいぃ~
    こちらでもPEARパッケージ作ったのですが公開してもいいですかね?
    もしくは、ほとんどServices_KakakuComを真似ただけなのでShinさんの所でもいいかな思っているのですが
    どうでしょうか?

  2. ピンバック: using API; ホットペッパーAPIのライブラリとGoogleMapsとのマッシュアップ

  3. shin より:

    > magiwoさん。
    ごめんなさい。なんでかしらないけど、スパムチェックに引っかかってた。。。たまに、スパムの方を見ると実は本当のコメントやトラックバックがあったりするだよねー。

    というわけで、Services_Hotpepperよろしこですー。

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Shin Ohno 2003-2012