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

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

(2022年2月5日)楽天商品検索API (version:2017-07-06)に変更
(2021年10月24日)PHP8対応,リファラ・チェック改良など

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

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

サンプル・プログラム

圧縮ファイルの内容
searchRakuten.phpサンプル・プログラム本体。
pahooRakuten.php楽天ウェブサービスに関わるクラス pahooRakuten。
使い方は「PHPで最寄りのネットができるホテルを検索する」などを参照。include_path が通ったディレクトリに配置すること。

楽天商品検索API

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

入力パラメータ
フィールド名 要否 内  容
applicationId 必須 楽天ウェブサービスのアプリケーションID
format 任意 'xml'または'json'
【デフォルト】json
callback 任意 コールバック関数名
JSONPとして出力する際のコールバック関数名 (UTF-8でURLエンコードした文字列)
英数字、「.(ドット)」、「_(アンダーバー)」、「[(中括弧)」、「](中括弧)」のいずれか1文字以上
elements 任意 出力パラメーター指定
カンマ区切りで、必要な出力パラメータを指定した場合、 指定された出力パラメータのみを返却。省略時はALL。
formatVersion 任意 2を指定すると、JSONの出力方法が改善する。省略時は1。
keyword 検索キーワード
UTF-8でURLエンコードした文字列
半角128以下
複数キーワードから検索したい場合は半角スペースで区切る。
shopCode ショップコード
ショップごとのURL(http://www.rakuten.co.jp/[xyz])におけるxyzのこと。
itemCode 商品コード
商品検索APIや、楽天商品ランキングAPIや、お気に入りブックマーク取得APIの出力パラメータに含まれまれる「shop:1234」という形式の値。
genreId ジャンルID
楽天市場におけるジャンルを特定するためのID
ジャンル名、ジャンルの親子関係を調べたい場合は「楽天ジャンル検索API」を利用する。
tagId 任意 タグID
10タグIDまでカンマ(,)区切りで指定可能。
hits 任意 1ページあたりの取得件数
1から30までの整数
【デフォルト】30
page 任意 取得ページ
1から100までの整数
【デフォルト】1
sort 任意 ソート
+affiliateRate:アフィリエイト料率順(昇順)
-affiliateRate:アフィリエイト料率順(降順)
+reviewCount:レビュー件数順(昇順)
-reviewCount:レビュー件数順(降順)
+reviewAverage:レビュー平均順(昇順)
-reviewAverage:レビュー平均順(降順)
+itemPrice:価格順(昇順)
-itemPrice:価格順(降順)
+updateTimestamp:商品更新日時順(昇順)
-updateTimestamp:商品更新日時順(降順)
standard:楽天標準ソート順【省略時】
※UTF-8でURLエンコードされている必要があります。
minPrice 任意 最小価格
1以上999,999,999以下の整数
maxPrice 任意 最大価格
1以上999,999,999以下の整数
maxPriceはminPriceより大きい必要がある
availability 任意 販売可能
0:すべての商品
1:販売可能な商品のみ【省略時】
field 任意 検索フィールド
0:検索対象が広い(同じ検索キーワードでも多くの検索結果が得られる)
1:検索対象範囲が限定される(同じ検索キーワードでも少ない検索結果が得られる)【省略時】
carrier 任意 PC用の情報を返すのか、モバイル用の情報を返すのかを選択
PC: 0【省略時】
mobile: 1
imageFlag 任意 商品画像有無フラグ
0 : すべての商品を検索対象とする【省略時】
1 : 商品画像ありの商品のみを検索対象とする
orFlag 任意 OR検索フラグ
複数キーワードが設定された場合に、AND検索、OR検索のいずれかが選択可能。
0:AND検索【省略時】
1:OR検索
※ただし、(A and B) or Cといった複雑な検索条件設定は指定不可
NGKeyword 任意 除外キーワード
検索結果から除外したいキーワード
UTF-8でURLエンコードした文字列形式については keyword と同様
purchaseType 任意 購入種別
商品を購入方法別に検索する事が可能
0:通常購入【省略時】
1:定期購入(定期購入とは、お客様の欲しい商品が欲しいサイクルで買えるサービスです。)
2:頒布会購入(頒布会購入とは、ショップがセレクトした商品を、ショップが決めた回数でお届けするサービスです)
shipOverseasFlag 任意 >海外配送フラグ
0 :すべての商品【省略時】
1 :海外配送可能な商品のみ
shipOverseasArea 任意 海外配送対象地域
配送可能地域での絞込みが可能
配送地域コードについては別途「海外配送対象地域コード一覧」を参照してください
※海外配送フラグで「1」が指定されたときのみ利用可能
省略時はALL。
asurakuFlag 任意 あす楽フラグ
0 :すべての商品【省略時】 1 :あす楽対応可能な商品のみ
asurakuArea 任意 あす楽配送対象地域配送可能地域での絞込みが可能
配送地域コードについては別途「あす楽配送対象地域 コード一覧」を参照してください
※あす楽フラグで「1」が指定されたときのみ利用可能
pointRateFla 任意 ポイント倍付けフラグ
0 :すべての商品【省略時】
1 :ポイント倍付け商品のみ
postageFlag 任意 送料フラグ
0 :すべての商品【省略時】
1 :送料込み/送料無料の商品のみ
giftFlag 任意 ギフト対応フラグ
0:全ての商品【省略時】
1:ギフト対応商品のみ
hasReviewFlag 任意 レビューありフラグ
0:全ての商品【省略時】
1:レビューがある商品のみ
maxAffiliateRate 任意 アフィリエイト料率最大制限値
1.0から99.9までの数値 例)5.0 →5%アフィリエイト料率以下の商品のみ
指定したアフィリエイト料率以上は表示しない
小数第1位まで指定可能
minAffiliateRate 任意 アフィリエイト料率最小制限値
1.0から99.9までの数値 例)5.0 →5%アフィリエイト料率以上の商品のみ
指定したアフィリエイト料率以下は表示しない
小数第1位まで指定可能
アフィリエイト料率最大制限値以下の値を指定してください。
hasMovieFlag 任意 動画ありフラグ
0:全ての商品【省略時】
1:動画がある商品のみ(動画リンクを返却します)
pamphletFlag 任意 資料請求対応フラグ
0:全ての商品【省略時】
1:資料請求対応商品のみ
appointDeliveryDateFlag 任意 配送日指定対応フラグ
0:全ての商品【省略時】
1:配送日指定可能な商品のみ
genreInformationFlag 任意 ジャンルごとの商品数取得フラグ
0 :ジャンルごとの商品数の情報を取得しない【省略時】
1 :ジャンルごとの商品数の情報を取得する
tagInformationFlag 任意 タグごとの商品数取得フラグ
0 :タグごとの商品数の情報を取得しない【省略時】
1 :タグごとの商品数の情報を取得する
※ジャンルIDが指定されていない場合、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ステータスコードとレスポンスボディから判断する。

