Skip to content

ブクログからNotionへ:蔵書管理アプリの制作

13 min. read
戻る

目次

蔵書管理アプリ自作の道

私は,銀行口座やクレジットカード,サブスクリプション,ガジェット,果ては就職活動に至るまで,さまざまな情報をNotionで管理しています。

ところが,書籍だけは長らくブクログを使い続けていました。Notionに移したい気持ちはありつつも,書名,著者,出版社,発売日,表紙画像といった書誌情報を1冊ずつ入力するのはあまりに大変です。ISBNから情報を取ってくる仕組みを自分で用意する必要がある,という点がネックになっていました。

そこで今回,ChatGPTに要件や構成を整理してもらい,CodexにNotionデータベースと自動取得処理を実装してもらうことで,ようやく蔵書管理をNotionへ移しました。

蔵書管理 一覧ビュー

完成した仕組みでは,普段はISBNを1つ入力するだけで,数分待つと,書名や著者,出版社,内容紹介,書影などが入り,さらにAIがジャンル,タグ,短い要約まで付けてくれます。

この記事では,「Notionと外部APIをつなぐと,こんな蔵書管理が作れる」という全体像を紹介します。

今回作りたかったもの

最初に決めた要件は,おおむね次のようなものでした。

Notionデータベースの構成

プロパティは,大きく3種類に分けました。

種類主なプロパティ入力方法
書誌情報書名,ISBN,ISBN-10,著者,出版社,発売日,ページ数,内容紹介,NDC,定価,表紙外部APIから自動入力
自分で管理する情報読書状況,所有形態,購入日,読了日,評価,感想,購入価格手動入力
システム管理情報同期状態,取得元,同期日時,同期メッセージ,登録日時,更新日時自動入力

これに加えて,AIが入力するジャンルタグrationale要約があります。

例えば,統計検定の対策本であれば,ジャンルは「データ・統計・AI」,タグは「統計学」「資格試験」「R」といった具合です。「資格本」という大分類を作るのではなく,何についての本かをジャンル,何のための本かをタグで表すようにしました。

個別の書籍ページ

使用している18ジャンル

ジャンルは,現在の蔵書だけでなく今後追加する本にも使い回せる粒度を意識して,次の18種類に固定しました。当初,日本十進分類法(NDC)などの既存分類法を使おうかとも考えましたが,初期登録時の書籍から検討し以下のものになっています。

ジャンル主な対象
IT・コンピュータプログラミング,Web,セキュリティ,システム開発
キャリア・就職就職活動,面接,働き方,キャリア形成
デザイングラフィック,UI,タイポグラフィ
データ・統計・AI統計,データ分析,AI,機械学習
ノンフィクション・人物伝記,企業史,ルポルタージュ
マーケティング・消費者マーケティング,消費者行動,広告,ブランド
人文・歴史・地理歴史,地理,哲学,宗教,文化
写真・映像写真,カメラ,映像制作,編集
小説文芸,ミステリー,SFなどのフィクション
建築・都市建築,都市,住宅,空間
政治・法律・社会政治,法律,行政,社会問題
教育・学習教育,学校,勉強法,学術
暮らし・旅行・実用旅行,生活,趣味,実用
漫画漫画作品
経営・組織経営戦略,組織,人事,リーダーシップ
経済・金融・会計経済,金融,投資,銀行,会計
自然科学・医療数学,自然科学,医学,健康
言語・語学日本語,外国語,言語学,辞書

ジャンル別ビュー

用途に応じてビューを分ける

同じデータベースに対して,現在は次のビューを用意しています。

普段眺めるのは「本棚」,不具合を直すときだけ「同期状態」や「要確認」を開く,という使い分けです。

同期状態ビュー

ISBNから情報が入るまで

全体の流れは次のとおりです。

NotionにISBNを入力

Cloudflare Workersが5分ごとに未処理の本を確認

ISBNの形式とチェックディジットを検証

楽天ブックス・Google Booksから書誌情報を取得

主要項目が足りない場合だけNDL Searchで補完

OpenAI APIでジャンル・タグ・分類根拠・要約を生成

利用できる書影URLを確認

Notionのプロパティとページカバーを更新

実行基盤にはCloudflare WorkersとCron Triggerを使いました。1

3つの書誌APIを役割分担させる

1つのAPIだけですべての項目が揃うとは限りません。そのため,取得結果を共通の形式へ変換し,項目ごとに組み合わせています。

取得元主な役割
楽天ブックス書籍検索API日本語書籍の基本情報,内容紹介,価格,書影候補
Google Books APIページ数,内容紹介,書影候補などの補完
NDL Search API楽天・Googleで不足した書誌情報,NDCなどの補完

楽天ブックスとGoogle Booksは基本的に両方を検索し,主要情報が揃わなかった場合だけNDL Searchから情報を取得します。

書影については,書誌情報とは別に優先順位を決めています。Google BooksのextraLargelargemedium……と大きい画像から順に確認し,利用できなければ楽天ブックスの画像へフォールバックします。選んだURLはNotionの「表紙」プロパティとページカバーの両方へ設定します。Google Booksには複数サイズの書影フィールドがありますが,すべての本ですべてのサイズが得られるわけではありません。2

実際のコードでは,ISBN-10/ISBN-13の正規化,取得結果側のISBN完全一致確認,リトライ,文字数制限,既存値の保護,書影URLの検証なども行っています。,またNotion APIにはレート制限やプロパティごとのサイズ制限があるため,応答時の待機や,長い本文の切り詰めも行なっています。3

