電子書籍購入一覧作成(BOOKWALKER kobo ebookjapan)

# 複数のところで買ってたらわからなくなったよ その2
という事で、一覧を作成することにしました。
BOOKWALKER、kobo、eBookJapan をブラウザからの取得します。

kobo honto dmm SQLiteでの取得は以下を参照。

https://qiita.com/kokomadeyonda/items/027ae8506bfaaeb6eec7

### 手順
1. ブラウザで、楽天KOBOはライブラリ、BOOKWALKER購入済みのページを表示する。
   eBookJapanは本棚のページ。
   ログインしていれば、とりあえずはOKです。
2. F12を押して、デベロッパーツールを立ち上げる。  
3. Consoleタブに移動して、対応するコードを貼り付けて実行。ダウンロード.csvとして出力される。

#####  BOOKWALKER用 
```
//BookWalker 一覧作成
// init
let xhr = new XMLHttpRequest()
let domain = 'https://bookwalker.jp/prx/holdBooks-api/hold-book-list/'
let items = []
let csvData = ""
let csvHead = "productId, title, authorName, companyName, imageUrl, viewerUrl, detailUrl, moralTypeCode ,buyTime,isExpired\n"
//ptoductID, タイトル, 作者, 出版社, サムネイル画像, viewerUrl, 販売ページ, moralTypeCode, 購入日, 有効期限
//
let order='?holdBook-series=0&order=0&orderBy=1' // 購入日 新
//let order='?holdBook-series=0&order=0&orderBy=0' // 購入日 古
//let order='?holdBook-series=0&order=2&orderBy=0' // タイトル昇順
//let order='?holdBook-series=0&order=2&orderBy=1' // タイトル降順
//
let page = 1
// function
function getItemsList(page) {
  let url = domain + order +'&page=' + page
  console.log(url)
  xhr.open('GET', url, false)
  xhr.send()  
}
// request result
xhr.onreadystatechange = function() {
  switch ( xhr.readyState ) {
    case 0:
      console.log('uninitialized')
      break
    case 1:
      console.log('loading...')
      break
    case 4:
      if(xhr.status == 200) {
        let data = xhr.responseText
        data = JSON.parse(data)
        if(data.holdBookList.entities) {
          items.push(...data.holdBookList.entities)
        }
        console.log(data.holdBookList.totalPage)
        if(data.holdBookList.totalPage==page) {
       	  break
        }
        page=page+1
        getItemsList(page)
      } else {
        console.log('Failed')
      }
      break
  }
}

// action
getItemsList(page)

// to csv
items.forEach(item => {
  csvData += '"' + item.productId + '","' + item.title + '","' + item.authors[0].authorName +  '","' + item.companyName +  '","' + item.imageUrl + '","' + item.viewerUrl + '","' + item.detailUrl + '","' + item.moralTypeCode + '","' + item.buyTime + '","' + item.isExpired + '"\n'
//  csvData += '"' + item.productId + '","' + item.title + + '","'+ '"\n'
})
//window.location = 'data:text/csv;charset=utf8,' + encodeURIComponent(csvData)
window.location = 'data:text/csv;charset=utf8,' + encodeURIComponent(csvHead + csvData)

```

#####  kobo用 
```
//kobo一覧作成
// init
let xhr = new XMLHttpRequest()
let domain = 'https://books.rakuten.co.jp'
let deatailUrl = 'https://books.rakuten.co.jp/rk/'
let items = []
let csvData = ""
let csvHead = 'productId,isbn,adultType,title,authorName,companyName,imageUrl,detailUrl,addDate\n'
//ptoductID, ISBN, adultContents, タイトル, 作者, 出版社, サムネイル画像, 販売ページ, 購入日

let sort=4 //
//let sort=2 //更新
//let sort=4 //購入順
//let sort=5 //タイトル順
//let sort=7 //著者名

let pp=1;

// function
function getItemsList(pn) {
  let url = domain + '/e-book/kobo/library/web-api?kw=&sort=' + sort + '&pn=' + pn + '&pc=100&sync=0&pv=1'

  xhr.open('GET', url, false)
  xhr.send()  
console.log(xhr.responseText)
}
       console.log('START')

// request result
xhr.onreadystatechange = function() {

  switch ( xhr.readyState ) {
    case 0:
      console.log('uninitialized')
      break
    case 1:
      console.log('loading...')
      break
    case 4:
      if(xhr.status == 200) {
        console.log('200')
        let data = xhr.responseText
        data = JSON.parse(data)
        console.log(data)

        if(data.result.items) {
          items.push(...data.result.items)
        }
        if(data.result.meta.endNum == data.result.meta.sumCount) {
 	    break
        }
        if(data.result.items== null) {
	    break
        }
        pp= pp+1
        getItemsList(pp)
      } else {
        console.log('Failed')
      }
      break
  }
}
// action
getItemsList(pp)
// to csv
items.forEach(item => {
//  csvData += '"' + item.id + '","' + item.title+ '","' + item.item.authors + '"\n'
  csvData += '"' + item.productId + '","' + item.isbn + '","' + item.adultType + '","' + item.title + '","' + item.contributors + '","' + item.mfrName + '","' + item.imageUrl + '","' + deatailUrl + item.productId + '","' + item.addDateTime + '"\n'

})
//   console.log(csvData)
window.location = 'data:text/csv;charset=utf8,' + encodeURIComponent(csvHead + csvData)
//window.location = 'data:text/csv;charset=utf8,' + encodeURIComponent(csvData)

```

### eBookJapan

- ebookjapan/旧ebookjapan共、取得は可能。
 購入履歴が無くても、本棚に本があれば、それをもとに取得。
 しかし、書籍名しか取れません:disappointed_relieved:
- 本棚のページを表示。背表紙を表示(背表紙以外だとシリーズとかにまとめられて、すべて取ることができません）
  スクロールして最後まで背表紙を見てください。
  その後、貼り付け。
```
//ebookjapan
var aa01 = document.getElementsByClassName('book-item__image');
var out_data="";

for (var i = 0; i<aa01.length; i++) {
  var img_src=aa01[i].getAttribute("src");
  var title=aa01[i].getAttribute("alt");
  out_data +=  '"' + title + '","' + img_src + '"\n';

}
window.location = 'data:text/csv;charset=utf8,' + encodeURIComponent(out_data);

```

その他

ちょっとしたTips
一覧で不要と思われる、サムネイル、販売ページ、viewerURLを出力しているのは、Notionに取り込むためです。
Notionで取り込めば、サムネイル付きの一覧が簡単に作成できます。（デザインはあれですが）
そこからクリックで直接本を開いたり、販売ページに飛ぶことができます。
自分でhtmlを作れば、同じようなこともできます。
(ここでは、kindle用はないですが、自分用にはviewerURLをつけたのを出力して、直接読めるようにしています。kindle用は、他の人の作成したのを参考にしてください）
Readeeでインポートすることも可能ですが別の機会に（kobo以外 ISBNなしでもインポート可能）