僕の環境では9月13日よりSBI証券の二段階認証メールが「HTMLメール」に変わった。
二段階認証を受け取っていた「さくらインターネット」の有料Webメーラーはセキュリティ上、HTMLメールは非対応。
HTMLメール非対応の場合には二段階認証URLをクリックしても、有効なURLと判断されない仕様になってしまった……。
ふ、ふざけるな!!!!!!
【写真】ARuFa氏
HTMLメールは「Webビーコン」を埋め込まれたりと、犯罪に使われやすいから禁止にしている企業やサービスだって未だに多くある。

半年で4回も仕様をコロコロ変えるSBIの企業体制は疑問しかない。40秒の時間制限も60秒に伸びてたし。
ちなみに全資産を楽天証券に近々移行予定だ。
5月、6月、8月に変更して、今回の変更で合計4回目となった。






今回提案する方法は
二段階認証キーをYahooメールで受け取る処理を自動化
となる。
多くの人はGmail/Yahooメール/Hotmailを利用していると思うので、汎用性は高い方法だ。
「じゃぁ最初からやれよ」となるが、Yahooメールはセキュリティ対策として幾つもの画面制御を入れてるから動きを理解するのに時間がかかった。
Yahoo!メールへログインし二段階認証を突破する
SBI証券の二段階認証突破は前回作った部分がそのまま利用できる。



今回はYahooメールの自動化に焦点をあてる。
「文字認証(CAPTCHA)」を突破する(自動対応)
自動でログインしようとすると次のような文字認証が表示される。
手動によるChromeのシークレットモードでは表示されない。ロジックが分からないが次の理由だと書かれてる。
- ブラウザー設定やネットワーク環境による影響の場合
- 連続して誤った入力を行った場合
- スパイウエアやウイルスによる影響の場合
全く分からないね……
文字認証を真面目に突破するなら「2Captcha」や「Anti-Captcha」などの外部サービスを利用する。ただし有料。
表示理由さえ分かれば表示されなくできると思っている。誰か教えて欲しい。
最初にして最大の難関
これが表示されるからYahooメールの自動化を諦めていたと言っても過言ではない。
が、試行錯誤を繰り返して「新規タブ」を開く事で文字認証を回避できることを発見した。
恐らく
同一コンテキスト内でセッション情報(クッキーや認証状態)が共有され、Yahoo!が連続アクセスを信頼済みと判断するため
だと思ってる。
ただし 抜け穴でありYahooに対策されそうな気がしてる。内密にね❤
てか、これが抜け穴なら全く役に立ってないww
「追加認証」を突破する(手動対応)
初回デバイス&ブラウザでアクセスすると次のような画面が表示される事がある。
これは初回アクセスすれば表示されなくなる(はず)ので手動で行う。実装による突破は未対応。
「第三者からの不正アクセス」画面を突破する(手動対応)
初回デバイス&ブラウザでアクセスすると次のような画面が表示される事がある。
これも初回アクセスすれば表示されなくなる(はず)ので手動で行う。実装による突破は未対応。
「SMS認証設定画面」を突破する(自動対応)
これも表示された。
これが表示された場合には「あとで設定する」ように実装に追加している。
恐らく何日か経過したら再度表示される類だと思ってる。
呼び出し方法
前回、再利用性を考慮した実装にしたため変更箇所は「mail_operation関数」だけだ。



呼び出し部分は変わらない。
動作確認のためにヘッドレス設定を「False」にしているが、動作することが分かれば「True」にする。
【main.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#coding: utf-8 from sbiauth import SbiAuthenticator import logging import os import re # ログの設定 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s [%(filename)s:%(lineno)d]') logger = logging.getLogger(__name__) if __name__ == '__main__': try: authenticator = SbiAuthenticator( sbi_username="SBI_USERNAME", # SBIユーザ名 sbi_password="SBI_PASSWORD", # SBIパスワード mail_username="MAIL_USERNAME", # Yahooメールユーザ名 mail_password="MAIL_PASSWORD", # Yahooメールパスワード headless=False # ヘッドレス設定(Trueで非表示、Falseで表示) ) playwright, browser, sbi_page = authenticator.authenticate() 好きな処理関数(sbi_page) authenticator.close() except ValueError as e: logger.error(f"認証エラー: {e}") raise except Exception as e: logger.error(f"予期しないエラー: {e}") raise |
おわりに
注意としてメール設定はSMS認証やワンタイムパスワード等は全て「未設定」にする必要がある。
今後Yahooメールにも不正アクセス等が問題化すると、新しい認証方式が必須化されるかもしれない。
そうなると「SBI証券の仕様変更」「Yahooメールの仕様変更」両方に影響されてしまう。
今回の対応だけでも動作確認&ブログ執筆で3連休が潰れたのに……僕はもう疲れたよパトラッシュ。
ソースコード
「sbiauth.py」という名前で同じフォルダに置いておく。
変更箇所は「mail_operation」だけだ。そういう実装にしていたからね。
今回は特殊環境ではない実装なのでGitHubに置いておいた。
