PowerShellでWebブラウザのパスワード入力補助ツールをつくってみた

## 背景

お仕事で色々なWebツールを利用しているのですが、
・たくさんパスワードを覚えるのがシンドイ（<strong>a.k.a.備忘用Excelをいちいち開くのが面倒くさい</strong>）
・Webツールごとにブラウザの使い分けが必要だけど<strong>お気に入りから探すのが面倒くさい</strong>
です。
なので、PowerShellで簡易なパスワード入力補助ツールをつくってみました。

## PowerShellで実装したこと

・予め入力しておいたアカウント情報やURLをコンソール画面に一覧表示する
・アカウント情報（ユーザ名やパスワードなど）をテキストファイルに出力し表示する
・URLとブラウザを紐づけて起動できる<strong>（ブラウザ混在や複数のURLでもOK）</strong>

　※前提1：予めURLやアカウント情報をスクリプト内にCSV形式で入力しておく
　※前提2：平文なのでスクリプトはローカルに保存する
　※前提3：バージョンはPowerShell 5.1

## 使い方

　1.コードをスクリプトファイル（.ps1）として保存する
　2.ショートカットをつくって、[プロパティをごにょごにょ](https://qiita.com/tomoko523/items/df8e384d32a377381ef9#%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%BD%9C%E6%88%90%E7%B7%A8)する
　3.ショートカット経由でスクリプトを起動する
　4.コンソール画面で検索条件（サンプルコードだと header）を入力しEnterする

　※3.の後に ↓ な感じなコンソール画面が起動します
![demo2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602161/15e9f86f-e5bb-2c6f-32bb-8b657412cc1c.png)

<strong>そうすると・・・</strong>
　アカウント情報がテキストファイルに出力されるのでパスワードを<strong>思い出す手間を省けます</strong>。当然コピペも可能です。
　また、上手く検索条件を仕込んでおけば複数のWebツールを<strong>まとめて起動できて時間短縮</strong>にもつながります。

　※サンプルコードのままで "you" を入力した場合、you2とyoutにヒットするので ↓ な感じになります。
　（実用上問題ないのでテキストファイル上の余計な改行は見なかったことに... (= = ;)）
![demo6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602161/4b03dc14-69cc-3cd2-e863-b3273a3ee21e.png)

<strong>なるべくマウス操作をしたくない...
何個もExcelファイルを開くのがキライ...
Windows10にはPowershellが標準実装されてるじゃん！！</strong>
という方はお試しください。

## コード

サンプルコードのURLはパスワードとか関係ありませんので、あしからず。。

```PowerShell:Webパスワード入力補助.ps1
#引数を整形して標準出力する。"--" や 改行（空白行）で見た目を整える。区切り文字はTab
function StdoutFilterParams{
    param(
        $parameter
        ,$filter
    )

    $msg_stdout = @()
    $msg_stdout += "`n"
    $msg_stdout += $filter -join "`t"
    $msg_stdout += "--" * ($filter -join "`t").length
    foreach($row in $parameter)
    {
        $tmp = ""
        $filter | 
        %{
            $tmp = $tmp + $row.$_ + "`t"
        }
        $msg_stdout += $tmp
    }
    $msg_stdout += "`n"

    echo $msg_stdout
    return
}


#引数をテキストファイルに出力する。出力列は呼び出し元で制御する。区切り文字は全角スペース
function TextoutFilterParams{
    param(
        $parameter
        ,$filter
        ,$dstpath
    )

    $body_text = @()
    foreach($row in $parameter)
    {
        $tmp = ""
        $filter | 
        %{
            $tmp = $tmp + $row.$_ + "　"
        }
        $body_text += $tmp
    }

    $body_text | Out-File -FilePath $dstpath -Encoding Default
    return
}

#ブラウザにURLを渡す。ブラウザ種別は事前入力パラメータと整合させる（カスタマイズ可）
function OpenUrl{
    param(
        $parameter
    )

    foreach($row in $parameter)
    {
        $url_dst = $row.url
        Switch -regex ($row.browsercode){
            "chp"   {start chrome.exe "-incognito $url_dst" -wait}
            "edp"   {start msedge.exe "-inprivate $url_dst" -wait}
            default {start $url_dst -wait}
        }
    }

    return
}

#URLやアカウント情報を入力しておく（CSV形式）
<# 左端に # でコメントアウト
    第1引数：ヘッダ（Webツールの名前とか、検索条件にするのでイイ感じのネーミングにしたい）
    第2引数：ユーザ名
    第3引数：パスワード
    第4引数：ブラウザ種別(chp:chromeシークレットモード、edp:edgeプライベートモード、それ以外:デフォルトブラウザ)
    第5引数：ブラウザに渡すURL
#>
$login_params_str = @"
amazon,hoge3,password1,chp,https://www.amazon.co.jp
you2,hoge2,password2,ed,https://www.youtube.com/
yout,hoge1,password3,edp,https://qiita.com/
"@


#パラメータ群を連想配列に変換する
$login_params = @()
$index = 1

foreach($row in ($login_params_str -split "`n" | ?{$_ -notmatch "^#"}))
{
    $tmp = 
    @{
        index       = $index
        header      = $row.split(",")[0]
        user        = $row.split(",")[1]
        password    = $row.split(",")[2]
        browsercode = $row.split(",")[3]
        url         = $row.split(",")[4]
    }
    $login_params += [PSCustomObject]$tmp
    $index ++
}


#表示項目を絞って標準出力する
$cols_filter = @("index","header","user","url")
StdoutFilterParams -parameter $login_params -filter $cols_filter


#ユーザに任意の header を入力させ対象行をピックアップする
$user_input = Read-Host -prompt "使いたいWebツールの header を入力してください:`n"
$seleceted_params = $login_params | ?{$_.header -match $user_input}


#ピックアップした行を、スクリプトのあるフォルダにテキストファイルで出力させる。
$scriptRoot = $PSScriptRoot
$path_dsttext = Join-Path $scriptRoot "tmp_loginparam.txt"
$cols_filter = @("header","user","password","url")
TextoutFilterParams -parameter $seleceted_params -filter $cols_filter -dstpath $path_dsttext


#出力したテキストファイルを既定のエディタで表示させる
start $path_dsttext


#ピックアップした行のURLをブラウザに渡してWebツールに接続させる
OpenUrl -parameter $seleceted_params

```

## 参考にしたWebサイト

Powershellで複数のブラウザをシークレットモードまたはプライベートモードで開く
http://ja.uwenku.com/question/p-bgxnetns-pe.html

以上