とりあえず、ソースコード吐いていいかね。Services_HotPepper-0.1.0?(訂正)
というわけで、ライブラリが出てきたっぽいので、そちらにリンクを貼って、こっちのソースコードは消すよー。だいたい同じ感じの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();
-
// サービスエリアコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#022
-
$data = $hotpepper->getServiceArea();
-
// 大エリアコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#023
-
$data = $hotpepper->getLargeArea();
-
// 中エリアコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#024
-
$data = $hotpepper->getMiddleArea();
-
// 小エリアコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#025
-
$data = $hotpepper->getSmallArea();
-
// お店ジャンルコードの内容を取得 詳細: http://api.hotpepper.jp/reference.html#026
-
$data = $hotpepper->getGenre();
-
// 予算のコード内容を取得 詳細: http://api.hotpepper.jp/reference.html#027
-
$data = $hotpepper->getBudget();
-
-
// グルメサーチAPIの内容を取得
-
// $parametersの内容は、リクエストパラメータのハッシュ http://api.hotpepper.jp/reference.html#002
-
$data = $hotpepper->getGourmetSearch($parameters);
これだけではありがた味がわからないので、それを使って、検索結果の店の住所からGoogle Mapsにプロットしてみるのが次のコード。はい。ツッコミされまくりそうですね。
-
<?php
-
require_once 'Services/Hotpepper.php';
-
require_once 'Pager.php';
-
-
class HotPepperApp
-
{
-
private $hotpepper;
-
private $searchResult;
-
private $parameters;
-
-
const DEFAULT_ADDRESS = '東京';
-
-
{
-
$this->hotpepper = new Services_Hotpepper();
-
$this->hotpepper->setResponseFormat('array');
-
$this->hotpepper->setUseCache(true);
-
$this->parameters = $parameters;
-
$this->parameters['Count'] = 10;
-
}
-
$this->parameters['Start'] *= (int)$this->parameters['Count'];
-
}
-
// 2006-12-25T16:03:16 修正 parametersに使えない値があるとInvalidParamerExceptionを吐くので、とりあえずそれ以外は削る。
-
'ShopIdFront', 'ShopNameKana', 'ShopName', 'ShopTel', 'ShopAddress',
-
'KtaiCoupon', 'LargeServiceAreaCD', 'ServiceAreaCD', 'LargeAreaCD',
-
'MiddleAreaCD', 'SmallAreaCD', 'Keyword', 'GenreCD', 'Order',
-
'Start', 'Count');
-
foreach ($this->parameters as $key => $value) {
-
}
-
}
-
}
-
-
public function getOptions($master)
-
{
-
$method = 'get' . $master;
-
$result = $this->hotpepper->$method();
-
-
$output = '<select name="' .$master. 'CD">';
-
$output .= '<option value=""> - </option>';
-
foreach ($result[$master] as $item) {
-
$output .= '<option value="' . $item[$master.'CD'] . '"';
-
$output .= ' selected="selected"';
-
}
-
$output .= '>' . $item[$master .'Name'] . '</option>';
-
}
-
$output .= '</select>';
-
return $output;
-
}
-
-
public function getResult()
-
{
-
$output = '';
-
$this->searchResult = $this->hotpepper->getGourmetSearch($this->parameters);
-
}
-
return $this->searchResult['Shop'];
-
}
-
-
public function getPager()
-
{
-
$this->searchResult = $this->hotpepper->getGourmetSearch($this->parameters);
-
}
-
'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
-
{
-
$noKtaiCoupon = (boolean)$result['KtaiCoupon'];
-
-
$ktaiText = $isKtaiCoupon ? '携帯NG!' : '携帯OK!';
-
-
$base =<<<eof
-
<a href='$url'>$name($ktaiText)<br />$catch<br /><hr />$address<br />
-
<!-- HotPepperのページからメールを送ればいいんじゃない?
-
<form>
-
<lable>携帯にアクセス先アドレスを:<input type='text' name='email'/>
-
<input type='hidden' name='url' value='$ktaiShopUrl'/>
-
<input type='submit' value='送信!'/>
-
-
-->
-
EOF;
-
$detail =<<<eof
-
<div style='float:left;width=200;text-align:center;'>
-
<img src='$image' alt='$name' /><br />写真提供:ホットペッパー.jp<br />
-
-
<div>
-
ジャンル($genre)<br />予算($budget)<br />総席数($capacity)
-
<hr />
-
$access
-
</div>
-
EOF;
-
);
-
return $tab;
-
}
-
}
-
-
$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">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
-
<title>Google Maps JavaScript API Example</title>
-
<!-- http://localhost/ -->
-
-
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAvkm9X7SZvAyCad0c7GjwBhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxRo7UhGG5tiSNLbTXH8AFUQzXffZg"
-
type="text/javascript"></script>
-
-
<!-- http://www.ganchiku.com/ -->
-
<!--
-
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAvkm9X7SZvAyCad0c7GjwBhR3SquV7UZw5piZBM9SKA5Ap0BlHxRIXFNr6SBh14IfS1Z5EVaMbEE3jw"
-
type="text/javascript">
-
-->
-
<script type="text/javascript">
-
-
//<![CDATA[
-
-
function load() {
-
if (GBrowserIsCompatible()) {
-
var map = new GMap2(document.getElementById("map"));
-
var geocoder = new GClientGeocoder();
-
var address = '<?php echo $app->getShopAddress(); ?>';
-
map.addControl(new GLargeMapControl());
-
map.addControl(new GMapTypeControl());
-
map.addControl(new GOverviewMapControl());
-
geocoder.getLatLng(address, function(point) {
-
if (!point) {
-
alert("存在する住所(一部可)を入力してください。");
-
} else {
-
map.setCenter(point, 13);}
-
});
-
}
-
var shopAddress = '';
-
<?php foreach ($app->getResult() as $result) : ?>
-
shopAddress = '<?php echo array_shift(explode(" ", $result['ShopAddress'])); ?>';
-
geocoder.getLatLng(shopAddress, function(point) {
-
if (point) {
-
var marker = new GMarker(point);
-
var windowTabs = [
-
<?php foreach (HotPepperApp::getTabHtml($result) as $tab => $content) : ?>
-
new GInfoWindowTab("<?php echo $tab; ?>", "<?php echo $content; ?>"),
-
<?php endforeach; ?>
-
];
-
map.addOverlay(marker);
-
GEvent.addListener(marker, "click", function() {
-
marker.openInfoWindowTabsHtml(windowTabs);
-
});
-
}
-
});
-
<?php endforeach; ?>
-
}
-
-
//]]>
-
</script>
-
</head>
-
<body onload="load()" onunload="GUnload()">
-
<div id="form">
-
<form method="get" action="hotpepper.php">
-
<input type="text" name="ShopAddress" value="<?php echo $app-/>getShopAddress(); ?>" size="64" maxlength="128">
-
<select name="Count">
-
<?php
-
for($i = 0; $i <10; $i++) {
-
$value = ($i+1) * 10;
-
echo ' selected="selected"';
-
}
-
$output .= '>' . $item[$master .'Name'] . '';
-
}
-
?>
-
</select>
-
<input name="search" type="submit" value="検索"/>
-
</form>
-
</div>
-
<br />
-
<div id="map" style="width: 800px; height: 600px"></div>
-
-
Powered by <a href="http://www.hotpepper.jp/">ホットペッパー.jp</a>, <a href="http://maps.google.com/maps">GoogleMap</a>
-
-
</body>
-
</html>
まぁ、詳細はどうでもいいけど、HotPepperのAPIから帰ってくる住所は、建物の名前まで返ってくるので、それは削っている。あと、Pagerは、適当にtotalItemsに NumberOfResultsを - DisplayPerPageで引いた値を入れておく。最後のページのところで問題があるので。まぁ、本当はもう少しスマートにできるんだろうけど。
で、このソースから、少しだけ修正してあるけど、HotPeppe APIとGoogleMapのMashUpができあがる。まぁ、暇なときに作成したプロダクトとしてはこんなもんじゃない?まぁ、前から言っているように、食べログも使いたいので、これで終わりではない。。。予定。
うまいこと食べログを使うことができたら、価格.com WEBサービスAPIコンテストでも参加してみようかな。つーか、こういうのはどんどんやって欲しいね。HotPepperだったら、クーポン載せるの結構高いんでしょ?いっぱい宣伝してもらった方が、店もうれしいし、リクルートもうれしいし、Win-Win Situationじゃないのかね。そして、コンテストで買った人がお金とかもらえてうれしかったら、さらにいいじゃない?なんか、Web2.0ではお金儲けにならないって、どこかで読んだけど、こういうパターンだったらお金儲けになるんじゃない?
というわけで、メリークリスマス。


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