Powershellでウェブブラウザを作る2【WebBrowerプロパティの一覧】

コンピュータ
PowerShellのあれこれ

WebBrowerコントロールのプロパティの一覧を取得しました。

<#
.SYNOPSIS
 WebBrowerコントロールのテスト
.DESCRIPTION
 説明
#>

using namespace System.Windows.Forms

param (
    [string]$Url = "https://maywork.net/test/ua.php"
)


function Main
{
    param (
        $url
    )

    $form = [Form]::new()


    $wb = [WebBrowser]::new() | % {
        $_.Dock = [DockStyle]::Fill
        $_
    }

    $wb.add_DocumentCompleted({
        Write-Host "DocumentCompletedイベント"
        Write-Host "プロパティの一覧"
        Write-Host ("AllowNavigation:{0}" -f $wb.AllowNavigation) # True
        Write-Host ("AllowWebBrowserDrop:{0}" -f $wb.AllowWebBrowserDrop) # True
        Write-Host ("CanGoBack:{0}" -f $wb.CanGoBack) # False
        Write-Host ("CanGoForward:{0}" -f $wb.CanGoForward) # False
        Write-Host ("DefaultSize:{0}" -f $wb.DefaultSize) # null
        Write-Host ("Document:{0}" -f $wb.Document) # System.Windows.Forms.HtmlDocument
        Write-Host ("DocumentStream:{0}" -f $wb.DocumentStream) # System.IO.MemoryStream
        Write-Host ("DocumentText:{0}" -f $wb.DocumentText) # <!DOCTYPE html...
        Write-Host ("DocumentTitle:{0}" -f $wb.DocumentTitle) # ユーザーエージェント
        Write-Host ("DocumentType:{0}" -f $wb.DocumentType) # HTML ドキュメント
        Write-Host ("EncryptionLevel:{0}" -f $wb.EncryptionLevel) # Bit128
        Write-Host ("Focused:{0}" -f $wb.Focused) # True
        Write-Host ("IsBusy:{0}" -f $wb.IsBusy) # False
        Write-Host ("IsOffline:{0}" -f $wb.IsOffline) # False
        Write-Host ("IsWebBrowserContextMenuEnabled:{0}" -f $wb.IsWebBrowserContextMenuEnabled) # True
        Write-Host ("ObjectForScripting:{0}" -f $wb.ObjectForScripting) # null
        Write-Host ("ReadyState:{0}" -f $wb.ReadyState) # Complete
        Write-Host ("ScriptErrorsSuppressed:{0}" -f $wb.ScriptErrorsSuppressed) # False
        Write-Host ("ScrollBarsEnabled:{0}" -f $wb.ScrollBarsEnabled) # True
        Write-Host ("StatusText:{0}" -f $wb.StatusText) # 完了
        Write-Host ("Url:{0}" -f $wb.Url) # https://maywork.net/test/ua.php
        Write-Host ("Version:{0}" -f $wb.Version) # 11.0.18362.836
        Write-Host ("WebBrowserShortcutsEnabled:{0}" -f $wb.WebBrowserShortcutsEnabled) # True
    })


    $form.Controls.Add($wb)

    $form.Add_Load({
        $wb.Navigate([Uri]::new($url))
    })


    [Application]::run($form)
}

Main $Url

結果

DocumentCompletedイベント
プロパティの一覧
AllowNavigation:True
AllowWebBrowserDrop:True
CanGoBack:False
CanGoForward:False
DefaultSize:
Document:System.Windows.Forms.HtmlDocument
DocumentStream:System.IO.MemoryStream
DocumentText:<!DOCTYPE html>
<html lang="ja">
<head>
<title>ユーザーエージェント</title>
</head>
<body>
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Win64; x64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)</body>
</html>
DocumentTitle:ユーザーエージェント
DocumentType:HTML ドキュメント
EncryptionLevel:Bit128
Focused:True
IsBusy:False
IsOffline:False
IsWebBrowserContextMenuEnabled:True
ObjectForScripting:
ReadyState:Complete
ScriptErrorsSuppressed:False
ScrollBarsEnabled:True
StatusText:完了
Url:https://maywork.net/test/ua.php
Version:11.0.18362.836
WebBrowserShortcutsEnabled:True

DocumentCompletedイベントのタイミングで実行しています。
なかなか興味深いプロパティがあります。
Documentプロパティあたりを使ってスクレイピングなど出来そうですが、気になったのはDocumentStreamです。
System.IO.MemoryStreamが返ってきますのでこのストリームを調べてみます。

<#
.SYNOPSIS
 WebBrowerコントロールのDocumentStream
.DESCRIPTION
 説明
#>

using namespace System.Windows.Forms

param (
    [string]$Url = "https://maywork.net/test/ua.php"
)


function Main
{
    param (
        $url
    )

    $form = [Form]::new()


    $wb = [WebBrowser]::new() | % {
        $_.Dock = [DockStyle]::Fill
        $_
    }

    $wb.add_DocumentCompleted({
        $ds = $wb.DocumentStream
        $fs = [System.IO.FileStream]::new(".\WebBrowser3.txt",
            [System.IO.FileMode]::Create,
            [System.IO.FileAccess]::Write
            )
        $bw = [System.IO.BinaryWriter]::new($fs)

        $br = [System.IO.BinaryReader]::new($ds)
        
        $buf = $br.ReadBytes(8192)

        while ($buf.Count -gt 0) {
            $bw.Write($buf)
            $buf = $br.ReadBytes(8192)
        }

        $br.Dispose()
        $bw.Dispose()

        $fs.Dispose()
    })


    $form.Controls.Add($wb)

    $form.Add_Load({
        $wb.Navigate([Uri]::new($url))
    })


    [Application]::run($form)
}

Main $Url

ストリームをbyte配列で読みだしてローカルファイルに書き出してみたところhtmlが保存されていました。
urlを画像ファイルを指定すると画像ファイルがダウンロードされるのではと期待しましたが、結果はHTMLでした。
HTMLのみが相手であればDocumentTextのプロパティで文字列として取り扱ったほうが何かと都合がよさそうです。

コメント