読者です 読者をやめる 読者になる 読者になる

チラシ裏日記上等!!新館

オタクWebエンジニアの雑記ブログです。本や漫画や映画の感想なんかを主に書いています。最近は勉強会の感想とかも書いています。

openBDという書誌情報を扱うサービスのAPIを使えるgemを作りました

Ruby Gem

openBDという書誌・書影の情報を扱うサービスのWeb APIをたたけるgemを作りました。

github.com

gemを作るのは初めて。

使い方

使い方は

require 'openbd_api'

# isbnの番号を入れる
OpenBD.get 9784309226712

で「サピエンス全史」の書誌情報がハッシュの配列でとれます。

irb(main):004:0> OpenBD.get 9784309226712
=> [{"onix"=>{"CollateralDetail"=>{"TextContent"=>[{"Text"=>"虚構が他人との協力を可能にし、文明をもたらした! では文明は人類を幸福にしたのか? 現代世界を鋭くえぐる世界的ベストセラー!", "TextType"=>"02", "ContentAudience"=>"00"}]}, "PublishingDetail"=>{"Imprint"=>{"ImprintName"=>"河出書房新社", "ImprintIdentifier"=>[{"IDValue"=>"309", "ImprintIDType"=>"19"}, {"IDValue"=>"0961", "ImprintIDType"=>"24"}]}, "Publisher"=>{"PublisherIdentifier"=>[{"PublisherIDType"=>"19", "IDValue"=>"309"}, {"PublisherIDType"=>"24", "IDValue"=>"0961"}], "PublisherName"=>"河出書房新社", "PublishingRole"=>"01"}, "PublishingDate"=>[{"Date"=>"20160909", "PublishingDateRole"=>"01"}]}, "ProductSupply"=>{"SupplyDetail"=>{"ReturnsConditions"=>{"ReturnsCode"=>"03", "ReturnsCodeType"=>"04"}, "ProductAvailability"=>"99", "Price"=>[{"PriceAmount"=>"1900", "CurrencyCode"=>"JPY", "PriceType"=>"03"}]}}, "NotificationType"=>"03", "ProductIdentifier"=>{"IDValue"=>"9784309226712", "ProductIDType"=>"15"}, "RecordReference"=>"9784309226712", "DescriptiveDetail"=>{"TitleDetail"=>{"TitleType"=>"01", "TitleElement"=>{"Subtitle"=>{"content"=>"文明の構造と人類の幸福", "collationkey"=>"ブンメイノコウゾウトジンルイノコウフク"}, "TitleElementLevel"=>"01", "TitleText"=>{"content"=>"サピエンス全史(上)", "collationkey"=>"サピエンスゼンシ01"}}}, "Language"=>[{"LanguageCode"=>"jpn", "LanguageRole"=>"01", "CountryCode"=>"JP"}], "ProductForm"=>"BA", "Audience"=>[{"AudienceCodeType"=>"22", "AudienceCodeValue"=>"00"}], "Extent"=>[{"ExtentValue"=>"272", "ExtentUnit"=>"03", "ExtentType"=>"11"}], "Contributor"=>[{"ContributorRole"=>["A01"], "PersonName"=>{"content"=>"ユヴァル・ノア・ハラリ", "collationkey"=>"ハラリ,Y.N"}, "BiographicalNote"=>"イスラエル人歴史学者。オックスフォード大学で中世史、軍事史を専攻して博士号を取得し、現在、エルサレムのヘブライ大学で歴史学を教えている。オンライン上での無料講義も行ない、多くの受講者を獲得している。", "SequenceNumber"=>"1"}, {"ContributorRole"=>["B06"], "PersonName"=>{"content"=>"柴田 裕之", "collationkey"=>"シバタ ヤスシ"}, "BiographicalNote"=>"翻訳家。早稲田大学・Earlham College卒業。訳書にブオノマーノ『バグる脳』、コスリン/ミラー『上脳・下脳』、リフキン『限界費用ゼロ社会』、ファンク『地球を「売り物」にする人たち』など。", "SequenceNumber"=>"2"}], "Subject"=>[{"SubjectSchemeIdentifier"=>"78", "SubjectCode"=>"0022"}], "ProductFormDetail"=>"B119", "ProductComposition"=>"00"}}, "hanmoto"=>{"reviews"=>[{"han"=>"", "appearance"=>"2016-10-16", "post_user"=>"genkina", "kubun_id"=>1, "source"=>"毎日新聞", "choyukan"=>"朝刊", "source_id"=>29, "reviewer"=>"本村凌二(早稲田大学特任教授・西洋史)", "link"=>""}, {"han"=>"", "appearance"=>"2016-10-23", "post_user"=>"genkina", "kubun_id"=>1, "source"=>"朝日新聞", "choyukan"=>"朝刊", "source_id"=>18, "reviewer"=>"", "link"=>""}, {"han"=>"", "appearance"=>"2016-10-30", "post_user"=>"genkina", "kubun_id"=>1, "source"=>"日本経済新聞", "choyukan"=>"朝刊", "source_id"=>23, "reviewer"=>"中村桂子(JT生命誌研究館館長)", "link"=>""}, {"han"=>"", "appearance"=>"2016-11-27", "post_user"=>"genkina", "kubun_id"=>1, "source"=>"読売新聞", "choyukan"=>"朝刊", "source_id"=>20, "reviewer"=>"", "link"=>""}, {"han"=>"", "appearance"=>"2016-12-18", "post_user"=>"genkina", "kubun_id"=>1, "source"=>"毎日新聞", "choyukan"=>"朝刊", "source_id"=>29, "reviewer"=>"中村桂子(JT生命誌研究館館長)", "link"=>""}, {"han"=>"", "appearance"=>"2016-12-18", "post_user"=>"genkina", "kubun_id"=>1, "source"=>"毎日新聞", "choyukan"=>"朝刊", "source_id"=>29, "reviewer"=>"本村凌二(早稲田大学特任教授・西洋史)", "link"=>""}, {"han"=>"", "appearance"=>"2016-12-25", "post_user"=>"genkina", "kubun_id"=>1, "source"=>"読売新聞", "choyukan"=>"朝刊", "source_id"=>20, "reviewer"=>"", "link"=>""}, {"han"=>"", "appearance"=>"2016-12-25", "post_user"=>"genkina", "kubun_id"=>1, "source"=>"東京新聞/中日新聞", "choyukan"=>"朝刊", "source_id"=>19, "reviewer"=>"藤田一人(美術評論家)", "link"=>""}, {"han"=>"", "appearance"=>"2017-01-15", "post_user"=>"genkina", "kubun_id"=>1, "source"=>"日本経済新聞", "choyukan"=>"朝刊", "source_id"=>23, "reviewer"=>"", "link"=>""}], "datemodified"=>"2016-09-07 10:02:08", "datecreated"=>"2016-08-06 10:02:07"}, "summary"=>{"isbn"=>"9784309226712", "title"=>"サピエンス全史(上)", "volume"=>"", "series"=>"", "publisher"=>"河出書房新社", "pubdate"=>"20160909", "cover"=>"", "author"=>"ユヴァル・ノア・ハラリ/著 柴田裕之/翻訳"}}]

