Перейти до вмісту
> 💻 🧠 Код 1001 > ⚡ Філософія 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=YOUR_API_KEY").

.PARAMETER SubscribeMessage
    Повідомлення для підписки у форматі JSON для надсилання на сервер.

.PARAMETER ReconnectDelay
    Затримка в секундах перед перепідключенням. За замовчуванням 5 секунд.

.EXAMPLE
    $Url = "wss://streamer.cryptocompare.com/v2?api_key=YOUR_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
    }
}

# =================================================================================
# --- ПРИКЛАД ВИКОРИСТАННЯ ---
# =================================================================================
# Розкоментуйте та замініть YOUR_API_KEY на ваш ключ API з Cryptocompare
# $Url = "wss://streamer.cryptocompare.com/v2?api_key=YOUR_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. Логування — відображає повідомлення в консолі з кольоровим виділенням.

Рекомендації

  1. Завжди використовуйте безпечне з’єднання wss://.
  2. Перевіряйте ваші ключі API та токени автентифікації.
  3. Фільтруйте лише необхідні дані.
  4. Для потоків великого обсягу зберігайте повідомлення у файл або базу даних.
  5. Попередньо тестуйте перепідключення та обробку помилок.
Позначки:

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *