PHPで楽天ブックスを利用して新刊書籍を検索

(1/1)
PHPでAmazonを利用して新刊書籍を検索」では、AWS(Amazon Web Service)を利用して新刊書籍を検索するプログラムを作ったが、AWSが完全無償ではなくなったため、「PHPで楽天ブックスAPIを使って書籍検索」で使った 楽天ブックスAPIを利用するように変更してみる。
改良方針としては、表示や入力などのUIはそのまま、SQLite で作ったデータベースや設定ファイル CONFIG_FILE もそのまま利用できるようにする。

(2026年7月5日)楽天ウェブサービスAPI移行に対応, PHP4.x/5.x系サポート終了
(2025年12月06日)PHP8.5対応,pahooInputData導入

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

PHPで新刊書籍を検索

目次

サンプル・プログラムのダウンロード

圧縮ファイルの内容
searchNewBooks2.phpサンプル・プログラム本体。
pahooRakuten.php楽天ウェブサービスに関わるクラス pahooRakuten。
使い方は「PHPで最寄りのネットができるホテルを検索する」などを参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
searchNewBooks.xml設定ファイル。新刊書籍の検索条件を記載する。
searchNewBooks2.php 更新履歴
バージョン 更新日 内容
2.2.0 2025/12/13 PHP8.5対応,pahooInputData導入
2.1.1 2022/12/21 bug-fix
2.1 2021/10/24 PHP8対応,リファラ・チェック改良
2.0 2020/05/30 書籍検索APIをAmazonから楽天ブックスに変更
1.4 2019/01/11 JavaScriptのコピー機能を pahooClipboard に変更
pahooRakuten.php 更新履歴
バージョン 更新日 内容
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対応
pahooInputData.php 更新履歴
バージョン 更新日 内容
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対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .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: }

楽天トラベルのホテル検索、楽天市場の商品検索など、楽天ウェブサービスを利用するためのクラスファイルが "pahooRakuten.php" である。同梱のクラス・ファイル "pahooRakuten.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooGeoCodeクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

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

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

楽天ブックスの項目名をDBキーに変換

searchNewBooks2.php

 152: /**
 153:  * 楽天ブックスの項目名ををDBキーに変換
 154:  * @param   string $rakuten:楽天ブックスのキー
 155:  * @return  string DBキー/FALSE:変換失敗
 156: */
 157: function rakuten2db($rakuten) {
 158:     $table = array(
 159:         array('isbn',           'ISBN'),
 160:         array('title',          'Title'),
 161:         array('author',         'Author'),
 162:         array('publisherName',  'Publisher'),
 163:         array('salesDate',      'PublicationDate'),
 164:         array('itemPrice',      'Price'),
 165:         array('itemUrl',        'Url'),
 166:         array('smallImageUrl',  'SmallImage'),
 167:         array('mediumImageUrl', 'MediumImage'),
 168:         array('largeImageUrl',  'LargeImage'),
 169:     );
 170: 
 171:     $res = FALSE;
 172:     foreach($table as $item) {
 173:         if ($item[0] == $rakuten) {
 174:             $res = $item[1];
 175:             break;
 176:         }
 177:     }
 178: 
 179:     return $res;
 180: }

楽天ブックスAPIAWS を比べると、本プログラムで必要になる応答項目は揃っているのだが、項目名が異なる。オリジナルのプログラムは AWS の項目名に会わせてデータベースを設計したため、同じデータベースを利用し続けるために、項目名を変換するユーザー関数 rakuten2db を用意した。

日付文字列の正規化

searchNewBooks2.php

 238: /**
 239:  * 日付文字列の正規化
 240:  * @param   string $ymd 日付文字列
 241:  * @return  string 正規化文字列
 242: */
 243: function normalDate($ymd) {
 244:     $table = array(
 245:         array('/([0-9]+)年$/ui', '$1-01-01'),
 246:         array('/([0-9]+)年([0-9]+)月$/ui', '$1-$2-01'),
 247:         array('/([0-9]+)年([0-9]+)月上旬$/ui', '$1-$2-01'),
 248:         array('/([0-9]+)年([0-9]+)月中旬$/ui', '$1-$2-10'),
 249:         array('/([0-9]+)年([0-9]+)月下旬$/ui', '$1-$2-20'),
 250:         array('/([0-9]+)年([0-9]+)月([0-9]+)日+$/ui', '$1-$2-$3')
 251:     );
 252: 
 253:     $res = date('Y-m-d');
 254:     foreach ($table as $pat) {
 255:         if (preg_match($pat[0], $ymd> 0) {
 256:             $res = preg_replace($pat[0], $pat[1], $ymd);
 257:             break;
 258:         }
 259:     }
 260: 
 261:     return $res;
 262: }

楽天ブックスAPI では、出版日が「年」しかなかったり、「○年○月頃」「○年○月中旬」などの曖昧な応答が返ってくることがある。これらを「年-月-日」に変換するユーザー関数 normalDate を用意した。

ISBN→ASIN変換

本プログラムでは利用しないが、データ項目として ASIN コードが残っていることから、これを埋めるために、「PHPでISBNコードをASINコードに変換する」で作ったISBN→ASIN変換プログラムを利用している。

参考サイト

(この項おわり)
header