OpenExchangeRates.orgで為替情報を取得する

Google Finance APIの配信が停止して、株価の終値は証券会社のメールサービスを利用するという形で対応しました。為替レートの取得についてはopenexchangerates.orgというAPIを使うことにします。

無料アカウントを登録しよう

無料アカウントはメールアドレス認証で登録できます。ほかには名前を聞かれたかな。

無料アカウントには多少の制約があります。他にもあるかもですが、大きいのはこれぐらい。

  • データ取得はひと月1000回まで
  • 対USDのレートしか取れない

とはいえ、ひと月は672から744時間です。FXをやるのでなければ十分な回数だし、対円レートだって計算すればいいだけです。

シェルスクリプトで扱いやすいJSONデータが返ってくる

アカウント登録が完了するとAPIにアクセスするためのApp IDが送られてきます。

直近のレートを知りたければこんな感じ。

$ curl -s "https://openexchangerates.org/api/latest.json?app_id=********************************"

{
  "disclaimer": "Usage subject to terms: https://openexchangerates.org/terms",
  "license": "https://openexchangerates.org/license",
  "timestamp": 1528250400,
  "base": "USD",
  "rates": {
    "AED": *.****81,
    "AFN": **.****32,
    "ALL": ***.95,
〜以下略〜

タイムスタンプはunix時間です。1通貨一行でとても扱いやすい。日本円の対ドルレートが欲しければ。。。

cat latest.json | grep -e "JPY" | sed 's/[^.0-9]//g'

これで取り出せる。

タイムスタンプを見ればわかるとおり毎時0分0秒にデータが更新されているので、cronで毎時3分ぐらいに取得すればいいでしょう。

phpで計算しちゃう

取得したデータはWebサイトに表示したい内容なので、サイト自体をphpで作っておけばimportでファイルを取り込めます。

シェルスクリプトでもunix時間の変換や為替計算はできますが、どうせphpに組み込まれてしまうのであればphpで演算してしまえばいいでしょう。

#! /bin/sh
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
SOURCE=`mktemp`
KEY='********************************'
EP='https://openexchangerates.org/api/'
RES=`curl "${EP}latest.json?app_id=${KEY}" -o $SOURCE -w "%{http_code}"`
if test ${RES} -eq 200; then
  TIMESTAMP=`cat $SOURCE | grep -e 'timestamp' | sed 's/[^0-9]//g'`
  JPY=`cat $SOURCE | grep -e 'JPY' | sed 's/[^.0-9]//g'`
  TWD=`cat $SOURCE | grep -e 'TWD' | sed 's/[^.0-9]//g'`
  RUB=`cat $SOURCE | grep -e 'RUB' | sed 's/[^.0-9]//g'`
  DISTINATION='/usr/local/www/travel/tour/rate-rub.php'
  echo "<?php" > $DISTINATION
  echo "printf('<p>参考為替レート:%3.4f JPY/RUB ',${JPY}/${RUB});" >> $DISTINATION
  echo "echo '('.date('Y-m-d H:i:s',\"${TIMESTAMP}\").'取得)</p>';" >> $DISTINATION
  echo "?>" >> $DISTINATION
  DISTINATION='/usr/local/www/travel/tour/rate-ntd.php'
  echo "<?php" > $DISTINATION
  echo "printf('<p>参考為替レート:%3.4f JPY/NTD ',${JPY}/${TWD});" >> $DISTINATION
  echo "echo '('.date('Y-m-d H:i:s',\"${TIMESTAMP}\").'取得)</p>';" >> $DISTINATION
  echo "?>" >> $DISTINATION
fi
rm $SOURCE

こんな感じで取り込んだデータを表示しているサイトがこちら。