楽天ウェブサービスセンターブログ

楽天ウェブサービスセンターブログ

商品検索APIサンプルソース(Perl)



■サンプルソースご利用の際の注意事項


・Perlが動作するWEBサーバのCGI実行領域におきます。ファイル属性に実行属性(モード:755)をつけてください。
・拡張子は.plとなっていますが適宜WEBサーバの仕様にあわせて変更してください。(.cgi等)
・サンプルコードのファイルは文字エンコーディングをUTF-8で保存するようにしてください。

[ item_search.pl ]

#!/usr/bin/perl
#---------------------------------------------------------------
# 楽天1商品検索API の利用サンプルコード (Perl)
#---------------------------------------------------------------
# 以下を変更してPerlの実行環境におくだけでOK
# 詳細な仕様は以下を参照
# - 楽天ウェブサービス- http://webservice.rakuten.co.jp/

#---------------- 以下、変更部分 ------------------------------#
# 自分のディベロッパーID

$DEVELOPER_ID = "自分のディベロッパーID";

# 自分のアフィリエイトID

$AFFILIATE_ID = "自分のアフィリエイトID";

#---------------- 以上、変更部分 ------------------------------#
use LWP::Simple;

#---------------------------------
# 定数
#---------------------------------
# API名
$API_NAME       = "楽天商品検索API";

# APIのURL
$API_BASE_URL   = "http://api.rakuten.co.jp/rws/1.3/rest";

# APIのタイプ
$OPERATION      = "ItemSearch";

# APIのバージョン
$API_VERSION    = "2007-02-14";

#---------------------------------
# メイン処理
#---------------------------------
# APIステータス
$status  = "";

# APIからのメッセージ
$statusmsg  = "";

# 取得件数
$count = 0;

# 商品リスト
@items = ();

# APIへのパラメタの連想配列
%api_params          = (
    "keyword"        => "",
    "version"        => $API_VERSION,
    "shopCode"       => "",
    "genreId"        => "",
    "catalogCode"    => "",
    "hits"           => "",
    "page"           => "",
    "sort"           => "",
    "minPrice"       => "",
    "maxPrice"       => "",
    "availability"   => "",
    "field"          => "",
    "carrier"        => "",
    "imageFlag"      => ""
);

#---------------------------------
# フォーム値からのパラメタ取得
#---------------------------------

# リクエストURL生成
$api_url = sprintf("%s?developerId=%s&affiliateId=%s&operation=%s",$API_BASE_URL,$DEVELOPER_ID,$AFFILIATE_ID,$OPERATION);

# GETメソッドの場合
if( $ENV{'REQUEST_METHOD'} eq "GET" ) {
$buffer = $ENV{'QUERY_STRING'};
# POSTメソッドの場合
} else {
  read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );
}

# リクエストパラメタを連想配列に入れる
my %req_params = map { /([^=]+)=(.+)/ } split /&/, $buffer;


# APIのクエリ生成
while ( ( $key, $value ) = each ( %api_params ) ) {
    if($req_params{$key} ne ""){
        $api_url = sprintf("%s&%s=%s",$api_url, $key, $req_params{$key});
    }elsif($api_params{$key} ne ""){
        $api_url = sprintf("%s&%s=%s",$api_url, $key, $api_params{$key});
    }
}
#---------------------------------
# ウェブサービスAPIに問合せ
#---------------------------------
if(urldecode($req_params{'submit'}) eq "商品検索"){
    # レスポンスコンテンツ
    my $data = get($api_url);

#---------------------------------
# ステータス判断
#---------------------------------
    # 必要な情報だけ簡易な正規表現で取得
    if($data){
        $data =~s/\n//g;
        # ステータス
        if($data =~/<Status>(.+)<\/Status>/){
            $status = $1;
        }
        # メッセージ
        if($data =~/<StatusMsg>(.+)<\/StatusMsg>/){
            $statusmsg = $1;
        }
        # 件数
        if($data =~/<count>(.+)<\/count>/){
            $count = $1;
        }
        # 商品のリスト
        if($data =~/<Items>(.+)<\/Items>/){
            @items = split(/<\/Item>/,$1);      # ITEMの配列
        }
    }else{
        $statusmsg = "$API_NAMEからのデータの取得に失敗しました";
    }
}

# フォーム入力値の表示
$req_params{keyword}     = htmlspecialchars((urldecode($req_params{keyword})));
$req_params{minPrice}    = htmlspecialchars((urldecode($req_params{minPrice})));
$req_params{maxPrice}    = htmlspecialchars((urldecode($req_params{maxPrice})));

