連載第12回の目的
連載第12回と第13回では、Excel VBAにおける「楽天ウェブサービス」の活用について紹介します。楽天グループ株式会社の提供するこのWebサービスは、同社の運営するさまざまなサービスの情報を外部から取得できる機能を無償で提供します。今回はこれに含まれる「楽天ブックス系API」を使用して、キーワードを自由に指定して書籍情報を検索して一覧表にするExcelワークシートを作成します(図1)。
今回は、「楽天ウェブサービス」「楽天ブックス系API」の概要を紹介し、アプリケーションIDの取得、API呼び出しのテストまでを取り上げます。
▼完成サンプルのExcelファイル
https://github.com/wateryinhare62/mynavi_excelvba_webservice
なお、本連載では動作確認をWindows 10 Pro(64bit)、Microsoft 365(Excel 16.0、VBA 7.1)で行っています。旧バージョンや単体のExcelで試す場合にはご注意ください。
楽天ブックス系APIについて
楽天ブックス系APIは、楽天グループ株式会社が提供するWebサービスのひとつです。同社のWebサービスは、「楽天ウェブサービス」として楽天市場系APIをはじめとして7種類のAPI群から構成されますが、このうち楽天ブックス系APIは書籍、雑誌、メディア、ゲームなどをさまざまな形で検索できる機能を提供します。検索の対象は、同社の「楽天ブックス」となります。
楽天ウェブサービス
・楽天市場系API…楽天市場を対象としたAPI
・楽天トラベル系API…楽天トラベルを対象としたAPI
・楽天ブックマーク系API…楽天ブックマークを対象としたAPI
・楽天レシピ系API…楽天レシピを対象としたAPI
・楽天Kobo系API…楽天Kobo(電子書籍)を対象としたAPI
・楽天GORA系API…楽天GORA(ゴルフ場予約)を対象としたAPI
・楽天ブックス系API…楽天ブックスを対象としたAPI
楽天ブックス総合検索API…楽天ブックスの商品を総合的に検索
楽天ブックス書籍検索API…楽天ブックスの商品を書籍を対象に検索
楽天ブックスCD検索API…楽天ブックスの商品を音楽メディアを対象に検索
楽天ブックスCD/Blu-ray検索API…楽天ブックスの商品を映像メディアを対象に検索
楽天ブックス洋書検索API…楽天ブックスの商品を洋書を対象に検索
楽天ブックス雑誌検索API…楽天ブックスの商品を雑誌を対象に検索
楽天ブックスゲーム検索API…楽天ブックスの商品をゲームを対象に検索
楽天ブックスソフトウェア検索API…楽天ブックスの商品をソフトウェアを対象に検索
楽天ブックスジャンル検索API…楽天ブックスの商品のジャンル分け情報を検索
今回は書籍検索を行いたいので、その機能を持つ「楽天ブックス書籍検索API」を使っていくことになります。また、書籍をジャンル指定して検索したいので、ジャンル分け情報を取得できる「楽天ブックスジャンル検索API」も使っていきます。楽天ブックス系APIの各APIは基本的な使い方が共通なので、書籍ではなくメディアを検索したいという場合にも、サンプルが参考になると思います。
APIは、無償で利用できます。ただし、利用には一定の約束ごとと制限がありますので、事前に以下URLにある「ご利用ガイド」に目を通しておいてください(初期ページが英語であることがあるので、その場合には日本語に切り替えてください)。基本的には、楽天IDが必要、アプリケーションの登録が必要、クレジット表記が必要といったことなどです。これらについては、必要なときに都度触れていきます。
▼楽天ウェブサービス(RAKUTEN WEBSERVICE)
https://webservice.rakuten.co.jp/
楽天ブックス系APIを使う準備
楽天ブックス系APIの利用には、楽天IDとアプリケーションIDが必要です。まずはこれらを取得しておきます。
楽天IDの取得
楽天IDを持っていない方は、以下のページの[楽天会員登録(無料)]から登録(無料)を行ってください。登録には、メールアドレスが必要です。以降は、ログインしての作業になります。
▼楽天市場
https://www.rakuten.co.jp/
アプリケーションの登録(アプリケーションIDの取得)
アプリケーションを登録すると、アプリIDが発行されます。このIDは今回作成するアプリケーションにおいて、各自がプログラム中に設定する必要があります。アプリケーションの登録は、「楽天ウェブサービス」のトップ画面にある[アプリID発行]から行います。なお、アプリケーションの登録は楽天ブックス系APIに限ったものではなく、その他のAPIも含めた楽天ウェブサービス全体に適用されます。
[アプリID発行]をクリックすると、楽天IDを楽天ウェブサービスに連携する確認画面となります(図2)。「利用規約」と「プライバシーポリシー」を一読の上同意できれば、[続ける]をクリックします。これで先に進むことができます。
アプリケーション情報の入力ページが表示されます(図3)。表1の要領で、必要な項目を入力してください。OAuth認可方式を必要とするAPIの利用に必要な詳細情報など、今回において入力/選択の必要のない項目は省略しています。
表1:アプリケーション登録で入力する内容
項目 | 内容 |
---|---|
アプリ名 | アプリケーションの名称。30文字以内で好きな名称を指定。ここでは「楽天ブックス活用アプリ」とした |
アプリURL | アプリケーションのURL。255文字以内でアプリケーションのURLを指定。今回作成するアプリケーションはWebアプリケーションではないので、ホームページやブログのURLを記入 |
楽天ウェブサービス・楽天APIを知ったきっかけは何ですか? | 一つ以上、どれかにチェックを入れる |
認証 | 画像に表示される英数字を入力 |
入力したら、最後の項目の「規約に同意して新規アプリを作成」をクリックします。「創作成功」と薄いブルーの地に表示されれば登録は成功です。「403 Method Not Found」などのエラーページとなる場合、必須項目が埋められていない可能性があります。
ページに表示されるアプリID/デベロッパーIDを控えておいてください。「楽天ウェブサービス」のトップ画面にある[アプリ情報の確認]からも確認できます。このアプリIDは、API呼び出しの際に必要となります。application secret、アフィリエイトIDは今回は不要です。
これで、アプリケーションの登録ができました。
APIの呼び出しをテストする
アプリケーションIDの取得ができたので、APIの呼び出しを始めることができます。スクリプトを書く前に、APIが正しく呼び出せるかテストして、APIについての理解も深めておきましょう。
今回使用する楽天ブックス系APIはGETメソッドでアクセスするので、API呼び出しのテストはWebブラウザで実行できます。なお、WebブラウザがJSONデータを見やすく表示してくれるようになっていると便利です。Google Chromeでは、第3回で紹介した拡張機能「JSON Viewer」を利用できます。
今回のサンプルは、①書籍のジャンル分け情報をあらかじめ取得しておき、②書名、著者名、出版社名からジャンルや並び替え順序を指定して検索し、③検索結果が複数ページにわたる場合にはページの切り替えもできるようにしていきます。この①②で使用するAPIをテストします。返されるJSONデータの理解はスクリプトの読みこなしに必要なので、基本的な構成を理解しておいてください。
ジャンル分け情報を検索する―楽天ブックスジャンル検索API
楽天ブックスジャンル検索APIは、書籍などの検索時に指定できるジャンル分け情報を検索するAPIです。楽天ブックスジャンル検索APIについては、下記にドキュメントがありますので、全容を知りたい場合には参照してください。
▼楽天ウェブサービス: 楽天ブックスジャンル検索API(version:2012-11-28) | API一覧
https://webservice.rakuten.co.jp/documentation/books-genre-search
リクエストURL(エンドポイント)は以下のようになります。検索に必要な情報はクエリパラメータで与えます。
(GET)https://app.rakuten.co.jp/services/api/BooksGenre/Search/20121128?[parameter]=[value]…
パラメータに、検索したいジャンルの情報などを指定していきます。他のAPIとも共通となるものを表2に、楽天ブックスジャンル検索API独自のものを表3に挙げます(※は必須パラメータ)。
表2:楽天ブックス系APIの共通パラメータ
パラメータ | 概要 |
---|---|
applicationId※ | アプリケーションID |
affiliateId | アフィリエイトID(デフォルトはなし) |
format | レスポンスのフォーマット(jsonまたはxml。デフォルトはjson) |
callback | レスポンスをJSONPとするときのコールバック関数(デフォルトはなし) |
elements | レスポンスに含めたい要素をカンマ区切りで列挙(デフォルトはすべて) |
formatVersion | レスポンスのフォーマットのバージョン(1または2。デフォルトは1) |
表3:楽天ブックスジャンル検索APIのパラメータ
パラメータ | 概要 |
---|---|
booksGenreId※ | ジャンルID(3桁の数字の繰り返し。ルートは000) |
genrePath | レスポンスに親階層より上を含めるか(0で含めない、1で含める。デフォルトは0) |
共通パラメータで必須なのはアプリケーションID(applicationId)のみですが、elementsやformatVersionを指定することで、レスポンスを絞り込んだり、形式を切り替えたりすることができます。
また、ジャンル分け情報は階層構造をなしており、ルート(000)をbooksGenreIdに指定すると、ルート直下のジャンル分け情報を検索することができます。さらに、そのレスポンスのいずれかをbooksGenreIdに指定すると、その下の階層が検索できます。ちなみに書籍のジャンルIDは001となっているので、これをbooksGenreIdに指定すると書籍の細かなジャンル分け情報が得られます。
ここでは、formatVersionに「2」、booksGenreIdに「001」を指定してAPIを呼び出してみます。アプリケーションIDの指定を忘れないでください(以下では途中から省略しています)。
https://app.rakuten.co.jp/services/api/BooksGenre/Search/20121128?booksGenreId=001&formatVersion=2&applicationId=1007…
このURLをWebブラウザのアドレス欄に入力して呼び出すと、問題なければ以下のようなレスポンスが返ってきます。レスポンスで返ってきたJSONデータの構造を見てみましょう。その概略をリスト1に示します。
[リスト1]ジャンル検索結果のJSONデータの構造
{
"children": [ … 子階層の配列
{ … 個々の子階層のデータ
"booksGenreId": "001001", … ジャンルID
"booksGenreName": "漫画(コミック)", … ジャンル名称
"genreLevel": 2 … ジャンルの階層
},
{
"booksGenreId": "001002",
"booksGenreName": "語学・学習参考書",
"genreLevel": 2
},
…
],
"current": { … 基準の階層
"booksGenreId": "001",
"booksGenreName": "本",
"genreLevel": 1
},
"parents": [ … 親階層の配列(この場合は空)
]
}
データが正しく取得できている場合、childrenというキーを含んだJSONが返されます。正常終了した場合の結果は、基本的に配列childrenにまとめられます。なお、formatVersionを省略するか「1」を指定した場合、childrenの各要素はchildというキーの下に配置されます。つまり、children[]⇒child⇒booksGenreIdというようになります。しかし、各要素はchildキーのみを含むだけになり冗長なので、これを省略できるformatVersion=2を指定しています。以降のサンプルはすべて、この指定に基づきますので注意してください。