Webブラウザを操作したり自動化するためのフレームワーク、Selenium。WordPressの管理画面上での操作を定期的に行っているのですが、これを自動化するためにSelenium、Pythonを使って処理ができそうなので勉強も兼ねてプログラムを書いてみています。
今回はPythonでSeleniumを利用してWordPressにログインする際に、二段階認証が有効になっている場合の方法をご紹介します。
目次
二段階認証は自動化のハードルが高い
WordPressの管理画面にログインする場合、以下のフローとなります。
- ログイン画面を開く
- ユーザー名(またはEメール)とパスワードと入力
- 入力後、送信ボタンをクリック
- ログイン成功
これをPythonで書いてあげれば良くて、この方法は至るところで紹介されており特に難しくありません。
問題は二段階認証です。WordPressのセキュリティ対策として二段階認証は特別なものではなく対応しているところも多いです。二段階認証をPythonでどうやって突破できるか色々調べました。
Python+Seleniumで2段階認証(6桁のパスコード)を突破する全手順 | たぬハック
MacでGoogleの2段階認証(ワンタイムパスワード)をコマンド一発で取得する方法 – chat-blog
上記で紹介されている「oath-toolkit」ライブラリをインストールすることで6桁のパスワードを生成してくれるため、二段階認証側に追加してあげればいけそうな気がするのですが、WordPress側の二段階認証をどうやって生成しているかにもよって方法が変わってくるため、そのあたりのハードルがちょっと高そうでした。
二段階認証は手動で対応し、成功後の動作から自動化する
ならば、二段階認証は手動で対応することで一気にハードルを下げます。目的は二段階認証の自動化ではなく、動作のオートメーション化なので。
Pythonの場合、処理を止めておくには sleep
で指定の時間待つことが可能です。例えば30秒など設定しておけば、その間に二段階認証の6桁のパスワードを確認し、入力して送信し、ログイン成功までを指定した時間で行えばその後の処理はうまく動いてくれそうです。
ですが、時間がかかりすぎて処理開始まで時間がかかったり、逆にもたもたして指定時間をすぎる可能性もあります。なのであまりいい方法とは言えません。
そこで、ログイン成功したかをチェックするプログラムを書きます。
ログインが成功したかどうかを判別し、成功していたら処理を再開する
色々な方法があるかと思いますが、今回は以下の方法を採用しました。
- ログイン時のURLを取得しておく
- ログイン後のURLに変更したかを2秒ごとに確認
- ログイン後のURLに変わっていたら処理を再開
ようはログイン画面のURLとログイン後のURLが別なので、そこだけ確認しておくようにし、変わっていたら処理を続行する、というような単純な繰り返し処理です。
#ライブラリのimportは省略
# ブラウザを開く
browser = webdriver.Chrome()
# 管理画面にアクセス
browser.get("https://ドメイン/wp-login.php") # 管理画面のURLを入力します
sleep(3) # 3秒待つ
# ログイン処理
username = 'ユーザー名' # ここにユーザー名を入力します
password = 'パスワード' # ここにパスワードを入力します
browser.find_element_by_css_selector("#user_login").send_keys(username) # ユーザー名をフォームに入力
browser.find_element_by_xpath("//*[@id='user_pass']").send_keys(password) # パスワードをフォームに入力
browser.find_element_by_css_selector("#wp-submit").click() # 送信をクリック
sleep(3) # 3秒待つ
# 2段階認証は手動対応
url = browser.current_url # 現在のURLを取得
while url == 'https://ドメイン/wp-login.php': # URLを確認しログイン成功したかどうかをチェック
sleep(2) # 2秒ごとに実施
url = browser.current_url # 現在のURLを取得(変わっていたらループを抜ける)
# この後にログイン後の処理を書く
URLを確認しログイン成功したかどうかをチェック
「ブラウザを開く」「管理画面にアクセス」「ログイン処理」といった部分はコメントアウトで書いてある処理です。ライブラリのインポートも含めてここでは割愛します。
「2段階認証は手動対応」部分ですが、非常にシンプルなので説明するまでもないかもしれませんが、一応念の為。
current_url
を使って現在のURLを取得しておきます。現在のURLとは管理画面のログインURLなので、 https://ドメイン/wp-login.php のようなURLになります。while
文の繰り返し処理では、取得した現在のURLと一致するかどうかを判別し、一致したら続くブロック内の処理を実行します。- 現在のURLを取得して代入するというのを
sleep
で2秒ごとに繰り返します。ログインが成功しているとダッシュボードに画面遷移してURLが変わるので、url
にダッシュボードのURLが代入されればループから抜けます。
以上で二段階認証は手動で入力し、その前後の処理を自動化することができました。
ちなみに、管理画面の特定のページに最初から遷移しておきたい場合は、 browser.get("https://ドメイン/wp-login.php")
の時点でログイン後に遷移しておきたいページのURLを入力すれば、WordPress側で自動でリダイレクト処理を行ってくれます。
WordPress内の処理を自動化しラクをする
きっと二段階認証を自動で突破するエレガントな方法があるかと思いますが、とりあえずの方法として手動での対応方法をご紹介しました。
定期的に管理画面にアクセスして決まった処理をしている、という場合はPythonとSeleniumを使って処理を自動で行うことができる可能性があります。
数分の作業だからわざわざコードを書かなくても……とも思いましたが、今までPythonは書いたことがなかったので、自分の勉強のために取り組んでみています。
管理画面からデータをエクスポートし、そのエクスポートしたデータを加工する、ということを定期的に行うためのコードを書いています。結果、自動化までに既に数時間使って試行錯誤していますが……後もう少しです。
これが出来上がったらまた紹介したいと思います。
コメントを残す