サンプル・プログラムの実行例
目次
サンプル・プログラム
| searchRakuten.php | サンプル・プログラム本体。 |
| pahooRakuten.php | 楽天ウェブサービスに関わるクラス pahooRakuten。 使い方は「PHPで最寄りのネットができるホテルを検索する」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 3.2.0 | 2025/03/30 | pahooInputData.php導入, 参考URL変更 |
| 3.1.1 | 2024/09/23 | 参考URL変更 |
| 3.1 | 2021/10/24 | PHP8対応,リファラ・チェック改良 |
| 3.0 | 2016/02/27 | pahooRakutenクラスに変更 |
| 2.01 | 2015/07/05 | SSLv3脆弱性対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 3.6.4 | 2025/11/29 | PHP8.5対応:curl_closeを実行しないようにした |
| 3.6.3 | 2025/08/14 | searchVacantHotelsURL() 日本測地系にデグレード |
| 3.6.2 | 2023/07/09 | bug-fix |
| 3.6.1 | 2022/12/13 | PHP8.2対応 |
| 3.6 | 2022/02/05 | 楽天商品検索API (version:2017-07-06)に変更 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 2.0.1 | 2025/08/11 | getParam() bug-fix |
| 2.0.0 | 2025/08/11 | pahooLoadEnv() 追加 |
| 1.9.0 | 2025/07/26 | getParam() 引数に$trim追加 |
| 1.8.1 | 2025/03/15 | validRegexPattern() debug |
| 1.8.0 | 2024/11/12 | validRegexPattern() 追加 |
準備:PHP の https対応
Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dllLinuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順
これで準備は完了だ。
準備:pahooInputData 関数群
また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。
準備:pahooRakuten クラス
pahooRakuten.php
19: // 楽天ウェブサービス・クラス ===============================================
20: class pahooRakuten {
21: public $error; // エラー・フラグ
22: public $errmsg; // エラー・メッセージ
23: public $hits; // 検索ヒット件数
24: public $webapi; // 直前に呼び出したWebAPI URL
25:
26: // 楽天ウェブサービス
27: // https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Rakuten 参照
28: public $APPLICATIONID = ''; // アプリID
29: public $APPLICATION_SECRET = ''; // シークレット
30: public $AFFILIATEID = ''; // アフィリエイトID
31:
32: /**
33: * コンストラクタ
34: * @param なし
35: * @return なし
36: */
37: function __construct() {
38: if (isset($_ENV['PAHOO_RAKUTEN_APP_ID'])) {
39: $this->APPLICATIONID = $_ENV['PAHOO_RAKUTEN_APP_ID'];
40: }
41: if (isset($_ENV['PAHOO_RAKUTEN_APP_SECRET'])) {
42: $this->APPLICATION_SECRET = $_ENV['PAHOO_RAKUTEN_APP_SECRET'];
43: }
44: if (isset($_ENV['PAHOO_RAKUTEN_AFFILIATEID'])) {
45: $this->AFFILIATEID = $_ENV['PAHOO_RAKUTEN_AFFILIATEID'];
46: }
47:
48: // プロパティを初期化する.
49: $this->error = FALSE;
50: $this->errmsg = '';
51: $this->hits = 0;
52: $this->webapi = '';
53: }
楽天ウェブサービスには、アプリID や アフィリエイトID が必要で、その入手方法は「楽天ウェブサービス - WebAPIの登録方法」を参照されたい。
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
楽天商品検索API
| 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(https://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を指定した場合はタグごとの商品数は取得できない |
準備:pahooRakuten クラス
pahooRakuten.php
クラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
楽天ウェブサービスには、アプリID や アフィリエイトID が必要で、その入手方法は「楽天ウェブサービス - WebAPIの登録方法」を参照されたい。
解説:WebAPIコール
pahooRakuten.php
90: /**
91: * WebAPIを呼び出して応答データを取得する(https用)
92: * @param string $url リスクエストURL
93: * @return string 応答データ/FALSE=失敗
94: */
95: function callWebAPI($url) {
96: $ch = curl_init($url);
97: curl_setopt($ch, CURLOPT_HEADER, FALSE);
98: curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
99: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // サーバ証明書検証をスキップ
100: curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 〃
101: $result = curl_exec($ch);
102: if (PHP_VERSION_ID < 80500) {
103: curl_close($ch);
104: }
105:
106: return $result;
107: }
解説:応答データの扱い
pahooRakuten.php
301: /**
302: * 楽天商品検索APIから必要な情報を配列に格納する
303: * @param string $query 商品名またはキーワード
304: * @param array $items 情報を格納する配列
305: * @return ヒットした件数/FALSE:検索に失敗
306: */
307: function searchItems($query, &$items) {
308: $url = $this->searchItemsURL($query);
309: if (($res = $this->callWebAPI($url)) == FALSE) {
310: $this->error = TRUE;
311: $this->errmsg = 'WebAPI呼び出しに失敗';
312: return FALSE;
313: }
314: $this->webapi = $url;
315:
316: // PHP4用; DOM XML利用
317: if ($this->isphp5over() == FALSE) {
318: if (($dom = domxml_open_mem($res)) == NULL) return FALSE;
319: $root = $dom->get_elements_by_tagname('root');
320: // レスポンス・チェック
321: $count = $root[0]->get_elements_by_tagname('count');
322: $cnt = $count[0]->get_content();
323: if ($cnt <= 0) { // ヒットせず
324: $this->error = TRUE;
325: $this->errmsg = '検索結果なし';
326: return FALSE;
327: }
328: // 書籍情報取りだし
329: $obj = $root[0]->get_elements_by_tagname('Items');
330: $obj = $obj[0]->get_elements_by_tagname('Item');
331: $cnt = 1;
332: foreach ($obj as $val) {
333: foreach ($this->RakutenSearchItems as $name) {
334: $node = $val->get_elements_by_tagname($name);
335: if ($node != NULL) {
336: $items[$cnt][$name] = $node[0]->get_content();
337: }
338: }
339: $node = $val->get_elements_by_tagname('imageFlag');
340: if ($node[0]->get_content() == 1) {
341: $node2 = $val->get_elements_by_tagname('smallImageUrls');
342: $node3 = $node2[0]->get_elements_by_tagname('imageUrl');
343: $items[$cnt]['imageUrl'] = $node3[0]->get_content();
344: } else {
345: $items[$cnt]['imageUrl'] = '';
346: }
347: $cnt++;
348: }
349:
350: // PHP5用; SimpleXML利用
351: } else {
352: $xml = simplexml_load_string($res);
353: // レスポンス・チェック
354: $count = (int)$xml->count;
355: if ($count <= 0) { // ヒットせず
356: $this->error = TRUE;
357: $this->errmsg = '検索結果なし';
358: return FALSE;
359: }
360: $obj = $xml->Items->Item;
361: $cnt = 1;
362: foreach ($obj as $node) {
363: foreach ($this->RakutenSearchItems as $name) {
364: if (isset($node->$name)) {
365: $items[$cnt][$name] = (string)$node->$name;
366: }
367: }
368: if ($node->imageFlag == 1) {
369: $items[$cnt]['imageUrl'] = (string)$node->smallImageUrls->imageUrl;
370: } else {
371: $items[$cnt]['imageUrl'] = '';
372: }
373: $cnt++;
374: }
375: }
376: $this->hits = $cnt - 1;
377:
378: return $this->hits;
379: }
参考サイト
- 楽天商品検索API:楽天市場
- PHPで楽天ブックスAPIを使って書籍検索:ぱふぅ家のホームページ

今回は、その中から楽天市場で販売されている商品の検索ができる楽天商品検索API を利用し、商品名またはキーワードから商品情報を取り出すプログラムを作ってみることにする。
(2025年12月6日)PHP8.5対応:double→float表記変更,curl_closeを実行しないようにした
(2025年3月30日)pahooInputData.php導入, 参考URL変更