Liner Note

情報(ユーザー中心デザイン・ユーザビリティ)と技術(ウェブプログラミング・ウェブサービス)についてのメモ書き

要約:新しくなったGoogleブック検索APIを一通り触ってみました

Google ブック検索に検索結果や書評をサイト上に組み込めるAPIが新たに追加されました。まず、このAPIなんですが、以下のように3つのAPIから構成されています。

  • ISBN、OCLC番号、LC番号等で特定した書籍のGoogle Book Search内データを、自分のウェブサイトに取り込んで(embed)表示できる”Embedded Viewer API”
  • Google Book Search内のデータの全文検索、書誌データやユーザが付与したレビュー・レイティング・タグ等のデータの収集、自分が付与したデータの編集ができる”Data API”
  • 従来は”Book Viewability API”と呼ばれていた、Google Book Searchのデータにリンクを貼ることができる”Dynamic Links”(E764参照)

Google Book Searchに新API-ウェブサイト内での表示や全文検索、データ収集・更新も可能に | カレントアウェアネス・ポータル

以前から書籍の公開レベルが取得できるAPIを公開していたようなんですが、今回埋め込みビューワのAPIが公開されたことで、格段に利用しやすくなったと思います(いずれもAPIキーが必要ないので、とても手軽に利用できます)

API利用ドキュメントは平易かつ簡潔に書かれているので、あえて解説する必要はないと思うのですが、学習がてらにちょっと書いてみましょうか。

動的リンク(”Dynamic Links”)

Google Codeでの仕様解説ページ

書籍のプレビューは著作権や出版社との交渉によりできたり、できなかったりします。

単にハイパーリンクを用いて書籍の詳細ページに(詳細の有無にかかわらず)リンクする静的リンク(”Static Links”)では、いざプレビュー出来なかったときに閲覧者をがっかりさせてしまいますが、動的リンク(”Dynamic Links”)ではその公開レベルなどの情報が入手できるので、例えば「全文公開されている書籍のみGoogle Booksにリンクする」など柔軟にリンクを生成できます。

公開レベルは以下の3つが設定されています。なお、アメリカでは見られるのに日本では見られないといったように、アクセス元の位置により別々の公開レベルが設定されることもあるようです。

全文公開(full)
パブリック・ドメインの書籍など全文が公開されている書籍を指します
部分プレビュー(partial)
スキャンがされた書籍で、その一部分をプレビューすることが出来ます
スニペットビューあるいはプレビューなし(noview)
“snippets”とは切り取られた断片という意味で、これはスキャンがなされていないか著作元からの許可が得られないなどの関係で、これらの書籍には解説くらいしか載せられていません

方法としてはJavascriptを使って、書籍の情報を以下のようにJSONオブジェクトで受け取ります。その際、コールバック関数を呼ぶことも出来ます。

JAVASCRIPTソースコード
JsonSearchResult {
    // ※書籍の識別子。大抵はISBNが設定されているようです
    string bib_key;
    // ※Google Books上の詳細ページのURL
    string info_url;
    // ※書籍がプレビューできるページのURL。無いときもあるようです
    string preview_url;
    // ※書籍カバー画像のURL
    string thumbnail_url;
    // ※公開レベル、full / partial / noview の三段階
    string preview;
    // ※ 書籍が外部に埋め込み可能であれば true となる
    boolean embeddable;
};

Javascriptは以下のようなURLで呼び出します。こちらが指定する部分はbibkeysパラメータとcallbackパラメータ(コールバック関数)くらいですね。

<script src=”http://books.google.com/books?bibkeys=ISBN:4873112834&jscmd=viewapi&callback=mycallback”></script>

動的リンクはもちろん、Javascriptで処理するのが筋かと思いまし、ドキュメント中でもサーバサイドでの処理を考えてデザインしていないと書かれていますが、PHPでは json_decode という関数があるので、これを用いて結果のJSON形式をオブジェクトか連想配列で受け取ることが出来ます。

