グルメサイトを横断検索した結果を出力するスクリプト

Nov 18, 2009   #Perl  :

anythingのソースを作るために、グルメサイトを横断検索して結果を出力するスクリプトを作成しました。

仕様

  • 電話番号を引数として受け取る
  • 検索するのは、以下のサイト:
    1. ホットペッパー
    2. ぐるなび
    3. ドコイク?
  • 出力する形式は以下の順番にタブで区切って出力する
    1. ヒットしたサイト名
    2. 店名
    3. 住所
    4. URL
    5. 電話番号

ソース

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 $data = XMLin( $response->content )->{shop};
my $result = {
"Hotpepper" => {
"shopname" => encode( 'utf8', $data->{name} ),
"address"  => encode( 'utf8', $data->{address} ),
"url" => encode( 'utf8', $data->{urls}->{pc} ),
"tel" => $self->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 $data = XMLin( $response->content )->{rest};
my $result = {
"GourNavi" => {
"shopname" => encode( 'utf8', $data->{name} ),
"address" => encode( 'utf8', $data->{address} ),
"url" => encode( 'utf8', $data->{url} ),
"tel" => $self->tel,
"image" => encode( 'utf8', $data->{image_url}->{shop_image1} ),
}
};
$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 $data = XMLin( $response->content )->{poi};
my $result = {
"dokoiku" => {
"shopname" => encode( 'utf8', $data->{name} ),
"address" => encode( 'utf8', $data->{address} ),
"url" => encode( 'utf8', $data->{dokopcurl} ),
"tel" => $self->tel,
}
};
$self->result($result);
}
# ヒットすれば t を返し、ヒットしなければ f を返す
return defined XMLin( $response->content )->{poi};
}
sub pretty_print {
my $self = shift();
my @work = keys ( %{ $self->result });
my $key = $work[];
my $shopname = $self->result->{$key}->{"shopname"};
my $address = $self->result->{$key}->{"address"};
my $url = $self->result->{$key}->{"url"};
my $tel = $self->result->{$key}->{"tel"};
say "$key\t$shopname\t$address\t$url\t$tel";
}
sub search {
my $self = shift();
if ( $self->search_hot() ) {
$self->pretty_print;
}
if ( $self->search_gournavi() ) {
$self->pretty_print;
}
if ( $self->search_dokoiku() ) {
$self->pretty_print;
}
}
1;

使い方

#!/usr/bin/env 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();

実行結果

~ on kazu634 [530] $: gourmet 03-3780-3908
Hotpepper       正軍    東京都渋谷区道玄坂2-25-15 阿久津ビル3F        http://www.hotpepper.jp/strJ000062726/?vos=nhppalsa000016      03-3780-3908
GourNavi        炭火串焼 正軍   〒150-0043 東京都渋谷区道玄坂2-25-15 阿久津ビル3F       http://r.gnavi.co.jp/b418500/?ak=VMPVyGdfIVYCrk8cr02oSYEV7QXvr8jhUTdC%2Ba4dsB8%3D      03-3780-3908
dokoiku 炭火串焼 正軍   東京都渋谷区道玄坂2-25-15 阿久津ビル3F  http://www.doko.jp/search/shop/sc70016616/?vos=apidoko1        03-3780-3908