準備:pahooRakuten クラス

0016: // 楽天ウェブサービス・クラス ===============================================
0017: class pahooRakuten {
0018:     var $error;          //エラーフラグ
0019:     var $hits;           //検索ヒット件数
0020:     var $webapi;     //直前に呼び出したWebAPI URL
0021: 
0022:     //楽天ウェブサービス
0023:     //https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Rakuten 参照
0024:     var $APPLICATIONID      = '*******************';    //アプリID
0025:     var $APPLICATION_SECRET = '****************';       //シークレット
0026:     var $AFFILIATEID        = '*******************';    //アフィリエイトID

楽天トラベルのホテル検索、楽天市場の商品検索など、楽天ウェブサービスを利用するために、クラスファイル "pahooRakuten.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
クラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

楽天ウェブサービスには、アプリIDアフィリエイトID が必要で、その入手方法は「楽天ウェブサービス - WebAPIの登録方法」を参照されたい。

解説:WebAPIコール

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

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

解説:応答データの扱い

0283: /**
0284:  * 楽天商品検索APIから必要な情報を配列に格納する
0285:  * @param   string $query 商品名またはキーワード
0286:  * @param   array  $items 情報を格納する配列
0287:  * @return  ヒットした件数/FALSE:検索に失敗
0288: */
0289: function searchItems($query, &$items) {
0290:     $url = $this->searchItemsURL($query);
0291:     if (($res = $this->callWebAPI($url)) == FALSE) {
0292:         $this->error  = TRUE;
0293:         $this->errmsg = 'WebAPI呼び出しに失敗';
0294:         return FALSE;
0295:     }
0296:     $this->webapi = $url;
0297: 
0298: //PHP4用; DOM XML利用
0299:     if ($this->isphp5over() == FALSE) {
0300:         if (($dom = domxml_open_mem($res)) == NULLreturn FALSE;
0301:         $root = $dom->get_elements_by_tagname('root');
0302:         //レスポンス・チェック
0303:         $count = $root[0]->get_elements_by_tagname('count');
0304:         $cnt = $count[0]->get_content();
0305:         if ($cnt <= 0) { //ヒットせず
0306:             $this->error  = TRUE;
0307:             $this->errmsg = '検索結果なし';
0308:             return FALSE;
0309:         }
0310:         //書籍情報取りだし
0311:         $obj = $root[0]->get_elements_by_tagname('Items');
0312:         $obj = $obj[0]->get_elements_by_tagname('Item');
0313:         $cnt = 1;
0314:         foreach ($obj as $val) {
0315:             foreach ($this->RakutenSearchItems as $name) {
0316:                 $node = $val->get_elements_by_tagname($name);
0317:                 if ($node != NULL) {
0318:                     $items[$cnt][$name] = $node[0]->get_content();
0319:                 }
0320:             }
0321:             $node = $val->get_elements_by_tagname('imageFlag');
0322:             if ($node[0]->get_content() == 1) {
0323:                 $node2 = $val->get_elements_by_tagname('smallImageUrls');
0324:                 $node3 = $node2[0]->get_elements_by_tagname('imageUrl');
0325:                 $items[$cnt]['imageUrl'] = $node3[0]->get_content();
0326:             } else {
0327:                 $items[$cnt]['imageUrl'] = '';
0328:             }
0329:             $cnt++;
0330:         }
0331: 
0332: //PHP5用; SimpleXML利用
0333:     } else {
0334:         $xml = simplexml_load_string($res);
0335:         //レスポンス・チェック
0336:         $count = (int)$xml->count;
0337:         if ($count <= 0) {       //ヒットせず
0338:             $this->error  = TRUE;
0339:             $this->errmsg = '検索結果なし';
0340:             return FALSE;
0341:         }
0342:         $obj = $xml->Items->Item;
0343:         $cnt = 1;
0344:         foreach ($obj as $node) {
0345:             foreach ($this->RakutenSearchItems as $name) {
0346:                 if (isset($node->$name)) {
0347:                     $items[$cnt][$name] = (string)$node->$name;
0348:                 }
0349:             }
0350:             if ($node->imageFlag == 1) {
0351:                 $items[$cnt]['imageUrl'] = (string)$node->smallImageUrls->imageUrl;
0352:             } else {
0353:                 $items[$cnt]['imageUrl'] = '';
0354:             }
0355:             $cnt++;
0356:         }
0357:     }
0358:     $this->hits = $cnt - 1;
0359: 
0360:     return $this->hits;
0361: }

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

参考サイト

(この項おわり)
header