vbsによるWebサイトの自動ログイン

# 自動ログインツール
以前のやっていた案件でJenkinsを使用したビルドを行っており、本番環境へリリースするためにjenkinsからリリースセットをダウンロードしてデプロイを行っていました。その際に自動でログインを行い対象のリリースファイルをダウンロードするようなツールを用意したので、その備忘録として記事を作成しました。

なお今回はjenkinsではなく、ニコニコ動画へのログインを試みるという処理になります。
処理の内容としては、以下のようになっています。

1. ブラウザを起動
2. URLを入力し、Enterキーを押下
3. ユーザIDとパスワードを入力
4. ログインを押下


```vb:login.vbs

Option Explicit

'定数および変数の定義

'ログインURL
Const LOGIN_URL = "https://account.nicovideo.jp/login"

'ユーザID
Const USER_ID = "admin"

'パスワード
Const USER_PASS = "adminpass"


'メインの処理

Dim WshShell
Set WshShell = Wscript.CreateObject("WScript.Shell")

'cscript.exe で強制実行
Call CscriptRun

'ログインする
Call main

Set WshShell = Nothing

'=====================================================================================

'メイン処理
'=====================================================================================
Sub main()

    Wscript.StdOut.WriteLine "------"
    Wscript.StdOut.WriteLine "ログインして、APリリースセットのダウンロードを開始します。"
    Wscript.StdOut.WriteLine "アクティブなウィンドウ（Chrome）を対象にして処理を行うため、何も操作せずにお待ちください。"

    'ログインに成功するまでループ（必要に応じて）
    'Do While Not WshShell.AppActivate("ダッシュボード", True)
        Call login
    'Loop
    
End Sub
'=====================================================================================

Sub login()

    'Chromeがアクティブかを確認するためのフラグ
    Dim activeFlg
    
    Wscript.Sleep 2000

    'ログインエラーで無い場合
    If Not WshShell.AppActivate("ログインエラー", True) Then
        'クロームを起動する(3:最大化で最前面)
        WshShell.Run "Chrome.exe", 3
        'Chromeをアクティブにする
        Do While Not activeFlg
            activeFlg = WshShell.AppActivate("新しいタブ", True)
        Loop
    Else
        WshShell.SendKeys "{F6}", True
    End If
    
    Wscript.Sleep 2000
    
    'ログインURLをアドレスバーに貼り付け
    WshShell.SendKeys LOGIN_URL
    
    Wscript.Sleep 500
    
    'ログイン画面に遷移
    WshShell.SendKeys "{Enter}", True

    'ログイン
    Wscript.Sleep 2000
    
    'ユーザ名を入力
    WshShell.SendKeys "{Tab}", True
    WshShell.SendKeys "{Tab}", True
    WshShell.SendKeys USER_ID, True
    
    Wscript.Sleep 2000

    WshShell.SendKeys "{Tab}", True

    'パスワードを入力
    WshShell.SendKeys USER_PASS, True
    
    Wscript.Sleep 2000

    WshShell.SendKeys "{Tab}", True
    Wscript.Sleep 1000
    
    'ログインボタン押下
    WshShell.SendKeys "{Enter}", True

    Wscript.Sleep 500

End Sub

'=====================================================================================


'cscript.exe で強制実行
'拡張子(.vbs)が wscript.exe に紐づいている場合、cscript.exe で起動しなおす
'※デフォルトでは wscript.exe に紐づいている
'cscript.exe の実行終了後 pause で一時停止する
'=====================================================================================
Sub CscriptRun()

    Const WINDOW_ACTIVE = 1

    Dim WshShell
    Dim strParam
    Dim item

    If LCase(Right(Wscript.FullName, 11)) <> "cscript.exe" Then
        Set WshShell = CreateObject("WScript.Shell")

        strParam = " "
        For Each item In Wscript.Arguments
            If InStr(item, " ") < 1 Then
                strParam = strParam & item & " "
            Else
                strParam = strParam & Dd(item) & " "
            End If
        Next

        'ウィンドウをアクティブに表示する。
        WshShell.Run "%comspec% /c cscript.exe //Nologo " & Dd(Wscript.ScriptFullName) & strParam & " & pause", WINDOW_ACTIVE, True

        Set WshShell = Nothing
        Wscript.Quit
    End If

End Sub
'=====================================================================================


' 文字列を " で囲む関数
'=====================================================================================
Function Dd(strValue)
    Dd = """" & strValue & """"
End Function
'=====================================================================================


```

## 備考
色々なWebサイトへのログインとして応用できるかと思っていましたが、ユーザIDを入力時にかな入力になっていた場合は半角/全角の切り替えができなかったり、ログインボタンがマウスクリックでしか反応しなかったりするサイトもあり、汎用には向かないということが分かりました。