kindleの積読本をランダムでslackに通知する
はじめに
kindleで購入した本が増えてきました。セール時にまとめて購入するケースが多く、必然的に購入したが読んでいない本も増えてきます。 kindleでは表示が購入が新しいものから順に並ぶため、積読期間が長くなるとリストの後方に移動していき、その存在を忘れてしまうことがあります。時にはリストの奥底に埋没した彼らの存在を思い返すことも必要なのではないでしょうか?
このあたりの記事の発想に近いですね。
実施したこと
1. kindle購入リストを取得
この記事の手順をそのまま使わせていただきました。 zenn.dev
kindleのPC用アプリをインストールしてログインすると、ローカルにkindleの蔵書リストを含むxmlファイルが作成されます。
私のM1mac環境だと以下にファイルが作成されました。
~/Library/Application Support/Kindle/Cache/KindleSyncMetadataCache.xml
あとはこのxmlファイルをパースすれば以下のようにcsv形式の書籍のリストができます。 (パースのコードも参考記事に記載されています。)
2. リストに既読フラグを手動付与
残念ながら、xmlファイルの中には未既読のフラグは入っていません。 幸いにして書籍のリストは1000に満たないくらいしかなかったので、既読フラグを手動付与します。 ついでに分析用途で使用するために書籍のジャンル情報も付与します。
付与後のデータはこんな感じ(genre列とread列が手動付与対象)
3. GAS(Google App Script)でリストを読み取り未読本をランダムでslackに通知
2で作成したリストを元に、未読本をランダムで定期的にslackに通知する仕組みを作ります。 実現する方法はいろいろありますが、今回はGASでスクリプトを定期実行するやり方をします。 Javascriptを少し書く必要がありますが、サーバを用意する必要がないのがメリットですね。
こちらの記事を参考に作成させていただきました。
参考記事との差分はコード部分なので、その部分だけ記述していきます。
まずspreadsheetにアップロードされたリストの読み込みを行い、最終行を取得します。
function post_thundoku() { const spreadsheet = SpreadsheetApp.openById('{spreadsheetのIDを入力}') const sheet = spreadsheet.getSheetByName('kindle蔵書_211225v2') const lastRow = sheet.getDataRange().getLastRow()
次に、未読の行番号のリストを作成し、その中からランダムで1つ行を選択します。 選択後、その行のASIN,title,author,publisherの情報を取得します。
valid_rows = []; for (var i = 2; i <= lastRow; i++) { if (sheet.getRange(i, 11).getValue() === 0){ valid_rows.push(i) } } select_row = valid_rows[Math.floor(Math.random() * valid_rows.length)]; ASIN = sheet.getRange(select_row, 1).getValue() title = sheet.getRange(select_row, 2).getValue() author = sheet.getRange(select_row, 3).getValue() publisher = sheet.getRange(select_row, 4).getValue()
最後に取得した情報を整理してslackにメッセージを投げます。
const SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/XXXXXXXXXXXXX' msg = "積読本をお知らせします。 \n 書名:" + title + "\n" + "著者:" + author + "\n" + "出版社:" + publisher + "\n" + 'https://www.amazon.co.jp/dp/' + ASIN const jsonData = { "text": msg, "unfurl_links": true } const payload = JSON.stringify(jsonData) const options = { "method": "post", "contentType": "application/json; charset=utf-8", "payload": payload } UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options) }
上記のスクリプトを実行するとこんな感じでslackに積読本が通知されるものができました。
GASでスクリプトを実行する周期は設定できますが、とりあえず1日に1回動作するようにしています。
まとめ
kindleの未読本を定期的にslackに通知する仕組みを作成しました。 これで埋没した積読本にも日の当たる機会が生まれやすくなるのではないでしょうか。
あと改善点としては運用フローがちょっと面倒というのがあって、 新しい本を購入したときや、ある本を既読にしたときに手動で元リストを更新する必要があるのでそのあたりもう少しなんとかならないかなという思いがあります。