mizuho_bank
· 🪦 retired
みずほダイレクト(みずほ銀行のインターネットバンキング)に Ruby からアクセスするためのライブラリです。Mechanize でログイン画面の遷移(お客さま番号 → 合言葉 → パスワード)を自動化し、口座残高や入出金明細を Ruby のオブジェクトとして取り出せます。
当時 gem として公開していました。API のない時代に、自分の口座情報をプログラムから扱うためのスクレイパーです。
gem install mizuho_bank
使い方はこんな感じです(README より)。認証情報はコードに直書きせず、アカウント情報管理の Pit から読み込む前提の作りです。
require 'mizuho_bank'
require 'pit'
pit = Pit.get("MizuhoBank", :require => {
"keiyaku_no" => "keiyaku_no",
"password" => "password",
# 合言葉(秘密の質問)3組の question/answer も同様に登録しておく
})
aikotoba_dict = {
pit['aikotoba1_question'] => pit['aikotoba1_answer'],
pit['aikotoba2_question'] => pit['aikotoba2_answer'],
pit['aikotoba3_question'] => pit['aikotoba3_answer']
}
MizuhoBank.new(pit['keiyaku_no'].to_s, pit['password'].to_s, aikotoba_dict){ |bank|
p bank.info.main_account.money # 口座残高
p bank.info.main_account.cache_flows # 最近の取引履歴
}
内部設計
コンポーネント構成です。中核の MizuhoBank クラスがログイン処理とページのパースを束ねていて、結果は MizuhoDirectInfo/MizuhoAccount/MizuhoCacheFlow というプレーンなデータクラスに詰めて返します。
- ログインはステートマシン(
lib/mizuho_bank.rb)—「次にどのページが来るか」を決め打ちにせず、what_is_this_page?が現在のページ本文に含まれる文言(「お客さま番号を入力し…」「合言葉確認」など)からページ種別を判定し、ループで対応する入力処理に振り分けます。銀行側が認証ステップを出したり出さなかったりしても追従できる作りです - 合言葉(秘密の質問)対応 — 合言葉ページでは質問文を Nokogiri で抜き出し、コンストラクタに渡した「質問文 → 答え」の辞書(
aikotoba_dict)を引いて回答します。3組の質問のどれが出ても対応できます - リトライ — ログイン処理全体を自作 gem の retry-handler で包んでいて、失敗時は 5 秒間隔で最大 5 回やり直します
- サービス時間外の検知 — みずほダイレクトには定期メンテナンスの時間帯があり、公式の時間外案内ページをスクレイピングして「毎週土曜深夜」「第1・第4土曜」のパターンを
RepeatDateRangeに落とし、現在時刻がそこに入っていればログイン自体を止めます。「1st saturday in this month」のような英語表現を Chronic に渡して実時刻に解決しています - パース — ログイン後のトップページから利用者名・最終ログイン日時・代表口座(店名・取引種類・口座番号・残高・引き出し可能残高)と直近 10 件の入出金を、明細照会ページから月単位の入出金明細を、それぞれテーブルの位置指定(
nth-childや添字)で抜き出します。サイトは Shift_JIS なので、入力値はtosjis、取得ページはtoutf8で変換しています
ログインから明細取得までの流れです。
既知の問題として、合言葉に失敗し続けたときに要求される画像認証には対応していません(README 記載)。また、パースがページの文言とテーブル構造に密結合なので、サイト側の改版で動かなくなる種類のコードです。