--- title: グルメナビサイトを横断検索する perl スクリプト author: kazu634 date: 2009-10-27 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4875;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Perl ---
作ってみました。まずはこのような 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;
この 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 で取り込んで使うぞ!