#---------------------------------
# 関数
#---------------------------------
# 文字列にURLデコード処理をする
sub urldecode{
    my $str=shift;
    $str=~tr/+/ /;
    $str=~s/%([a-fA-F0-9]{2})/pack("C",hex($1))/eg;
    return $str;
}
# 文字列をHTMLエスケープ
sub htmlspecialchars{
    my $str = shift;
    $str =~ s/&/&\;/g;
    $str =~ s/"/"\;/g;
    $str =~ s/'/\&\#39\;/g;
    $str =~ s/</\<\;/g;
    $str =~ s/>/\>\;/g;
    return $str;
}
#---------------------------------
# HTMLコンテンツ
#---------------------------------
print "Content-type: text/html; charset=UTF-8\n\n";
print <<"EOF";
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>$API_NAME/楽天ウェブサービス</title>
</head>
<body bgcolor="#ffffff" TEXT="#333333" LINK="#3333cc">

<!-- タイトル -->
<h1 style="font-size:16px;font-weight:bold;">楽天ウェブサービス</h1>
<hr size="1" noshade>$API_NAME<hr size="1" noshade>
<!--/タイトル -->

<!-- HTMLフォーム表示 -->
<form action="item_search.pl" method="get">
<table width="80%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt 0pt 0px;">
<tr><td bgcolor="#afafaf">
<table width="100%" border=0 cellspacing=1 cellpadding=5 style="font-size:12px;">
<tr><td style="background-color: #eeeeee;">検索キーワード</td><td style="background-color: #ffffff;">
<!-- キーワード入力テキストボックス --><input type="text" name="keyword" value="$req_params{keyword}" size="30">
</td></tr>
<tr><td style="background-color: #eeeeee;">価格</td><td style="background-color: #ffffff;">
<!-- 最小価格入力テキストボックス -->
<input type="text" name="minPrice" value="$req_params{minPrice}" size="20"> 円

<!-- 最上価格入力テキストボックス -->
<input type="text" name="maxPrice" value="$req_params{maxPrice}" size="20"> 円
</td></tr>
</table>
</td></tr></table><br>
<input type="submit" name="submit" value="商品検索">
</form>
<!-- HTMLフォーム表示 -->
EOF

print <<"EOF";
<!-- API検索結果表示 -->
<font style="font-size:14px;">
EOF
if($status)     { print "取得結果: $status<br>" };
if($statusmsg)  { print "取得内容: $statusmsg<br>" };
if($count   )   { print "取得件数: $count<br>" };

if($count > 0 ){
print <<"EOF";
<table width="80%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt 0pt 0px;">
<tr><td bgcolor="#afafaf">
<table width="100%" border=0 cellspacing=1 cellpadding=5 style="font-size:12px;">
<tr align="center" style="background-color: #eeeeee;">
<td width="8%" >写真</td>
<td width="47%">商品名</td>
<td width="15%">価格</td>
<td width="30%">ショップ名</td>
</tr>
EOF
    # ベタな正規表現
    foreach my $item ( @items ){
        if($item=~/<itemName>(.+)<\/itemName>/)         {$itemname=$1;}
        if($item=~/<itemPrice>(.+)<\/itemPrice>/)       {$itemprice = $1;}
        if($item=~/<itemUrl>(.+)<\/itemUrl>/)           {$itemurl = $1;}
        if($item=~/<affiliateUrl>(.+)<\/affiliateUrl>/) {$affiliateurl = $1;}
        if($item=~/<smallImageUrl>(.+)<\/smallImageUrl>/){$smallimageurl = $1;}
        if($item=~/<shopName>(.+)<\/shopName>/)         {$shopname =$1;}
        if($item=~/<shopUrl>(.+)<\/shopUrl>/)           {$shopurl =$1;}

print <<"EOF";
<tr style="background-color: #ffffff;">
<td width="8%"  align="center"><a href="$itemurl" target="_top"><img src="$smallimageurl" border=0></a></td>
<td width="47%" align="left"><a href="$affiliateurl" target="_top">$itemname</a></td>
<td width="15%" align="right" nowrap>$itemprice 円</td>
<td width="47%" align="left"><a href="$shopurl" target="_top"><font size="-1">$shopname</a></td>
</tr>
EOF
}
print <<"EOF";
</table>
</td></tr></table>
EOF
    }
print <<"EOF";
</font>
<!-- /API検索結果表示 -->
EOF

exit 0;






© Rakuten Group, Inc.
X
Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: