Skip to content

GoogleブックスAPIの使い方

Google Books APIsはGoogleが提供する書籍を扱うためのAPIで、Google Play Booksのデータもこれに含まれる。GoからBooks APIを扱う場合はgoogle.golang.org/api/books/v1が利用できる。

Google Books APIsでは認証の方法として2つ可能になっている。

  • OAuth 2.0
  • APIキー

OAuth 2.0で認証を行うと、ユーザーが所有する書籍データや本棚などのデータにアクセスできる。一方でAPIキーによる認証では、ユーザーデータの操作は行えないが、書籍検索などの一般公開された情報にはアクセスできる。

前述のドキュメントによると、GoogleブックスAPIのスコープは以下の1つだけ定義されている。

https://www.googleapis.com/auth/books
  • 本棚(bookshelf)
  • 書籍(volume)
  • 書籍情報(volume info)
  • シリーズ情報(volume series info)

すべての書籍は、なんらかの本棚に割り当てられているが、この本棚はGoogle BooksのものであってGoogle Play Booksの本棚とは異なる。そのため取得できる書籍はあくまでGoogle Booksの本棚となる。デフォルトでは以下の本棚が用意されている。

タイトル和名ID
Favoritesお気に入り0
Purchased購入済み1
To read読みたい書籍2
Reading now読書中3
Have read既読4
Reviewed評価済み5
Recently viewed最近見た書籍6
My Google eBooksGoogle Play Books7
Books for youおすすめの書籍8
Browsing history閲覧履歴9

ここで ID=7My Google eBooks がGoogle Play Booksで扱う書籍相当となっている。

Google Booksの本棚にブラウザからアクセスしたい場合、as_coll= パラメータに閲覧したい本棚の ID を渡して以下のようなURLを参照すれば良い。公開されている本棚であればログインしていなくても閲覧できる。

https://books.google.co.jp/books?uid=xxx&as_coll=4

本棚と、それに含まれる書籍を列挙するコードは以下のようになる。

s, _ := books.NewService(ctx, opts...)
shelves, _ := s.Mylibrary.Bookshelves.List().Context(ctx).Do()
for _, shelf := range shelves.Items {
log.Printf("[%s]\n", shelf.Title)
id := strconv.FormatInt(shelf.Id, 10)
volumes, _ := s.Mylibrary.Bookshelves.Volumes.List(id).Context(ctx).Do()
for _, book := range volumes.Items {
series := book.VolumeInfo.SeriesInfo
log.Printf("title: %v\n", book.VolumeInfo.Title)
log.Printf("series title: %v\n", series.ShortSeriesBookTitle)
log.Printf("series number: %v\n", series.BookDisplayNumber)
log.Printf("authors: %v\n", book.VolumeInfo.Authors)
log.Printf("categories: %v\n", book.VolumeInfo.Categories)
log.Printf("main category: %v\n", book.VolumeInfo.MainCategory)
log.Printf("\n")
}
}

APIによってまちまちだが、BookshelvesVolumesListCall の場合は StartIndexMaxResults で調整を行う。その本棚にいくつの書籍があるのかについては Volumes.TotalItems を参照する。

APIが返すエラーは googleapi パッケージで詳しく調べられる。

import (
"errors"
"google.golang.org/api/googleapi"
)
_, err := call.Do()
if err != nil {
if googleapi.IsNotModified(err) {
return
}
var e *googleapi.Error
if errors.As(err, &e) {
return
}
}

ISBNはどこにあるのかと思ったら、書籍情報に IndustryIdentifiers があって、これはISBN10やISBN13で共用されているので Type をみて振り分ける。

ただし、電子書籍の場合はISBNが割り当てられていない場合がある。salesInfo.isEbooktrue となっている場合は電子書籍に該当する。この場合、ISBNを取得する手段は無い。