目次
サンプル・プログラムの実行例
サンプル・プログラム
| 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脆弱性対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 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
ここでは、書籍タイトルまたは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
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
172: /**
173: * 楽天ブックスAPIで書籍検索
174: * @param string $query ISBN番号または書籍名
175: * @param string $author 著者名
176: * @param array $items 検索結果を格納する配列
177: * @param string $sort ソート(省略時:standard)
178: * @return ヒットした件数/FALSE:検索に失敗
179: */
180: function searchBooks($query, $author, &$items, $sort='standard') {
181: $url = $this->searchBooksURL($query, $author, $sort);
182: if (($res = $this->callWebAPI($url)) == FALSE) {
183: $this->error = TRUE;
184: $this->errmsg = 'WebAPI呼び出しに失敗';
185: return FALSE;
186: }
187: $this->webapi = $url;
188:
189: // PHP4用; DOM XML利用
190: if ($this->isphp5over() == FALSE) {
191: if (($dom = domxml_open_mem($res)) == NULL) return FALSE;
192: $root = $dom->get_elements_by_tagname('root');
193:
194: // レスポンス・チェック
195: $count = $root[0]->get_elements_by_tagname('count');
196: $cnt = $count[0]->get_content();
197: if ($cnt <= 0) { // ヒットせず
198: $this->error = TRUE;
199: $this->errmsg = '検索結果なし';
200: return FALSE;
201: }
202: // 書籍情報取りだし
203: $obj = $root[0]->get_elements_by_tagname('Items');
204: $obj = $obj[0]->get_elements_by_tagname('Item');
205: $cnt = 1;
206: foreach ($obj as $val) {
207: foreach ($this->RakutenBooksItems as $name) {
208: $node = $val->get_elements_by_tagname($name);
209: if ($node != NULL) {
210: $items[$cnt][$name] = $node[0]->get_content();
211: }
212: }
213: $items[$cnt]['title'] = preg_replace("/([あ-ん|ア-ン])-/ui", "$1ー", $items[$cnt]['title']);
214: $items[$cnt]['titleKana'] = preg_replace("/([あ-ん|ア-ン])-/ui", "$1ー", $items[$cnt]['titleKana']);
215: $cnt++;
216: }
217:
218: // PHP5用; SimpleXML利用
219: } else {
220: $xml = simplexml_load_string($res);
221: // レスポンス・チェック
222: $count = (int)$xml->count;
223: if ($count <= 0) { // ヒットせず
224: $this->error = TRUE;
225: $this->errmsg = '検索結果なし';
226: return FALSE;
227: }
228: $obj = $xml->Items->Item;
229: $cnt = 1;
230: foreach ($obj as $node) {
231: foreach ($this->RakutenBooksItems as $name) {
232: if (isset($node->$name)) {
233: $items[$cnt][$name] = (string)$node->$name;
234: }
235: }
236: $items[$cnt]['title'] = preg_replace("/([あ-ん|ア-ン])-/ui", "$1ー", $items[$cnt]['title']);
237: $items[$cnt]['titleKana'] = preg_replace("/([あ-ん|ア-ン])-/ui", "$1ー", $items[$cnt]['titleKana']);
238: $cnt++;
239: }
240: }
241: $this->hits = $cnt - 1;
242:
243: return $this->hits;
244: }
参考サイト
- 楽天ブックス書籍検索API:楽天市場
- PHPでAmazonを利用して新刊書籍を検索:ぱふぅ家のホームページ
- Ajax - Amazonと楽天に二股かけてみる:404 Blog Not Found
- 楽天APIの結果がサイトの検索結果と異なる?!:頭と尻尾はくれてやる!

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