ども!AWS認定ソリューションアーキテクトアソシエイトのまとんです。
ファイナンシャル × IoTのおもちゃを作っていこうとおもいます。
背景
最近、投資効果のあるドル建ての生命保険に入りました。
ドル建てなので、保険金を受け取るときや、解約返戻金を受け取るときに、円安になっていると資産が増えます。
なので、夫婦共々「今日は一体、ドル円レートはいくらなのか!?」と気になるのですが、いちいちチャートを確認するのはめんどうです。
やりたいこと
為替レートが気になったときに「今何円だよ」と教えてくれる仕組みを作りたい!
具体的には、ソラコムのボタンを押したときに、為替レートを調べて、LINEに通知させようと思います。
デモムービー
ドル円の為替レートをLINEに通知してくれる、ハイソ投資ボタンを作りました。#soracom #ソラコム #Lambda #LINENotify pic.twitter.com/9mEq3VD6uU
— メタラーまとん@はてなブログ (@Highso_ciety) September 7, 2019
アーキテクチャ
ソラコムボタンを押す
→Lambda起動
→OANDA APIで為替レートを取得
前準備
OANDAのデモ口座を作成
OANDAは、FXを運営するサイトです。
為替レートなどを取得できるAPIを無料公開しています。
デモ口座と本番口座が作れるのですが、デモ口座であれば即時開設できて、デモ口座でもAPIが使えるので、目的のためにはデモ口座で十分です。
為替APIを公開している会社は少なく、OANDAは貴重なサイトの一つです。
詳細はこの記事を参考にさせていただきました。
【保存版】Pythonを使ったOANDA API v1で知っておきたい10の基本操作
まずは、OANDAでデモ口座を作成し、APIのトークンを取得します。
OANDA Japan株式会社 - FXでオアンダが選ばれる3つの理由
デモ口座を作って、ログインして、マイページ→APIアクセスの管理、で、パーソナルアクセストークンを取得し、メモしておきます。
LINE Notifyの登録
LINE Notifyは、誰でも簡単にLINE botを作れる素晴らしいサービスです。
手順はこの記事に詳細に記されているので、省略します。
[超簡単]LINE notify を使ってみる - Qiita
LINE Notify APIのパーソナルアクセストークンをメモしておきます。
自分のLINEで、新しいトークルームを作成し、「LINE Notify」という公式アカウントをトークルームに招待すればOKです。
嫁にも通知するため、トークルームには僕と嫁とLINE Notifyの3名が入ることになりました。
実装
Lambda関数の作成
今回、サーバーレス実装でコスト削減するため、AWS Lambdaで完結させてしまいます。
AWS Lambdaが初めての方は、こちらも併せてご参考ください。
highso.hatenablog.com
今回、「HighsoLineButton」というLambda関数を作りました。
AWS上のリソースにはアクセスしないので、IAMロールはデフォルトのままでOKです。
ランタイムはPython3.7を選びました。
OANDA APIのライブラリをzipでアップロード
早速Lambdaを書いていきたいのですが、困ったことに、OANDA APIを叩くためには、oandapyV20というライブラリが必要です。
これはLambdaの標準ライブラリに含まれていません。
自分の環境であれば、普通にpipで導入すればよいのですが、Lambdaではpipを走らせることができません。
なので回避策として、ローカルPCにpipでライブラリをダウンロードし、zipにしてLambdaにアップロードするという方法をとります。
詳細はこの記事を参考にしました。
【Python】AWS Lambdaで外部モジュールを使用する - Qiita
僕は、Windows10を使って開発しています。
Windows環境ではpipが使いづらいので、WSL(Windows Subsystem for Linux)でUbuntuを走らせています。
WSLを使いたい方は、こちらも併せてご参考ください。
では具体的な手順です。Ubuntuを前提に書きます。
・作業用ディレクトリを作成して移動
$ mkdir HighsoButton
$ cd HighsoButton
・pipで必要なパッケージをダウンロード。oandapyV20の他に、requestsも必要。
$ sudo pip3 install oandapyV20 -t ./
$ sudo pip3 install requests -t ./
$ ls -l
・binと*.dist-infoは不要なので、ディレクトリごと削除
$ rm bin -r
$ rm *dist-info -r
・zipで作業フォルダごと圧縮する。zipがインストールされていなかったので、aptで導入
$ sudo apt install zip
$ zip -r hoge.zip ./*
・(WSLを使っている場合は、cpコマンドでWSLからデスクトップにzipをコピー)
$cp hoge.zip /mnt/c/Users/<ユーザー名>/Desktop/
・Lambdaに戻り、コードエントリタイプ→.zipファイルをアップロードでhoge.zipをアップロードし、画面右上の保存ボタンを押す
アップロードが成功すると、左側のディレクトリに、oadnapyV20などが出現する。
・zipをアップロードすると、元々あったPythonファイルが消去されるので(1時間の作業がパァになった・・・)、新しくPythonファイルを作成する。
File → New From Template → Python File
→ File → Save as → 「lambda_function.py」のファイル名で保存。
・lambda_function.pyにコードを記述する。
Lambda関数の実装
OANDA APIで為替レートを取得し、LINE Notify APIで通知するコードを書いていきます。
以下の記事を参考にしました。
Python + AWS Lambda + Line Notify で自動で毎朝Lineに本日のお天気を通知してみた。 - Qiita
具体的に書いたコードは以下の通りです。
import json
import sys
import urllib.parse
import urllib.request
import datetime
import os
from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments
from datetime import datetime as dt
from datetime import timedelta
# LINE notify API
LINE_TOKEN= 'LINE Notifyのアクセストークン'
LINE_NOTIFY_URL='https://notify-api.line.me/api/notify'#OANDA API
access_token = 'OANDAのアクセストークン'
api = API(access_token=access_token)def get_USDJPY():
params = {
'count': 1,
'granularity': 'D'
}
r = instruments.InstrumentsCandles(instrument="USD_JPY", params=params)
api.request(r)
data = []
for raw in r.response['candles']:
data.append({
'time': raw['time'],
'volume': raw['volume'],
'o': raw['mid']['o'], #始値
'h': raw['mid']['h'], #高値
'l': raw['mid']['l'], #安値
'c': raw['mid']['c'], #終値
})
print(data)
#最新の終値
date = dt.strptime(data[0]['time'][:19], '%Y-%m-%dT%H:%M:%S')
date = date + timedelta(hours = 9) #タイムゾーンを補正
print(date)
msg = str(date.year) + '年' + str(date.month) + '月' + str(date.day) + '日のUSD-JPY終値: ' + str(data[0]['c']) + '円'
print(msg)
return msg
def send_line(msg):
method = "POST"
headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
payload = {"message": msg}
try:
payload = urllib.parse.urlencode(payload).encode("utf-8")
req = urllib.request.Request(
url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
urllib.request.urlopen(req)
except Exception as e:
print ("Exception Error: ", e)
sys.exit(1)
def lambda_handler(event, context):
msg = get_USDJPY()
send_line(msg)
・アクセストークンは自分のものをコピー
・get_USD-JPYでは、「'count': 1,」で1レコードだけを、「'granularity': 'D'」で日足を取得するよう設定しています。
granularityを変更すれば、例えば'M5'で5分足を取得できます。ここらへんはお好みで。
コードを書いたら、画面右上の保存ボタンを押して保存し、テストボタンで、テストイベントをデフォルトのまま作成して、テストを実行します。
エラーが出ずに実行されると、最初に作ったLINEのトークルームで、LINE Notifyが「〇年〇月〇日のUDS-JPY終値:〇〇円」と発言します。
SORACOMボタンとの連携
最後に、このLambda関数を、ソラコムボタン経由で起動するようにします。
起動するタイミングは、例えば「毎日0時に自動的に起動」などできるのですが、
嫁いわく「毎日通知がくるとウザイ」とのことだったので、ボタンを押した際に起動するようにしました。
ソラコムボタンとの連携については、こちらも併せてご参照ください。
ソラコムのボタンを購入して、自分のAWSアカウントにデバイス登録してあることを前提とします。
AWS IoT 1-clickを開き、
管理→プロジェクトを作成→
プロジェクト名:Highso-LINE
デバイステンプレート:すべてのボタンタイプ
デバイステンプレート名:UseLambda
アクション:Lambda関数の選択、作ったLambda関数を選択
管理→Highso-LINEを選択→プレイスメントの作成
デバイスのプレイスメント名:LINEPlacement
デバイスの登録:登録したボタン
これで、ボタンを押したときにLambda関数が起動するようになりました。
続く
残りのタスクは、生命保険金の解約返戻金を計算するところです。
もうちょいがんばろう!
以上、メタラーまとんでした。
ではでは。
ファイナンシャル×IoT記事
1. ドル円為替レートをLINEに通知するハイソ投資ボタンを作った! Lambda, LINE Notify, OANDA, SORACOM
2. ドル建て生命保険の解約返戻金を計算してLINEに通知する仕組みを作った!
3. LINE Botに生命保険の解約返戻金を教えてもらえるようにした!Messaging API, Amazon API Gateway, Lambda