簡體   English   中英

如何使用 Websocket 客戶端使用 PowerShell V2 打開到 URL 的長期連接?

[英]How to use a Websocket client to open a long-lived connection to a URL, using PowerShell V2?

我正在嘗試使用 PowerShell V2(測試目的)通過 Slack 啟動實時消息傳遞 (rtm) 實例。 但是根據 Slack 的常見問題解答,要連接到他們的 rtm API,我需要通過 Websocket 客戶端使用 wss:// 協議來流式傳輸關聯的事件。 我還試圖使其成為異步連接(接收和連接)。

這不起作用:

$webSock = New-Object System.Net.WebSocket.ClientWebSocket
$client = New-Object System.Threading.CancellationToken

另一件事是我需要一個函數來從 PowerShell V2 中的 JSON 轉換。

我嘗試使用它,但它也不起作用:

function ConvertFrom-Json20([object] $item){ 
    add-type -assembly system.web.extensions
    $ps_js=new-object system.web.script.serialization.javascriptSerializer

    #The comma operator is the array construction operator in PowerShell
    return ,$ps_js.DeserializeObject($item)
}

可以使用 .NET 的System.Net.WebSockets.ClientWebSocket類來做到這一點。 您需要運行 Windows 8 或 Server 2012 或更高版本作為您的底層操作系統才能使用此類,因此我認為無論如何您都至少擁有 PowerShell v3(因此是ConvertFrom-Json cmdlet)。 您還需要使用System.ArraySegment .NET 類。

我創建了一個簡單的框架,演示了如何使用各種類從 PowerShell 腳本與 Slack RTM API 進行交互。 您可以在 GitHub 上找到該項目: https : //github.com/markwragg/Powershell-SlackBot

我還在博客上更詳細地介紹了它: http : //wragg.io/powershell-slack-bot-using-the-real-time-messaging-api/

奇怪的是,我最近也有同樣的需求。 感謝 Mark Wragg 和他的有用鏈接,這里有一些快速的代碼來實現這一點。 您至少需要 Windows 8 和 Server 2012 才能使這些事情發揮作用。

Try{  
    Do{
        $URL = 'ws://YOUR_URL_HERE/API/WebSocketHandler.ashx'
        $WS = New-Object System.Net.WebSockets.ClientWebSocket                                                
        $CT = New-Object System.Threading.CancellationToken
        $WS.Options.UseDefaultCredentials = $true

        #Get connected
        $Conn = $WS.ConnectAsync($URL, $CT)
        While (!$Conn.IsCompleted) { 
            Start-Sleep -Milliseconds 100 
        }
        Write-Host "Connected to $($URL)"
        $Size = 1024
        $Array = [byte[]] @(,0) * $Size

        #Send Starting Request
        $Command = [System.Text.Encoding]::UTF8.GetBytes("ACTION=Command")
        $Send = New-Object System.ArraySegment[byte] -ArgumentList @(,$Command)            
        $Conn = $WS.SendAsync($Send, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $CT)

        While (!$Conn.IsCompleted) { 
            #Write-Host "Sleeping for 100 ms"
            Start-Sleep -Milliseconds 100 
        }

        Write-Host "Finished Sending Request"

        #Start reading the received items
        While ($WS.State -eq 'Open') {                        

            $Recv = New-Object System.ArraySegment[byte] -ArgumentList @(,$Array)
            $Conn = $WS.ReceiveAsync($Recv, $CT)
            While (!$Conn.IsCompleted) { 
                    #Write-Host "Sleeping for 100 ms"
                    Start-Sleep -Milliseconds 100 
            }

            #Write-Host "Finished Receiving Request"

            Write-Host [System.Text.Encoding]::utf8.GetString($Recv.array)


        }   
    } Until ($WS.State -ne 'Open')

}Finally{

    If ($WS) { 
        Write-Host "Closing websocket"
        $WS.Dispose()
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM