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

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

(2022年12月21日)不具合修正

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

PHPで新刊書籍を検索

もくじ

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

圧縮ファイルの内容
searchNewBooks2.phpサンプル・プログラム本体。
pahooRakuten.php楽天ウェブサービスに関わるクラス pahooRakuten。
使い方は「PHPで最寄りのネットができるホテルを検索する」などを参照。include_path が通ったディレクトリに配置すること。
searchNewBooks.xml設定ファイル。新刊書籍の検索条件を記載する。

準備:pahooRakuten クラス

  16: // 楽天ウェブサービス・クラス ===============================================
  17: class pahooRakuten {
  18:     var $error;         //エラー・フラグ
  19:     var $errmsg;        //エラー・メッセージ
  20:     var $hits;          //検索ヒット件数
  21:     var $webapi;        //直前に呼び出したWebAPI URL
  22: 
  23:     //楽天ウェブサービス
  24:     //https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Rakuten 参照
  25:     var $APPLICATIONID      = '*******************';    //アプリID
  26:     var $APPLICATION_SECRET = '****************';       //シークレット
  27:     var $AFFILIATEID        = '*******************';    //アフィリエイトID

楽天トラベルのホテル検索、楽天市場の商品検索など、楽天ウェブサービスを利用するために、クラスファイル "pahooRakuten.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
クラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

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

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

 136: /**
 137:  * 楽天ブックスの項目名ををDBキーに変換
 138:  * @param  string $rakuten:楽天ブックスのキー
 139:  * @return    string DBキー/FALSE:変換失敗
 140: */
 141: function rakuten2db($rakuten) {
 142:     $table = array(
 143:         array('isbn',           'ISBN'),
 144:         array('title',          'Title'),
 145:         array('author',         'Author'),
 146:         array('publisherName',  'Publisher'),
 147:         array('salesDate',      'PublicationDate'),
 148:         array('itemPrice',      'Price'),
 149:         array('itemUrl',        'Url'),
 150:         array('smallImageUrl',  'SmallImage'),
 151:         array('mediumImageUrl', 'MediumImage'),
 152:         array('largeImageUrl',  'LargeImage'),
 153:     );
 154: 
 155:     $res = FALSE;
 156:     foreach($table as $item) {
 157:         if ($item[0] == $rakuten) {
 158:             $res = $item[1];
 159:             break;
 160:         }
 161:     }
 162: 
 163:     return $res;
 164: }

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

日付文字列の正規化

 222: /**
 223:  * 日付文字列の正規化
 224:  * @param  string $ymd 日付文字列
 225:  * @return    string 正規化文字列
 226: */
 227: function normalDate($ymd) {
 228:     $table = array(
 229:         array('/([0-9]+)年$/ui', '$1-01-01'),
 230:         array('/([0-9]+)年([0-9]+)月$/ui', '$1-$2-01'),
 231:         array('/([0-9]+)年([0-9]+)月上旬$/ui', '$1-$2-01'),
 232:         array('/([0-9]+)年([0-9]+)月中旬$/ui', '$1-$2-10'),
 233:         array('/([0-9]+)年([0-9]+)月下旬$/ui', '$1-$2-20'),
 234:         array('/([0-9]+)年([0-9]+)月([0-9]+)日+$/ui', '$1-$2-$3')
 235:     );
 236: 
 237:     $res = date('Y-m-d');
 238:     foreach ($table as $pat) {
 239:         if (preg_match($pat[0], $ymd> 0) {
 240:             $res = preg_replace($pat[0], $pat[1], $ymd);
 241:             break;
 242:         }
 243:     }
 244: 
 245:     return $res;
 246: }

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

ISBN→ASIN変換

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

参考サイト

(この項おわり)
header