.NET6.0のSeleniumで2段階認証に妥協的でもいいからとりあえず対応したい!
概要
今回の記事では、.NET6.0のSeleniumで2段階認証に妥協的でもいいからとりあえず対応する手順を掲載する。
業務で1日1回特定の時間にあるサイトにログインして、データをダウンロードする作業をSeleniumで自動化してたんだけども、ある日からこのサイトが2段階認証を導入した影響でログインがうまくいかなくなった。
しかも、この2段階認証はSMSか専用のスマホアプリを使う必要があって、Seleniumだけではどうにもならなそうな感じ。
とりあえず妥協的に対応したのでその記録です。
仕様書
環境
- NET6.0
- Selenium.Support 4.3.0
- Selenium.WebDriver 4.3.0
- Selenium.WebDriver.ChromeDriver 103.0.5060.5300
手順書
まず、Chromeで任意のユーザーで2段階認証をしておく。このキャッキュ?をSeleniumで使う。サイトによってここら辺は仕様が違うのでこのやり方でうまくいかない可能性があることについては留意しておいてほしい。
次にWebDriverのインスタンス化の際にオプションでChormeのプロフィールパスを指定する。
プロフィールパスを確認するには、Chromeのアドレスバーにchrome://version/
と入力して、移動すると。Chromeのバージョンなどといっしょに表示される。
下記のようなパスになってると思う。
C:\Users\<UserName>\AppData\Local\Google\Chrome\User Data\Default
下記はWebDriverのインスタンス化の際にオプションでChormeのプロフィールパスを設定するサンプルのコード。
ChromeOptions options = new ChromeOptions();
options.AddArgument("user-data-dir=C:\\Users\\UserName\\AppData\\Local\\Google\\Chrome\\User Data\\Default");
IWebDriver driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), options);
options.AddArgument("user-data-dir=<プロフィールパス>")
のような感じでプロフィールパスを設定する。
この状態でプログラムを実行すると2段階認証は認証済みになってて、IDとパスワードでログインできる状態になってる。状況によっては、ログイン済みになってる可能性もあるので状況によって処理を切り替えれるようプログラム側で対応しておく。
まとめ(感想文)
セキュリティ的に仕方ないんだろうけどもめんどい。