togatttiのエンジニアメモ

過度な期待はしないでください。旧麹町で働くエンジニアのメモ帳です。

Rubyで外国為替レートを取得する

Ruby外国為替レートをリアルタイムで取得する必要があったので、メモしておく。 欲しい情報は1ドル単位の円相場。

実際に、GoogleとかYahooなどのファイナンス情報をスクレイピングして持ってくる 方法もあったが、APIがあったのでそれを使う。

Rate Exchange JSON/JSONP APIs by Hippasus Chu

今回は1ドルあたりの円相場を得る場合、次のようなパラメータを持たせてURLにアクセス するとJSON形式でデータを得られる。

http://rate-exchange.appspot.com/currency?from=usd&to=jpy

{"to": "jpy", "rate": 101.54000000000001, "from": "usd"}

ちなみに、1ユーロあたりだと、こうする。

http://rate-exchange.appspot.com/currency?from=eur&to=jpy

{"to": "jpy", "rate": 139.04900000000001, "from": "eur"}

APIの使い方が分かったところで、Rubyで欲しい情報を取り出す。

こんな感じで取得する。

require 'open-uri'
require 'json'

api = "http://rate-exchange.appspot.com/currency?from=usd&to=jpy"
source = open(api).read()
json = JSON.parser.new(source)
hash = json.parse()
rate = hash['rate']
puts rate 
追記

このAPIを叩いているうちに、503 エラーが出た。

おそらく、利用回数の制限があるようだ。

Webサイトを表示させるたびに、通貨のAPIを叩く仕組みは良くない。。

APIを叩きレートを取得してテキストファイルに書き込むスクリプトを作り、

cronで一時間に一度レートを更新するように変更した。

#!/usr/bin/ruby

require 'open-uri'
require 'json'

f = File::open("/Users/togattti/myapp/tmp/rate.txt","w")
api = "http://rate-exchange.appspot.com/currency?from=usd&to=jpy"

begin
    source = open(api).read()
    json = JSON.parser.new(source)
    hash = json.parse()
    rate = hash['rate']
    f.puts rate
rescue => ex
    err = File::open("/Users/togattti/myapp/tmp/rate_error.log","a")
    time = Time.now.strftime("[%Y-%m-%d %Hh%Mm%Ss]")
    err.puts "#{time} #{ex}"
end

参考

Googleの為替レートAPIが利用できなくなっていた件 | 8wired