Basic認証の自動ログイン「ieBasic2」の解説
前回の「Basic認証自動ログイン「ieBasic」」では、リクエストのヘッダ「Authorization」に直接ユーザー名・パスワードを格納してアクセスする方法を説明しました。
しかし、こちらの方法はデータ取得はできてもボタンクリックなど行う場合は、毎回リクエストする必要があり非常に手間です。
今回は、ヘッダーへリクエストするのではなく、「SendKeysステートメント」を使用した方法を解説します。
Basic認証(ベーシック認証)自動ログインのサブルーチン
Private Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Private Declare Function GetKeyboardState Lib "user32" _
(pbKeyState As Byte) As Long
Const VK_NUMLOCK = &H90 '「NumLock」キー
Const KEYEVENTF_EXTENDEDKEY = &H1 'キーを押す
Const KEYEVENTF_KEYUP = &H2 'キーを放す
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
Sub ieBasic2(urlName As String, _
basicId As String, _
basicPass As String)
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.navigate urlName
'5秒停止
Sleep 5000
SendKeys basicId
SendKeys "{TAB}"
SendKeys basicPass
SendKeys "{ENTER}"
'IEが完全表示されるまで待機
Call ieCheck(objIE)
'「NumLock」キーをON
Call numLockOn
End Sub
「NumLock」キーをONにするサブルーチン
sub numLockOn()
Dim NumLockState As Boolean
Dim keys(0 To 255) As Byte
GetKeyboardState keys(0)
NumLockState = keys(VK_NUMLOCK)
'「NumLock」キーがオフの場合はオンにする。
If NumLockState <> True Then
'キーを押す
keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
'キーを放す
keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
End If
End sub
Basic認証自動ログインのマクロ
Sub sample()
Dim objIE As InternetExplorer
'Basic認証ページへアクセスする
Call ieBasic2("http://www.vba-ie.net/basic/test3.html", "user", "123456")
End Sub
実行結果
引数は以下の3つが設定されています。
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
---|---|---|---|---|---|
urlName | String | 表示させたいBasic認証URLの文字列 | "http://www.vba-ie.net/ basic/test3.html" | × | |
basicId | String | Basic認証のユーザー名文字列 | "user" | × | |
basicPass | String | Basic認証のパスワード文字列 | "123456" | × |
こちらは、全て必須項目となります。
「urlName」には、表示させたいBasic認証URLの文字列を設定します。
「basicId」にはBasic認証のユーザー名文字列を「basicPass」にはBasic認証のパスワード文字列を設定します。
それでは、1つずつコードを見ていきましょう。
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.navigate urlName
こちらは何度も見ていますので理解できるかと思いますが、「urlName」で指定したURLをIEで開いています。
ここではこれまでと1つだけ違う点があります。
Navigateメソッドはページを表示させますが、Webブラウザがページを完全に表示するまで待ってはくれないと説明したのを覚えているでしょうか?
今回は、読込完了せずに処理を進めていきます。
なぜ、完了せずに処理を進めるかというと、今回はWebブラウザが表示されたと同時にBASIC認証の画面が表示されます。
認証画面が表示されている間は、ページにアクセスできていないので、もし読込待ちの処理を入れてしまうと、無限ループに陥るためです。
ですので、認証が完了した後に、読込待ちの処理を入れていきます。
'5秒停止
Sleep 5000
ページを表示させてから5秒停止の処理を入れています。これはBASIC認証画面が完全に表示されるのを待つための処理です。
PC環境によっては、停止する秒数を変更してください。
SendKeys basicId
SendKeys "{TAB}"
SendKeys basicPass
SendKeys "{ENTER}"
こちらは「SendKeysステートメント」を利用して直接入力処理を行っています。
まず、basicIdで設定されているユーザー名を入力します。次に{TAB}でタブキーを押下し、パスワードのテキストボックスをフォーカスにします。そしてbasicPassで設定されているパスワードを入力し、最後に{ENTER}でEnterキーを押下(press)させ、認証を行っています。
Call ieCheck(objIE)
認証が完了したら、ページにアクセスしますので、ここで「ieCheckサブルーチン」を設定し、完全に読込が完了するまで待ちます。
Call numLockOn
ここでアクセスは完了なのですが、「SendKeysステートメント」にはNumLockキーがオフになるバグが存在します。
「numLockOnサブルーチン」はそのバグに対応するためのもので、NumLockキーをオンにする処理を入れています。
それでは、「numLockOnサブルーチン」を見ていきましょう。
Private Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Private Declare Function GetKeyboardState Lib "user32" _
(pbKeyState As Byte) As Long
Const VK_NUMLOCK = &H90 '「NumLock」キー
Const KEYEVENTF_EXTENDEDKEY = &H1 'キーを押す
Const KEYEVENTF_KEYUP = &H2 'キーを放す
今回は、NumLockキーをオンにするためにWindowsAPIの「keybd_event」を利用します。
「keybd_event」は、「SendKeysステートメント」と同様の機能で任意のキーを操作することができます。尚、「SendKeysステートメント」では操作が不能なWindowsキーの操作も可能です。
また、キーボードの状態を確認する必要があるので、「GetKeyboardState」も利用していきます。
上記の宣言は「keybd_event」「GetKeyboardState」を利用するためのものですので、利用する際はそのままコピーしてください。
次に定数の設定がされていますが、「VK_NUMLOCK = &H90」は「NumLock」キーを設定しています。
keybd_eventではキーを「押す」「放す」の処理を別々に指定しなければならないため、「KEYEVENTF_EXTENDEDKEY(押す)」「KEYEVENTF_KEYUP(放す)」を設定しています。
GetKeyboardState keys(0)
GetKeyboardState関数を呼び出す場合に、keys配列の先頭を引数として渡します。
キーの状態を正常にできた場合は0以外とできなかった場合は0を返します。
NumLockState = keys(VK_NUMLOCK)
NumLockState変数に「NumLock」キーを設定します。
If NumLockState <> True Then
'キーを押す
keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
'キーを放す
keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
End If
「NumLock」キーがOFFの場合は、keybd_event関数で「NumLock」キーを押す→放すの処理をしてONにします。
これで認証が完了となります。
この後にクリック処理を入れても再度認証画面が表示されることはありませんので、操作することが可能です。「ieBasic」「ieBasic2」サブルーチンどちらを利用しても大丈夫ですので、用途に合わせてご利用ください。
次の記事: VBAでIE操作に役立つIEのバージョンチェック >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。