秋に引っ越し先を探して先月引っ越しして、あれやこれやと色んなものに追われながら生活してたら年の瀬がやってきて慄いているgodanです。
本稿は虎の穴ラボ AdventCalender 2023の14日目の記事です。
昨日はかなざわさんで「Hashicorp Vault でのシークレット管理」でした。悩むことの多いシークレット管理について色々知れる記事でした。未読の方は是非合わせて御覧ください。
本稿では一年を振り返る一環として、アプリを作りながら今年一年の読書を振り返った話になります。
本読んでますか?
近年はChatGPTやGitHub Copilotの台頭で調べる量が減ったり、良質な動画コンテンツも増えてきましたが、技術書も変わらずの良さを持っていると個人的には考えています。昔ながらの良書もあれば、話題の良書もあります。
今年はどのくらい読んだのか、そしてどのくらい積んだのか。せっかくだから知りたくはありませんか? というわけで次のようなアプリを今回作成しました。
このアプリの根幹である「書籍情報取得をどうするか」について今回お話しします。
書籍のメタデータをどうやって取得するか
過去に個人的に本にまつわる個人アプリなどを作成してきました。その時使用していたのはGoogle Books APIでした。 情報はJSONで返ってくるし、Google Apps Script(以下GAS)で気軽に利用できたこともあり愛用していました。 過去にGoogle Books APIとGASで作ったものを下記のスライドで紹介しています。
▼ 過去登壇資料
本とスプシと同人誌
▼ Google Books API Docs developers.google.com
引き続き利用しても良かったのですが、Google Books APIでは新しい書籍、特に漫画やラノベの書籍は取れなかったり、逆に古すぎると取れなかったりしました。なので他に良い書籍に関するAPIが無いか探してみたところ、国立国会図書館が書籍に関するAPIを公開しているのを知りました。
国立国会図書館サーチで提供するAPI(以下、国立国会図書館サーチAPI)について
国立国会図書館サーチで提供されているAPIは主に次の3つです。
- 検索用API
- 書名や著者、ISBNなど様々なメタデータから検索をすることができる
- GETパラメータで問い合わせるとXMLで情報を返してくれる
- ハーベスト用API
- サービス間でのメタデータを交換するためのプロトコル用API
- 書影API
- 国会図書館サーチが所持している書影の画像を取得できます。
- ISBNをGETパラメータにつけて問い合わせると画像データを返してくれる
今回は書影と書籍情報がほしいので「検索用API」と「書影API」を利用しました。
▼ 参照: 国立国会図書館サーチ | APIのご利用について
国立国会図書館APIを使うには
国立国会図書館サーチで利用されているメタデータは国会図書館以外にも複数のデータ提供機関によって構成されています。 そのため各機関ごとに利用規約や利用条件が異なっています。利用条件については公式がわかりやすくデータプロバイダ一覧を提供されているのでぜひ使う方は一読しましょう。
非営利目的であれば、このAPIを使用する際の申請や登録の必要はないようです。しかし、営利目的で使用する場合や、非営利でも定期的に使用する場合を行う必要があるようです。「APIのご利用について」で丁寧に記載してくださっているので使う時は合わせて一読しましょう。今回はブログとLTのための利用なので申請せず利用させていただいてます。
▼ 参照: 国立国会図書館サーチ | API提供対象データプロバイダ一覧
とりあえず叩いてみる
検索用APIではSRU,OpenSearch,OpenURLの3つの形式に対応しています。恥ずかしながら自分は今回はじめてSRUを知りました。今回はOpenSearchを利用しようと思います。
試しにブルーアーカイブオフィシャルアートワークスのISBNを含めてリクエストをしてみます。 https://iss.ndl.go.jp/api/opensearch?isbn=978-4758024068
かなり詳細な情報を取得できました。発売社以外にも金額やジャンルも記載してくれています。
GASで叩いてみる
ブラウザから直接APIを叩くのは難しいので今回バックエンドにはGASを選択しました。 GASでISBNを含んだGETリクエストを受けたら書籍情報を返すスクリプトを書きました。次のコードはその中でもISBNを渡されたらAPIを問い合わせる部分を抜き出しました。
function getBookInfo(isbn) { var url = `https://iss.ndl.go.jp/api/opensearch?isbn=${isbn}`; var response = UrlFetchApp.fetch(url); // XMLをパースする var xml = XmlService.parse(response.getContentText()); var nameSpace = XmlService.getNamespace('http://purl.org/dc/elements/1.1/'); var root = xml.getRootElement(); var entry = root.getChildren('channel')[0].getChildren('item')[0]; try{ var title = entry.getChildText('title'); var author = entry.getChildText('author'); var extent = entry.getChild('extent', nameSpace).getText(); // Np ; Ncm となっているのでページと厚さ別々で正規表現で取得する var extentArray = extent.match(/(\d+)p ; (\d+)cm/); } catch(e){ Logger.log(e); } var bookInfo = { title: title, author: author, isbn: isbn, page: extentArray ? Number(extentArray[1] || 0 ) : 0, thickness: extentArray ? Number(extentArray[2] || 0) : 0 }; console.log(bookInfo); return bookInfo; }
GASでもかなりお手軽に問い合わせができました。今回はGASでWebアプリを作成し、パラメーターに合わせてAPIに問い合わせてJSONを返すようにしました。 今回は試していませんがスプレットシートに記載されたISBNをもとに書籍情報を埋めるスプレットシート関数も作れそうです。
アプリを実装する
いい感じに書籍情報が取得できたので、このGAS製APIを使いアプリを作成します。今回はReactで作成しました。
レポジトリも公開していますのでもし、興味があればぜひ見ていただけると嬉しいです。
▼ アプリサイト(12月中は公開のママにしておきます)
https://godan.github.io/how_many_book_do_you_read/
▼ リポジトリ
アプリはもう少しブラッシュアップ予定です。
早速使ってみる
さて今年読んだすべての本を手元に並べれなかったので直近3ヶ月読んだ本をカウントしてみます。
まぁまずまず…… 直近3ヶ月なら悪くないのでは……?
せっかくですし積本も測ってみましょう。
……倍以上あるでねぇか!!!!!!!
まとめ
Google Books APIよりは手間はかかりますが、国立国会図書館サーチAPIでも書籍情報を取ることができました。作成に当たってGoogle Books APIでは取れなかった書籍を重点的に問い合わせたのですが国立国会図書館サーチAPIではちゃんと書籍データが帰ってきていました。今後はこちらの方を使おうかなと考えています。
正月休みは積本消化にもってこいです!正月は積み本消化に勤しもうと思います。
明日はH.Yさんで「Github ActionsでのCypressを並列実行して早く終わらせた。」です!
採用情報
虎の穴では一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
カジュアル面談やエンジニア向けイベントも随時開催中です。ぜひチェックしてみてください。 toranoana-lab.co.jp