LoginSignup
34

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-02-25

楽天証券口座の資産総額と損益額を、毎日確認するため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のコンソールにて「バケットを作成をクリック」 スクリーンショット 2023-02-23 18.33.56.png

・「バケット名」を設定(バケット名はグローバルで一意でなければいけない)
・「リージョン」は、今回は”アジアパシフィック (東京)”に設置する
・その他の設定はデフォルトのまま、「バケットを作成」をクリック
スクリーンショット 2023-02-23 18.55.48.png
(中略)
スクリーンショット 2023-02-23 18.43.18.png
② パッケージの取得
・AWSのリージョンを「アジアパシフィック(東京)」に切り替える。

・サービス欄からCloudShellを検索して、起動します。
スクリーンショット 2023-02-24 15.56.13.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

・保存用ディレクトリを作成

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
・用意したパッケージを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

③Lambdaレイヤーの構築
・Lambdaコンソールから「レイヤー」をクリック

・seleniumレイヤーの作成
 名前:selenium-layer
 「Amazon S3 からファイルをアップロードする」を選択し、先の作業でS3へアップロードしたpython.zipのパス (s3://rakuten-line-bot/python.zip)を指定
 ランタイム:Python3.7
スクリーンショット 2023-02-25 17.21.20.png
・作成クリック

・headlessレイヤーの作成
 名前:headless-layer
 「Amazon S3 からファイルをアップロードする」を選択し、先の作業でS3へアップロードしたheadless.zipのパス (s3://rakuten-line-bot/headless.zip)を指定
 ランタイム:Python3.7
スクリーンショット 2023-02-25 17.25.59.png
・作成クリック

(3)AWSLambdaを構築
①Lambda関数作成
・Lambdaコンソールにて、「関数の作成」をクリック
スクリーンショット 2023-02-25 17.33.07.png
・関数の作成
「一から作成」を選択
 名前:rakuten-line-bot
 ランタイム:Python3.7
スクリーンショット 2023-02-25 17.37.40.png

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

・一般設定
「設定」→「一般設定」→「編集」
メモリを「256MB」に設定
タイムアウトを「1分30秒」に設定
「保存」をクリック
スクリーンショット 2023-02-25 17.42.14.png

・レイヤー設定
「layers」をクリック
スクリーンショット 2023-02-25 17.54.06.png
「レイヤーの追加」をクリック
スクリーンショット 2023-02-25 17.55.05.png
「カスタムレイヤー」を選択
 名前:selenium-layer
バージョン:1
「保存」をクリック
スクリーンショット 2023-02-25 17.55.26.png
※headless-layerも同じように追加する。

・環境変数の設定
「設定」→「環境変数」→「編集」→「環境変数の追加」
手順(1)で取得した、トークンとユーザIDを設定
楽天証券ログイン情報を設定
「保存」をクリック
スクリーンショット 2023-02-25 17.48.53.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
LINEの期待結果
IMG_8633.jpg

(4)定期実行を設定
・サービス欄からを EventBridge 検索して、起動
スクリーンショット 2023-02-25 18.18.03.png

・「ルール」をクリック

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

・任意の名前を入力→「スケジュール」を選択→「続行してルールを作成する」をクリック
スクリーンショット 2023-02-25 18.23.16.png

・パターン設定
ローカル時間9時になるように設定し、「次へ」をクリック
スクリーンショット 2023-02-25 18.27.18.png

・ターゲット設定
さきほど作成した、Lambda関数が実行されるよう設定し、「次へ」をクリック
スクリーンショット 2023-02-25 18.29.50.png

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

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

(5)定期実行の期待結果
毎日9時にLINE通知が届くこと(関数の実行時間の都合上9:01になっている)
IMG_8609.jpg

以上です。

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34