前置き
書籍管理アプリなどを作るときに大概必要になってくると思われる書籍検索APIですが
APIによって、リクエスト可能なパラメータや、取得されたjsonに含まれる情報が異なってきます。
本記事では、著名な書籍APIのリクエストパラメータと取得できる値を考察してみました。
何も考えずにAPIを採用してしまうと、
このAPI、よく見たら欲しかった値が入ってきていない😄
なんてことを実装中に気づくことになりますので、ご注意ください。
本記事は下記のQiita記事をとても参考にしております。
書籍検索APIは結局どれが一番いいのか
#API考察
下記の3つの書籍APIをみていきます!(リンクは公式ページ)
##楽天ブックス書籍検索API
###リクエストパラメータ
公式リファレンスのサービス固有パラメータを参照すると、必須、任意合わせて15個のパラメータが用意されていますね。
isbnコード指定の他に、よく使うであろうタイトル検索、著者名検索も準備されており、それぞれあいまい検索ができるみたいですね
###取得値
実際にAPIを叩いた結果は下記です。
https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?applicationId=【ひみつ】&isbn=9784591159224
※applicationIdは楽天のページからアプリIDの発行をして取得できます!
{
"count": 1,
"page": 1,
"first": 1,
"last": 1,
"hits": 1,
"carrier": 0,
"pageCount": 1,
"Items": [
{
"Item": {
"title": "芸は人なり、人生は笑いあり 歌丸ばなし2",
"titleKana": "ゲイハヒトナリジンセイハワライアリウタマルバナシ2",
"subTitle": "",
"subTitleKana": "",
"seriesName": "一般書 200",
"seriesNameKana": "イッパンショ 200",
"contents": "",
"author": "桂 歌丸",
"authorKana": "カツラウタマル",
"publisherName": "ポプラ社",
"size": "単行本",
"isbn": "9784591159224",
"itemCaption": "「後生鰻」「中村仲蔵」「ねずみ」など磨きをかけた演目全8席。",
"salesDate": "2018年06月08日",
"itemPrice": 1296,
"listPrice": 0,
"discountRate": 0,
"discountPrice": 0,
"itemUrl": "https://books.rakuten.co.jp/rb/15472494/",
"affiliateUrl": "",
"smallImageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/9224/9784591159224.jpg?_ex=64x64",
"mediumImageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/9224/9784591159224.jpg?_ex=120x120",
"largeImageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/9224/9784591159224.jpg?_ex=200x200",
"chirayomiUrl": "",
"availability": "1",
"postageFlag": 0,
"limitedFlag": 0,
"reviewCount": 7,
"reviewAverage": "4.33",
"booksGenreId": "001004008002/001011007001"
}
}
],
"GenreInformation": []
}
第一階層は検索結果件数などのメタデータ、
Itemsの中に書籍の情報が入ってきていますね。
・・何か大事な値が不足していないでしょうか?
そうです。書籍ページ数の情報がありません!
書籍のページ数の進捗管理をするような機能を実装したい場合は、別のAPIを使ったほうがいいかもしれません。(1敗)
Google Books APIs
###リクエストパラメータ
公式リファレンスを見ると、楽天ブックス書籍検索APIよりかは指定可能なパラメータが少ないですかね?🤔
個人的には、isbn、title、authorといった必要なパラメータは充足しているので問題ないと思います
また、楽天ブックス書籍検索APIとの大きな違いは、GoogleBooksAPIは「著者」や「タイトル」といったキーを指定せずとも
キーワードのみで、それに関連する検索結果を引っ張ってこれるところですね
試しに、https://www.googleapis.com/books/v1/volumes?q=歌丸
をリクエストしてみると・・・
[
{
"kind": "books#volume",
"id": "EuikvwEACAAJ",
"etag": "LqVXRRlI6Is",
"selfLink": "https://www.googleapis.com/books/v1/volumes/EuikvwEACAAJ",
"volumeInfo": {
"title": "桂歌丸大喜利人生",
"subtitle": "笑点メンバーが語る不屈の芸人魂",
"authors": [
"日本テレビ",
"日本テレビホールディングス=",
"日本テレビ放送網=",
"NTV="
],
~中略~
{
"kind": "books#volume",
"id": "5bhCuAEACAAJ",
"etag": "DQERUSMg7xw",
"selfLink": "https://www.googleapis.com/books/v1/volumes/5bhCuAEACAAJ",
"volumeInfo": {
"title": "芸は人なり、人生は笑いあり",
"subtitle": "歌丸ばなし",
"authors": [
"桂歌丸"
],
このように、タイトル、著者どちらかに"歌丸"が含まれる結果が取得できます。
もちろん、title、author等を指定してのリクエストも可能です!
https://www.googleapis.com/books/v1/volumes?q=author:歌丸
{
"kind": "books#volumes",
"totalItems": 15,
"items": [
{
"kind": "books#volume",
"id": "5bhCuAEACAAJ",
"etag": "F2IOe1h+6Lg",
"selfLink": "https://www.googleapis.com/books/v1/volumes/5bhCuAEACAAJ",
"volumeInfo": {
"title": "芸は人なり、人生は笑いあり",
"subtitle": "歌丸ばなし",
"authors": [
"桂歌丸"
],
~後略~
###取得値
それでは、取得したjsonを見てみましょう。
{
"kind": "books#volumes",
"totalItems": 1,
"items": [
{
"kind": "books#volume",
"id": "5bhCuAEACAAJ",
"etag": "ObdwDSODxwo",
"selfLink": "https://www.googleapis.com/books/v1/volumes/5bhCuAEACAAJ",
"volumeInfo": {
"title": "芸は人なり、人生は笑いあり",
"subtitle": "歌丸ばなし",
"authors": [
"桂歌丸"
],
"publishedDate": "2018-06",
"description": "「これは我々落語家のバイブル。生き様と心",
"industryIdentifiers": [
{
"type": "ISBN_10",
"identifier": "4591159221"
},
{
"type": "ISBN_13",
"identifier": "9784591159224"
}
],
"readingModes": {
"text": false,
"image": false
},
"pageCount": 246,
"printType": "BOOK",
"maturityRating": "NOT_MATURE",
"allowAnonLogging": false,
"contentVersion": "preview-1.0.0",
"panelizationSummary": {
"containsEpubBubbles": false,
"containsImageBubbles": false
},
"imageLinks": {
"smallThumbnail": "http://books.google.com/books/content?id=5bhCuAEACAAJ&printsec=frontcover&img=1&zoom=5&source=gbs_api",
"thumbnail": "http://books.google.com/books/content?id=5bhCuAEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api"
},
"language": "ja",
"previewLink": "http://books.google.co.jp/books?id=5bhCuAEACAAJ&dq=isbn:9784591159224&hl=&cd=1&source=gbs_api",
"infoLink": "http://books.google.co.jp/books?id=5bhCuAEACAAJ&dq=isbn:9784591159224&hl=&source=gbs_api",
"canonicalVolumeLink": "https://books.google.com/books/about/%E8%8A%B8%E3%81%AF%E4%BA%BA%E3%81%AA%E3%82%8A_%E4%BA%BA%E7%94%9F%E3%81%AF%E7%AC%91%E3%81%84%E3%81%82%E3%82%8A.html?hl=&id=5bhCuAEACAAJ"
},
"saleInfo": {
"country": "JP",
"saleability": "NOT_FOR_SALE",
"isEbook": false
},
"accessInfo": {
"country": "JP",
"viewability": "NO_PAGES",
"embeddable": false,
"publicDomain": false,
"textToSpeechPermission": "ALLOWED",
"epub": {
"isAvailable": false
},
"pdf": {
"isAvailable": false
},
"webReaderLink": "http://play.google.com/books/reader?id=5bhCuAEACAAJ&hl=&printsec=frontcover&source=gbs_api",
"accessViewStatus": "NONE",
"quoteSharingAllowed": false
},
"searchInfo": {
"textSnippet": "「後生鰻」「中村仲蔵」「ねずみ」など磨きをかけた演目全8席。"
}
}
]
}
こちらは、ちゃんとページ数もpageCountから取得できますね!
画像もthumbnailから取得できます!
情報量も申し分ないですが、ひとつ挙げるとするならばpublishedDateがYYYY-MMまでなところですかね?
楽天のAPIではDDまで入っておりました。
また、楽天APIにはitemPriceという価格(楽天での販売価格?)の値を持っておりましたが、GoogleAPIには無いみたいです
openBD
openBDは楽天のAPIとは異なり、登録不要で使えます。
また、レスポンスの速さを売りにしているみたいです。
リクエストパラメータ
公式リファレンスのAPI仕様をみると、どうやらisbnコードのみが指定可能となるようです。
キーワード検索が使えないのはちょっぴり残念
取得値
https://api.openbd.jp/v1/get?isbn=9784591159224
をリクエストしてみます。
[
{
"onix": {
"RecordReference": "9784591159224",
"NotificationType": "03",
"ProductIdentifier": {
"ProductIDType": "15",
"IDValue": "9784591159224"
},
"DescriptiveDetail": {
"ProductComposition": "00",
"ProductForm": "BA",
"ProductFormDetail": "B120",
"Collection": {
"CollectionType": "10",
"CollectionSequence": {
"CollectionSequenceType": "01",
"CollectionSequenceTypeName": "完結フラグ",
"CollectionSequenceNumber": "0"
},
"TitleDetail": {
"TitleType": "01",
"TitleElement": [
{
"TitleElementLevel": "03",
"PartNumber": "200",
"TitleText": {
"collationkey": "イッパンショ",
"content": "一般書"
}
}
]
}
},
"TitleDetail": {
"TitleType": "01",
"TitleElement": {
"TitleElementLevel": "01",
"TitleText": {
"collationkey": "ゲイハヒトナリジンセイハワライアリウタマルバナシ2",
"content": "芸は人なり、人生は笑いあり 歌丸ばなし2"
}
}
},
"Contributor": [
{
"SequenceNumber": "1",
"ContributorRole": [
"A01"
],
"PersonName": {
"collationkey": "カツラウタマル",
"content": "桂 歌丸"
}
}
],
"Language": [
{
"LanguageRole": "01",
"LanguageCode": "jpn"
}
],
"Extent": [
{
"ExtentType": "11",
"ExtentValue": "246",
"ExtentUnit": "03"
}
],
"Subject": [
{
"SubjectSchemeIdentifier": "78",
"SubjectCode": "0093"
}
],
"Audience": [
{
"AudienceCodeType": "22",
"AudienceCodeValue": "00"
}
]
},
"CollateralDetail": {
"TextContent": [
{
"TextType": "02",
"ContentAudience": "00",
"Text": "「これは我々落語家のバイブル。生き様と心意気、歌丸落語が活字で楽しめます」――三遊亭円楽師匠も大絶賛、真剣勝負の一冊です"
},
{
"TextType": "03",
"ContentAudience": "00",
"Text": "「これは、我々落語家のバイブル。生き様と心意気、歌丸落語が活字で楽しめます。」――三遊亭円楽師匠も大絶賛! おかげさまで読者の方からも大反響、桂歌丸師匠の名作古典落語集の第2弾! 長屋に暮らす貧乏な夫婦の意外な思いつき(『尻餅』)、芸に打ち込む歌舞伎役者の物語(『中村仲蔵』)など、江戸を舞台にした、師匠とっておきの人情噺、滑稽噺を全8席収録。ネタのみどころ、裏話などを演目ごとに解説。落語への思いにあふれる桂歌丸、真剣勝負の一冊です。 【本文抜粋】 どうぞ一席お付き合いをお願い申し上げます。 すでにお客様もご存じと思いますが、最近はますます酸素吸入器が手放せなくなりました。管をつないでおりますと、鼻の周りがきらきら光りまして、いっそネオンみたいにしようかと考えております。歌丸、水っ洟を垂らしてんじゃないかとお思いの方もいらっしゃいますが、違うんです。これ、立派に息してるんです。 息苦しいうえに、歩くのもひと苦労。そんなこともありまして、舞台の袖から高座へは車椅子でお迎え、家から寄席の会場へは車でお迎えと、ああ、あたくしもその日が近いかと精進にも磨きがかかります。 周りの噺家連中もそろそろだって待ち構えているようで、こっちに断りなく葬儀の練習が始まっているようです。つい先日も、円楽さんが葬儀委員長になったからって楽屋に来まして、葬儀にお金をかけるのは馬鹿馬鹿しいですよ、最近はもっと簡素にエコにやるようになっていると言うんです。棺はいらないとか、霊柩車はリヤカーでいいとか、お経の練習を始めたとか。 それであたくしも、黙っていられずに言いましたよ。練習するならネタの練習をしろって。それからね、はっきり言ってやったんです。 「あたしはあんたより絶対先には死なないよ!」って。なんだったら、笑点メンバー全員の葬儀委員長をやらせてもらうつもりです。 この本は、ここ数年の高座の中から、お気に入りの演目を収めたものです。ネタは先代の師匠に頼んで譲ってもらったものもあれば、噺家同士で取り換えっこしたものもあります。 台詞を磨き、サゲを磨き、あたくしの頭みたいにピカピカにしてご披露申し上げます。高座でお目にかかれない皆様にも、お楽しみ頂ければ幸いです。(まえがきより) 【収録作品】 後生鰻、小間物屋政談、尻餅、中村仲蔵、長命、城木屋、質屋庫、ねずみの8 席"
}
]
},
"PublishingDetail": {
"Imprint": {
"ImprintIdentifier": [
{
"ImprintIDType": "19",
"IDValue": "591"
},
{
"ImprintIDType": "24",
"IDValue": "7764"
}
],
"ImprintName": "ポプラ社"
},
"PublishingDate": [
{
"PublishingDateRole": "01",
"Date": "20180608"
}
]
},
"ProductSupply": {
"MarketPublishingDetail": {
"MarketPublishingStatus": "00"
},
"SupplyDetail": {
"ProductAvailability": "99",
"Price": [
{
"PriceType": "03",
"PriceAmount": "1200",
"CurrencyCode": "JPY"
}
]
}
}
},
"hanmoto": {
"datecreated": "2018-05-30 16:14:05",
"datekoukai": "2018-05-30",
"datemodified": "2018-05-30 16:14:05"
},
"summary": {
"isbn": "9784591159224",
"title": "芸は人なり、人生は笑いあり 歌丸ばなし2",
"volume": "200",
"series": "一般書",
"publisher": "ポプラ社",
"pubdate": "20180608",
"cover": "",
"author": "桂歌丸/著"
}
}
]
API仕様書によると、楽天APIにしかなかった価格も、GoogleAPIにしかなかったページ数も
openBDではどちらも取得できますね!
画像リンクも、ResourceLinkというキーで取得できます。(今回の調査対象書籍では取得できませんでしたが。)
取得できる情報量としては申し分なさそうですね〜
#まとめ
主要なAPIのリクエストパラメータとレスポンスをみていきましたが、それぞれのAPIで一長一短があったと思います。🤔
特に、欲しい情報がちゃんとレスポンスに含まれているのかどうかは、ちゃんとみた上で選択する必要がありますね。🤔
用途によっては、GoogleBooksAPIsでキーワード検索かけてから、取得したisbnコードをopenBDにリクエストするなんてハイブリット案もありかもしれませんね🤔