PHPで楽天商品検索APIを使って商品検索

(1/1)
楽天ウェブサービスは、楽天市場の販売情報などを提供する API群で、アフィリエイトで利用することを想定してつくられている。
今回は、その中から楽天市場で販売されている商品の検索ができる楽天商品検索API を利用し、商品名またはキーワードから商品情報を取り出すプログラムを作ってみることにする。

サンプル・プログラムの実行例

PHPで楽天商品検索APIを使って商品検索

サンプル・プログラム

楽天商品検索API

楽天商品検索APIは、楽天市場で販売されている商品の情報を取得することが可能な API である。検索キーワード(商品名など)、販売店コード、カタログコードをキーワードにして書籍を検索することができる。
WebAPIのURL
URL
https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222

入力パラメータ
項目名 フィールド名 内  容
アプリ applicationId string 【必須】
アフィリエイトID applicationId string アフィリエイトID。これを入力すると、アフィリエイトURLを取得できる。
レスポンス形式 format string json か xml を選択。省略時は json。
json を選択した場合、 callback パラメーター指定により jsonp 形式にすることもできる。
コールバック関数名 callback string JSONPとして出力する際のコールバック関数名 (UTF-8でURLエンコードした文字列)
英数字、「.(ドット)」、「_(アンダーバー)」、「[(中括弧)」、「](中括弧)」のいずれか1文字以上
出力パラメーター指定 elements string カンマ区切りで、必要な出力パラメータを指定した場合、 指定された出力パラメータのみを返却。省略時はALL。
検索キーワード keyword string ★UTF-8でURLエンコードした文字列
半角128以下
複数キーワードから検索したい場合は半角スペースで区切る
ショップコード shopCode string ★ショップごとのURL(http://www.rakuten.co.jp/[xyz])におけるxyzのこと
商品コード itemCode string ★商品検索APIや、楽天商品ランキングAPIや、お気に入りブックマーク取得APIの出力パラメータに含まれまれる「shop:1234」という形式の値
ジャンルID genreId long ★楽天市場におけるジャンルを特定するためのID
ジャンル名、ジャンルの親子関係を調べたい場合は「楽天ジャンル検索API」を利用する
タグID tagId long 10タグIDまでカンマ(,)区切りで指定可能
1ページあたりの取得件数 hits int 1から30までの整数。省略時は30。
取得ページ page int 1から100までの整数。省略時は1。
ソート sort string +affiliateRate:
アフィリエイト料率順(昇順)
-affiliateRate:
アフィリエイト料率順(降順)
+reviewCount:
レビュー件数順(昇順)
-reviewCount:
レビュー件数順(降順)
+reviewAverage:
レビュー平均順(昇順)
-reviewAverage:
レビュー平均順(降順)
+itemPrice:
価格順(昇順)
-itemPrice:
価格順(降順)
+updateTimestamp:
商品更新日時順(昇順)
-updateTimestamp:
商品更新日時順(降順)
standard:
楽天標準ソート順
※UTF-8でURLエンコードされている必要があります。
省略時はstandrd。
最小価格 minPrice long 1以上999,999,999以下の整数
最大価格 maxPrice long 1以上999,999,999以下の整数
maxPriceはminPriceより大きい必要がある
販売可能 availability int(1) 0:すべての商品
1:販売可能な商品のみ
省略時は1。
検索フィールド field int(1) 0:検索対象が広い(同じ検索キーワードでも多くの検索結果が得られる)
1:検索対象範囲が限定される(同じ検索キーワードでも少ない検索結果が得られる)
省略時は1。
キャリア carrier int(1) PC用の情報を返すのか、モバイル用の情報を返すのか、スマートフォン用の情報を返すのか、を選択
PC: 0
mobile: 1
smartphone: 2
省略時は0。
商品画像有無フラグ imageFlag int(1) 0 : すべての商品を検索対象とする
1 : 商品画像ありの商品のみを検索対象とする
省略時は0。
OR検索フラグ orFlag int(1) 複数キーワードが設定された場合に、AND検索、OR検索のいずれかが選択可能。
0:AND検索
1:OR検索
※ただし、(A and B) or Cといった複雑な検索条件設定は指定不可。
省略時は0。
除外キーワード NGKeyword string 検索結果から除外したいキーワード
UTF-8でURLエンコードした文字列
形式については keyword と同様
購入種別 purchaseType int(1) 商品を購入方法別に検索する事が可能
0:通常購入
1:定期購入(定期購入とは、お客様の欲しい商品が欲しいサイクルで買えるサービスです。)
2:頒布会購入(頒布会購入とは、ショップがセレクトした商品を、ショップが決めた回数でお届けするサービスです。)
省略時は0。
海外配送フラグ shipOverseasFlag int(1) 0 :すべての商品
1 :海外配送可能な商品のみ
省略時は0。
海外配送対象地域 shipOverseasArea string 配送可能地域での絞込みが可能
配送地域コードについては別途「海外配送対象地域 コード一覧」を参照してください
※海外配送フラグで「1」が指定されたときのみ利用可能
省略時はALL。
あす楽フラグ asurakuFlag int(1) 0 :すべての商品
1 :あす楽対応可能な商品のみ
省略時は0。
あす楽配送対象地域 asurakuArea int 配送可能地域での絞込みが可能
配送地域コードについては別途「あす楽配送対象地域 コード一覧」を参照してください
※あす楽フラグで「1」が指定されたときのみ利用可能
省略時は0。
ポイント倍付けフラグ pointRateFlag int(1) 0 :すべての商品
1 :ポイント倍付け商品のみ
省略時は0。
商品別ポイント倍付け pointRate int 2から10までの整数 例)5 →ポイント5倍
商品別ポイント倍付けについてはこちらをご確認ください。
※ポイント倍付け商品フラグに「1」が指定されたときのみ利用可能
送料フラグ postageFlag int(1) 0 :すべての商品
1 :送料込み/送料無料の商品のみ
省略時は0。
クレジットカード利用可能フラグ creditCardFlag int(1) 0 :すべての商品
1 :クレジットカード利用可能な商品のみ
省略時は0。
ギフト対応フラグ giftFlag int(1) 0:全ての商品
1:ギフト対応商品のみ
省略時は0。
レビューありフラグ hasReviewFlag int(1) 0:全ての商品
1:レビューがある商品のみ
省略時は0。
アフィリエイト料率最大制限値 maxAffiliateRate float 1.0から99.9までの数値 例)5.0 →5%アフィリエイト料率以下の商品のみ
指定したアフィリエイト料率以上は表示しない
小数第1位まで指定可能
アフィリエイト料率最小制限値 minAffiliateRate float 1.0から99.9までの数値 例)5.0 →5%アフィリエイト料率以上の商品のみ
指定したアフィリエイト料率以下は表示しない
小数第1位まで指定可能
アフィリエイト料率最大制限値以下の値を指定してください。
動画ありフラグ hasMovieFlag int(1) 0:全ての商品
1:動画がある商品のみ(動画リンクを返却します)
省略時は0。
資料請求対応フラグ pamphletFlag int(1) 0:全ての商品
1:資料請求対応商品のみ
省略時は0。
配送日指定対応フラグ appointDeliveryDateFlag int(1) 0:全ての商品
1:配送日指定可能な商品のみ
省略時は0。
ジャンルごとの商品数取得フラグ genreInformationFlag int(1) 0 :ジャンルごとの商品数の情報を取得しない
1 :ジャンルごとの商品数の情報を取得する
省略時は0。
タグごとの商品数取得フラグ tagInformationFlag int(1) 0 :タグごとの商品数の情報を取得しない
1 :タグごとの商品数の情報を取得する
※ジャンルIDが指定されていない場合、0を指定した場合はタグごとの商品数は取得できない
省略時は0。
★検索キーワード、ジャンル ID、商品コード、ショップコードのいずれかが指定されていることが必須。
応答データ(xml) root count 検索結果の総商品数 hits 一度に返却する商品数 page 現在のページ番号 first 検索結果の何件目からか last 検索結果の何件目までか carrier PC=0|モバイル=1|スマホ=2 pageCount 総ページ数(最大100) Items Item itemName 商品名 catchcopy キャッチコピー itemCode 商品コード itemPrice 商品価格 itemCaption 商品説明文 itemUrl 商品URL affiliateUrl アフィリエイトURL imageFlag 商品画像有無フラグ smallImageUrls imageUrl 商品画像64x64URL mediumImageUrls imageUrl 商品画像128x128URL availability 販売可能フラグ taxFlag 消費税フラグ postageFlag 送料フラグ creditCardFlag クレジットカード利用可能フラグ shopOfTheYearFlag ショップオブザイヤーフラグ shipOverseasFlag 海外配送フラグ shipOverseasArea 海外配送対象地域 asurakuFlag あす楽フラグ asurakuClosingTime あす楽〆時間 asurakuArea あす楽配送対象地域 affiliateRate アフィリエイト利用利率 startTime 販売開始時刻 endTime 販売終了時刻 reviewCount レビュー件数 reviewAverage レビュー平均 pointRate 商品別ポイント倍付け pointRateStartTime 商品別ポイント倍付け開始日時 pointRateEndTime 商品別ポイント倍付け終了日時 giftFlag ギフト包装フラグ shopName 店舗名 shopCode 店舗コード shopUrl 店舗URL shopAffiliateUrl 店舗アフィリエイトURL genreId ジャンルID tagIds タグ情報
エラー内容は HTTP ステータスコードとレスポンスボディから判断する。

