2014年10月16日木曜日

夜間バッチでAPIを利用して為替レートを取得する方法2

以前、Git Hub - ExchangeRatesを使って、夜間バッチで為替を取得するもの(夜間バッチでAPIを利用して為替レートを取得する方法)を作ったのですが、
アクセス回数に制限があるようで、更新に失敗するようになってしましたので、
Yahoo!のSQL(Yahoo Query Language)をつかって為替を取得するように変更しました。
他にも、CSVをダウンロードする方法もあるみたいですが、、、
http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s=USDJPY=X
今回はSQLを使いました。

YQLでJSON形式で為替を取得

JSON形式で、ドルエンの為替を取得するためのYQLのリクエストはこんな感じです。
パラメータ qに実際のクエリを書いて、データを取得する感じです。
https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22USDJPY%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys
結果は、以下のようになります。
{
query: {
    count: 3,
    created: "2014-10-15T02:39:54Z",
    lang: "ja",
    results: {
        rate: [
            {
                id: "USDJPY",
                Name: "USD to JPY",
                Rate: "107.075",
                Date: "10/15/2014",
                Time: "10:39pm",
                Ask: "107.10",
                Bid: "107.05"
            }
        ]
    }
}
}
以下気をつけ点として
パラメータにformat=jsonを付けて、json形式を指定する。
指定するsqlのpare in (xxxx)のxxxに複数の組み合わせを指定することで、結果も指定した分だけ帰ってきます。
例えば、USDJPY と EURJPYを取得したい場合。
select * from yahoo.finance.xchange where pair in ("USDJPY", "EURJPY")
結果は以下のようになります。
query: {
    count: 3,
    created: "2014-10-15T02:39:54Z",
    lang: "ja",
    results: {
        rate: [
            {
                id: "USDJPY",
                Name: "USD to JPY",
                Rate: "107.075",
                Date: "10/15/2014",
                Time: "10:39pm",
                Ask: "107.10",
                Bid: "107.05"
            },
            {
                id: "EURJPY",
                Name: "EUR to JPY",
                Rate: "135.3278",
                Date: "10/15/2014",
                Time: "10:39pm",
                Ask: "135.3723",
                Bid: "135.2834"
            }
        ]
    }
}
}
クエリーを確認したい場合は、YQLコンソール から確認ができます

実際のコード

実際には以下のようなコードを書きました。
前提条件として
  • rakeで実行する
  • 円とドル、ユーロ、元の3つの為替を取得する。
  namespace :batch do
    desc '為替のレートを取得する'
    task :rate => :environment do |task|
      puts "run #{task.name} with env: #{Rails.env} : #{Time.now}"

      require 'open-uri'

      begin
        Rate.transaction do
          # URL
          url = 'http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.xchange where pair in ("USDJPY", "EURJPY", "CNYJPY")&format=json&env=store://datatables.org/alltableswithkeys'
          url = URI.escape(url)
          source = open(url).read()
          json = JSON.parser.new(source)
          query_hash = json.parse()
          results = query_hash['query']['results']
          p "results : #{results}"

          results['rate'].each do |result_rate|
            rate_name = result_rate['id']
            p "rate_name: #{rate_name}"
            rate = Rate.find_by_ratename(rate_name)
            if rate.blank?
              rate = Rate.new
              rate.ratename = rate_name
            end
            rate_value = result_rate['Rate']
            p "rate_value: #{rate_value}"
            rate.rateval = rate_value
            rate.save!
          end

        end # Rate transaction end

        puts '全ての処理に成功しました。'
      rescue => e
        puts "error occurred batch : #{Time.now}"
        puts "error occurred batch : #{e.message}"
      end

    end
  end

0 件のコメント:

コメントを投稿

statistics

Arsip