楽天証券口座の資産額を毎日LINE通知（Selenium・AWS Lambda・Python）

楽天証券口座の資産総額と損益額を、毎日確認するためLINE通知機能を作ってみました。
**【目次】**
（１）Line Developerに登録する
（２）AWSLambdaでseleniumを使える環境を構築
（３）AWSLambdaを構築
（４）定期実行を設定
（５）定期実行の期待結果

**【使用サービス】**
　API
・Messaging API（LINE）

　AWS
・s3（パッケージ格納）
・cloudShell（パッケージダウンロード）
・SystemsManagerパラメータストア（アカウント情報格納）
・Lambda（ロジック）
・EventBridge（Lambdaを定期実行）

　パッケージ
・selenium
・WebDriver

　楽天証券
・個人アカウント


**【手順】**
__（１）Line Developerに登録する__
　　大まかな手順は下記。参考サイトに詳細記載があるためここでは割愛。

　　「チャネル開設」
　　↓
　　「チャネルアクセストークンの取得」
　　↓
　　「自分のLineアカウントに作成したチャンネルを友達登録」
　　↓
　　「ユーザIDの取得」

参考サイト：https://wellknowledge.org/lambda-line-alart/

__（２）AWSLambdaでseleniumを使える環境を構築__
__①　S３バケットの準備__
・AWSにログインし、S3のコンソールにて「バケットを作成をクリック」　![スクリーンショット 2023-02-23 18.33.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/2feb8c52-f814-9ba5-77c6-93405ae86aad.png)
    
・「バケット名」を設定（バケット名はグローバルで一意でなければいけない）
・「リージョン」は、今回は”アジアパシフィック (東京)”に設置する
・その他の設定はデフォルトのまま、「バケットを作成」をクリック
![スクリーンショット 2023-02-23 18.55.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/6e276189-d9eb-4f3a-9d9d-a40ffe6c521f.png)
（中略）
![スクリーンショット 2023-02-23 18.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/6b18de10-0e50-e9e5-574d-8e6f16ebda84.png)
__②　パッケージの取得__
・AWSのリージョンを「アジアパシフィック（東京）」に切り替える。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/a389374c-3c20-c6cd-effa-551c42bd45c6.png" width=35%　>
・サービス欄からCloudShellを検索して、起動します。
![スクリーンショット 2023-02-24 15.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/b7f6fd5d-ef2a-2440-9e49-43e41762343b.png)
・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
```
結果
![スクリーンショット 2023-02-24 16.10.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/f776c4cf-814e-d0bc-c260-470371899efb.png)

・保存用ディレクトリを作成
```
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
```
結果
![スクリーンショット 2023-02-25 17.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/35f999ac-e7e8-95ef-393d-d33a880e9363.png)
・用意したパッケージをS3へコピー
```
aws s3 cp python.zip s3://rakuten-line-bot
aws s3 cp headless.zip s3://rakuten-line-bot
```
.S3コンソールでコピーされているか確認
![スクリーンショット 2023-02-25 17.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/dabca785-28d2-3175-017e-588e207df4c7.png)

__③Lambdaレイヤーの構築__
・Lambdaコンソールから「レイヤー」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/f94b3ed6-b56e-4e2e-8c77-d9a99c2bda65.png" width=35%　>
・seleniumレイヤーの作成
　名前：selenium-layer
　「Amazon S3 からファイルをアップロードする」を選択し、先の作業でS3へアップロードしたpython.zipのパス　（s3://rakuten-line-bot/python.zip）を指定
　ランタイム：Python3.7
![スクリーンショット 2023-02-25 17.21.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/dc87ad31-5798-5b2d-84a5-c8d6a295b553.png)
・作成クリック

・headlessレイヤーの作成
　名前：headless-layer
　「Amazon S3 からファイルをアップロードする」を選択し、先の作業でS3へアップロードしたheadless.zipのパス　（s3://rakuten-line-bot/headless.zip）を指定
　ランタイム：Python3.7
![スクリーンショット 2023-02-25 17.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/0689da92-27e4-4c1f-b6a2-83b27a629e55.png)
・作成クリック

__（３）AWSLambdaを構築__
__①Lambda関数作成__
・Lambdaコンソールにて、「関数の作成」をクリック
![スクリーンショット 2023-02-25 17.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/502cd4bd-7222-d815-a5ea-f500978498df.png)
・関数の作成
「一から作成」を選択
　名前：rakuten-line-bot
　ランタイム：Python3.7
![スクリーンショット 2023-02-25 17.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/e2ec6a76-1b82-17b1-c366-219f37c7aadd.png)

・その他はデフォルトで「関数の作成」をクリック

・一般設定
「設定」→「一般設定」→「編集」
メモリを「256MB」に設定
タイムアウトを「1分30秒」に設定
「保存」をクリック
![スクリーンショット 2023-02-25 17.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/0be6d264-702d-56a3-16af-4d44d838938a.png)

・レイヤー設定
「layers」をクリック
![スクリーンショット 2023-02-25 17.54.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/ecbeae99-ab23-f21a-3e71-6e8c896ffda8.png)
「レイヤーの追加」をクリック
![スクリーンショット 2023-02-25 17.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/3f69a1a6-7ac2-2dcb-b2a9-93bf561c0646.png)
「カスタムレイヤー」を選択
　名前：selenium-layer
バージョン：１
「保存」をクリック
![スクリーンショット 2023-02-25 17.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/f9117a7f-e96e-014f-ae8c-40ef1618ea8b.png)
※headless-layerも同じように追加する。

・環境変数の設定
「設定」→「環境変数」→「編集」→「環境変数の追加」
手順（１）で取得した、トークンとユーザIDを設定
楽天証券ログイン情報を設定
「保存」をクリック
![スクリーンショット 2023-02-25 17.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/c31e7a85-1d05-9f48-7b26-d5cbb2dd190c.png)

・コードソースを設定
以下を書き込み、「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コンソールの期待結果
![スクリーンショット 2023-02-25 18.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/0299f665-08a8-57e5-1107-c4f103872a27.png)
LINEの期待結果
![IMG_8633.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/714d6102-c565-a067-9826-567d0dc7e1b8.jpeg)

__（４）定期実行を設定__
・サービス欄からを　EventBridge　検索して、起動
![スクリーンショット 2023-02-25 18.18.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/4635394c-d414-981c-f219-8f7b91f59946.png)

・「ルール」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/64c79b13-c007-8f3d-ca1b-b74ac6fd0d64.png" width=35%　>

・「ルールを作成」をクリック

・任意の名前を入力→「スケジュール」を選択→「続行してルールを作成する」をクリック
![スクリーンショット 2023-02-25 18.23.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/702f8f45-156d-a8c9-8836-de00ca37fdbb.png)

・パターン設定
ローカル時間９時になるように設定し、「次へ」をクリック
![スクリーンショット 2023-02-25 18.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/207730b0-019b-c21e-abb1-bd367acc0397.png)

・ターゲット設定
さきほど作成した、Lambda関数が実行されるよう設定し、「次へ」をクリック
![スクリーンショット 2023-02-25 18.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/a80b5625-f1eb-08f3-2be6-82420185aacb.png)

・タグの設定は、デフォルトのまま「次へ」をクリック

・「ルールの作成」をクリック


__（５）定期実行の期待結果__
毎日９時にLINE通知が届くこと（関数の実行時間の都合上９：０１になっている）
![IMG_8609.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033475/7093907b-8265-006a-6926-713560d73405.jpeg)

__以上です。__

参考サイト：https://qiita.com/yoshi2045/items/24b3287e34bfb1c42f88