📚

Kindleの読書記録をNotionにまとめるCLIをつくった話

2024/05/27に公開

はじめに

ふとコマンドラインツールを作ってみたいなと思い、ちょっとしたツールを Ruby で実装してみました。
せっかくなので、この記事ではオレオレコマンドラインツールの紹介と、使用した技術についてまとめます。

なにを作ったのか

https://github.com/keisuke90/notion_library

Notion のデータベースに読書記録をつけるための CLI です。
多分探せば同じようなツールは見つかるんだろうけど、①NotionAPI を触ってみたかった、②Kindle のハイライトも自動で取得したかった、という 2 点の理由から自前で実装しました。

機能 ①

本を検索して Notion のデータベースに登録します。

$ notion_library register

# 検索ワードを入力
Please enter a keyword to search:
$ ruby

# 検索結果の表示
[1]プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで / 伊藤 淳一 / 技術評論社
[2]最短突破 Ruby技術者認定試験(Silver/Gold対応) 公式テキスト / 牧 俊男/小川 伸一郎/一般財団法人Rubyアソシエーション 前田 修吾 / 技術評論社
[3]ゼロからわかるRuby超入門 / 五十嵐邦明/松岡浩平 / 技術評論社
[4]パーフェクト Ruby on Rails 【増補改訂版】 / すがわらまさのり/前島真一/橋立友宏/五十嵐邦明/後藤優一 / 技術評論社
[5]独習Ruby 新版 / 山田 祥寛 / 翔泳社
~~ 省略(最大30件検索結果を取得します)~~

# 登録したい本のインデックスを入力
Please select a book by entering the number:
$ 1

# 確認
You selected: プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで
Do you want to register this book? (y/n)
$ yes
Registering the book...
The book has been successfully registered.

本の検索には楽天ブックス書籍検索 API  を使用しました。

https://webservice.rakuten.co.jp/documentation/books-book-search

名前検索にしか対応していませんが、登録したい本を検索し Notion のデータベースに登録することが可能です。
ページのカバーに本の表紙を設定しているためギャラリーで表示すると満足感があります。

登録後のイメージ
登録後のイメージ

後述する機能を実装するために本当は Amazon の API を使いたかったのですが、アフィリエイトの審査が必要だったので諦めました。

機能 ②

Kindle でハイライトした部分を取得して、機能 ① で追加したページに書き込みます。

$ notion_library highlight

# 登録したい本のASINを入力
Please enter the ASIN of the book you want to get highlights from:
$ B08CK2H12H

The highlights have been successfully registered.

ハイライト取得例
ハイライト取得例

どちらかというとこれをやりたくて実装した感じです。
ハイライトの取得は API 等の提供はされておらず正攻法が見つからなかったため、このページをスクレイピングすることで、データを取得しました。
任意の本のページを表示するために ASIN(amazon の商品管理コード)が必要でしたが、前述の通り API の使用ができなかったため、ASIN は Amazon の商品ページから確認して手動で入力することにしました(妥協)。

使用した技術

Thor

CLI の実装には Thor という gem を使いました。

https://github.com/rails/thor

Thor についての解説は割愛しますが、Thor クラスを継承することでパブリックメソッドをコマンドとして実行することができます。

# Thorのサンプル
require "thor"

module RubyCliSample
  class CLI < Thor
    desc "hello", "Prints 'Hello World!'"
    def hello
      puts "Hello World!"
    end
  end
end

NotionAPI

Notion にデータを登録するために NotionAPI を使用しました。
Notion を使っている方はご存知だと思いますが、Notion には三つの構成要素がありそれぞれエンドポイントが分かれています。

  • Database
    • 一番上位の要素で、ページの親要素となります。
    • データベース ID を使用し、任意のデータベースから更新したいページを取得する処理を実装しました。
  • Page
    • データを書き込むためのページです。データベースまたは、別のページが親要素となります。
    • 本を登録する際に、新しいページを作成する処理を実装しました。
  • Block
    • ページ内の要素はブロックとして構成されています。
    • ハイライトの取得処理は任意のページに新規のブロックを作成することで書き込みを行いました。

Block のエンドポイントを見ると、ブロック ID を指定するように書かれており取得方法がわからず困惑しましたが、代わりにページ ID を使用することでページの一番下にブロックを追加することができました。

curl 'https://api.notion.com/v1/blocks/{ブロックIDではなくページIDを指定した}' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Notion-Version: 2022-06-28'

NotionAPI は使いこなせるととても便利だと思うので、興味のある方はぜひドキュメントから詳細を確認してみてください。

https://developers.notion.com/

おわりに

作りは荒いですが、自分で実装したツールって愛着が湧きますね。
最後まで読んでいただきありがとうございました。

Discussion