0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

eBookJapan用

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

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

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

ブラウザからの作成

1.ブラウザで該当するページを見てください。(ログイン済み)
2. F12を押して、デベロッパーツールを立ち上げる。
3. Consoleタブに移動して、対応するコードを貼り付けて実行。ダウンロード.csvとして出力されます。

  • ブラウザの本棚から作成
    本棚ページを表示
    背表紙表示にします(他の表示では、すべて取ることが出来ません)
    スクロールして、最後の背表紙まで見てください。
    コードを貼り付けて実行。
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

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が出力されます。

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?