アクセス回数に制限があるようで、更新に失敗するようになってしましたので、
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 件のコメント:
コメントを投稿