ちなみに、このAPIにはブランディングガイドラインがあり、指定された用語を使わないといけないようです。例えば、書籍のプレビューを「ダウンロード」や「立ち読み」などと言うのはNGのようです。

コード例

少し例を書いてみると以下のようになります。

PHPソースコード
<?php
$isbn = "4873112834";
$json = file_get_contents("http://books.google.com/books?bibkeys=ISBN:{$isbn}&jscmd=viewapi");
// json_decodeに仕事させるために必要な処理
$json = str_replace(array("\\x26", ";", "var _GBSBookInfo = "), array("&", "", ""), $json);
// オブジェクトに変換
$book = json_decode($json, true);
$book = $book["ISBN:".$isbn];
// サムネイルのサイズを大きくする
$book["thumbnail_url"] = preg_replace("/zoom=\d/", "zoom=1", $book["thumbnail_url"]);
// 書き出し
echo '<p><a href="'. $book["info_url"] .'"><img src="'. $book["thumbnail_url"] .'" alt="書影画像" style="border: 1px solid #333;" /></a></p>';
if ($book["preview"] != "noview"){
echo '<p><a href="'. $book["preview_url"] .'"><img src="http://books.google.com/intl/ja/googlebooks/images/gbs_preview_button1.gif" /></a></p>';
}
?>

実行例

書影画像

ブックビューワ埋め込みAPI (”Embedded Viewer API”)

Google Codeでの仕様解説ページ

ブックビューワ埋め込みAPIは書籍のプレビューが可能な場合に、そのビューワを呼び出してウェブページ中に埋め込めるAPIです。ビューワではPDFビューワのようで、ページ内容を検索したり、ズームしたりといったコントロールが設けられています。触った印象や呼びだし方はGoogle Mapsに似ています。

コードが不得手な人は英語ですがコード作成フォームも用意してくれているので、利用してみてください。

コード例

HTMLソースコード
<!DOCTYPE html "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Google Book Search Embedded Viewer API Example</title>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("books", "0", {"language": "ja"});
google.setOnLoadCallback(initialize);
 
function initialize() {
  var viewer = new google.books.DefaultViewer(document.getElementById('viewerCanvas'));
  viewer.load('ISBN:4569635458', notFound, Found);
}
 
function Found(){
  // alert("指定された書籍がありました");
}
 
function notFound(){
  alert("指定された書籍は見つかりませんでした");
}
</script>
</head>
<body>
<div id="viewerCanvas" style="width: 600px; height: 500px"></div>
</body>
</html>

では、主要な部分を見ていきましょう。

HTMLソースコード
<script type="text/javascript" src="http://www.google.com/jsapi"></script>

ブックビューワ埋め込みAPIではGoogle Maps APIのように空のブロック要素の中に、javascriptで内容を挿入していく方法を採っています。そして、その基礎となるGoogle AJAX APIスクリプトをまず読み込んでいます。

HTMLソースコード
<script type="text/javascript">
google.load("books", "0", {"language": "ja"});
google.setOnLoadCallback(initialize);
 
function initialize() {
  var viewer = new google.books.DefaultViewer(document.getElementById('viewerCanvas'));
  viewer.load('ISBN:4873112834', notFound, Found);
}
// (略)
</script>

次に、google.loadメソッドでブックビューワ埋め込みAPIを呼び出しています。3つめの引数は任意で表示言語を指定することができます。

最後に、google.setOnLoadCallbackメソッドを介してinitializeメソッドを呼び出します。google.setOnLoadCallbackメソッドはブラウザ上でスクリプトが確実に実行されるように、DOMツリーが構築されるのを待ってメソッドを実行する関数です。

そのinitializeメソッドですが、Google Mapsのようにまずgoogle.books.DefaultViewerメソッドでビューワを呼び出すブロック要素を指定して初期化し、次にloadメソッドで識別子(ISBNなど)を指定して、ビューワを呼び出します。2つ目の引数に指定したメソッドはビューワが利用できない場合に、3つ目の引数に指定したメソッドはビューワの呼び出しに成功した時にそれぞれ呼び出されます。