サピエンス全史(上)文明の構造と人類の幸福

サピエンス全史(上)文明の構造と人類の幸福

書誌情報はopenBDのAPIで返ってくるJSONをそのままハッシュにしているだけです。情報の仕様は公開されていますが、JSONの仕様じゃないので注意。複数isbnを指定できるので配列で返しています。

基本的にWeb APIで公開されているものをそのまま実装している感じです。なので coverageschema もあります。リソースのgetに対してPOSTしているメソッドがあるのですが、そこだけbulk_getという風にしています。

コマンドラインツールも作っていて、これもWeb APIで出来ることが出来る感じです。jqと組み合わせるとこんな感じで出来ます。

$ openbd coverage | jq '.[0]' | xargs openbd get | jq '.[0].summary.title' 
"Ethics and the limits of philosophy"

まだ検索の機能がWeb APIで用意されていないのですが、それが出来ると楽しくなりそうです。

実装についてあれこれ

APIキーとかないのでインスタンスにする必要はないかなと思い、全部クラスメソッドで作ったりしましたが、実はmoduleで良かったんじゃないかとか思ったりします。実装に関してはまだまだつたない部分が多いかと。

普段Railsであんまり意識しないでRubyとか使ってますが、gemとか作るとRubyで書いてるって感じがして良いですね。Web APIが進化するのに追随して学んでいければと思います。