メタラーまとんがハイソにやらかすようです

東大理系修士卒JTBCエンジニアのハイソサイエティ(上流階級)な日常

ドル円為替レートをLINEに通知するハイソ投資ボタンを作った! Lambda, LINE Notify, OANDA, SORACOM

ども!AWS認定ソリューションアーキテクトアソシエイトのまとんです。

ファイナンシャル × IoTのおもちゃを作っていこうとおもいます。

背景

最近、投資効果のあるドル建ての生命保険に入りました。

ドル建てなので、保険金を受け取るときや、解約返戻金を受け取るときに、円安になっていると資産が増えます。

なので、夫婦共々「今日は一体、ドル円レートはいくらなのか!?」と気になるのですが、いちいちチャートを確認するのはめんどうです。

やりたいこと

為替レートが気になったときに「今何円だよ」と教えてくれる仕組みを作りたい!

具体的には、ソラコムのボタンを押したときに、為替レートを調べて、LINEに通知させようと思います。 

デモムービー

アーキテクチャ

f:id:highso:20190908015709p:plain

ソラコムボタンを押す

→Lambda起動

→OANDA APIで為替レートを取得

→LINE Notify APIでLINEトークに通知

前準備

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を使いたい方は、こちらも併せてご参考ください。

highso.hatenablog.com

では具体的な手順です。Ubuntuを前提に書きます。

・作業用ディレクトリを作成して移動

$ mkdir HighsoButton

$ cd HighsoButton

・pipで必要なパッケージをダウンロード。oandapyV20の他に、requestsも必要。

$ sudo pip3 install oandapyV20 -t ./

$ sudo pip3 install requests -t ./

$ ls -l

f:id:highso:20190908011933p:plain

・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をアップロードし、画面右上の保存ボタンを押す

f:id:highso:20190908012255p:plain

アップロードが成功すると、左側のディレクトリに、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で通知するコードを書いていきます。

以下の記事を参考にしました。

OANDA APIから為替データを取得 - Qiita

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時に自動的に起動」などできるのですが、

嫁いわく「毎日通知がくるとウザイ」とのことだったので、ボタンを押した際に起動するようにしました。

ソラコムボタンとの連携については、こちらも併せてご参照ください。

highso.hatenablog.com

ソラコムのボタンを購入して、自分の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

4. 投資の近況報告!!積み立てNISA、ドル建て生命保険、国内株式