AIには「自由に分類」させすぎない

書誌情報が揃った後は,OpenAI Responses APIへ書名と内容紹介を渡し,ジャンル,タグ,分類根拠,要約を生成します。

ここで重視したのは,AIに毎回好きな名前のジャンルやタグを作らせないことです。

実際の指示文は,おおむね次のような内容です。

AIの確度が高く,検証にも問題がなければ同期状態を取得済にします。確度が低い場合や判断に迷いがある場合はタグジャンル要確認にして,人が確認する運用にしました。AIに任せつつ,怪しい結果だけを後から拾えるようにしています。

また,すでに自分でジャンルやタグを入力している本は上書きしません。自動化の都合より,自分で整えた情報を優先するためです。

ChatGPTとCodexに任せたこと

今回の作業では,ChatGPTとCodexを次のように使い分けました。

ChatGPT:要件整理と設計の壁打ち

最初は「ISBNを入力したら書誌情報が入るNotionを作りたい」という程度のアイデアでした。そこからChatGPTとのやり取りで,次のような点を決めました。

その上でCodexに渡す用の仕様書を作りました。

Codex:実物を見ながら実装と修正

Codexには,Notionの実際のデータベース構成を確認させながら,Cloudflare Workersのプロジェクト作成,API連携,テスト,デプロイまで進めてもらいました。

初回同期では,表記揺れやCloudflare Workersの実行上限など,設計時には見つからない問題も起きました。こうした問題も,ログを確認し,原因を特定し,各種調整を行い,テストを追加するところまでCodexに任せました。

ブクログから866冊を移行した

初回移行では,ブクログから書き出したCSVを元に,866冊分のISBNをNotionへ登録しました。

ブクログからCSVを書き出す

ISBN列だけを残す

Notionの蔵書管理DBへCSVを取り込む

Cloudflare Workersが順番に書誌情報を補完

AIでジャンル・タグを一括分類

CSVには書名や著者も含められますが,今回はISBNだけを入口にしました。外部APIから取得した値を基準に揃えることで,ブクログ側の表記と新規登録分の表記が混在しにくくなります。

最初の一括分類では,Notionから書き出したデータをローカルのPythonツールで処理し,結果をCSVで確認してからNotion APIで反映しました。その後,同じ分類処理を通常のCloudflare Workers側へ組み込み,新しく登録する本にも自動でジャンル・タグが付くようにしています。

2026年9月8日時点では,866冊のうち861冊が取得済,外部APIで十分な情報を得られなかった5冊が手動入力になっています。ジャンルも全件に付与できました。

初期登録・書籍情報の取得時の画面録画(40倍速)

Notionへ移して良かったこと

一番大きいのは,書籍だけ別サービスに置かれていた状態を解消し,ほかの情報と同じNotion上で扱えるようになったことです。

既製の蔵書管理サービスは導入直後から使いやすい一方,用意された項目や見せ方の範囲で使うことになります。NotionとAPIを組み合わせた今回の構成は作る手間こそかかりますが,「次はバーコード読み取りを付けたい」「別の書誌情報源を試したい」「シリーズ情報を追加したい」と思ったときに,自分で拡張できます。

微妙な不満

一方,ブクログのすべての機能を移し切れたわけではありません。

綺麗な書影が取れない本がある

Google Booksの大きな画像を優先しても,高解像度の書影が登録されていない本はあります。APIによって収録状況も異なるため,低解像度の画像しか見つからない,あるいは画像そのものがない本も残ります。

ギャラリービューでは書影の品質が見栄えに直結するので,気になる本だけ手動で差し替えるか,今後ほかの取得元を追加する必要がありそうです。

Notion特有の読み込み待ちがある

866冊分の書影や複数のプロパティを表示するため,ビューを開いた直後や切り替え時には,Notion特有の読み込み待ちが発生します。専用の蔵書管理サービスほど軽快ではなく,「すぐ本棚を眺めたい」という用途では少し気になります。

APIによる同期も即時ではなく,ISBN入力後に次のCronを待つ必要があります。ただし,書籍の登録に数分の遅延は困らないため,ここはアクセス量を抑えることとのトレードオフとして割り切っています。

おわりに

蔵書管理をNotionへ移せなかった最大の理由は,書誌情報の入力でした。しかし,ISBNを共通のキーにしてNotion APIと複数の書誌APIをつなぎ,足りない分類だけAIに任せることで,ようやく実用になる形を作れました。当面ブクログも併用しますが,ブクログ対比の欠点がないか潰し切ったら,Notionでの管理に完全に移行しようと思います。

今回の仕組みで面白かったのは,最初から完璧なシステムを設計できたことではなく,ChatGPTとの壁打ちで要件を固め,Codexに実装させ,実際のエラーを見ながら少しずつ育てられたことです。

蔵書管理サービスを自作する,と聞くと大がかりに感じますが,Notionを画面とデータベースとして使えば,自分で用意するのはその間をつなぐ部分です。APIの意味が分かり,Codexを使って小さなツールを作れるのであれば,個人の用途に合わせた情報管理を作る選択肢として十分現実的だと思います。

Footnotes

  1. Cloudflare Docs. 「Cron Triggers」「Limits」(参照:2026年09月08日)

  2. Google for Developers. 「Volume」(参照:2026年09月08日)

  3. Notion Labs. 「Request limits」(参照:2026年09月08日)

画像の拡大表示


この記事を共有する:

関連記事


Next Post
iPhone・Macを安く買う6つの方法:買い切り派のApple製品購入術