ブクログに登録した本をPythonで引っ張ってくるスクリプト【Obsidian】

ブクログに登録した本の情報を取得してMarkdownファイルに埋め込むスクリプトを組みました

はじめに

最近Obsidianというマークダウンエディタにハマっています。
無限の使い方がありそうでオラわくわくすっゾ!

01. Booklog Import Script

指定したカテゴリ内の書籍情報を取得し、紹介リンクコードを埋め込んだMarkdownファイルを作成します。

指定したカテゴリ内から指定した冊数分を本棚の先頭から取得します。
全ての書籍を一括で読み込むスクリプトではありません。

一括で読み込む場合はブクログのエクスポート機能でダウンロードしたCSVファイルを使う方法があります。
CSVからMarkdownファイルを作成するコードも別に作ったので、コードをすっきり整理できたらこちらも投稿します。

概要

### 書籍名1
書籍名1の紹介リンク用のコード

### 書籍名2
書籍名2の紹介リンク用のコード

のような形で新~旧に記述します。
ファイル名はデフォルトだと「booklog_import-年-月-日」です。
最新数冊などの指定もできるので定期的なインポートに使えると思います。

ご使用の前に

Google Colaboratoryを使用する前提のコードになっています。
値を指定する必要があるので、コードを書き換えてから手動で実行します。

Google Colaboratory(以下Colab)は、Googleが提供する開発者向けのサービスです。
Googleアカウントさえあれば環境構築が不要でブラウザ上でPythonのコードを記述して実行することができます。
アカウントが無い方は作成しておいてください。

使用方法

1:Google Colaboでノートブックを作成する

Google Colaboratoryにアクセスし、「Open Colab」をクリックします
ようこそページが表示されるので、 ファイルノートブックを新規作成でノートブックを作ります。

コードセルの「コーディングを開始するか、AIで生成します。」と表示されてる欄に以下のコードをコピーして貼り付けます。

Code
import requests
from bs4 import BeautifulSoup
import json
from datetime import date

# 【ブクログID:ログインに使うID】
booklogID = "★"
#【カテゴリID:7桁の数字 or カテゴリ無しはnoneを指定】
categoryID = "★"
#【取得数:最新から何冊読み込むか】
count = ★

url = f"https://api.booklog.jp/json/{booklogID}?category={categoryID}&count={count}"
response = requests.get(url)
data = response.json()

today = date.today().strftime("%Y-%m-%d")

file_name = f"booklog_import-{today}.md"

with open(file_name, "w", encoding="utf-8") as file:
    for book in data['books']:
        title = book.get('title', 'タイトル不明')
        book_url = book.get('url', 'URLなし')
        
        item_url = book_url.replace("archives", "item").replace(f"users/{booklogID}/", "buildhtml/")

        response_item = requests.get(item_url)

        if response_item.status_code != 200:
            file.write(f"### {title} (紹介リンクページにアクセスできませんでした)\n\n")
            continue
        
        soup = BeautifulSoup(response_item.text, 'html.parser')

        widget_code = soup.find('textarea', class_='widgetCode')
        
        if widget_code:
            html_content = ''.join(str(element) for element in widget_code.contents)

            if html_content:
                file.write(f"### {title}\n")
                file.write(f"{html_content}\n\n") 
            else:
                file.write(f"### {title} (紹介コードが見つかりません)\n\n")
        else:
            file.write(f"### {title} (紹介コードが見つかりません)\n\n")

# ファイルをダウンロード
from google.colab import files
files.download(file_name)

2:コードを書き換える

6~11行目の★の部分3箇所ユーザー毎の値に書き換えます。

# 【ブクログID:ログインに使うID】
booklogID = "★"
#【カテゴリID:7桁の数字 or カテゴリ無しはnoneを指定】
categoryID = "★"
#【取得数:最新から何冊読み込むか】
count = ★
IDの確認方法

ブクログの自分の本棚にアクセスし、取得したいカテゴリを開きます。
URLの該当部分がIDになります。カテゴリ未設定の場合はnoneを指定してください。
https://booklog.jp/users/【ブクログID】?category_id=【カテゴリID】&display=front

取得数の指定

カテゴリ内の本を何冊読み込むかの指定です。新しい方(先頭にあるもの)から読み込みます。
全て読み込みたい場合は1000とか多めの適当な数で大丈夫です。
最新2冊のみ取得したいな~って場合は2と指定してください。

3:コードを実行する

コードセル左の実行ボタンをクリックするか、Shift + Enter でコードを実行します。

取得数が多いと少し時間がかかります。しばらく待って緑の✅️が表示されたら成功です。
保存ダイアログが開くのでObsidianの保管庫内に保存します。

ノートを開いてみてエラーメッセージ等が記述されてなければ完了です!

