グルメナビサイトを横断検索する perl スクリプト

Oct 27, 2009   #Perl  :

作ってみました。まずはこのような pm ファイルを作成します。

pm ファイル

package WebService::Gourmet;
use 5.010000;
use strict;
use warnings;
use Carp;
use base qw(Class::Accessor::Fast Exporter);
__PACKAGE__->mk_accessors(qw ( tel result ));
use WebService::Simple;
use YAML::Syck;
use XML::Simple;
use Encode;
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
# This allows declaration  use WebService::Gourmet ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = (
'all' => [
qw(
          )
]
);
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw(
);
our $VERSION = '0.01';
# Preloaded methods go here.
sub search_hot {
my $self = shift();
# ホットペッパー
my $gourmet = WebService::Simple->new(
base_url => "http://webservice.recruit.co.jp/hotpepper/shop/v1/",
param    => { key => 'Your API key', }
);
# 入力された電話番号は「lll-mmm-nnnn」という形式のみを想定している。
# しかし、ホットペッパーは「lllmmmnnnn」という形式のみ受け付ける。
# そこで変換を行う。
my $arg = $self->{tel};
$arg =~ s/-//g;
# APIをリクエストする
my $response = $gourmet->get( { tel => $arg, } );
# 結果を $self->result に格納する
if ( defined XMLin( $response->content )->{shop} ) {
my $result = XMLin( $response->content )->{shop};
my $shopname = encode( 'utf8', $result->{name} );
my $address  = encode( 'utf8', $result->{address} );
my $url      = encode( 'utf8', $result->{urls}->{pc} );
my $tel      = $self->tel;
$result =
"[Hotpepper] $shopname\t|*店名|[$url:title=$shopname]|\\n|*住所|$address|\\n|*電話番号|$tel|";
$self->result($result);
}
# ヒットすれば t を返し、ヒットしなければ f を返す
return defined XMLin( $response->content )->{shop};
}
sub search_gournavi {
my $self = shift();
# ぐるなびへのアクセス
my $gourmet = WebService::Simple->new(
base_url => "http://api.gnavi.co.jp/ver1/RestSearchAPI/?",
param    => { keyid => 'Your API key', }
);
# 電話番号の取得
my $arg = $self->{tel};
# APIをリクエストする
my $response = $gourmet->get( { tel => $arg, } );
# 結果を $self->result に格納する
if ( defined XMLin( $response->content )->{rest} ) {
my $result = XMLin( $response->content )->{rest};
my $shopname = encode( 'utf8', $result->{name} );
my $address  = encode( 'utf8', $result->{address} );
my $url      = encode( 'utf8', $result->{url} );
my $tel      = $self->tel;
my $image    = encode( 'utf8', $result->{image_url}->{shop_image1} );
$result =
"[ぐるなび] $shopname\t|*店名|[$url:title=$shopname]|\\n|*住所|$address|\\n|*電話番号|$tel|\\n|*画像|[$image:image:w300]";
$self->result($result);
}
# ヒットすれば t を返し、ヒットしなければ f を返す
return defined XMLin( $response->content )->{rest};
}
sub search_dokoiku {
my $self = shift();
# ドコイク?へのアクセス
my $gourmet = WebService::Simple->new(
base_url => "http://api.doko.jp/v1/searchPOI.do?",
param    => {
key    => 'Your API key',
format => 'xml',
}
);
# 電話番号の取得
my $arg = $self->{tel};
# APIをリクエストする
my $response = $gourmet->get( { tel => $arg, } );
# 結果を $self->result に格納する
if ( defined XMLin( $response->content )->{poi} ) {
my $result = XMLin( $response->content )->{poi};
my $shopname = encode( 'utf8', $result->{name} );
my $address  = encode( 'utf8', $result->{address} );
my $url      = encode( 'utf8', $result->{dokopcurl} );
my $tel      = $self->tel;
$result =
"[ドコイク?] $shopname\t|*店名|[$url:title=$shopname]|\\n|*住所|$address|\\n|*電話番号|$tel|";
$self->result($result);
}
# ヒットすれば t を返し、ヒットしなければ f を返す
return defined XMLin( $response->content )->{poi};
}
sub search {
my $self = shift();
if ( $self->search_hot() ) {
say $self->result;
}
if ( $self->search_gournavi() ) {
say $self->result;
}
if ( $self->search_dokoiku() ) {
say $self->result;
}
}
1;

perl スクリプト

この pm ファイルを用いる、perl スクリプトを作成します。

# === Libraries ===
use strict;
use warnings;
use utf8;
use lib '/Users/kazu634/bin/lib';
use WebService::Gourmet;
# === Main part ===
my $tel = shift || die "Usage: gourmet 000-000-0000\n";
die "Telephone number must be with hyphen. For example, 000-000-0000"
unless ( $tel =~ /^\d+-\d+-\d+$/ );
my $instance = WebService::Gourmet->new( { tel => $tel } );
$instance->search();

実行結果

~/bin on kazu634 [531] $: perl gourmet.pl 045-324-2831
[ぐるなび] Backstreet Brewery   |*店名|[http://r.gnavi.co.jp/g600174/?ak=VMPVyGdfIVYCrk8cr02oSYEV7QXvr8jhUTdC%2Ba4dsB8%3D:title=Backstreet Brewery]|\n|*住所|220-0005 神奈川県横浜市西区南幸2-6-6 DD・Z-POINT1F|\n|*電話番号|045-324-2831|\n|*画像|[http://apicache.gnavi.co.jp/image/rest/index.php?img=g600174v.jpg&sid=g600174:image:w300]
[ドコイク?] Backstreet Brewery |*店名|[http://www.doko.jp/search/shop/sc71233363/?vos=apidoko1:title=Backstreet Brewery]|\n|*住所|神奈川県横浜市西区南幸2-6-6DD・Z-POINT1F|\n|*電話番号|045-324-2831|

これを anything で取り込んで使うぞ!