アプリIDの入手

0020:     //楽天ウェブサービス
0021:     //https://webservice.rakuten.co.jp/app/list 参照
0022:     var $APPLICATIONID      = '*******************';    //アプリID
0023:     var $APPLICATION_SECRET = '****************';       //シークレット
0024:     var $AFFILIATEID        = '*******************';    //アフィリエイトID

楽天ウェブサービスの API を利用するには、事前にアプリ ID を入手する必要がある。楽天会員に登録すると、自動的にアプリ ID が 1 つ発行される。

サンプル・プログラムをダウンロードしたら、この部分に自分のアプリ ID、シークレット、アフィリエイト ID を記述する。
シークレットは、本プログラムでは参照しない。
アフィリエイト ID は省略可能で、その場合には API の戻り値の affiliateUrl が省略される。

解説:WebAPIコール

0073: /**
0074:  * WebAPIを呼び出して応答データを取得する(https用)
0075:  * @param string $url リスクエストURL
0076:  * @return string 応答データ/FALSE=失敗
0077: */
0078: function callWebAPI($url) {
0079:     $ch = curl_init($url);
0080:     curl_setopt($chCURLOPT_HEADERFALSE);
0081:     curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
0082:     curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE); //サーバ証明書検証をスキップ
0083:     curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE); //  〃
0084:     $result = curl_exec($ch);
0085:     curl_close($ch);
0086: 
0087:     return $result;
0088: }

