Kindle の蔵書一覧ファイルが欲しい
Amazon Kindle で大規模なセールをやっているのだけど、このようなセールがあると既に持っている電子書籍を除外して検索したいと思うことがある。数千冊を所持していると買ったか買っていないかの記憶が朧げであるし、持っている書籍の詳細ページを開いても時間の無駄となる。
AmazonのKindle検索には作家ブロック機能・ジャンルブロック機能・購入済み除外機能が欲しい。電子書籍の写真集はまず買わないし、その人のTwitterはブロックしてるって作者は見たくなし、特にセール中は持ってる本はもう表示しないで欲しいんや
— 池田仮名 (@bulldra) 2021年4月18日
それ以外にもいくつかのブロックしたい要素があるが、Amazonの検索クエリでサポートされているわけではないのフィルターを独自に作る必要があり、その元データとしてAmazon Kindle の所持済み書籍一覧ファイルが必要となる。
Kindle の蔵書一覧を取得する方法として上記が紹介されていたが、そのコメントで Kindle for Mac のキャッシュを使う方法が提案されていたため、その方式で Python での実装を行った。
Kindle の蔵書一覧ファイルを生成するスクリプト
work ディレクトリにファイルを KindleSyncMetadataCache.xml をコピーしてきてきて、 docker-compose で work をコンテナにマウントした状態で処理を実行。Windowsの場合もコピー元ファイルのパスを書き換えることで実行可能だ。
asin_set = set() for event, el in etree.iterparse(settings.kindle_xml): if event =='end' and el.tag == 'ASIN': asin_set.add(el.text)
xml.etree.ElementTree
で XMLをパースして ASIN
タグが閉じられたら配下のテキストを SET に格納していきファイル出力。必要に応じてタイトルなども出力できるが、フィルターで利用するには ASIN リストだけがあれば十分なので最低限の処理としている。
所持済み書籍のASIN一覧ファイルがあると捗る
ASINは「Amazon Standard Identification Number」の略で、Amazonグループが取り扱う、書籍以外の商品を識別する10けたの番号です。CD、DVD、ビデオ、ソフトウェア、ゲームな ど、書籍以外の商品の詳細ページに記載されています。 https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201446530
そもそもASINとは、Amazon内で利用される書籍に限らない識別番号。書籍においてはISBNを利用するのが国際標準だが、Kindle書籍においては電子版独特の番号になっているためASINを利用することで確実に識別できる。
蔵書の ASIN 一覧ファイルがあると嬉しい
B00932MVK8 B00932MWAW B00932MX88 B00932OTVC
生成した ASIN 一覧ファイルを利用することで、検索結果のASINと蔵書のASINリストをマッチングさせてすでに存在しているASINの商品は表示対象から外すことが可能となる。
https://github.com/bulldra/amazon-tools/blob/master/src/product_wrapper.py#L69
こちらのツールは解説記事は別途書くが、購入可能性の著しく低い電子書籍を判定するスコアの算定に「所持済み」であることが最も寄与するようになっている。電子書籍においては「もう一度購入する」ことがないため所持済みリストは「いらないものリスト」そのものになるのだ。
他にも https://www.amazon.co.jp/dp/B00932MVK8
といったURLで商品詳細ページを開くことができるので所持済み商品のリンク集を生成するといった活用も可能となる。
Amazon に認証して所持済み書籍の一覧ファイルを取得する公式の方法はないし、クローリングやスクレイピングを毎回するのも重すぎる。今のところは KindleSyncMetadataCache.xml をコピーしてきて変換するのがてっとり早い。