【perl】APIを使って検索サイトを作るプログラム

百戦錬磨の開発者が作ったプログラムを解読して、APIを使って検索サイトを作るにはどうプログラミングしたらいいのかを学びました。具体的なソースは以下。(長いので要注意)


使用しているAPIはこちら↓
http://webservice.recruit.co.jp/hotpepper/reference.html
(このAPIは、(株)リクルートが提供しているホットペッパーのものです。)


下記にあるソースでできることは、
1.検索ボックスがあり、検索ワードを入力

2.入力されて送られてきた検索ワードを受け取り、検索結果をブラウザに表示


動作確認環境は以下。
windows XP
・xampp
・active perl
firefoxIE(すみません。バージョン忘れました。)


001.cgi

#! /usr/bin/perl

#1.使用するモジュールを宣言(6個のモジュールを使用)
use strict;
use CGI;
use LWP::UserAgent;
use XML::TrerPP;
use URI;
use URI::QueryParam;

#2.CGIというモジュールを使用して、検索ボックスに入力された値を取得
my $q = CGI->new;
my $keyword = $q->param('keyword');
my $start = $q->param('start') || 1;
my $count = $q->param('count') || 10;

#3.URIというモジュールを使用。APIを呼び出して検索ボックスに入力された値を渡す。
my $api = URI->new('http://webservice.recruit.co.jp/hotpepper/gourmet/v1/');
$api->query_param(keyword => $keyword);


#すぐ上の一文を以下にするだけで、キーワード検索から住所検索(部分一致)になる。
#$api->query_param(ShopAddress => $keyword);


$api->query_param(start => $start);
$api->query_param(count => $count);
$api->query_param(format => 'xml');
$api->query_param(key => '●●●');
#すぐ上の文の●●●は、API利用を(株)リクルートに申請したときに与えられるキー。これがないと、今回使用しているAPIは利用できない。


my $res =undef;
my $error = '';
my $ua = LWP::UserAgent->new;
#次の一文で、10秒たっても処理が終わらなかったらエラーを返すように設定。
$ua->timeout(10)

#プロキシサーバーを通してこのプログラムをまわすとき
#●●は、プロキシサーバーのアドレス
#■■は、ポート番号
#$ua->proxy(http => 'http://●●:■■');

#プロキシサーバーを通してこのプログラムをまわすときのやり方2番目(●●と■■は上記と同じ)
#$::ENV{HTTP_PROXY} = 'http://●●:■■';
#$ua->env_proxy;


#取得した検索結果からXMLで戻り値を取得
my $response = $ua->get($api);
if ($response->is_success){
 may $tree = XML::TreePP->new();
 $tree-set(force_array =>['shop']);
 $res = $tree=>parse($response->content);
}
else{
 $error = $response->status_line;
}


#4.戻り値を使って、検索結果表示をするhtmlを組み立てる。
print $q->header('-charset' => 'utf-8');
if ($error){
#ヒアドキュメントを使用
 print <<"ERR_HTML";
 <html>
 <head>
 <title>エラー<title>
 </head>
 <body>
 <h2>エラーが発生しました</h2>
 <p>$error</p>
 </body>
 </html>
ERR_HTML
}
else{
 print <<"HTML";
 <html>
 <head>

#googlemapAPIをいれるならここ→http://d.hatena.ne.jp/midori_kasugano/20090527/1243417380

<title>p$keyword - 検索結果</title>
</head>
<body bgcolor="lime" style="width:400px" onload="initialize()" onunload="GUnload()">

<div id="map_canvas" style="width: 500px; height: 300px"></div>
<form method="get" action="">
<p style="font-size:small">住所検索:<input type="text" style="width:150px" name="keyword" value="$keyword"/>
<input type="submit" name="submit" value="検索" />
</p>
</form>
HTML2
print "<p style=\"font-size:small\">";
if ($res->{results}{results_start} > 1 ){
    print " <a href=\"?keyword=".$keyword."&start=" .( $start-$count || 1) . "\"><前 </a>";
}
print "$res->{results}{results_available}件中 $res->{results}{results_start}件目から $res->{results}{results_returned}件表示";
if ($res->{results}{results_available} > $res->{results}{results_start}+$res->{results}{results_returned} ){
    print " <a href=\"?keyword=".$keyword."&start=" .( $start+$count) . "\">次></a>";
}
print "</p>\n";
foreach my $shop (@{$res->{results}{shop}}){
    print "<div style=\"border:1px solid #99aa99;margin:5pt 0;padding:5pt\">\n";
    print "<img src=\"$shop->{photo}{pc}{s}\" style=\"height:40px;float:left;margin-right:5px\">\n";
    print "<div style=\"font-size:small;color:#1111aa;\">$shop->{catch}</div><br clear=\"all\" />\n";
    print "<div style=\"font-size:small\">$shop->{address}</div>\n";
    print "<div style=\"font-size:small\">$shop->{station_name}駅</div>\n";   
    print "<div style=\"font-weight:bold\"><a href=\"$shop->{urls}{pc}\">$shop->{name}</a></div>\n";
    print "</div>\n";
}

print <<"HTML_2";
<a href="http://webservice.recruit.co.jp/"><img src="http://webservice.recruit.co.jp/banner/hotpepper-s.gif" alt="ホットペッパー Webサービス" width="135" height="17" border="0" title="ホットペッパー Webサービス"></a>
</body>
</html>
HTML_2

}