Kindle蔵書一覧を取得する方法

Kindleの蔵書が1万冊を超えてきて、そろそろ蔵書管理したくなり、
蔵書一覧を取得する方法を調べたので、まとめておく。

## 概要
蔵書一覧の取得方法としては大きく2つあり、
[コンテンツと端末の管理](https://www.amazon.co.jp/mn/dcw/myx.html)ページからスクレイピングする方法と、
[Kindle Cloud Reader](https://read.amazon.co.jp/)が使っているWeb SQL Databaseのクライアント側のDBからそのまま取得する方法がある。
後者のほうが簡単なため、ここでは後者の方法について記載する。
（前者の方法が知りたい方は、[https://qiita.com/yshr1982/items/072e8b44d456f6d9358b](https://qiita.com/yshr1982/items/072e8b44d456f6d9358b)などを参考にしてください。)

// 追記
上記の２つの方法以外のやり方を情報共有してもらったので追記。
@error_401さんから頂いた情報によると
Kindle for PCを利用している場合、本の情報が入ったXMLが生成されるため
このXMLをパースして蔵書一覧を取得することも可能だそうです。詳細は本記事のコメント欄参照。

## 取得方法
1. [Kindle Cloud Reader](https://read.amazon.co.jp/)にアクセス。本が大量にあると読み込みが終わるまで時間がかかるためしばらく待つ。
2. F12を押して、デベロッパーツールを立ち上げる。
3. Consoleタブに移動して、以下のコードを貼り付けて実行。Kindle.csvとして出力される。

```javascript
getKindleCsv = function () {
    const FILE_NAME = 'Kindle.csv';
    var db = openDatabase('K4W', '3', 'thedatabase', 1024 * 1024);

    // Set CSV header
    var csvData = "ASIN,Title,Authors,PurchaseDate\n";

    db.transaction(function (tx) {
        tx.executeSql('SELECT * FROM bookdata order by title;', [], function (tx, results) {
            var len = results.rows.length;

            for (i = 0; i < len; i++) {
                var result = results.rows.item(i);
                var asin = result.asin;
                var title = result.title;
                var authors = JSON.parse(result.authors);
                var purchaseDate = new Date(result.purchaseDate).toLocaleDateString();

                // Remove double quotes and CRLF from title
                title = title.replace(/"/g, '');
                title = title.replace(/\n|\r\n|\r/g, '');

                // Take only first author
                var authorList = authors[0];

                // Write out CSV Style
                csvData += '"' + asin + '","' + title + '","' + authorList + '","' + purchaseDate + '"\n'
            }

            // Export CSV File
            var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
            var blob = new Blob([bom, csvData], {
                type: 'text/csv'
            });
            var url = (window.URL || window.webkitURL).createObjectURL(blob);
            var link = document.createElement('a');
            link.download = FILE_NAME;
            link.href = url;
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        });
    });
};

getKindleCsv();
```

頻繁に利用するようであれば、以下のコードをブックマークレットとして登録してクリックひとつで利用することもできる。

```javascript
javascript: (function () {const FILE_NAME = 'Kindle.csv';var db = openDatabase('K4W', '3', 'thedatabase', 1024 * 1024);var csvData = "ASIN,Title,Authors,PurchaseDate\n";db.transaction(function (tx) {tx.executeSql('SELECT * FROM bookdata order by title;', [], function (tx, results) {var len = results.rows.length;for (i = 0; i < len; i++) {var result = results.rows.item(i);var asin = result.asin;var title = result.title;var authors = JSON.parse(result.authors);var purchaseDate = new Date(result.purchaseDate).toLocaleDateString();title = title.replace(/"/g, '');title = title.replace(/\n|\r\n|\r/g, '');var authorList = authors[0];csvData += '"' + asin + '","' + title + '","' + authorList + '","' + purchaseDate + '"\n'}var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);var blob = new Blob([bom, csvData], {type: 'text/csv'});var url = (window.URL || window.webkitURL).createObjectURL(blob);var link = document.createElement('a');link.download = FILE_NAME;link.href = url;document.body.appendChild(link);link.click();document.body.removeChild(link);});});})();
```

## 参考
[Gist - Amazon Kindle Export](https://gist.github.com/jkubecki/d61d3e953ed5c8379075b5ddd8a95f22)