電子書籍購入一覧作成 eBookJapan/旧eBookJapan

# eBookJapan用
旧eBookJapanの一覧が欲しくて、作成しました。
現行のeBookJapanにも対応しています。
ブラウザまたは、Pythonを使用して、一覧を作成します。
購入履歴が無くても、本棚に入っていれば作成できます。
旧eBookJapanはこれで作成しています。
複数の取得方法がありますが、お好みで...

- ブラウザの本棚から作成
  書名しか取れません。旧eBookJapan向け  
- ブラウザの購入履歴からの作成
購入履歴がある、現eBookJapan用
- Pythonを使用して作成
旧eBookJapan向け

※旧eBookJapanは購入日は取れません。（購入履歴が無い為）
 本棚から作成するのは、現eBookJapanも可

### ブラウザからの作成
1.ブラウザで該当するページを見てください。(ログイン済み）
2. F12を押して、デベロッパーツールを立ち上げる。  
3. Consoleタブに移動して、対応するコードを貼り付けて実行。ダウンロード.csvとして出力されます。
 
 - ブラウザの本棚から作成
 本棚ページを表示
 背表紙表示にします(他の表示では、すべて取ることが出来ません)
 スクロールして、最後の背表紙まで見てください。
 コードを貼り付けて実行。
 ``` //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);
```

### ブラウザの購入履歴からの作成(現eBookJapan向け)
購入履歴ページを表示。（購入履歴のない旧eBookJapanは不可）
コードを貼り付けて実行。
  - その1 購入履歴で作成
  - その2 購入履歴から、商品情報を取得して、本の情報を追加
  ※たくさん購入している時の動作は不明(私自身が現行のeBookjapanではあまり買っていないため）

その1
```
//eBookJapan
let xhr = new XMLHttpRequest()

//let pHurl='https://ebookjapan.yahoo.co.jp/proxy/apis/user/purchaseHistory?results=20&start='
let csvData = ''
let orderUrl='https://ebookjapan.yahoo.co.jp/proxy/apis/user/purchaseHistory?results='
let thumbnailUrl = 'https://cache2-ebookjapan.akamaized.net/contents/thumb/s/'  // + imageFileName
let shopUrl = 'https://ebookjapan.yahoo.co.jp/books/'   // + titleId + '/' + publicationCd + '/'
let order_cnt = 0
let start=0
let result_cnt = 50  //一回で取得する購入番号件数

function getOrderList(start) {

  let url = orderUrl + result_cnt + '&start=' +  start
  xhr.open('GET', url, false)
  xhr.send()

　if (xhr.status === 200) {  
    let data = xhr.responseText
    data = JSON.parse(data)
    order_cnt += data.results
    data.items.forEach(its => {
//      console.log(its.orderId)
      its.orderItems.forEach(it =>{
        console.log(its.orderId,it.publicationCd,it.publicationName)
##     CSV出力順->  購入番号,  productCd, 書籍名,  表紙画像URL, 販売ページURL, 購入日 
        csvData += '"' + its.orderId + '","' + it.publicationCd+ '","' + it.publicationName +  '","' + thumbnailUrl+ it.imageFileName +  '","' + shopUrl + it.titleId + '/' + it.publicationCd + '/","' + its.orderDatetime + '"\n'
       })
    })
    if (order_cnt >= data.totalResults) {
      return
    }
    start += result_cnt
    console.log('getItem', start)
    getOrderList(start)
  }
}
getOrderList(start)
window.location = 'data:text/csv;charset=utf8,' + encodeURIComponent(csvData)
```
  
  その2
```//eBookJapan 詳細版
let xhr = new XMLHttpRequest()
let xhr2 = new XMLHttpRequest()

let orderUrl='https://ebookjapan.yahoo.co.jp/proxy/apis/user/purchaseHistory?results='
let productUrl = 'https://ebookjapan.yahoo.co.jp/proxy/apis/books/book/sync?publicationCd='

let csvData = ''
let thumbnailUrl = 'https://cache2-ebookjapan.akamaized.net/contents/thumb/s/'  // + imageFileName
let shopUrl = 'https://ebookjapan.yahoo.co.jp/books/'   // + titleId + '/' + publicationCd + '/'
let order_cnt = 0
let start=0
let result_cnt = 50  //一回で取得する購入番号件数

function getProduct(productCd) {
  let purl = productUrl + productCd
  xhr2.open('GET', purl, false)
  xhr2.send()

　if (xhr2.status === 200) {  
    let pdata = xhr2.responseText
    pdata = JSON.parse(pdata)
    return pdata
   
  }
}

function getOrderList(start) {

  let url = orderUrl + result_cnt + '&start=' +  start
  xhr.open('GET', url, false)
  xhr.send()

　if (xhr.status === 200) {  
    let data = xhr.responseText
    data = JSON.parse(data)
    order_cnt += data.results
    data.items.forEach(its => {
//      console.log(its.orderId)
      its.orderItems.forEach(it =>{
      pdata=getProduct(it.publicationCd)
      if (pdata.publication != null){
        bookName = pdata.publication.name                           //書籍名
        author = pdata.publication.author                          //作者 
        saleDate = pdata.publication.saleDate                       //発売日 
        summary= pdata.publication.summary                         //概要 
        category= pdata.publication.unificationMiddleGenre.name     //ジャンル
        publisher =pdata.publication.publisher.name                 //出版社
        bookCd = pdata.publication.goods.bookCd                      //bookCd
        viewUrl = 'https://ebookjapan.yahoo.co.jp/viewer/purchased/' + bookCd   //ViewUrl

      }else{
//商品コード(販売ページ)がない場合 viewUrlはそれっぽいのを 正解かどうかは不明
        bookName = '****'; author = '****'; saleDate = ''; summary= ''; category= '';publisher = '****'; bookCd = ''
        viewUrl = 'https://ebookjapan.yahoo.co.jp/viewer/purchased/' + 'B0016' + it.publicationCd.substring(3)

        if (it.publicationCd.substring(0,4) == 'A000')
           viewUrl = 'https://ebookjapan.yahoo.co.jp/viewer/purchased/' + 'B00060' + it.publicationCd.substring(4)
        if (it.publicationCd.substring(0,4) == 'A001'){
           viewUrl = 'https://ebookjapan.yahoo.co.jp/viewer/purchased/' + 'B00160' + it.publicationCd.substring(4)
        }
      }
      if (it.publicationName != ''){
        bookName = it.publicationName
      }
      if (it.titleId == ''){
        hanbaiUrl =shopUrl + pdata.publication.title.titleId + '/' + it.publicationCd + '/'
      }else{
        hanbaiUrl =shopUrl + it.titleId + '/' + it.publicationCd + '/'
      }
//      console.log(it.imageFileName)
      if (it.imageFileName == ''){
        gazouUrl =thumbnailUrl +pdata.publication.goods.imageFileName
      }else{
        gazouUrl =thumbnailUrl + it.imageFileName
      }
      
//     console.log(its.orderId,it.publicationCd,it.publicationName,hoge.publication.author)
      console.log(its.orderId,it.publicationCd,it.publicationName,author)

//     CSV出力順->  購入番号, productCd, 書籍名, 作者, 出版社, 表紙画像URL, 販売ページURL, ビューURL, 概要, ジャンル, 発売日, 購入日 
        csvData += '"' +its.orderId + '","' +it.publicationCd + '","' +bookName + '","' +author +  '","' + publisher  + '","' +gazouUrl +  '","' +hanbaiUrl + '","' +viewUrl + '","' +summary + '","' +category + '","' +saleDate + '","' + its.orderDatetime + '"\n'
       })
    })
    if (order_cnt >= data.totalResults) {
      return
    }
    start += result_cnt
    console.log('getItem', start)
    getOrderList(start)
  }
}
getOrderList(start)
window.location = 'data:text/csv;charset=utf8,' + encodeURIComponent(csvData)

```
### Pythonを使用して作成
eBookJapan PCアプリ、Pythonを利用して作成します。
Pythonが動く環境(必要なライブラリ含む)を用意してください。
#### 手順
1. eBookJapan PCアプリを起動。
本棚の表示 （表示方法->背表紙 まとめ表示はオフ)
スクロールして、すべての背表紙を見る。
マイページｰ>その他 書籍フォルダを確認(フォルダ名を引数として使用）

2. Pythonで実行。
CSVファイルとビューワー用htmlが出力されます。

※商品コードから該当するページを取得するので、ネットに繋がるようにしてください。

```Pythonで実行
py ebjget.py "書籍フォルダ名"

```
```
#
# coding: [encoding]
#
import sys
import os

import requests
import json
import csv
import glob


#B00160xxxxxx
#  A001xxxxxx

#B00060xxxxxx
#  A000xxxxxx
#B00162xxxxxx
#  A002xxxxxx
#B00163xxxxxx
#  A003xxxxxx

url0 = "https://ebookjapan.yahoo.co.jp/proxy/apis/books/book/sync?publicationCd="

out_file="ebj0000.csv"  #CSV めんどくさいから固定
out_html="ebj0000.html" #html 直リンViwer

#########################################################################################
# START

args=sys.argv

if (len(args)) == 2:
    in_path=args[1]

else:
    print('ERROR')
    exit()

#書籍フォルダ
path=in_path + r"\Books\thumb.trunk\*.s.jpg"
items = glob.glob(path)

cnt=0
f = open(out_file, mode='w',encoding='UTF-8', newline='')
f2 = open(out_html, mode='w',encoding='UTF-8')

writer = csv.writer(f,quoting=csv.QUOTE_NONNUMERIC)

for id in items:

    bCode=os.path.basename(id)[0:12]
    aCode= "A00" + bCode[5:]    #B00160以外 B00?6xxxxxxx ->A00xxxxxxx
    if (bCode[0:6] == "B00160"):      #B00160xxxxxx ->A001xxxxxx
        aCode= "A001" + bCode[6:]
    cnt=cnt+1
    url = url0 + aCode
    response = requests.get(url)

    jsonData = response.json()
    productCd = aCode +"**" ;bookName = "********"; #販売ページがない本
    author = "";saleDate = "";summary= "";category= "";publisher = ""
    thumbnail = "";titleId = "";shopUrl = "";thumbnailUrl ="";viewUrl = ""
    viewUrl = "https://ebookjapan.yahoo.co.jp/viewer/purchased/" + bCode


    if ('publication' in jsonData):
        
        if (jsonData["publication"] is not None):   #キーにデータあり(販売ページあり）

            productCd = jsonData["publication"]["publicationCd"]                #productCd
            bookName = jsonData["publication"]["name"]                          #書籍名
            author = jsonData["publication"]["author"]                          #作者
            saleDate = jsonData["publication"]["saleDate"]                      #発売日
            summary= jsonData["publication"]["summary"]                         #概要

            if ("unificationMiddleGenre" in jsonData["publication"]):
                category= jsonData["publication"]["unificationMiddleGenre"]["name"] #ジャンル
            else:
               category= jsonData["publication"]["unificationTopGenre"]["name"] #ジャンル 親
            publisher =jsonData["publication"]["publisher"]["name"]             #出版社
            thumbnail = jsonData["publication"]["goods"]["imageFileName"]       #表紙画像
            titleId = jsonData["publication"]["title"]["titleId"]               #
            shopUrl = "https://ebookjapan.yahoo.co.jp/books/" + titleId + "/" + productCd + "/"     #販売ページ
#           shopUrl = "https://ebookjapan.yahoo.co.jp/books/" + titleId + "/"                       #販売ページ最新巻(最終巻)
            thumbnailUrl = "https://cache2-ebookjapan.akamaized.net/contents/thumb/s/" + thumbnail  #表紙画像

    else:
        print(jsonData["error"])
    print(cnt, bCode, productCd, bookName, author)
##------------------------------------------------------------------------------------------------------------------##
###  CSV出力順->  bCode,  productCd, 書籍名, 作者, 出版社, 表紙画像URL, 販売ページURL, ビューURL, 概要, ジャンル, 発売日 
    writer.writerow([bCode, productCd, bookName, author, publisher, thumbnailUrl, shopUrl, viewUrl, summary, category, saleDate])
    html='<a href="' + viewUrl + '" target="_blank"><img src="' + thumbnailUrl + '"></a>\n'
    f2.write(html)
f.close
f2.close

```

※ 保存フォルダにある、背表紙のファイル名を、商品コードに加工して、それで該当する情報を取ってきています。
不要な項目は、削除してください.