ちなみに、呼び出す前にプレビューがそもそも利用できるかどうか確認したい場合は動的リンクの embeddable の返り値を利用してください。

実行例


全文検索 & メタデータ編集API(”Data API”)

Google Codeでの仕様解説ページ

全文検索APIは文字通り書籍のタイトル、目次、説明、内容などから書籍の検索が出来るAPIで、認証無しで利用できます。一方、メタデータ編集APIは利用情報とのひも付けが必要なのでGoogleアカウントでの認証が必要で、認証後は利用者独自の本棚の内容を取得・編集したり、本のレビューやタグに変更を加えたり出来ます。後者を解説すると長くなるので今回は割愛しましょう。

全文検索APIはRESTでデータを渡せばATOMフォーマットでデータが返ってくるというものです。以下は、「オライリー」が含まれており、かつAsanoという方が書かれた本のフィードのURLです。

http://www.google.com/books/feeds/volumes?q=%E3%82%AA%E3%83%A9%E3%82%A4%E3%83%AA%E3%83%BC+inauthor%3AAsano

ベースURL
http://books.google.com/books/feeds/volumes
qパラメータ

検索クエリを指定します。検索対象はタイトル、キーワード、説明、著者名、主題です。&で複数のクエリをくっつけて、検索語の頭に – を付けると、その後を除いた検索が出来ます。また、同じく以下のように接頭辞をつけることで検索語の検索対象を絞ることが出来ます

inauthor:
検索対象:著者名
intitle:
検索対象:タイトル
inpublisher:
検索対象:出版社
date:
検索対象:出版年。date:1990-2001のように指定する
isbn:
検索対象:ISBN
start-indexパラメータ
検索を開始する件数(=オフセット数)。max-resultsパラメータと組み合わせて使う。
max-resultsパラメータ
1回の検索に含める件数。デフォルト値は10で最大値は20
min-viewabilityパラメータ
検索結果を公開レベルに応じて絞り込みたいときに使用します。値にfullを指定すると全文公開のアイテムのみ、partialを指定すると一部公開と全文公開のアイテムのみ結果に出力されます。

コード例

コード例は「オライリー」を検索語にして得られた検索結果を書きだしてみたものです。Amazonと違ってモノそのものは売っていないので、価格を出したり入手できるようにしたい場合はAmazonアソシエイトと組み合わせる必要があります。

それにしても対象書籍の言語を指定する方法がどうにも見つかないのが気になりますね。検索オプションにはきちんとオプションが存在しますので、ないことはないのでしょうが…。

PHPソースコード
<?php
 
$url = "http://books.google.com/books/feeds/volumes?hl=ja&q=". urlencode("オライリー") ."&max-results=5";
$str = file_get_contents($url);
$str = str_replace("dc:", "", $str);
$xml = simplexml_load_string($str);
 
foreach ($xml->entry as $item){
  
  if (strpos($item->link[0]["type"], "image") !== false){
    $cover = preg_replace("/zoom=\d/", "zoom=1", h($item->link[0]["href"]));
    echo '<p><a href="'. h($item->link[1]["href"]) .'"><img src="'. $cover .'" alt="書影画像" style="border: 1px solid #333;" /></a></p>';
  }
  
  echo '<p><a href="'. h($item->link[1]["href"]) .'">'. $item->title .'</a></p>';
  if (strpos($item->link[2]["rel"], "preview") !== false){
    echo '<p><a href="'. h($item->link[2]["href"]) .'"><img src="http://books.google.com/intl/ja/googlebooks/images/gbs_preview_button1.gif" alt="この書籍内を検索" /></a></p>';
  }
  echo '<p>'. h($item->description) .'</p>';
  echo '<table><tbody>';
  echo ($item->creator) ? '<tr><th>著者</th><td>'. h($item->creator) .'</td></tr>' : "";
  echo ($item->publisher) ? '<tr><th>出版社</th><td>'. h($item->publisher) .'</td></tr>' : "";
  echo ($item->date) ? '<tr><th>出版年</th><td>'. h($item->date) .'年</td></tr>' : "";
  echo '</tbody></table>';
  
}
 
