はじめに
こんにちは。記事を見てくださってありがとうございます。
今回はPowershellを使ってWebサイトに自動ログインする方法について解説していきたいと思います。
また、この方法ではInternet Explorerが必要(Edgeでも可能かもしれないけど調べられていない…)なのと、環境によってPowerShellの実行権限を変えなくてはならないので、各自用意と変更お願いします。
あと、ログイン時にロボットではありませんの認証があるサイトも無理です。
コード
まずはコードを添付します。
今回は例として、勤怠管理サービスである”IEYASU”というサイトにログインを行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[void][System.Reflection.Assembly]::Load("Microsoft.VisualBasic, Version=8.0.0.0,Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a") $ie = New-Object -ComObject InternetExplorer.Application $ie.Visible = $true $loginId = "ここにログインアドレスを入力" $loginPassword ="ここにパスワードを入力" ##Login Start## $ie.Navigate("https://f.ieyasu.co/*****/login/") Start-Sleep -s 1 while ($ie.Busy){ Start-Sleep -s 1 } Start-Sleep -s 1 $doc = $ie.document $idElements = $doc.IHTMLDocument3_getElementById("user_login_id") $idElements.value = $loginId $pwElements = $doc.IHTMLDocument3_getElementById("user_password") $pwElements.value = $loginPassword $inputElements = $doc.IHTMLDocument3_getElementsByName("Submit") $inputElements[0].click() ##Login End## Start-Sleep -s 1 while ($ie.Busy){ Start-Sleep -s 1 } Start-Sleep -s 1 $ie.Quit() $ie = $null |
コード解説
上から順に解説していきます。
1 |
[void][System.Reflection.Assembly]::Load("Microsoft.VisualBasic, Version=8.0.0.0,Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a") |
IEを使うための初期設定の部分です。私もあまり理解していないんで解説できませんが、IEを使う際に記載する魔法陣みたいなものです。
1 |
$ie = New-Object -ComObject InternetExplorer.Application |
これは”ie”という変数にInternet Explorerを入れています。わかりにくいかもしれませんが、アプリケーションを変数に入れることによって、コードで操作できるようになります。
1 |
$ie.Visible = $true |
ここで”ie”という変数に入れたInternet Explorerを可視化してます。可視化するとInternet Explorerのウィンドウが表示されます。逆に言うと何もしなければ表示されません。
可視化するかどうかは変数化したInternet Explorerの中のVisibleというパラメータを$trueすればいいので、上記コードで$trueにしています。(デフォルトでは$false)
1 2 |
$loginId = "ここにログインアドレスを入力" $loginPassword ="ここにパスワードを入力" |
これは後に使用する、ログインIDとログインパスワードを記載しています。
1 |
$ie.Navigate("https://f.ieyasu.co/*****/login/") |
※会社名の部分を*****でマスクしています。
このように記載することでブラウザがURLに飛んでくれます。
1 2 3 4 5 |
Start-Sleep -s 1 while ($ie.Busy){ Start-Sleep -s 1 } Start-Sleep -s 1 |
これはInternet Explorerがページを読み込むまで待機するという指示を書いています。
$ie.Busyが$trueだったら(IEが読み込み中だったら)1秒待つという操作を、読み込みが終わるまで繰り返しています。
1 |
$doc = $ie.document |
このコードを実行することによって、現在Internet Explorerが開いでいるWebページを$docという変数に入れています。
1 |
$idElements = $doc.IHTMLDocument3_getElementById("user_login_id") |
スクリプトの重要な部分です。
1 |
$doc.IHTMLDocument3_getElementById("取得したいHTML要素のID") |
と記載しIDを指定することで、HTMLの要素をPowerShellで扱えるようになります。
そして取得したいHTML要素のIDは、取得したい部分で右クリック→検証を選択。
すると開発者ツールが立ち上がった後、選んだ部分のHTMLが表示されるので、id=”*****”と書かれた部分をスクリプト内のコードに組み込んでください。
そして$idElementsという変数に入れることで、この名前でIDを入力するためのテキストボックスを扱えるようになります。
1 |
$idElements.value = $loginId |
先ほど定義した$idElementsのvalueプロパティに、ログインIDを代入するこでブラウザに入力できます。
1 2 |
$pwElements = $doc.IHTMLDocument3_getElementById("user_password") $pwElements.value = $loginPassword |
こちらもログインIDと同様処理を行っている為、説明は割愛します。
1 2 |
$inputElements = $doc.IHTMLDocument3_getElementsByName("Submit") $inputElements[0].click() |
このコードは先ほどと少し異なっており$doc.IHTMLDocument3_getElementsByName(“Submit”)となっています。
理由はシンプルで、ログインボタンの要素にid=”*****”という記載がないのです。
ただし、”id”の記載がなくても別の方法で要素の指定ができます。そこで今回はgetElementsByNameという”name”で指定する方法を選びました。
指定するしくみは先程と同じなのですが、getElementsByNameでHTML要素を指定し変数に代入した場合、配列になってしまいます。(深い解説はしませんが、name属性は同じ内容で複数存在する可能性があるため)
ですので、”inputElements[0].click()”と配列の形式で”click()”を実行することで、ログインボタンを押すというアクションが起こせます。※今回は同じname属性がなかったので”inputElements[0]”で実行できましたが、HTMLよって”inputElements[1]”になったり”inputElements[2]”になったりします。
1 2 3 4 5 |
Start-Sleep -s 1 while ($ie.Busy){ Start-Sleep -s 1 } Start-Sleep -s 1 |
ログインボタンを押すとロードが始まるので、再度ロード待ちを行います。解説は重複するのでしません。
本来であればこの後、打刻ボタンを押したりなど処理を行いますが、この記事は自動ログインの解説なので処理はここで一旦終了します。
1 2 |
$ie.Quit() $ie = $null |
最後にInternet Explorerを閉じる処理を行います。ウィンドウ右上の[×]ボタンを押す操作を、コードでやるとこうなります。
解説は以上です。
おわりに
今回はPowerShellを使った自動ログイン処理の解説を行いましたが、いかがだったでしょうか。
私は打刻漏れ防止のために、この自動ログインスクリプトを実行した後、出勤を押すというスクリプトを組んで社用PCにログインしたタイミングで実行するようにしています。
ログインしたタイミングでPowerShellを実行するのもかなり簡単で便利なので、またの機会に紹介出来たらなと思います。
読んでいただきありがとうございました。
コメント