ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ содСрТимому
davidka.net > πŸ’» 🧠 Код 1001 > ⚑ Ѐилософия PowerShell > ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΡ‘ΠΌΡ‹ PowerShell > πŸ“‘ Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ WebSocket для получСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с PowerShell

πŸ“‘ Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ WebSocket для получСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с PowerShell

  • Π°Π²Ρ‚ΠΎΡ€:

WebSocket Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ: это ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» для постоянного двустороннСго соСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром. Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ β€” ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ подписки Π½Π° ΠΊΠ°Π½Π°Π»Ρ‹.

ΠŸΡ€ΠΎΡΡ‚Π°Ρ аналогия: Π²Ρ‹ Π·Π²ΠΎΠ½ΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³Ρƒ (Ρ€ΡƒΠΊΠΎΠΏΠΎΠΆΠ°Ρ‚ΠΈΠ΅, handshake), Π΄Ρ€ΡƒΠ³ провСряСт, ΠΊΡ‚ΠΎ Π·Π²ΠΎΠ½ΠΈΡ‚, ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² (аутСнтификация), послС Ρ‡Π΅Π³ΠΎ линия остаётся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ сообщСниями (ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…).

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° WebSocket Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ постоянноС соСдинСниС Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… запросов, ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ…, экономию рСсурсов ΠΈ двусторонний ΠΎΠ±ΠΌΠ΅Π½ сообщСниями.


ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ WebSocket Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Cryptocompare

Cryptocompare прСдоставляСт ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Π°ΠΌ Ρ‡Π΅Ρ€Π΅Π· WebSocket. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ BTC/USD.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ WebSocket-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π° PowerShell

# =================================================================================
# WebSocket-Client.ps1 β€” Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ WebSocket-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ для получСния Π΄Π°Π½Π½Ρ‹Ρ…
# Windows PowerShell >= 5.1
# Автор: hypo69
# Π”Π°Ρ‚Π° создания: 13/09/2025
# =================================================================================

# =================================================================================
# Π›Π˜Π¦Π•ΠΠ—Π˜Π― (MIT)
# =================================================================================
<#
ЛицСнзия MIT: https://opensource.org/licenses/MIT
#>

function Start-WebSocketClient {
<#
.SYNOPSIS
    Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ WebSocket-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.

.DESCRIPTION
    ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ WebSocket-сСрвСру, отправляСт подписку Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…
    ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ входящиС сообщСния Π² консоль. АвтоматичСскоС ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Ρ‹Π²Π΅.

.PARAMETER Url
    URL WebSocket-сСрвСра (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: "wss://streamer.cryptocompare.com/v2?api_key=ВАШ_API_KEY").

.PARAMETER SubscribeMessage
    Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ подписки Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON.

.PARAMETER ReconnectDelay
    Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π² сСкундах ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 5 сСк.

.EXAMPLE
    $Url = "wss://streamer.cryptocompare.com/v2?api_key=ВАШ_API_KEY"
    $SubscribeMessage = '{"action":"SubAdd","subs":["5~CCCAGG~BTC~USD"]}'
    Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5
#>
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, HelpMessage = "Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ URL WebSocket-сСрвСра.")]
        [string]$Url,

        [Parameter(Mandatory, HelpMessage = "Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ подписки Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON.")]
        [string]$SubscribeMessage,

        [Parameter(Mandatory = $false, HelpMessage = "Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (сСк).")]
        [int]$ReconnectDelay = 5
    )

    while ($true) {
        try {
            $ws = [System.Net.WebSockets.ClientWebSocket]::new()
            $uri = [Uri] $Url
            $ws.ConnectAsync($uri, [Threading.CancellationToken]::None).Wait()
            Write-Host "βœ… Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ установлСно с $Url" -ForegroundColor Green

            if ($SubscribeMessage) {
                $bytes = [System.Text.Encoding]::UTF8.GetBytes($SubscribeMessage)
                $buffer = [System.ArraySegment[byte]]::new($bytes)
                $ws.SendAsync($buffer, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, [Threading.CancellationToken]::None).Wait()
                Write-Host "➑ Подписка ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π°: $SubscribeMessage" -ForegroundColor Cyan
            }

            $bufferSize = 1024
            $buffer = New-Object byte[] $bufferSize
            $segment = [System.ArraySegment[byte]]::new($buffer)

            while ($ws.State -eq [System.Net.WebSockets.WebSocketState]::Open) {
                $receiveTask = $ws.ReceiveAsync($segment, [Threading.CancellationToken]::None)
                $receiveTask.Wait()
                $message = [System.Text.Encoding]::UTF8.GetString($buffer, 0, $receiveTask.Result.Count)
                Write-Host "πŸ“© ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ: $message"
            }
        }
        catch {
            Write-Host "⚠ Ошибка: $_" -ForegroundColor Red
        }

        Write-Host "⏳ ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· $ReconnectDelay сСкунд..." -ForegroundColor Yellow
        Start-Sleep -Seconds $ReconnectDelay
    }
}

# =================================================================================
# --- ΠŸΠ Π˜ΠœΠ•Π  Π˜Π‘ΠŸΠžΠ›Π¬Π—ΠžΠ’ΠΠΠ˜Π― ---
# =================================================================================
# РаскоммСнтируйтС ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ API_KEY своим ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Cryptocompare
# $Url = "wss://streamer.cryptocompare.com/v2?api_key=ВАШ_API_KEY"
# $SubscribeMessage = '{"action":"SubAdd","subs":["5~CCCAGG~BTC~USD"]}'
# Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… прСимущСств. Он ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π»ΡŽΠ±Ρ‹Ρ… WebSocket-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡΡΡŒ ΠΎΠ΄Π½ΠΈΠΌ сСрвисом. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ автоматичСскоС ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Ρ‹Π²Π΅ соСдинСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ восстанавливаСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π»Π΅Π³ΠΊΠΎ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, просто ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² сообщСниС подписки. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ β€” Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ», Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ входящиС сообщСния, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ JSON ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ….


ПояснСниС ΠΊ ΠΊΠΎΠ΄Ρƒ

  1. [System.Net.WebSockets.ClientWebSocket] β€” .NET класс для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ WebSocket.
  2. ConnectAsync β€” устанавливаСт соСдинСниС с сСрвСром.
  3. SendAsync β€” ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° подписочного сообщСния Π½Π° сСрвСр.
  4. ReceiveAsync β€” ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ входящих сообщСний.
  5. ΠΠ²Ρ‚ΠΎΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ β€” Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· бСсконСчный while ($true) ΠΈ Start-Sleep.
  6. Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” Π²Ρ‹Π²ΠΎΠ΄ сообщСний Π² консоль с Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с WebSocket

  1. ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» wss://.
  2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉΡ‚Π΅ API-ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.
  3. Π€ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.
  4. Для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… сохраняйтС сообщСния Π² Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….
  5. ВСстируйтС ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок Π·Π°Ρ€Π°Π½Π΅Π΅.

ΠœΠ΅Ρ‚ΠΊΠΈ:

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *