hotpepper4sを作ってみた(Scala AC 23日目)

はじめに

私は「ぽんこつまっぷ」という、自分で使う為の地図作っているのだが

http://ponkotuy.com/maps/

食べログAPIが優秀と聞いて、こいつに使えないかなー、折角だし試そう、と思ったのだが、食べログAPIは「新規受け付けを終了しました」だそうで…。

色々調べてみたらHotPepperさんがAPI公開してるし、簡単にキー取得できたので、Scalaから簡単に扱えるようにScala向けのAPIラッパー(?)作ってみた。

使うまで

まずHotPepperAPIのkeyを取得。リクルートWebサービスは統合されているので、リクルートで登録

http://webservice.recruit.co.jp/index.html

新規登録から行ける。メールアドレスのみで簡単。

次にhotpepper4sをgitからcloneして

https://github.com/ponkotuy/hotpepper4s

src/main/resouces/hotpepper4s.confに

authentication.key = {{key}}

と置けばおっけー。あとはsbt runでSampleが走るので煮るなり焼くなり御自由にどうぞ。

使い方

力尽きたのでsampleをぺたっと。なお、gourmetSearchとshopSearchは内部的に完全に別物で、shopSearchでしか引っ掛からない店とかもある模様。多分後者が旧フォーマットということではないかと勝手に予想している。

  println("---- ID検索 ----")
  println(HotPepper.gourmetSearchById("J001040295", Type.LITE))
  println("---- Name検索 ----")
  HotPepper.gourmetSearchByName("花の舞", Type.LITE, count = 3).foreach(shop => println(shop.name))
  // 1始まりなのでstart=3だと前のと被る
  HotPepper.gourmetSearchByName("花の舞", Type.LITE, count = 3, start = 3).foreach(shop => println(shop.name))
  println("---- TEL検索 ----")
  println(HotPepper.shopSearchByTel("0332083008"))
  println("---- Keyword検索 ----")
  HotPepper.shopSearchByKeyword("花の舞 東京").foreach(shop => println(shop.name -> shop.address))

あと、一応HotPepper.gourmetSearch等に直接Queryを、Map[String, String]で渡せるようになってるので、実装されてない奴に関してはそちらで大体いける。ただし取得できるデータTypeは、手元で確認したのはType.LITEのみ。(Typeは取得する情報量で、Liteは文字通り少なめ)

詳しくはAPIのReferenceをどうぞ

http://webservice.recruit.co.jp/hotpepper/reference.html

実装状況

とりあえず動かすところまでは急ピッチでやってみたけど全然実装できてないです(滝汗)。とりあえずTODOリスト

  • Lite以外のTypeへの対応
  • マスター取得系APIの実装
  • 継承関係の整理
  • twitter4jっぽくページめくりの実装
  • scaladoc

思った以上にAPI Requestの結果が汚いので、もう1枚レイヤー被せる必要あるかなー。

困っていること

Type.NORMALの場合、要素が23個以上のJSONObjectが返ってくるので、JSONをcase classへ割り当てるのでは駄目で、手で書く必要がある。

あとこれはAPIの問題だけど、Searchが二種類あって、返り値に互換があんまり無いこと。後で気付いてかなり継承がぐちゃぐちゃになってる。一旦整理する必要あるかも。

その他

使ってる報告とか「ここはよ実装しろ」とか、プルリクとか是非お願いします。マサカ…じゃなくてアドバイスもあれば宜しくお願いします。

ちなみに本来用途であった「チェーン店根刮ぎ取りたい」は、メールで確認した限り無理っぽいのでぽんこつまっぷには使えなかったデス…