三菱東京UFJダイレクトのページの操作を自動化して、口座残高を調べる

家計簿アプリ自給自足の一環。今日はブラウザ操作を自動化して、口座残高を調べます。VISA デビッドをつかったらメールが来るように設定しているので、最終的にそれをハンドリングして、口座残高を LINE とかに通知したい。

こんなかんじの Pythonスクリプトを書きました。三菱東京UFJダイレクトのページにログインして、口座残高が書かれた要素を調べます。ブラウザは PhantomJS, 自動操作には WebDriver (Selenium2) を使うので、事前に PhantomJS と pip で selenium パッケージをインストールしておきます。

# -*- coding: utf-8 -*-
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.common.exceptions import TimeoutException

def get_amount():
    MUFG_URL = 'https://entry11.bk.mufg.jp/ibg/dfw/APLIN/loginib/login?_TRANID=AA000_001'

    ID = os.environ['MUFG_ID']
    PASSWORD = os.environ['MUFG_PASSWORD']
    browser = webdriver.PhantomJS()

    try:
        browser.get(MUFG_URL)

        WebDriverWait(browser, 10).until(
            expected_conditions.presence_of_element_located(
                (By.ID, 'account_id')
            )
        )

        browser.find_element_by_id('account_id').send_keys(ID)
        browser.find_element_by_id('ib_password').send_keys(PASSWORD)
        # 要素をクリックしたけど効かなかったので、onclickで呼び出している関数を呼び出す
        browser.execute_script('gotoPageFromAA011();')

        WebDriverWait(browser, 3).until(
            expected_conditions.presence_of_element_located(
                (By.ID, 'setAmountDisplay')
            )
        )

        return browser.find_element_by_id('setAmountDisplay').text
    except TimeoutException:
        browser.save_screenshot('debug.png')
        raise
    finally:
        browser.quit()

if __name__ == '__main__':
    print(get_amount())
  • 最初、Chrome でやろうとしていたけど、Chrome driver と selenium パッケージの相性が悪いのか動かなかった
  • Node のほうが、Nightmare や Protractor のような WebDriver API をラップして使いやすくしたパッケージが多いのだけど、サーバを Python で書こうとしているので合わせて Python で書くことにした
  • ログインボタンのクリック処理が動かなくて、仕方なく、ボタンの onclick属性 に書かれていた関数を呼び出すようにした