PowerShellでCSVファイルをダウンロードしまくったはなし
おはこんばんにちは。増田です。
今日は地味に面倒だった定期作業の1つのハードルをグッと下げた話をします。
とある定常運用作業の中で、「週に1回社内イントラサイトからCSVファイルを10個ほどダウンロードする」というものがあり、最初のうちはブラウザで地道にやっていました。
ただ週1とはいえ、3週間ぐらい続けるとさすがに飽きてきます。
ブラウザをポチポチするだけでも全部やると30分ぐらいかかりますし、次第に心理的な負担も増していきました。
(なんでこんなことやってんだろ。。。おれ。。。みたいな。。。)
・・・ということで、他の作業の隙間をぬって楽をするための努力をすることに決めました。
(ちょっとだけ脱線しますが、1日100%の働き方はしておらず、平時であれば大雑把に定常40%、流動タスク40%、残り20%はバッファになるような配分を心がけています。そうしないと、瞬間最大風速的にタスクが膨らんだ時に身動きが取れなくなりますので。。。)
まずは、対象のイントラサイトの分析をします。
鍵になる要素は以下です。
ベーシック認証
トップページはテーブルで1列目がハイパーリンク
目当てのCSVへのリンクはトップページから数回ページ遷移した先にある
ちなみに、なんでPowerShellかというと、吊るしのWindows Serverがあるので、そのタスクスケジューラーに登録できればOKかなと安易に考えていました。
プロジェクトの共有資産としてのサーバーなので、勝手に新しくツールをインストールするのも憚られます。
PowerShellでサイトにアクセスするときは、”Invoke-Webrequest”コマンドレットですね。
あとベーシック認証を通すときは、-Credentialオプションに System.Management.Automation.PSCredential のオブジェクトを指定してあげましょう。
パスワードだけあらかじめファイルに書き出しておきます。
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File secret.dat
そしたら、こんな感じで読み込みます。
$USER = "77430"
$secpw = cat secret.dat | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PSCredential($USER, $secpw)
これで、トップページが取れるはずです。
Invoke-Webrequest -Uri [トップページのURL] -Credential $credential
あとは、戻り値のオブジェクトやブラウザの開発者ツールを駆使して解析して、ページ遷移に必要な情報を探し出します。
今回はPOSTメソッドでパラメータを渡さないと目当てのファイルがダウンロードできませんでした。
POSTの際のパラメータに使う情報は特定のタグの中からある条件に絞ってあげることで取得できることがわかりました。
$contents = Invoke-Webrequest -Uri [対象ページのURL] -Credential $credential
$contents.ParsedHtml.IHTMLDocument3_getElementsByTagName('タグ名') | Where-Object {($_.xxxx -eq 'hoge')}
パラメータを生成し、POSTするのはこんな感じです。
$param = @{param1='test1'; param2='test2'}
Invoke-Webrequest -Uri [対象ページのURL] -Method 'POST' -Body $param -Credential $credential
こういった処理を繰り返して、最終的に目当てのCSVのダウンロードURLが出来上がったら、ローカルに保存します。
Invoke-Webrequest -Uri [CSVファイルのURL] -Credential $credential -OutFile [CSVファイルの書き出しパス]
ダウンロードしまくりなので、Invoke-Webrequestに始まり、Invoke-Webrequestに終わります。
長くて週1回、短くて毎日1回とかそんなレベルの頻度ですし、たくさんの端末から同時に実行するつもりもないので、上記の要素をうまく組み合わせればひとまず欲しい結果が得られました。
心の平穏に向かって一歩前進しました。
それではまた!
この記事が気に入ったらサポートをしてみませんか?