#3 マトリクス認証でパスワードを自動入力する ~Python + GoogleChrome + Selenium でマトリクス認証を突破する~

1. マトリクス認証とは
2. SeleniumでWebを自動操作してみる
3. マトリクス認証でパスワードを自動入力する ← 今回
4. Seleniumをexeファイル化し、クリック1つで認証を完了させる

注意事項

* クラッキング目的ではありません。あくまで個人目的で使用しましょう。
* プログラムが流出するとマトリクス認証を破られます。管理には気を付けてください。
* テストには自分で作成したWebサイトを使用します。エンタープライズのマトリクス認証でテストをするのは避けましょう。

Seleniumを使ってオブジェクトを取得する

Seleniumを使ってデータを取得する際に、基本的に使われる属性としては以下のようなものがあります。

# idから取得
driver.find_element_by_id('xxx')

# classから取得
driver.find_element_by_class_name('xxx')

# nameから取得
driver.find_element_by_name('xxx')

しかしながら、id, class, nameがないタグも存在します。
属性がないデータを取得する際には、XPathを利用すると便利です。

XPathとは?

XML形式のデータは、ツリー形式の構造で表現できます。
XPathはその特徴を利用して位置を識別できるようにするPathのことです。

XPathの確認の仕方

XPathGoogleChromeの開発者ツールから確認できます。WindowのF12キーまたは右クリックから「検証」を選択し、開発者ツールを起動させましょう。
開発者ツールの左上のクリックマークからXPathを確認したい要素を選択します。

f:id:lc-xx16:20200506224300p:plain

HTMLのコードが表示されるので、右クリックから「Copy」-「Copy XPath」でXPathが取得されます。
f:id:lc-xx16:20200506224303p:plain

/html/body/table/tbody/tr[2]/td[2]

このようにツリーのルートから要素までのパス(XPath)がコピーされます。
XPathを用いてSeleniumからオブジェクトを取得しましょう。

SeleniumXPathに存在するデータ取得する
obj = driver.find_element_by_xpath('/html/body/table/tbody/tr[2]/td[2]')
print(obj.text)

=> 2

XPathでデータが取得できました。
このようにHTMLドキュメントのルートからのPathが変わらなければnameやidなどの属性がなくとも値を取得できます。

マトリクス認証を突破してみる

マトリクス認証においてテーブルのデータが変化しても位置が変わらなければデータを取得し、パスワードを入力することが可能です。

from selenium import webdriver

# WebDriverを保存したURL
DRIVER_URL = 'D:\selenium\chromedriver.exe'

# 操作対象のWebURL(今回はローカルのhtmlを操作)
WEB_URL = 'file:///D:/selenium/sample.html'

# ドライバーを読み込む
driver = webdriver.Chrome(DRIVER_URL)

# ページを開く
driver.get(WEB_URL)

# 'password'というnameのオブジェクトを取得する
password = driver.find_element_by_name('password')

# XPathでパスワードの位置を定義する
pass_list = []
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[2]/td[2]').text)
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[2]/td[3]').text)
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[2]/td[4]').text)
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[2]/td[6]').text)
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[2]/td[7]').text)
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[3]/td[7]').text)
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[3]/td[8]').text)
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[3]/td[9]').text)
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[4]/td[9]').text)
pass_list.append(driver.find_element_by_xpath('/html/body/table/tbody/tr[4]/td[11]').text)

# passwordのオブジェクトにパスワードを入力する
password.send_keys(pass_list)

# passwordをsubmit
password.submit()

f:id:lc-xx16:20200506224310p:plain
自分が定義した位置と順番でパスワードを入力できました。最終行の

password.submit()

でパスワードがsubmitされ認証が完了します。

まとめ

今回はSeleniumXPathでマトリクス認証を突破しました。
しかし実際にサイトログインする際に、わざわざpythonコマンドラインや実行環境から実行するのは面倒だと思います。
そこで、次回は1クリックで起動できるようにexe化する方法を解説したいと思います。