Ruby 製の DMM Web サービス用のライブラリをつくりはじめた

DMM Web サービスとは

https://affiliate.dmm.com/api/ に公式の情報があります。下手な説明はできないので、こちらを読んでください。

ホスティング

今回つくりはじめたライブラリ rdmm のソースコードは、GitHub にホスティングされています。最低限の使い方も README に(自分が忘れたときに思い出せる程度には)記述してあります。

https://github.com/r7kamura/rdmm

利用時は rubygems.org から Gem として取得できます。執筆時点でのバージョンは 0.0.3。

https://rubygems.org/gems/rdmm

rdmm の機能

現時点では以下の2つのエンドポイントに対応しています。

  • 商品情報検索 API
  • シリーズ検索 API

商品情報検索 API は、名前の通り DMM の扱っている商品を検索できる API です。例えば自分の用途ではアニメの動画を検索するのに利用していて、「幼女戦記 1話」「幼女戦記 2話」「けものフレンズ 1話」のような単位で検索ができます。「検索」といってもキーワードを与えて検索する機能だけではなくて、沢山あるデータを様々な条件で絞り込めるというイメージです。floor というカテゴリのような単位があり、DMM.com のアニメを表す floor で絞り込んで検索できたりするので、これを利用しています。

シリーズ検索 API は、特定の商品群をまとめるシリーズという単位を検索できる API で、例えば前述した例で言えば「幼女戦記」「けものフレンズ」という単位で検索できます。これも floor を利用して検索できるので、DMM の扱っているアニメのシリーズを検索する、といった使い方ができます。

余計な変換をする

例えば日時データなんかは JSON で表現しようとすると文字列や整数として表現することが多いですが、各言語ごとに日時を表すための適切なクラスが存在しているはずで、Web API のクライアントライブラリではその辺りの変換を行ってくれると便利そうなので実装しています。

そんな勝手な変換は要らないというのであれば、汎用的な HTTP クライアントライブラリを利用すればいいはずで、特定の Web API に特化したライブラリを選択しているということは、つまりその辺りの特別な計らいが求めているのだという考えでやっていっています。

余計な変換という点で言えば、名前の変換というのもそうで、分かりづらい略語を利用した名前のパラメータは、ライブラリのレベルでは分かりやすい名前のパラメータとして扱うとか(例: cid → content_id)、データの型に適した名前でアクセスできるようにするとか、(例: actor → actors)、その辺りの変換もある程度好き勝手にやることにしています。

そのままのデータを保存できるようにする

Web API から商品情報を表す何らかのデータ(例: XMLの要素の集合)が返ってきたとして、そのデータを解釈するロジックがクライアントライブラリ側に実装される訳ですが、クライアントライブラリの機能改善に伴ってロジックが徐々に変更されていくことも、珍しくはありません。

しかしライブラリがバージョンアップされたからといって、データの再取得が必要になっては困ります。例えばこれは別のサービスの例ですが、Amazon の商品情報を扱う Web API は、1度に最大10件しかデータを取得できないし、毎秒1リクエスト程度しか許されていないので、再取得しようとするとかなりの時間が必要になります。

今回クライアントライブラリを実装するときにも、出来るだけ Web API から得たそのままのデータを取り出して DB などに保存できるように、また保存したデータを取り出して再度解釈できるように、ということに気を付けています。

追記

商品情報検索 API、シリーズ検索 API 以外のエンドポイントにも対応しました。