PlayFramework2とYahoo!オークションAPIを使ってみた

Yahoo!オークションAPIを使ってみたくなったので、とりあえず動くものを作ってみました。

image auction.drive7.info

いかにもアフィリエイトっぽくてアレな感じのタイトルですね。実際アフィリエイトID使っています。

適当に用意したカテゴリから検索した結果をパネルっぽく表示して、クリックするとオークションのページに飛べます。

準備

だいたいの流れはYahoo!デベロッパーネットワークのご利用ガイドに手順が書いてありますが、他に必要になりそうなドキュメントはこのへんです。

  1. APIドキュメント
  2. サンプルコード
  3. クレジット表示

2のサンプルコードのページにサンプルリクエストURLが載っているので、ブラウザのURLバーに入れる等で試せます。

アフィリエイトIDの確認と使い方はアフィリエイトプログラムに書いてあります。Yahoo!ポイントで受け取るか、バリューコマースを使うか選べるようです。

APIを使う

JavascriptにアプリケーションIDを直書きするのはよくないかなぁと思ったので、Webサービスを作ります。

それだけならYahoo! Pipesで十分だと思いますが、今回は使いたいのでPlay使います。おおまかにはこんな感じです。

Playframework2

conf/routes

GET /yapi controllers.YahooAPI.auction(q: String ?= "book")

controllers/YahooAPI.scala

package controllers

import play.api._
import play.api.mvc._
import play.api.libs._
import play.api.libs.json._
import play.api.libs.ws._

object YahooAPI extends Controller {
  def auction(q: String) = Action { request =>
    val appid = "YOUR_APPID"
    val baseurl = "http://auctions.yahooapis.jp/AuctionWebService/V2/json/search"
    val url = baseurl + "?appid=" + appid + "&query=" + q

    Async {
      WS.url(url).get().map { response =>
        Ok(response.body).as("application/json")
      }
    }
  }

http://example.com/yapi?q=bookにアクセスするとbookの検索結果がJSONで返ってきます。

jQuery

script.js

// API呼び出し
$.ajax({
  url: "http://example.com/yapi",
  data: {
    "q":"ほげほげ"
  },
  dataType: "jsonp",
  complete: function() {
    // 終了時の処理
  }
});

// コールバック
function loaded(json) {
  // API呼び出しの結果をゴニョゴニョする
}

取得した商品情報をレイアウトすれば完成です。

いろいろ手を抜いてます。アクセスが多いならYahooのサーバに優しくしておいた方がいいと思います。リクエストをキューでコントロールするとか、同一クエリは数秒キャッシュするとか、複数のアプリケーションIDでローテーションするとか。あ、最後のは違うか。