このノートから選択部分を分離して、タイトルを書籍名にしたノートを作成するTemplaterスクリプトも作ったのでおまけで公開しときます。

上手くいかない場合

実行するとエラーが出る

【ブクログID】【カテゴリID】にミスが無いか確認してください。
また、インデント(空白スペース)の数が正しくないとエラーが出ます。
空白2個or4個に統一されてることを確認してください。
下部にエラーメッセージが出るので、原因を確認して修正してください。

(紹介リンクページにアクセスできませんでした)と書かれる

  • 【ブクログID】【カテゴリID】は正しく指定されています。
  • アイテム詳細ページのURLが読み込めていない状態です。
item_url = book_url.replace("archives", "item").replace(f"users/{booklogID}/", "buildhtml/")

辺りが削れてないか確認してください。

(紹介コードが見つかりません)と書かれる

  • 【ブクログID】【カテゴリID】は正しく指定されています
  • アイテム詳細ページのURLは読み込めています。
  • リンク埋め込みコードが読み込めていない状態です。

widget_code = soup.find('textarea', class_='widgetCode')

辺りが削れてないか確認してください。

ブクログに登録した本をPythonで引っ張ってくるスクリプトは以上です。
そのまま一覧として活用するよりも、たたき台としてとりあえず情報をまとめるための用途かな。

02.おまけ:個別のノートに分離するTemplaterスクリプト

上で生成したbooklog_import.md(以下インポートノート)で使用するためのTemplaterスクリプトも作りました。

選択した部分を分離して、【書籍名.md】で新規ノートを作成します。
インポートノートの切り取った部分にはブロックリンクを埋め込みます。
インポートノートにはリンクカード部分のみ表示されます。【書籍名.md】にノートを書き込んでもインポートページはスッキリしたままです。
【title: 書籍名】【author: 著者】【release: 発売日】【publisher: 出版社】もフロントマターに記述します。

紹介リンクコードから情報を取得してるので読書状況やレビュー記録は拾えません!

動作イメージ

### 書籍名とリンクカード部分をまとめて選択した状態でTemplaterを起動し、スクリプトを実行します。
新しいノートが指定したフォルダ内に作成されます。

使用方法

Templaterプラグインを使用するので入れてない方は(いないと思いますが)いれておいてください。
プラグインの詳しい説明は割愛します。公式ドキュメント読んでね!

1:テンプレートフォルダにノートを作成する

Templaterで設定したテンプレートフォルダ内に新規ノートを作成します。
名前は分かりやすい適当なものでいいです(例:Booklog Separete and Move to NewNote)

作成したノートに以下のコードを貼り付けます。

<%*
const selection = app.workspace.activeEditor.getSelection();
if (!selection) {
    new Notice("分離する書籍名とリンクコードを選択してください。");
    return;
}

const lines = selection.split("\n");

const title = lines[0].replace(/^### /, "").trim();

const content = lines.slice(1).join("\n").trim();

// ★をノートを作成するフォルダー名にしてください。
const folderName = "★";
const fileName = `${folderName}/${title}.md`;

const authorMatch = selection.match(/

2:コードを書き換える

// ★をノートを作成するフォルダー名にしてください。
const folderName = "★";
const fileName = `${folderName}/${title}.md`;

ノートを作成したいフォルダー名に置き換えてください。
フォルダーが存在しない場合は新しく作成し、その中にノートを作成します。

追加・修正したいプロパティkeyがある場合はフロントマター部分も適宜編集してください。

3:インポートノート上でテンプレートを挿入する

分離したい本の「### 書籍名」~リンクカードの下部までまるっと選択します。
見出し折り畳んで選択した方がやりやすいかもしれません。

※必ず1冊ずつ選択してください

選択した状態でTemplaterのOpen insert template modalコマンドを呼び出します。
Ctrl + Pでコマンドパレットから、リボンメニューから、ホットキーから 各自のやりやすい方法でやってください。

先ほど作成したノート(例:Booklog Separete and Move to NewNote)を選択します。
テンプレートが挿入されるとスクリプトが走って選択部分が分離します。

右上にノートを作成したメッセージが表示されれば無事にノートが作成されました。
インポートノートから分離したノートにリンクが貼られるので、内容におかしいところが無いか確認してください!

手動でプロパティ追加したり見出しをくっつけたりする雛形にしてくださいね。

以上!!!

03.さいごに

以上、ブクログからObsidianに蔵書データを持ってくる方法でした。
CSVデータから書籍名.mdを一括で作成するスクリプトもそのうち投稿します~

Obsidianはアイデアによってはいろんな使い方ができるので良いですね!
お絵かきや創作に活用できる方法なんかもいろいろ考えていきたいです。

それでは、アデュ~~~~

この記事をシェアする
  • B!

コメント

このブログの人気の投稿