ラベル rake の投稿を表示しています。 すべての投稿を表示
ラベル rake の投稿を表示しています。 すべての投稿を表示

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

2014年10月7日火曜日

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

概要

気がついたら、Googleの為替取得用のAPIが使えなくなっていたので、
その代替えとして、Git Hub - ExchangeRatesを使う事にしました。
このAPIを使うと
http://rate-exchange.appspot.com/currency?from=usd&to=jpyのurlで、下記なようなjsonが取得できます。
{
  to: "jpy",
  rate: 109.365,
  from: "usd"
}
urlのパラメータでfromとtoを変えることで、ユーロや元など他の通貨にも対応可能です。

使い方

今回やりたい事は、1日1回夜間のバッチで為替レートを取得するため、
rake で実行する、スクリプトを作成しました。
そのコードを下記します。
# -*- encoding : utf-8 -*-

namespace :batch do

  desc '為替のレートを取得する'
  task :rate => :environment do |task|
    begin
      Rate.transaction do

        # ドル
        usd_jpy_url = "http://rate-exchange.appspot.com/currency?from=usd&to=jpy"
        source = open(usd_jpy_url).read()
        json = JSON.parser.new(source)
        usd_hash = json.parse()
        puts "USD : #{usd_hash['rate']}"
        usd_rate = Rate.find_by_code('usd')
        usd_rate.rateval = usd_hash['rate']
        usd_rate.save!

        # ユーロ
        eur_jpy_url = "http://rate-exchange.appspot.com/currency?from=eur&to=jpy"
        source = open(eur_jpy_url).read()
        json = JSON.parser.new(source)
        eur_hash = json.parse()
        puts "EUR : #{eur_hash['rate']}"
        eur_rate = Rate.find_by_code('eur')
        eur_rate.rateval = eur_hash['rate']
        eur_rate.save!

        # 元
        cny_jpy_url = "http://rate-exchange.appspot.com/currency?from=cny&to=jpy"
        source = open(cny_jpy_url).read()
        json = JSON.parser.new(source)
        cny_hash = json.parse()
        puts "CNY : #{cny_hash['rate']}"
        cny_rate = Rate.find_by_code('cny')
        cny_rate.rateval = cny_hash['rate']
        cny_rate.save!

      end # Userd transaction end

      puts "success : #{Time.now}"
    rescue => e
      puts "error : #{Time.now} : #{e.message}"
    end

  end
end

putsでは下記のような値が出力されます。
"USD : 109.441"
"EUR : 137.241"
"CNY : 17.8184"
後は、これをcronに設定するば終了です。

statistics