目次
サンプル・プログラムの実行例
サンプル・プログラム
| searchBook.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.02 | 2015/07/05 | SSLv3脆弱性対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 4.0.0 | 2026/07/04 | API移行に対応, PHP4.x/5.x系サポート終了 |
| 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対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 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
22: // 楽天ウェブサービス・クラス ===============================================
23: class pahooRakuten {
24: public $error; // エラー・フラグ
25: public $errmsg; // エラー・メッセージ
26: public $hits; // 検索ヒット件数
27: public $webapi; // 直前に呼び出したWebAPI URL
28:
29: // 楽天ウェブサービス
30: // https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Rakuten 参照
31: public $APPLICATIONID = ''; // アプリケーションID
32: public $ACCESSKEY = ''; // アクセスキー
33: public $AFFILIATEID = ''; // アフィリエイトID
34: public $ALLOWEDWEBSITE = ''; // 許可されたWebサイト
35:
36: /**
37: * コンストラクタ
38: * @param なし
39: * @return なし
40: */
41: function __construct() {
42: if (isset($_ENV['PAHOO_RAKUTEN_APP_ID'])) {
43: $this->APPLICATIONID = $_ENV['PAHOO_RAKUTEN_APP_ID'];
44: }
45: if (isset($_ENV['PAHOO_RAKUTEN_ACCESSKEY'])) {
46: $this->ACCESSKEY = $_ENV['PAHOO_RAKUTEN_ACCESSKEY'];
47: }
48: if (isset($_ENV['PAHOO_RAKUTEN_AFFILIATEID'])) {
49: $this->AFFILIATEID = $_ENV['PAHOO_RAKUTEN_AFFILIATEID'];
50: }
51: if (isset($_ENV['PAHOO_RAKUTEN_ALLOWEDWEBSITE'])) {
52: $this->ALLOWEDWEBSITE = $_ENV['PAHOO_RAKUTEN_ALLOWEDWEBSITE'];
53: }
54:
55: // プロパティを初期化する.
56: $this->error = FALSE;
57: $this->errmsg = '';
58: $this->hits = 0;
59: $this->webapi = '';
60: }
楽天ウェブサービスには、アプリケーションURL、アプリケーションID、アクセスキー、アフィリエイトID が必要で、その入手方法は「楽天ウェブサービス - WebAPIの登録方法」を参照されたい。
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
楽天ブックス書籍検索API
ここでは、書籍タイトルまたはISBNコードを検索キーに使う。
| URL |
|---|
| https://app.rakuten.co.jp/services/api/BooksBook/Search/20130522 |
| フィールド名 | 要否 | 内 容 |
|---|---|---|
| applicationId | 必須 | 楽天ウェブサービスのアプリケーションID |
| format | 任意 | 'xml'または'json' 【デフォルト】json |
| title | ★ | 書籍タイトル UTF-8でURLエンコードした文字列。複数キーワードから検索したい場合は、半角スペースで区切る。 |
| author | ★ | 著者名 UTF-8でURLエンコードした文字列。複数キーワードから検索したい場合は、半角スペースで区切る。 |
| publisherName | ★ | 出版社名 UTF-8でURLエンコードした文字列。複数キーワードから検索したい場合は、半角スペースで区切る。 |
| size | ★ | 書籍のサイズ 0:全て 1:単行本 2:文庫 3:新書 4:全集・双書 5:事・辞典 6:図鑑 7:絵本 8:カセット,CDなど 9:コミック 10:ムックその他 |
| isbn | ★ | ISBNコード(10進数13桁) |
| booksGenreId | ★ | 楽天ブックスにおけるジャンルを特定するためのID |
| hits | 任意 | 1ページあたりの取得件数 1から30までの整数 【デフォルト】30 |
| page | 任意 | 取得ページ 1から100までの整数 【デフォルト】1 |
| availability | 任意 |
在庫状況 0:すべての商品【省略時】 1:在庫あり 2:2~3日以内に発送予定 3:1~2週間以内に発送予定 4:予約受付中 |
| outOfStockFlag | 任意 | 品切れ等購入不可商品表示フラ 0:品切れや販売終了など購入不可の商品は結果に表示させない【省略時】 1:品切れや販売終了など購入不可の商品を結果に表示させる |
| chirayomiFlag | 任意 |
チラよみフラグ 0:すべての商品【省略時】 1:チラよみ対象商品で絞り込む |
| sort | 任意 |
ソート standard:標準【省略時】 sales:売れている +releaseDate:発売日(古い) -releaseDate:発売日(新しい) +itemPrice:価格が安い -itemPrice:価格が高い +reviewCount:レビューの件数が少ない -reviewCount:レビューの件数が多い |
| carrier | 任意 | PC用の情報を返すのか、モバイル用の情報を返すのかを選択 PC: 0【省略時】 mobile: 1 |
| genreInformationFlag | 任意 |
ジャンルごとの商品数取得フラグ 0 :ジャンルごとの商品数の情報を取得しない【省略時】 1 :ジャンルごとの商品数の情報を取得する |
解説:WebAPIコール
pahooRakuten.php
解説:応答データの扱い
pahooRakuten.php
123: /**
124: * 楽天ブックスAPIで書籍検索
125: * @param string $query ISBN番号または書籍名
126: * @param string $author 著者名
127: * @param array $items 検索結果を格納する配列
128: * @param string $sort ソート方式(省略時:standard)
129: * @param bool $purchasable 購入可能(省略時:TRUE)
130: * @return ヒットした件数/FALSE:検索に失敗
131: */
132: function searchBooks($query, $author, &$items, $sort='standard', $purchasable=TRUE) {
133: // 入力パラメータ
134: $params = [
135: 'applicationId' => $this->APPLICATIONID,
136: 'accessKey' => $this->ACCESSKEY,
137: 'affiliateId' => $this->AFFILIATEID,
138: 'format' => 'xml',
139: 'sort' => $sort,
140: 'outOfStockFlag' => $purchasable ? 1 : 0,
141: ];
142:
143: // ISBN番号
144: if (preg_match('/^[0-9]+$/', $query) > 0) {
145: $params['isbn'] = $query;
146: // 書籍名
147: } else if ($query != '') {
148: $query = preg_replace("/ー/ui", '-', $query);
149: $params['title'] = $query;
150: }
151: // 作者
152: if ($author !== '') {
153: $params['author'] = $author;
154: }
155:
156: $url = 'https://openapi.rakuten.co.jp/services/api/BooksBook/Search/20170404?' . http_build_query($params);
157: $this->webapi = $url;
158:
159: // cURLを使ったリクエスト
160: try {
161: $ch = curl_init($url);
162: curl_setopt_array($ch, [
163: CURLOPT_CONNECTTIMEOUT => 10,
164: CURLOPT_RETURNTRANSFER => TRUE,
165: CURLOPT_SSL_VERIFYPEER => FALSE, // サーバ証明書検証をスキップ
166: CURLOPT_SSL_VERIFYHOST => FALSE, // 〃
167: CURLOPT_RETURNTRANSFER => TRUE,
168: CURLOPT_HTTPHEADER => [
169: "Referer: {$this->ALLOWEDWEBSITE}",
170: "Origin: {$this->ALLOWEDWEBSITE}",
171: ],
172: ]);
173: $response = curl_exec($ch);
174: if (curl_error($ch) !== '') {
175: $this->error = TRUE;
176: $this->errmsg = curl_error($ch);
177: // throw new Exception($this->errmsg);
178: return FALSE;
179: }
180: $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
181: if ($httpCode !== 200) {
182: $this->error = TRUE;
183: $this->errmsg = "HTTP Code = {$httpCode}";
184: // throw new Exception($this->errmsg);
185: return FALSE;
186: }
187: // PHP8.5:非推奨関数
188: if (PHP_VERSION_ID < 80500) {
189: curl_close($ch);
190: }
191:
192: } catch (Exception $e) {
193: $this->error = TRUE;
194: $this->errmsg = $e->getMessage();
195: // throw new Exception($this->errmsg);
196: return FALSE;
197: }
198:
199: // 応答の解釈
200: try {
201: $xml = simplexml_load_string($response);
202: // レスポンス・チェック
203: $count = (int)$xml->count;
204: if ($count <= 0) { // ヒットせず
205: $this->error = TRUE;
206: $this->errmsg = '検索結果なし';
207: // throw new Exception($this->errmsg);
208: return FALSE;
209: }
210:
211: $obj = $xml->Items->Item;
212: $cnt = 1;
213: foreach ($obj as $node) {
214: foreach ($this->RakutenBooksItems as $name) {
215: if (isset($node->$name)) {
216: $items[$cnt][$name] = (string)$node->$name;
217: }
218: }
219: $items[$cnt]['title'] = preg_replace("/([あ-ん|ア-ン])-/ui", "$1ー", $items[$cnt]['title']);
220: $items[$cnt]['titleKana'] = preg_replace("/([あ-ん|ア-ン])-/ui", "$1ー", $items[$cnt]['titleKana']);
221: $cnt++;
222: }
223:
224: } catch (Exception $e) {
225: $this->error = TRUE;
226: $this->errmsg = $e->getMessage();
227: // throw new Exception($this->errmsg);
228: return FALSE;
229: }
230:
231: $this->hits = $cnt - 1;
232: return $this->hits;
233: }
参考サイト
- 楽天ブックス書籍検索API:楽天市場
- PHPでAmazonを利用して新刊書籍を検索:ぱふぅ家のホームページ
- Ajax - Amazonと楽天に二股かけてみる:404 Blog Not Found
- 楽天APIの結果がサイトの検索結果と異なる?!:頭と尻尾はくれてやる!

今回は、その中から楽天ブックスが販売する書籍の検索ができる楽天ブックス書籍検索APIを利用し、書名、著者名またはISBNコードから書籍情報を取り出すプログラムを作ってみることにする。
(2026年7月5日)楽天ウェブサービスAPI移行に対応, PHP4.x/5.x系サポート終了
(2025年12月6日)PHP8.5対応:double→float表記変更,curl_closeを実行しないようにした