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

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

(2025年12月06日)PHP8.5対応,pahooInputData導入
(2022年12月21日)不具合修正

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

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 更新履歴
バージョン 更新日 内容
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)に変更
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

  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: }

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

楽天ウェブサービスには、アプリ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