#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の確認の仕方
XPathはGoogleChromeの開発者ツールから確認できます。WindowのF12キーまたは右クリックから「検証」を選択し、開発者ツールを起動させましょう。
開発者ツールの左上のクリックマークからXPathを確認したい要素を選択します。
HTMLのコードが表示されるので、右クリックから「Copy」-「Copy XPath」でXPathが取得されます。
/html/body/table/tbody/tr[2]/td[2]
このようにツリーのルートから要素までのパス(XPath)がコピーされます。
XPathを用いてSeleniumからオブジェクトを取得しましょう。
SeleniumでXPathに存在するデータ取得する
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()
自分が定義した位置と順番でパスワードを入力できました。最終行の
password.submit()
でパスワードがsubmitされ認証が完了します。
まとめ
今回はSeleniumのXPathでマトリクス認証を突破しました。
しかし実際にサイトログインする際に、わざわざpythonをコマンドラインや実行環境から実行するのは面倒だと思います。
そこで、次回は1クリックで起動できるようにexe化する方法を解説したいと思います。