楽天証券口座の資産総額と損益額を、毎日確認するためLINE通知機能を作ってみました。
【目次】
(1)Line Developerに登録する
(2)AWSLambdaでseleniumを使える環境を構築
(3)AWSLambdaを構築
(4)定期実行を設定
(5)定期実行の期待結果
【使用サービス】
API
・Messaging API(LINE)
AWS
・s3(パッケージ格納)
・cloudShell(パッケージダウンロード)
・SystemsManagerパラメータストア(アカウント情報格納)
・Lambda(ロジック)
・EventBridge(Lambdaを定期実行)
パッケージ
・selenium
・WebDriver
楽天証券
・個人アカウント
【手順】
(1)Line Developerに登録する
大まかな手順は下記。参考サイトに詳細記載があるためここでは割愛。
「チャネル開設」
↓
「チャネルアクセストークンの取得」
↓
「自分のLineアカウントに作成したチャンネルを友達登録」
↓
「ユーザIDの取得」
参考サイト:https://wellknowledge.org/lambda-line-alart/
(2)AWSLambdaでseleniumを使える環境を構築
① S3バケットの準備
・AWSにログインし、S3のコンソールにて「バケットを作成をクリック」
・「バケット名」を設定(バケット名はグローバルで一意でなければいけない)
・「リージョン」は、今回は”アジアパシフィック (東京)”に設置する
・その他の設定はデフォルトのまま、「バケットを作成」をクリック
(中略)
② パッケージの取得
・AWSのリージョンを「アジアパシフィック(東京)」に切り替える。
・サービス欄からCloudShellを検索して、起動します。
・python3のバージョンを確認します。
python3 --version
・Seleniumをダウンロード
Python 3.7となっていましので、3.7を使用します。
pip3 install selenium==3.141.0 -t ./python/lib/python3.7/site-packages --use-feature=2020-resolver
・ZIP化
直下に python ディレクトリができていると思うので、後でローカル環境にDLできるようにzip化しておきます。
zip -r python python
・ls -l コマンドで確認
ls -l
・保存用ディレクトリを作成
mkdir headless
・作成したディレクトリに移動
cd headless
・headless-chromiumをダウンロード
curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-55/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
・ダウンロード完了後、展開
unzip -o headless-chromium.zip -d .
・zipファイルはもう使わないので削除
rm headless-chromium.zip
・chromedriverをダウンロード
※先程ダウンロードしたheadless-chromiumのchromeバージョンは69なので、chromedriverのバージョンは2.43を利用
curl -SL https://chromedriver.storage.googleapis.com/2.43/chromedriver_linux64.zip > chromedriver.zip
・展開してzipファイルの方は削除
unzip -o chromedriver.zip -d .
rm chromedriver.zip
.homeディレクトリに戻り、headlessディレクトリをzip化
cd
zip -r headless headless
・ls -l コマンドで確認
ls -l
aws s3 cp python.zip s3://rakuten-line-bot
aws s3 cp headless.zip s3://rakuten-line-bot
③Lambdaレイヤーの構築
・Lambdaコンソールから「レイヤー」をクリック
・seleniumレイヤーの作成
名前:selenium-layer
「Amazon S3 からファイルをアップロードする」を選択し、先の作業でS3へアップロードしたpython.zipのパス (s3://rakuten-line-bot/python.zip)を指定
ランタイム:Python3.7
・作成クリック
・headlessレイヤーの作成
名前:headless-layer
「Amazon S3 からファイルをアップロードする」を選択し、先の作業でS3へアップロードしたheadless.zipのパス (s3://rakuten-line-bot/headless.zip)を指定
ランタイム:Python3.7
・作成クリック
(3)AWSLambdaを構築
①Lambda関数作成
・Lambdaコンソールにて、「関数の作成」をクリック
・関数の作成
「一から作成」を選択
名前:rakuten-line-bot
ランタイム:Python3.7
・その他はデフォルトで「関数の作成」をクリック
・一般設定
「設定」→「一般設定」→「編集」
メモリを「256MB」に設定
タイムアウトを「1分30秒」に設定
「保存」をクリック
・レイヤー設定
「layers」をクリック
「レイヤーの追加」をクリック
「カスタムレイヤー」を選択
名前:selenium-layer
バージョン:1
「保存」をクリック
※headless-layerも同じように追加する。
・環境変数の設定
「設定」→「環境変数」→「編集」→「環境変数の追加」
手順(1)で取得した、トークンとユーザIDを設定
楽天証券ログイン情報を設定
「保存」をクリック
・コードソースを設定
以下を書き込み、「deploy」をクリック
from selenium import webdriver
import urllib.request
import json
import os
import requests
from time import sleep
#Line APIを取得
lineUserId = os.environ.get('lineUserId')
lineAccessToken = os.environ.get('lineAccessToken')
#楽天証券情報を取得
rekutenId = os.environ.get('rakuten_ID')
rakutenPass = os.environ.get('rakuten_PASS')
#LINE送信
def line_push(lineAccessToken, lineUserId, text):
url = 'https://api.line.me/v2/bot/message/push'
data = {
"to": lineUserId,
"messages":[
{
"type":"text",
"text":text
}
]
}
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {'+lineAccessToken+'}',
}
req = urllib.request.Request(url, json.dumps(data).encode(), headers)
urllib.request.urlopen(req)
#メイン
def lambda_handler(event, context):
URL = "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"
options = webdriver.ChromeOptions()
# headless-chromiumのパスを指定
options.binary_location = "/opt/headless/headless-chromium"
options.add_argument("--headless")
options.add_argument('--single-process')
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--no-sandbox")
browser = webdriver.Chrome(
# chromedriverのパスを指定
executable_path = "/opt/headless/chromedriver",
options = options
)
browser.get(URL)
# title = browser.title
# text = browser.title
sleep(10)
# 「ユーザID」入力
elem_user_id = browser.find_element_by_id("form-login-id")
elem_user_id.send_keys(rekutenId)
# 「パスワード」入力
elem_user_password=browser.find_element_by_id("form-login-pass")
elem_user_password.send_keys(rakutenPass)
# 「ログイン」ボタンクリック
elem_ACT_login = browser.find_element_by_id("login-btn")
elem_ACT_login.click()
#資産合計を取得
total = browser.find_element_by_id("asset_total_amount")
total = total.text
#評価損益を取得
totalDiff = browser.find_element_by_id("asset_total_amount_diff")
totalDiff = totalDiff.text
#送信用テキストを生成
text = "資産合計" + "\n" + total + "\n" + "評価損益" + "\n" + totalDiff
#ブラウザを閉じる
browser.close()
#LINE送信を呼び出し
line_push(lineAccessToken, lineUserId, text)
return "success!!"
②テスト
「テスト」→イベント名に任意入力→「保存」
「テスト」をクリック
Lambdaコンソールの期待結果
LINEの期待結果
(4)定期実行を設定
・サービス欄からを EventBridge 検索して、起動
・「ルールを作成」をクリック
・任意の名前を入力→「スケジュール」を選択→「続行してルールを作成する」をクリック
・パターン設定
ローカル時間9時になるように設定し、「次へ」をクリック
・ターゲット設定
さきほど作成した、Lambda関数が実行されるよう設定し、「次へ」をクリック
・タグの設定は、デフォルトのまま「次へ」をクリック
・「ルールの作成」をクリック
(5)定期実行の期待結果
毎日9時にLINE通知が届くこと(関数の実行時間の都合上9:01になっている)
以上です。
参考サイト:https://qiita.com/yoshi2045/items/24b3287e34bfb1c42f88