function h($s){
  return htmlspecialchars($s);
}
 
?>

実行例

書影画像

ヴェロニカ・ゲリン

この書籍内を検索

1996年、アイルランド共和国の首都ダブリン―大手新聞記者、ヴェロニカ・ゲリンは凶弾に倒れた。タブーを恐れず、麻 …

著者 エミリー オライリー
出版年 2004-06-30年

書影画像

「老い」とアメリカ文化

この書籍内を検索

著者 イヴリン・M・オライリー
出版年 2004-04年

書影画像

sendmail Volume 2 設定編

この書籍内を検索

ブッククラブのメンバーには、以下のような特典情報を電子メールでお届けしています。
.最新刊悄雜.オライリー特製グッズのプレゼント情報. …

著者 エリックオールマン
出版社 O’Reilly Japan
出版年 2004-04年

書影画像

夢で会えるから

この書籍内を検索

傷心を抱えてダラスにやってきたヒラリーは、仕事に生きる決心をしてマカリスター・ベッド社に入社した。引っ越し …

著者 キャスリーンオライリー
出版年 2004-06-20年

書影画像

Make: Technology on Your Time Volume 05

この書籍内を検索

モノを作る楽しさと創造性を刺激する

著者 オライリー・ジャパン
出版社 O’Reilly Japan
出版年 2008-09年

感想

現在の所、日本語での登録書籍数は約95,000件、うちプレビュー可能な書籍は16,800件(17.6%)とまだまだ心許ない状況*1 ですが、ビューワはうまく作られていますので、プレビューがある場合は本を買うかどうかの参考材料にできますね。

早速、OPACにも取り込もうと思います*2 が、一般的にはAmazonアソシエイトと動的リンクを組み合わせて、プレビューボタンを出すのが無難な使い方かと思います。

Amazonも黙ってみているわけはないでしょうから、Amazon側のAPIがより充実していくことも期待してます。

ちなみに、一見慈善事業のようなAPIですが、そこはGoogle Mapsと違って、こちらはビューワに広告が付くことでマネタイズしているようです。

  1. 参考までに、2007年の出版点数は約77,000件です[戻る]
  2. OPACの利用者は資料選定の際には、書籍の説明など参考材料を必ずチェック行動が見て取れますので[戻る]
キーワード:

似たもの記事

読者の皆さんの反応サイト内コメントの更新情報(RSSフィード)

読者のコメント

2

ブックマークコメント

3

他サイトの関連記事

0

読者のコメント

  1. お名前

    takagi

    投稿日時
    2008年11月21日
    13時ごろ
    Comment No
    #1

    とても丁寧な解説で非常にありがたく読ませていただきました。

    私、Web系のエンジニアを生業としておりまして
    仕事でちょっとここら辺のAPIでつまづいていたのですが
    なんとかこのコラムのおかげで乗り越えることができました。
    コメント欄で恐縮ですがここでお礼をのべさせていただきます

    ありがとうございました

はてなブックマークでつけられたコメント

teddy-gさんのプロフィール画像  teddy-g
Google Book Search APIはまだまだ使いどころがない気がする
seikennさんのプロフィール画像  seikenn
Google Book Search API を使うとき用
takorattaさんのプロフィール画像  takoratta
すばらしい。
ありがとうございます。

他サイトの関連記事

トラックバックはまだ寄せられていません


トラックバックとは
この記事に言及したサイトをこちらに掲載する仕組みをトラックバックと言います。ここでは、このサイトに頂いたトラックバックを一覧表示しています。
トラックバックしてくださる方へ
この記事への言及がない記事など、トラックバック受信方針に沿っていないものは、読者にお見せしても仕方ないこともあり削除させていただいることをご了承ください。
トラックバックを受け取るためのURI

コメント書き込みフォーム

  • メールアドレスはウェブ上で公開したり、連絡以外で使うことはありません
  • コメントを公開したくないが、作者に連絡を取りたい場合は メールで連絡してください
  • 本文中にHTMLコードは使用できません(URLはそのままお書きください)