こんにちは、ハッカー見習いのたぬ(@tanuhack)です!
Seleniumを使って、セキュリティが高めなWebサイトを自動操作をするときの強敵といえば何が思いつきますか?
そう、Googleの『2段階認証プロセス(6桁のパスコード)』ですよね!
そのため、入力を高速でしないといけなかったり、スマホが無かったら解錠ができなかったりと、手間が増え大変です。
しかし、今回紹介する方法を用いれば、なんとPython+Seleniumだけで『6桁の2段階認証』を突破することができるようになります!
それでは、どうぞ!
Macユーザー向けに書いているところが多々あります。Windowsユーザーの方は、適宜コマンドを修正しながら読み進めて下さい。
目次
下準備
- oath-toolkitをインストール
- アカウント追加用キーを取得
oath-toolkitをインストールする
ターミナルで以下のコードを入力するだけです。
アカウント追加用キーを取得する
各サイトの2段階認証設定ページから、QRコードが表示されるページまでアクセスします。
サイトによって文言は異なりますが、『CAN'T SCAN IT』や『スマートフォンのみをご利用の場合』等の文言が書いてるリンクをクリックすると、アカウント追加用キーが取得出来ます。
今回は例として、『amazon seller central』という2段階認証設定を紹介します。参考程度に流してください。
STEP1:2段階認証設定のページにアクセスする
STEP2:QRコードが表示されるページまでたどり着く
STEP3:アカウント追加用のキーを保存する
キーを保存すれば完了です。
『oath-toolkitのインストール』と『アカウント追加用キーを取得』まで終わったことを確認して、次はPythonからその6桁の数字を取得してみましょう!
Pythonでパスコードを取得
まず、ターミナルでインストールした『oath-toolkit』を使って、正常に6桁の数字が返されるか確認します
大丈夫だと思いますが、1分おきに6桁の数字がちゃんと変わるか確認しておいておくと安心ですね。
PythonでUNIXコマンドを使う
まず、PythonでUNIXのコマンドを使うために、subprocessモジュールをインポートして、oathtoolコマンドを実行します。
import subprocess
two_step_authentication = ['oathtool', '--totp', '--base32', 'アカウント追加用のキー']
print(subprocess.check_output(two_step_authentication))
正規表現やデコードして文字列を整える
一見、さっきのプログラムで6桁のパスコードが返されているように見えますが、文字タイプがbytesになっていたり、不要な文字列があったりと不十分です。
デコードしたり、不要な文字列を取り除いたりして6桁の数字だけに文字整形します。
import subprocess
import re
two_step_authentication = ['oathtool', '--totp', '--base32', 'アカウント追加用のキー']
SecondLoginPass = re.findall(r'\d+', subprocess.check_output(two_step_authentication).decode('utf-8'))
print(SecondLoginPass[0])
6桁の文字列が取得できれば、後はSeleniumのsend_keysを使って、パスワードを入力するだけです!!
お疲れ様でした。
[aside] Seleniumモジュールの使い方が分からない人は、こちらからどうぞ!【完全版】PythonとSeleniumでブラウザを自動操作(クローリング/スクレイピング)するチートシート [/aside]
最後に
今回は、PythonとSeleniumを使って、二段階認証を突破するための6桁の数字を取得する方法を紹介しました。
堅牢な二段階認証ですらもPython+Seleniumで突破して、どんどん作業を効率化させよう!!
それでは。
[aside]補足reCAPTCHAも突破したい欲張りさんは過去記事を参考にどうぞ!
【2Captcha】Python+Seleniumで『reCAPTCHA』を突破する方法 [/aside]