Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

VBAプログラム開発、スクレイピング・ログイン機能【2-3-2】ログイン処理をプロシージャ化する(ログインプロシージャ作成)

メインプロシージャまで作成できました。続けてログインプロシージャを作成していきます。

実施内容

ログインプロシージャを作成する

では、いよいよここからログイン処理としてCallされるプロシージャを確認します。

作成コード

# ログインプロシージャ(ログインプロシージャ)

Sub CheckLogin(objIE As InternetExplorer, htmlDoc As HTMLDocument, _

 Domain As String, ProcessDir As String, CheckFirstLogin As Boolean)

 'オブジェクト設定

  'ログイン設定(ディレクトリ)
  Dim LoginDir As String 'ログインディレクト
  LoginDir = "login" 'ログインディレクトリ指定
  Dim LoginPageURL As String 'ログインページURL
  LoginPageURL = Domain & LoginDir 'ログインページURL生成

  'ログイン設定(Web送信情報)
  Dim LoginEmail As String 'ログインメールアドレス
  Dim LoginPassword As String 'ログインパスワード
  LoginEmail = ThisWorkbook.Worksheets("ログイン設定").Cells(2, 1).Value 'Email
  LoginPassword = ThisWorkbook.Worksheets("ログイン設定").Cells(2, 2).Value 'Password

  '処理結果確認
  Dim LoginAnswer As String 'ログイン結果確認用
  Dim exitmsg As String 'メッセージ表示用
  'URL取得設定
  Dim ProcessPageURL As String '処理実施ページURL
  Dim ResponseURL As String '処理実施ページ表示後URL取得

 '処理実施ページ決定
 If CheckFirstLogin = True Then
  ProcessPageURL = LoginPageURL 'ログインページURL生成
 Else
  ProcessPageURL = Domain & ProcessDir '処理実施ページURL生成
 End If

 '処理実施ページへアクセス後、URL取得
 objIE.navigate ProcessPageURL 'IEで開く
 Call WaitResponse(objIE) '読み込み待ち
 ResponseURL = objIE.document.URL 'URL取得

 'ログイン画面表示時はログイン処理
 If ResponseURL = LoginPageURL Then
  Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット
  'フォーム入力

  htmlDoc.getElementsByName("email")(0).Value = LoginEmail
  htmlDoc.getElementsByName("password")(0).Value = LoginPassword
  htmlDoc.getElementsByClassName("form-group__submit")(0).Click


  'ログイン結果確認
  Call WaitResponse(objIE) '読み込み待ち
  ResponseURL = objIE.document.URL '読み込み後のURL取得
  Debug.Print ResponseURL 'デバッグ確認
  If ResponseURL = LoginPageURL Then
   LoginAnswer = "ログイン失敗"

   'オブジェクト終了処理を実施しておく
   objIE.Quit 'objIEを終了させる
   'ログイン失敗時はアラートをメッセージとして返す
   exitmsg = "ログインに失敗しました。"
   MsgBox exitmsg
   '続きの処理はせずに終了
   End
  Else
   LoginAnswer = "ログイン成功"
  End If
 Else
  LoginAnswer = "ログイン済み"
 End If

 'ログイン済みorログイン後サイトのHTMLオブジェクト取得
 Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット

 '結果確認情報
 Debug.Print "結果表示開始"
 Debug.Print "CheckFirstLogin " & CheckFirstLogin
 Debug.Print LoginAnswer
 Debug.Print "ProcessPageURL " & ProcessPageURL
 Debug.Print "ProcessDir " & ProcessDir
 Debug.Print "Web表示Titleタグ " & htmlDoc.getElementsByTagName("title")(0).innerText
 Debug.Print "結果表示終了"
 Debug.Print ""

 '初回処理終了処理
 If CheckFirstLogin = True Then CheckFirstLogin = False

End Sub

ログイン処理及び動作確認の為のDebug.Printが記載されています。実際にはデバッグは削除することになるので、もう少し短くなります。

 

では、ここから順を追って内容を確認します。

コード自体が長いので、いくつかブロックに分けて再表示しつつ解説していきます。

 

オブジェクト設定

まずは、変数宣言と初期値の設定です。

 

# ログインプロシージャ(オブジェクト設定1)

'ログイン設定(ディレクトリ)
Dim LoginDir As String 'ログインディレクト
LoginDir = "login" 'ログインディレクトリ指定
Dim LoginPageURL As String 'ログインページURL
LoginPageURL = Domain & LoginDir 'ログインページURL生成

ログインディレクトリ変数にログインURLディレクトリ部を指定します。そしてログインURLとして、メインプロシージャで設定したドメインと組み合わせています。

 

# ログインプロシージャ(オブジェクト設定2)

'ログイン設定(Web送信情報)
Dim LoginEmail As String 'ログインメールアドレス
Dim LoginPassword As String 'ログインパスワード
LoginEmail = ThisWorkbook.Worksheets("ログイン設定").Cells(2, 1).Value 'Email
LoginPassword = ThisWorkbook.Worksheets("ログイン設定").Cells(2, 2).Value 'Password 

ログインフォームに入力するメールアドレスとパスワードを設定しています。今回はログイン設定ワークシートから設定を読み取れるようにしました。

 

# ログインプロシージャ(オブジェクト設定3)

'処理結果確認

Dim LoginAnswer As String 'ログイン結果確認用
Dim exitmsg As String 'メッセージ表示用

 

主にデバッグ用にメッセージが出力できる変数を用意しています。

 

# ログインプロシージャ(オブジェクト設定4)

'URL取得設定
Dim ProcessPageURL As String '処理実施ページURL
Dim ResponseURL As String '処理実施ページ表示後URL取得

処理実施ページURLを格納するProcessPageURL

