PHPで Windows用国立国会図書館検索プログラムをつくる

(1/1)
PHPで国立国会図書館を検索」で、「国立国会図書館サーチ」を利用し、書籍を検索するプログラムを作った。今回は、これをWindows用アプリに移植する。

(2021年1月9日)国立国会図書館サーチAPIをhttpsに変更

目次

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

PHPでWindowsアプリ開発:国立国会図書館サーチ

サンプル・プログラム

圧縮ファイルの内容
searchndl.exe実行プログラム本体
searchndl.bcpコンパイル・ファイル
libeay32.dll
ssleay32.dll
実行時に必要になるDLL
searchndl/searchndl.phpwサンプル・プログラム
searchndl/searchndl.rcリソース
searchndl/searchndl.icoアイコン・ファイル
searchndl/php.iniphp設定ファイル
searchndl/PEAR.phpPEAR
php_curl.dll
php_openssl.dll
php_mbstring.dll
php_winbinder.dll
実行プログラムにバインドするDLL
searchndl/include/winbinder用ファイル
searchndl/XMLPEAR XMLパーサ関係

解説:ListView

0440: //ListViewの設定
0441: wb_set_text(wb_get_control($windowIDC_RES_LISTVIEW), array(
0442: array('NDC',     50),
0443: array('ISBN',   120),
0444: array('書籍名', 360),
0445: array('作者',   120),
0446: array('出版社', 100),
0447: array('出版日', 120)
0448: ));

検索結果は ListView に一覧表示する。
ListViewの見出しは、2次元配列で指定する。第1引数は見出しを、第2引数は幅を意味する。第2引数は省略可能である。

解説:httpsサイトからコンテンツを受信

0062: /**
0063:  * httpsサイトからコンテンツを受信
0064:  * @param string $url "https://" から始まるURL
0065:  * @return string取得したコンテンツ/FALSE取得エラー
0066: */
0067: function file_get_contents_ssl($url) {
0068:     $ch = curl_init($url);
0069:     curl_setopt($chCURLOPT_HEADERFALSE);
0070:     curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
0071:     curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE); //サーバ証明書検証をスキップ
0072:     curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE); //  〃
0073:     $result = curl_exec($ch);
0074:     curl_close($ch);
0075: 
0076:     return $result;
0077: }

WinBinder の  file_get_contents  はhttpsサイトに対応していないため、cURL関数を使ってhttpsサイトからコンテンツを受信するユーザー関数 file_get_contents_ssl を用意した。searchNDL で利用する。

解説:結果の表示

0297: /**
0298:  * 検索結果一覧
0299:  * @param int $windowウィンドウID
0300:  * @return stringなし
0301: */
0302: function putItems($window) {
0303:     global $Items;
0304: 
0305:     clear_error($window);
0306:     wb_delete_items(wb_get_control($windowIDC_RES_LISTVIEW));
0307:     $Items = array();
0308: 
0309:     $query = wb_get_text(wb_get_control($windowIDC_QUERY_EDIT));
0310:     $url = getURL_searchNDL($query);
0311:     if ($query != '') {
0312:         $i = searchNDL($query);
0313:     }
0314:     //表示
0315:     if ($i > 0) {
0316:         wb_create_items(wb_get_control($windowIDC_RES_LISTVIEW), $Items);
0317:     } else if ($i == 0) {
0318:         put_error($windowERROR_NOTHIT);
0319:     } else {
0320:         put_error($windowERROR_NOTCONNECTED);
0321:     }
0322: }

WebAPIのURLを求めるユーザー関数 getURL_searchNDL は「PHPで国立国会図書館を検索」と同じである。検索実行する searchNDL の流れも同じであるが、ListView に代入するために、検索結果を配列変数 $Items に代入するように変更している。

配列変数 $ItemsListView に代入するには、WinBinder関数 wb_create_items を利用する。

解説:Amazon商品ページ表示

0367: /**
0368:  * イベントハンドラ:メインウィンドウ
0369:  * @param int $windowウィンドウID
0370:  * @param int $id     イベントID
0371:  * @param int $ctrl   コントロール
0372:  * @param int $param  パラメータ
0373: */
0374: function process_main($window$id$ctrl=0, $param=0) { 
0375:     global $Items;
0376: 
0377:     switch($id) {
0378:         //検索
0379:         case IDC_EXEC_BUTTON:
0380:             putItems($window);
0381:             break;
0382:         //ダブルクリックでAmazonページを開く
0383:         case IDC_RES_LISTVIEW:
0384:             if ($param == WBC_DBLCLICK) {
0385:                 $arr = wb_get_selected(wb_get_control($windowIDC_RES_LISTVIEW));
0386:                 $i = $arr[0];
0387:                 $arr = wb_get_text(wb_get_control($windowIDC_RES_LISTVIEW), $i);
0388:                 $asin = isbn2asin($arr[1]);
0389:                 $url = ($asin == FALSE) ? '' : 'https://www.amazon.co.jp/gp/product/' . $asin;
0390:                 if ($asin != '')    wb_exec($url);
0391:             }
0392:             break;
0393:         //ヘルプ
0394:         case IDC_HELP:
0395:             create_help($window, 'process_help');
0396:             break;  
0397:         //プログラム終了
0398:         case IDCLOSE:
0399:             wb_destroy_window($window);      //ウィンドウを破棄 
0400:             break;  
0401:     }
0402: }

イベントハンドラ関数 process_main で、ListViewがダブルクリックされたら、まずWinBinder関数 wb_get_selected を利用して選択行番号を取得する。
ここで注意しなければならないのが、ListViewは見出しをクリックすることでソートができるため、この時点で wb_get_selected が返す行番号と元になっている配列変数 $Items の添え字が一致しない可能性があることだ。
そこで、WinBinder関数 wb_get_text を利用し、ListViewの選択されている行の内容を直接取得する。

あとは、「PHPで国立国会図書館を検索」と同様に、ISBNコードをASINコードに変換し、WinBinder関数 wb_exec を利用してブラウザを起動する。

コンパイル

コマンドラインから "bamcompile searchndl.bcp" を実行する。コンパイルが完了すると、"searchndl.exe" が生成される。

参考サイト

(この項おわり)
header