WebAPI は https プロトコルであるため、ユーザー関数 callWebAPI のように cURL 関数を用いて呼び出している。このあたりについては「PHP セキュリティ対策:SSL通信を行う」で解説している。

解説:応答データの扱い

0224: // 出力要素名
0225: var $RakutenSearchItems = array(
0226:     'itemName',            //商品名
0227:     'catchcopy',            //キャッチコピー
0228:     'itemCode',            //商品コード
0229:     'itemPrice',            //商品価格
0230:     'itemCaption',            //商品説明文
0231:     'itemUrl',                //商品URL
0232:     'affiliateUrl',        //アフィリエイトURL
0233:     'imageFlag',            //商品画像有無フラグ
0234:     'availability',        //販売可能フラグ
0235:     'taxFlag',                //消費税フラグ
0236:     'postageFlag',            //送料フラグ
0237:     'creditCardFlag',        //クレジットカード利用可能フラグ
0238:     'shopOfTheYearFlag',    //ショップオブザイヤーフラグ
0239:     'shipOverseasFlag',    //海外配送フラグ
0240:     'shipOverseasArea',    //海外配送対象地域
0241:     'asurakuFlag',            //あす楽フラグ
0242:     'asurakuClosingTime',    //あす楽〆時間
0243:     'asurakuArea',            //あす楽配送対象地域
0244:     'affiliateRate',        //アフィリエイト利用利率
0245:     'startTime',            //販売開始時刻
0246:     'endTime',                //販売終了時刻
0247:     'reviewCount',            //レビュー件数
0248:     'reviewAverage',        //レビュー平均
0249:     'pointRate',            //商品別ポイント倍付け
0250:     'pointRateStartTime',    //商品別ポイント倍付け開始日時
0251:     'pointRateEndTime',    //商品別ポイント倍付け終了日時
0252:     'giftFlag',            //ギフト包装フラグ
0253:     'shopName',            //店舗名
0254:     'shopCode',            //店舗コード
0255:     'shopUrl',                //店舗URL
0256:     'shopAffiliateUrl',    //店舗アフィリエイトURL
0257:     'genreId',                //ジャンルID
0258:     'tagIds'             //タグ情報
0259: );
0260: 
0261: /**
0262:  * 楽天商品検索APIのURLを取得する
0263:  * @param string $query 商品名またはキーワード
0264:  * @return string URL
0265: */
0266: function searchItemsURL($query) {
0267:     $query = urlencode($query);
0268:     $sort  = urlencode('+itemPrice');
0269: 
0270:     $appid = $this->APPLICATIONID;
0271:     $affid = $this->AFFILIATEID;
0272: 
0273:     $res = "https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222?applicationId={$appid}&affiliateId={$affid}&format=xml&keyword={$query}&sort={$sort}";
0274: 
0275:     return $res;
0276: }
0277: 
0278: /**
0279:  * 楽天商品検索APIから必要な情報を配列に格納する
0280:  * @param string $query 商品名またはキーワード
0281:  * @param array  $items 情報を格納する配列
0282:  * @return ヒットした件数/FALSE:検索に失敗
0283: */
0284: function searchItems($query, &$items) {
0285:     $url = $this->searchItemsURL($query);
0286:     if (($res = $this->callWebAPI($url)) == FALSE) {
0287:         $this->error  = TRUE;
0288:         $this->errmsg = 'WebAPI呼び出しに失敗';
0289:         return FALSE;
0290:     }
0291:     $this->webapi = $url;
0292: 
0293: //PHP4用; DOM XML利用
0294:     if ($this->isphp5over() == FALSE) {
0295:         if (($dom = domxml_open_mem($res)) == NULLreturn FALSE;
0296:         $root = $dom->get_elements_by_tagname('root');
0297:         //レスポンス・チェック
0298:         $count = $root[0]->get_elements_by_tagname('count');
0299:         $cnt = $count[0]->get_content();
0300:         if ($cnt <= 0) { //ヒットせず
0301:             $this->error  = TRUE;
0302:             $this->errmsg = '検索結果なし';
0303:             return FALSE;
0304:         }
0305:         //書籍情報取りだし
0306:         $obj = $root[0]->get_elements_by_tagname('Items');
0307:         $obj = $obj[0]->get_elements_by_tagname('Item');
0308:         $cnt = 1;
0309:         foreach ($obj as $val) {
0310:             foreach ($this->RakutenSearchItems as $name) {
0311:                 $node = $val->get_elements_by_tagname($name);
0312:                 if ($node != NULL) {
0313:                     $items[$cnt][$name] = $node[0]->get_content();
0314:                 }
0315:             }
0316:             $node = $val->get_elements_by_tagname('imageFlag');
0317:             if ($node[0]->get_content() == 1) {
0318:                 $node2 = $val->get_elements_by_tagname('smallImageUrls');
0319:                 $node3 = $node2[0]->get_elements_by_tagname('imageUrl');
0320:                 $items[$cnt]['imageUrl'] = $node3[0]->get_content();
0321:             } else {
0322:                 $items[$cnt]['imageUrl'] = '';
0323:             }
0324:             $cnt++;
0325:         }
0326: 
0327: //PHP5用; SimpleXML利用
0328:     } else {
0329:         $xml = simplexml_load_string($res);
0330:         //レスポンス・チェック
0331:         $count = (int)$xml->count;
0332:         if ($count <= 0) {       //ヒットせず
0333:             $this->error  = TRUE;
0334:             $this->errmsg = '検索結果なし';
0335:             return FALSE;
0336:         }
0337:         $obj = $xml->Items->Item;
0338:         $cnt = 1;
0339:         foreach ($obj as $node) {
0340:             foreach ($this->RakutenSearchItems as $name) {
0341:                 if (isset($node->$name)) {
0342:                     $items[$cnt][$name] = (string)$node->$name;
0343:                 }
0344:             }
0345:             if ($node->imageFlag == 1) {
0346:                 $items[$cnt]['imageUrl'] = (string)$node->smallImageUrls->imageUrl;
0347:             } else {
0348:                 $items[$cnt]['imageUrl'] = '';
0349:             }
0350:             $cnt++;
0351:         }
0352:     }
0353:     $this->hits = $cnt - 1;
0354: 
0355:     return $this->hits;
0356: }

応答データの要素が多いので、取得したい要素を $RakutenSearchItems にあらかじめ定義しておき、ユーザー関数 searchItems の中で付き合わせながら配列$items に格納していく。

参考サイト

(この項おわり)
header