アクセス結果として返されたページのURLを格納するResponseURLを宣言しています。

 

処理実施先URLの決定 

オブジェクト設定完了後は、アクセスするURLを設定します。

# ログインプロシージャ(処理実施URLの決定)

'処理実施ページ決定
If CheckFirstLogin = True Then
 ProcessPageURL = LoginPageURL 'ログインページURL生成
Else
 ProcessPageURL = Domain & ProcessDir '処理実施ページURL生成
End If

CheckFirstLoginの値によって初回アクセスであるか判定しています。

 

初回アクセス時はログインページURLを、

2回目以降であれば、処理を行うURLを、

ProcessPageURLとして設定しています。

 

 

指定URLへアクセスする

接続先が決定したので、実際にアクセスします。

# ログインプロシージャ(処理URLへアクセス)

'処理実施ページへアクセス後、URL取得
objIE.navigate ProcessPageURL 'IEで開く
Call WaitResponse(objIE) '読み込み待ち
ResponseURL = objIE.document.URL 'URL取得

IEオブジェクトに対してnavigateを利用し処理URLへアクセスを実施します。

IEの読み込み完了後、表示オブジェクトからURLだけを取得します。この時点でHTMLは読み込みません。

この時点では、ログインできているかどうか?=ログインページであるかどうかを確認するだけなので、HTML要素はまだ不要です。

 

 

アクセス完了後のURLを確認する(ログイン済) 

アクセス先のURLを元にログイン処理実施可否を判定します。

# ログインプロシージャ(アクセス後URLチェック・ログイン済)

'ログイン画面表示時はログイン処理
If ResponseURL = LoginPageURL Then

 ~ ログイン処理 ~


Else
 LoginAnswer = "ログイン済み"
End If

まず、取得URLがログイン画面URLでない場合。

ログイン画面のURLではないということは、ログイン画面は表示されていません。つまり、実際に処理を行う画面ログイン後の初期表示画面ということになります。

このケースはすでにログイン済ということになります。

 

アクセス完了後のURLを確認する(未ログイン) 

# ログインプロシージャ(アクセス後URLチェック・未ログイン)

'ログイン画面表示時はログイン処理
If ResponseURL = LoginPageURL Then
 Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット
 'フォーム入力

 htmlDoc.getElementsByName("email")(0).Value = LoginEmail
 htmlDoc.getElementsByName("password")(0).Value = LoginPassword
 htmlDoc.getElementsByClassName("form-group__submit")(0).Click


 'ログイン結果確認
 Call WaitResponse(objIE) '読み込み待ち
 ResponseURL = objIE.document.URL '読み込み後のURL取得
 Debug.Print ResponseURL 'デバッグ確認


 ~ ログイン確認詳細 ~

 

Else
 LoginAnswer = "ログイン済み"
End If

取得URLがログインURLであればログイン画面が表示されており、ログインが必要となります。

フォーム入力が必要となるので、ここでHTML要素を取得し、必要情報を入力してログインします。

ログイン実施後は、再びIEの読み込み完了を待ちます。

 

ログイン実施後の結果を確認する

ログイン処理後、表示オブジェクトのURLを再度取得し、URLをチェックします。

# ログインプロシージャ(ログイン結果確認)

If ResponseURL = LoginPageURL Then
 LoginAnswer = "ログイン失敗"

 'オブジェクト終了処理を実施しておく
 objIE.Quit 'objIEを終了させる
 'ログイン失敗時はアラートをメッセージとして返す
 exitmsg = "ログインに失敗しました。"
 MsgBox exitmsg
 '続きの処理はせずに終了
 End
Else
 LoginAnswer = "ログイン成功"
End If

ログイン後の再取得URLについて再度判定します。

判定方法は先程と同じです。

 

取得URL=ログインURLであればログインは失敗です。

 

ログイン失敗の通知をして、そのままVBAは終了となります。

この時、メインプロシージャの一番最後でobjIEを終了する処理があるのですが、EndでVBAを終了させてしまうと、quit処理がないまま終わってしますので、quit処理を実施した状態で終了できるようにしています。

 

取得URLがログインURLでない場合は正常にログインできていると判断できます。

 

 

ログイン確認後の流れ

最後に、ログイン完了後の処理を確認します。

# ログインプロシージャ(ログイン確認後の処理)

 'ログイン済みorログイン後サイトのHTMLオブジェクト取得
 Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット

 '結果確認情報
 Debug.Print "結果表示開始"
 Debug.Print "CheckFirstLogin " & CheckFirstLogin
 Debug.Print LoginAnswer
 Debug.Print "ProcessPageURL " & ProcessPageURL
 Debug.Print "ProcessDir " & ProcessDir
 Debug.Print "Web表示Titleタグ " & htmlDoc.getElementsByTagName("title")(0).innerText
 Debug.Print "結果表示終了"
 Debug.Print ""

 '初回処理終了処理
 If CheckFirstLogin = True Then CheckFirstLogin = False

End Sub

ログイン完了後の共通した処理としては、HTML要素を取得して何からの情報を扱うことになるので、要素取得をしています。

 

そしてそのあとは、表示確認用のデバッグ情報を集約しています。最終的にここは使用しません。

 

最後に、初回のログインチェックの場合はフラグを変更しています。2回目以降は指定したURLでチェックできるようにするための対応です。 

 

 

以上で、ログイン処理については専用のプロシージャとして再構成しました。

後は、ログイン処理プロシージャを今までに作成してきたVBAへ組み込んでやればログイン処理を含む一連のデータ処理が可能となります。

今回はあくまでログイン部分のみを切り出す為のテスト用プロシージャと連動した作りで考えていたので、実際に組み込むには若干修正が必要になるかもしれません。