三井住友銀行（SMBCダイレクト）サイトにPythonとSeleniumを使ってログインする

三井住友銀行（SMBCダイレクト）のサイトにPythonとSelenium使ってログインする方法を解説します。

※2021/02/22時点の情報です

## 環境
- Windows 10
- Python 3.8
- Selenium 3.141.0

## 全体の処理の流れと注意点
全体の処理の流れについては、下記記事に詳しく書いたのでこちらもあわせて確認してみてください。楽天銀行の例になっていますが、処理の流れは同じです。

https://qiita.com/yoshi2045/items/2fff5bf5f0fa763f7104

また、下記記事では他サイトのサンプル一覧と注意点を解説しているのでこちらも参考にしてみてください。

https://qiita.com/yoshi2045/items/a58a7fbebcb9faad3e15

## 三井住友銀行（SMBCダイレクト）でのポイント
全体の処理の流れについては上記記事を参考していただくとして、ここではNEOBANK（住信SBIネット銀行）サイトにおけるポイントを中心に紹介します。

### ログイン方法が２種類ある

三井住友銀行の場合、ログイン時に使用するIDは

- 店番号・口座番号
- 契約者番号

の２種類あります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459893/d72f5e53-328c-32d8-1b9a-eabf04419d37.png)

本記事のサンプルでは「契約者番号」の例になります。

店番号・口座番号を指定する場合は、find_element_by_id()の引数を

- "USRID1" を　"S_BRANCH_CD"
- "USRID2" を　"S_ACCNT_NO"

にすれば動作するはずです。（すみません、試してません）

### 第一暗証を長期間変えていないとログイン後の遷移画面が異なる

ログイン実行後、マイページが表示されるまで待機させています。

```python
# ページロード完了まで待機
WebDriverWait(browser, 10).until(
    ec.presence_of_element_located((By.CLASS_NAME, "webTitBlock"))
)
```

webTitBlockという要素が表示されるまで待機しているのですが、第一暗証を長期間変えていないと注意喚起画面に遷移します。

本サンプルでは対応していませんが、本来であれば次画面が何画面かのチェック処理を入れたほうがよいでしょう。


### 画面描画が完了するまで時間がかかる？
三井住友銀行の場合、jspで画面構築しているせいなのか分からないですが、時々browser.get()で画面オブジェクト取得後のfind_element_by_id()メソッド呼び出し時にエラーが発生することがありました。

そこでWebDriverWait（）メソッドを呼び出して、対象要素が表示されるまで待機させてみました。

しかし、、それでもエラーが起きる時がありました。。なぜかデバッグ実行で動かすとエラー起きなかったりするんですよね。。もし何か原因知ってる方いらっしゃったら教えてください～

## サンプルコード全文

```python
#
# SMBC（三井住友銀行）サイトへログイン
#

import json
from selenium.webdriver import Firefox, FirefoxOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

# 設定ファイルからログイン情報を取得
login_info = json.load(open("login_info.json", "r", encoding="utf-8"))

# ログインサイト名
site_name = "bank_smbc"

# ログイン画面URL
url_login = login_info[site_name]["url"]

# ユーザー名とパスワードの指定
USER1 = login_info[site_name]["id1"]
USER2 = login_info[site_name]["id2"]
PASS = login_info[site_name]["pass"]

# Firefoxのヘッドレスモードを有効にする
options = FirefoxOptions()
options.add_argument('--headless')

# Firefoxを起動する
browser = Firefox(options=options)

# ログイン画面取得
browser.get(url_login)

# ページロード完了まで待機
# SMBCの場合、jspで画面構築しているせいなのか分からないが、
# 時々find_element_by_idのところでエラーが発生するので
# その場合は以下を追加し対象要素表示まで待機
WebDriverWait(browser, 10).until(
    ec.presence_of_element_located((By.ID, "PASSWORD"))
)

# 入力
# 店番号・口座番号でログインする場合は以下ID
# S_BRANCH_CD
# S_ACCNT_NO
e = browser.find_element_by_id("USRID1")
e.clear()
e.send_keys(USER1)
e = browser.find_element_by_id("USRID2")
e.clear()
e.send_keys(USER2)
e = browser.find_element_by_id("PASSWORD")
e.clear()
e.send_keys(PASS)

# ログイン
button = browser.find_element_by_name("bLogon.y")
button.click()

# ページロード完了まで待機
WebDriverWait(browser, 10).until(
    ec.presence_of_element_located((By.CLASS_NAME, "webTitBlock"))
)

# ログインできたか確認（画面キャプチャ取る）
browser.save_screenshot("../screenshots/bank_smbc/home.png")

browser.quit()

```


## ログイン情報設定ファイル
サイトURLやログイン情報（IDやパスワード）は、JSON形式のファイルに保持するようにしています。以下のサンプルでは三菱UFJ銀行と三井住友銀行の2サイトの情報と設定しています。

"id1", "id2", "pass"の値を書き換えればそのまま使えるはずです。

なお、このファイルだけは絶対に漏洩しないよう、管理方法に注意しましょう！

```json:login_info.json
{
  "bank_ufj": {
    "id": "1234567890",
    "pass": "password",
    "url": "https://entry11.bk.mufg.jp/ibg/dfw/APLIN/loginib/login?_TRANID=AA000_001"
  },
  "bank_smbc": {
    "id1": "01234",
    "id2": "56789",
    "pass": "password",
    "url": "https://direct.smbc.co.jp/aib/aibgsjsw5001.jsp"
  }
}
```